什么是线程
线程是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流
调度和分派的基本单位
因为还具备许多传统进程所具有的特性 所有线程也被成为轻型进程 进程元
因为进程可以并发 所以不同进程间的线程也可以并发
线程和进程的区别
线程中也有三个状态:执行,就绪,阻塞
一个程序至少有一个进程,一个进程至少有一个线程.
进程在执行过程中拥有独立的内存单元 而线一般是多个线程共享同一个内存单元
线程是比进程更小的能独立运行的基本单位.线程基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;
同一个进程中的多个线程之间可以并发执行.
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程 产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,一个线程死掉就相当于进程中有一个步骤没办法执行了 所以该进程就无法完成了
所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些
如果拿线程和进程做例子 :假设进程是文字处理器 那么线程就可以一个用来显示文字和图像 一个用来从键盘读入数据 再一个在后天进行拼写和语法检查
放在现实中就是 进程就相当于工厂中的每一个流水线而线程就相当于流水线上的工人
线程控制块TCB
与PCB类似
线程控制块中也有一个唯一标识线程的线程标识符
一组寄存器,线程运行状态,优先级,线程专有存储区,信号屏蔽
内核支持线程KST
该种线程是在操作系统内核支持下运行的 他的创建阻塞撤销切换都是在内核空间实现的
这种线程的优势是:
1.在多处理器系统种 内核能够同时调度同一进程中的多个线程并行执行
2.因为是内核支持线程 所以具有更小的数据结构和堆栈,线程的切换更快 切换开销更小
3.可以让内核也采用多线程技术 提高系统执行速度和效率
4.相较于用户级线程 内核支持线程的调度单位是线程 在执行时间片轮转算法时 是每个线程执行一个时间片 如果进程A有一个内核线程 进程B有一百个内核进程 则进程B分配的时间是进程A的一百倍
缺点:
因为他是内核支持 所以虽然系统切换时 切换的开销更小 但是如果是用户的线程切换 则器模式切换的开销会较大(从一个线程切换到另一个线程需要从用户态转到系统态进行 因为用户进程的线程在用户态运行,而内核支持线程是在内核实现的 所以系统开销会比较大)
用户级线程ULT
在用户空间中实现 对线程的创建撤销同步通信都不需要内核的支持 与内核无关了 并且一个系统中的用户级线程的数目可以达到数百个至数千个 这就可能导致一个问题 用户级线程调度还是以进程为单位 在时间轮转方法中 每个进程都是给予一样的时间 但是因为进程中的用户级线程数量是不一样的 所以每个线程的执行时间和速度就可能差距很大
缺点:
1.因为和内核无关 所以内核就完全不知道用户级线程的存在
2.系统调用的阻塞问题 在基于进程机制的OS中 大多少数系统调用将使进程阻塞 因此 当线程执行一个系统调用时 不仅线程被阻塞 进程内的所有线程都会被阻塞 而内核支持线程中进程中的其他线程仍然可以运行
(简单来说就是 线程执行系统调用可能会发生阻塞 而如果使用用户级线程就会在该线程阻塞时进程的所有线程都会发生阻塞(原因在第三点) 而内核进程其他的线程则可以继续运行)
3.(重点)单纯的用户级线程实现方式中 多线程应用不能利用多处理机进行多重处理的优点 内核每次分配给一个进程的仅有一个CPU 进程中仅有一个线程能执行 在该线程放弃CPU之前其他CPU只能等待 这里也是为什么第二点 所有线程都会发生阻塞的原因
优点:
1.节省模式切换的开销 因为所有线程的管理数据结构均在该进程的用户空间中
2.每个进程可以选择适合自己的调度算法
3.用户线程甚至可以在不支持线程机制的操作系统平台上实现 因为用户级线程的实现与OS平台无关 线程管理的代码时属于用户程序的一部分
用户级线程和内核支持线程组合
多对一
多个同进程的用户线程映射到一个内核控制线程 这些用户线程运行和调度管理都是在相应进程的用户空间中完成 仅当用户线程需要访问内核时 才将其映射到一个内核控制线程中 每次只允许一个线程进行映射
优点:开销小,效率高,
缺点:
1.一个线程在访问内核时发生阻塞 整个进程就会阻塞
2.任意时刻只有一个线程能够访问内核 多个线程不能同时在多个处理机上运行
一对一
每一个用户级线程映射到一个内核支持线程
优点:
1.当一个线程阻塞时 运行调度另一个线程运行 并发功能好
2.在多处理机系统中 允许多个线程并发的允许在多处理机系统上
缺点:每创建一个用户线程 相应的都要创建一个内核线程 开销大 限制了整个系统的线程数
多对多
多个用户线程映射到同样数量或者更少数量的内核线程上 映射数量是可以变换的
优点就是可以像一对一 也可以像一对多