当前位置:
首页 > temp > 简明python教程 >
-
线程基础
计算机早期,操作系统都没有线程的概念,整个系统只运行着一个执行线程,同时包含操作系统代码和应用程序代码。所以就存在一个问题,长时间运行的任务会阻止其他任务执行。例如:在16位Windows的那些日子,打印文档会“冻结“整台机器。
随后微软为了解决这部分问题,引入进程概念。但是CPU本身呢,应用程序发生死循环呢?所以线程应运而生,它是对CPU的虚拟化,为每个进程提供进程专用的线程。
总体概览
开销
- 线程内核对象 (thread kernel object),包含线程上下文,上下文中保存CPU寄存器集合的内存块,在x64位系统中占1240字节
- 线程环境块 (thread environment block TEB),耗用一个内存页4KB。
- 用户模式栈 (user-mode stack),系统保留1MB的地址空间。
- 内核模式栈 (kernel-mode stack),针对从用户模式的代码传递给内核的任何实参。x64 占用 24KB。
- DLL 线程连接(attach)和 线程分离(detach)通知。
线程上下文切换
- 将CPU寄存器的值保存在当前正在运行的线程内核对象内部的一个上下文结构中。
- 从现有线程集合中选出一个线程供调度。如果该线程由另一个线程拥有,系统在开始执行任何代码或者接触任何数据之前,还必须切换CPU看见的虚拟地址空间。
- 将所选上下文结构中的值加载到CPU的寄存器中。
上下文切换大约耗时 30ms,一个时间片结束后,如果系统决定再次调用同一个线程,系统不会执行上下文切换。所以,你懂的,要尽量避免切换,4核最理想是4个线程同步执行。初衷,微软在设计OS的时候,决定侧重于可靠性与相应能力,而非侧重于速度和性能。
使用线程理由
- 可响应性
-
性能
- 计算限制的异步操作
- I/O限制的异步操作
线程调度和优先级
Windows 又被称之为抢占式多线程(preemptive multi-threaded)操作系统,是因为线程可在任何时间停止被抢占并调度另一个线程。线程分0到31的优先级,其中0为零页线程,在没有其他线程工作的时候,零页线程将系统内存中的所有空闲页清零。一般线程优先级为Normal,如图与线程存在Normal进程中的Normal线程,也就是8。
相对线程优先级 |
进程优先级类 Idle |
Below Normal | Normal | Above Normal | High | Realtime |
---|---|---|---|---|---|---|
Time-Critical | 15 | 15 | 15 | 15 | 15 | 31 |
Highest | 6 | 8 | 10 | 12 | 15 | 26 |
Above Normal | 5 | 7 | 9 | 11 | 14 | 25 |
Normal | 4 | 6 | 10 | 13 | 24 | |
Below Normal | 3 | 5 | 7 | 9 | 12 | 23 |
Lowest | 2 | 4 | 6 | 8 | 11 | 22 |
Idle | 1 | 1 | 1 | 1 | 1 | 16 |
前台线程和后台线程
CLR将每个线程要么视为前台线程,要么视为后台线程。一个进程所有前台线程停止运行时,CLR强制终止仍然在运行的后台线程,并不抛出异常。关键字:Background。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数