多线程基本知识
程序,进程,线程
程序是有自己内存布局的一种模块。内存布局一部分由已经实现好的确定的数据和动态执行时的区域两部分。
程序是进程的组件。进程需要通过组件来完成对应的功能。如果这个程序不依赖其它程序即可完成其既定的功能,它的内存布局也就是进程的内存布局。如若不是,那么上图中的布局(代码区和静态数据区)会有多份。
进程就是计算机正在执行的任务。它有自己的指令流和内存空间以及一颗虚拟CPU。
默认情况下一个进程只有一个控制流,但是在现代操作系统结构中,进程可以有多个控制流。每个控制流有一个单独的调用栈。这就是线程。线程隶属于一个进程,可以访问这个进程中绝大部分资源。Windows下,所有任务运行的单位就是线程。
几个模型
多进程模型
时分伪并行:对于进程来说,把CPU时间切片,在对应的时间执行对应的进程,由于时间很短,就会有并行的效果。每个进程还有一个独立空间和映射的虚拟CPU,每次切换时都会通过某些硬件机制或软件机制切换控制权,同时保存好切换的进程的环境信息。因此对于进程而言,它们是连续执行的。
线程模型
分为用户级线程和内核级线程
用户级线程为应用程序在某些控制点上分离虚拟控制流以模拟多个控制流行为。线程切换效率(较内核级线程)高,可以自定义切换算法,但控制力弱
内核级线程指操作系统提供线程能力,可以直接控制线程的工作。系统维护一张全局线程表,记录线程的各种信息。在一些情况下(如:sleep,wait,select等函数或硬中断和异常)执行对应的线程调度。从而应用进程不需要考虑切换进程,也不需要担心自己会占用过多CPU时间,因为操作系统会协调
并发编程
三种构造并发程序的方式:
- 基于进程:内核实现的多进程通信
- 基于IO多路复用:逻辑流被抽象化为状态机,主动监测文件描述符
- 基于线程:内核调度,共享虚拟地址
IO多路复用:一文搞懂I/O多路复用及其技术 - 尹瑞星 - 博客园
另外2个:《深入理解计算机系统》
线程调度
如果一个进程有多个线程,那么如何判断什么时候该执行哪个线程呢。Windows中线程调度依赖于异常
的触发。(写这篇的时候还没学中断和异常,具体内容先留着),异常拥有等级,高等级的异常可以打断低等级的异常的处理,等级被称为IRQL,对于IRQL等于1的线程,表示正在插入异步过程调用(APC)对象,若IRQL等于2,表示正在执行线程调度(选择新线程,处理硬件中断中不紧急的部分),被称为延迟过程调用(DPC)。通过这两种异常,可以对线程进行调度。