线程原理篇——>第7章 线程
第7章 线程
7.1 进程的分身术——线程
进程与线程的区别(面试题)
线程就是我们为了让一个进程能够同时干多件事情而发明的“分身术”。
线程的本质:拥有同样的程序文本。
线程是进程里面的一个执行上下文或者执行序列。一个进程可以拥有多个执行序列。
在线程模式下,一个进程至少有一个线程,但也可以有多个线程。
将进程分解为线程还可以有效利用多处理器和多核计算机。在没有线程的情况下,增加一个处理器并不能让一个进程的执行速度提高。但如果分解为多个线程,则可以让不同的线程同时运转在不同的处理器上,从而提高进程的执行速度。
7.2 线程管理
评判标准:如果某资源不独享会导致线程运行错误,则该资源就由每个线程独享;而其他资源都由进程里面的所有线程共享。
一般情况下线程共享和独享资源的划分 |
||
序号 |
线程共享资源 |
线程独享资源 |
1 |
地址空间 |
程序计数器 |
2 |
全局变量 |
寄存器 |
3 |
打开的文件 |
栈 |
4 |
子进程 |
状态字 |
5 |
闹铃 |
|
6 |
信号及信号服务程序 |
|
7 |
记账信息 |
|
7.3 线程模型的实现
用户态和内核态的区别(面试题)
进程的调度有两种。一、进程的调度交给线程;二、将线程的调度交给操作系统。
这两种不同的调度形成了线程的两种实现:用户态实现和内核态实现。由进程自己管理就是用户态线程,由操作系统管理就是内核态线程实现。
用户态和内核态的判断以线程表所处的位置为依据:位于内核叫做内核态实现,位于用户层叫做用户态实现。
线程的实现方式。因为线程是进程内部的东西,所以,存在由进程直接管理线程的可能性。因此,线程存在着内核态与用户态两种实现可能。
7.3.1 内核态线程实现
7.3.2 用户态线程实现
用户态实现就是用户自己做线程的切换,自己管理线程的信息,而操作系统无须知道线程的存在。
用户态如何进行线程调度呢?用户自己写一个执行系统(runtime system)作调度器,即成了正常执行任务的线程外,还有一个专门负责线程调度的线程。用户态下的运行,是一个线程在执行完一段时间后主动把资源释放给别人使用,而在内核态下则无须如此。因为操作系统可通过周期性的时钟中断把控制权夺过来。在用户态实现情况下,执行系统的调度器(runtime scheduler)也是线程,没有能力强行夺走控制权,所以必须合作。
用户态的优点:
灵活性。因为操作系统无须知道线程的存在,所以在任何操作系统上都能应用。
线程切换快。因为切换在用户态进行,无须陷入到内核态。
不用修改操作系统。
用户态的缺点:
编程序变得很诡异。由于用户态线程需要相互合作才能运转,所以,我们在写程序时,必须仔细斟酌在什么时候应该让出CPU给别的线程使用。而让出时机的选择对线程的效率和可靠性由很大的影响。
用户态线程实现无法完全达到线程提出所要达到的目的:进程级多道编程。