线程
进程
是资源分配
的基本单位线程
是分派
和调度
的基本单位多线程:
操作系统在单个进程内
支持多个并发执行路径的能力
- 线程存储模型:
- 线程的优先级、执行状态
- 未运行时保存的线程上下文
- 执行栈
- 用于局部变量的一些静态存储空间
- 与进程内其他线程共享的内存和资源的访问
- 线程的优点:
- 线程的
创建
、终止
和切换
所需时间远小于进程
(1)同一进程中,线程的切换不会引起进程的切换
(2)不同进程中,线程的切换会引起进程的切换- 线程间的通信不需内核的介入,多个线程共享内存和文件,因此通信效率更高
- 线程的状态:
线程的状态
:运行态
、就绪态
、阻塞态
挂起态
对线程没有意义,仅适用于进程- 如果一个进程被换出,由于所有线程都共享进程的地址空间,因此所有线程都须被换出
- 一个线程可以创建一个或多个线程,但不能创建进程
线程分类
- 分类:
用户级线程(ULT)(协程)
、内核级线程(KLT)
- 用户级线程(协程):
- 用户级线程的管理由
应用程序
完成,无TCB- 内核意识不到线程的存在,内核以
进程为单位
进行调度- 描述此类线程的数据结构以及控制此类线程的原语在核外子系统中实现,在
用户模式
下运行
优点 | 缺点 |
---|---|
所有线程管理数据结构都在一个进程的用户地址空间中,线程切换不需要内核模式特权 ,节省了两次状态转换的开销 | 在ULT 执行一个系统调用时,不仅会阻塞这个线程,而且会阻塞进程中的其他线程 |
调度策略可因应用程序的不同而不同 | 在纯ULT策略中,多线程应用程序不能利用多处理技术 |
ULT可在任何操作系统中运行 ,不需要对底层内核进行修改以支持ULT |
- 内核级线程:
- 内核完成进程及进程内的每个线程上下文的维护
- 调度是基于
线程
进行的- 描述此类线程的数据结构以及控制此类线程的原语在核心子系统中实现
- 混合方法:
- 线程的创建完全在用户空间中完成,线程的调度和同步也在用户程序中进行
- 一个应用程序的
多个用户级线程
会被映射到一些(小于等于用户级线程)内核级线程
上
- 数量关系:
协程*
- 协程本质上是一种
用户态的轻量级线程
,拥有自己的寄存器上下文
和用户栈
,切换时先将寄存器上下文和栈保存,等切换回来的时候再恢复- 一个线程可以有多个协程,当⼀个协程执行完成后,可以选择主动让出,让另⼀个协程运行
- 协程并没有增加线程的数目,只是在线程的基础上通过时分复用的方式运行多个协程
- 协程的切换在用户态完成,切换的开销比线程从用户态到内核态的要小很多
- 协程的切换时机由用户决定,而线程的切换时机由操作系统决定
- 为什么需要协程:
节约系统开销:
协程的切换在用户态中完成,避免了系统级线程频繁切换造成的系统开销节约内存:
(1)系统内存的制约使得无法开启大量的线程实现高并发,在协程编程模式下,可以轻松有十几万协程
(2)协程的栈内存很小,且动态变化,需要多少用多少,大概4~5K
,而传统POSIX线程栈内存1~8M
开发效率:
使用协程可以很方便的将一些很耗时的IO操作异步化执行效率:
同一线程内的多个协程,控制共享资源时不需要加锁,因此执行效率高很多
相关问题
- 进程与线程的区别:*
- 进程是资源分配的基本单位,线程是调度的基本单位
拥有资源:
进程是拥有系统资源的基本单位,具有独立的地址空间;线程不拥有系统资源,但同一进程的线程共享进程的系统资源通信方面:
同一进程中的线程共享全局变量,静态变量等数据,因此通信方便;进程间的通信需要借助操作系统提供的通信机制(IPC)完成系统开销:
线程的创建、切换和终止所需要的系统开销都要少于进程可靠性:
多进程程序鲁棒性更强,进程间不会相互影响;多线程程序中单个线程崩溃会导致进程中其他线程的崩溃