1、进程的分身术-线程

进程在一个时间只能干一件事情。如果想同时干两件事,办法就是线程,线程就是我们为了让个进程能够同时干多件事情而发明的“分身术”。
例如,在使用Word文本编辑时,实际上是打开了多个线程。这些线程一个负责显示,一个接受输入,一个定时进行存盘。这些线程一起运转,让我们感觉到我们的输入和屏幕显示同时发生,而不用键入一些 字符,等待一会儿才看到屏幕显示。在我们不经意间,还能自动存盘。

2、线程管理

有进程后,要管理逬程。那么有线程后,也要进行管理。而管理的基础也与进程管理的基础类似:就是要维持线程的各种信息。这些信息包含了线程的各种关键资料。存放这些信息的数据结构称为线程控制表线程控制块
线程共享一个进程空间,因此有许多资源是共享的。这些共享的资源存放在进程控制块。但由于线程是不同的执行序列,也会有些不能共享的资源,这些不被共享的资源和信息就需要存放在线程控制块里。
对于线程资源共享,一般的评判标准是:如果某资源不独享会导致线程运冇错误,则该资源就由每个线程独享;而其他资源都由进程里面的所有线程共享。
一般情况下线程共享和独享资源划分:

线程共享资源 线程独享资源
地址空间 程序计数器
全局变量 寄存器
打开的文件
子进程 状态字
闹铃
信息及信号服务程序
记账信息

3、线程的实现方式

既然线程是进程的构成部分,或者是进程的分身,那么由谁来管理线程就有两种选择:一是让进程自己来管理线程;二是让操作系统来管理线程。这种不同的选择就出现了内核态线程用户态线程。这也是线程实现的两种方式,由进程自己管理就是用户态线程实现,由操作系统管理就是内核态线程实现。

1、内核态线程实现

操作系统要管理线程,就要保持维护线程的各种资料,即将线程控制块存放在操作系统内核空间。这样,操作系统内核就同时保有进程控 制块和线程控制块。而根据进程控制块和线程控制块提供的信息,操作系统就可以对线程进行各种类似进程的管理,如线程调度、线程的资源分配、各种安全措施的实现等。
内核态线程实现的缺点:
1、效率较低。因为线程在内核态实现,每次线程切换都需要陷入到内核,由操作系统来进行调度。而从用户态陷入到内核态是要花时间的。
2、内核态实现占用内核希缺的内存资源。因为操作系统需要维护线程表,由于线程的数量通常大大高于进程的数量,随着线程数置的增加,操作系统内核空间将迅速耗尽。
3、内核态实现需要修改操作系统。

2、用户态线程实现

用户态实现:就是用户自己做线程的切换,自己管理线程的信息,而操作系统无需知道线程的存在。
用户态进行线程调度:用户自己写一个执行系统作调度器,即除了正常执行任务的线程外,还有一个专门负责线程调度的线程。由于大家都在用户态下运行,谁也不比谁占优势,要想取得CPU控制权只能靠大家的自愿合作。
用户态实现的优点:
1、灵活性。因为操作系统不用知道线程的存在,所以在任何操作系统上都能应用。
2、线程切换快。因为切换在用户态进行,无需陷入到内核态。
3、不用修改操作系统,实现容易。
用户态实现的缺点:
1、编程序变得很诡异。用户态线程需要相互合作才能运转,我们在写程序时,必须仔细斟酌在什么时候应该让出CPU给别的线程使用。而让出时机的选择対线程的效率和可靠性有很大的影响。
2、用户态线程实现无法完全达到线程提出所要达到的目的:进程级多道编程。

4、现代操作系统的线程实现模型

由于用户态和内核态都存在缺陷,现代操作系统使用的是将二者结合起来。用产态的执行系统负责进程内部线程在非阻塞时的切换;内核态的操作系统负责阻塞线程的切换,即我们同时实现内核态和用户态线程管理。其中内核态线程数量较少,而用户态线程数量多.每个内核态线程可以服务一个或多个用户态线程。

5、从用户态进入内核态

什么情况会造成一个线程从用户态进入到内核态呢?
1、如果在程序运行过程中发生中断或异常,系统将自动切换到内核态来运行中断或异常处理机制。
2、程序进行系统调用也将造成从用户态进入到内核态的转换。