- 一个进程至少有一个线程,但是也可以有多个线程
5.2 线程管理
存放线程的数据结构: 线程控制表
5.3 线程的实现方式
- 由进程自己管理就是用户态线程的实现,由操作系统管理就是内核态线程实现;用户态和内核态的判断以线程表所处的位置维依据:位于内核叫内核态实现,位于用户层叫用户态实现;
- 进程没有在用户态或内核态实现的问题,因为进程是在CPU上实现并发(多道编程),而CPU是由操作系统管理的,所以进程的实现只能由操作系统内核来进行;而线程是进程内部的东西,所以存在着两种可能;
- 内核态线程实现 :使得用户编程简单,因为线程的复杂性由操作系统承担,如果一个线程执行阻塞操作,操作系统可以从容地调度另外一个线程执行;缺点是效率低,因为线程在内核态实现,每次线程切换都需要陷入到内核,内核态实现占用内核稀缺的内存资源,因为操作系统需要维护线程表
- 线程用户态实现:优点是灵活,因为操作系统无需知道线程的存在,所以在任何操作系统上都能应用,其次线程切换快,因为在用户态进行,无需陷入到内核态;缺点是用户态线程实现无法完全达到线程提出所要达到的目的:进程级多道编程
- 线程的阻塞会导致整个进程的阻塞: 解决办法:
(1)在线程进行任何系统调用前,先行确认下该调用是否发生阻塞,即我们写一个包裹(wrap),將系统调用包裹起来,用户程序使用系统调用时需要通过这个wrap
,wrap
里有一段代码,专门检查发出的系统掉用会不会阻塞,如果会,就进制调用,否则,就放行 ;
(2)在进程阻塞后想办法激活受阻进程的其他线程(调度器激活) - 现代操作系统的线程实现模型:用户态的执行系统负责进程内部在非阻塞时的切换;内核态的操作系统负责阻塞线程的切换
- 从用户态进入内核态: ①:中断或异常,②:系统调用
思考题
- 线程与进程的异同?https://www.zhihu.com/question/25532384(进程就是包含上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文;而线程共享了进程的上下文环境 ,是更为细小的CPU时间段)