线程
线程
进程模型基于两个独立的概念
-
资源分配单位————操作系统实施保护功能,以防止进程间发生可能的冲突
-
调度单位————一个进程可能通过一个或多个程序段执行轨迹,形成进程内多个执行流
拥有资源所有权的仍称之为进程,调度的单位称之为线程
资源存在于内存中,切换进程时,需要执行一系列指令并通过切换映射表来切换内存资源,这样一来进程切换的代价就太大了。因此在进程切换时只进行线程的切换,不来回切换资源(如内存)
线程切换的实质就是映射表不变,pc指针改变。
线程控制块TCB
引入线程的好处:
-
并发执行在线程实体上,即处理机的调度(分配)发生在线程之间,减少了系统的时空开销。
-
系统创建或终止一个线程的开销要比创建或终止一个进程的开销小得多
-
线程之间通信效率要高于进程之间通信效率,进程之间的通信需要内核的介入。
线程与进程的比较
-
调度———同一进程内线程切换不会引起进程切换 | 不同进程中的线程切换才会发生进程切换
-
并发性———进程之间可以并发执行 | 进程之间也可以并发执行
-
系统资源———进程是资源的分配单位(拥有者) | 线程共享进程所拥有的的全部资源
-
系统开销———进程创建和撤销开销大于线程 | 进程切换开销大于进程内线程
用户级线程
用户级线程是操作系统提供在用户空间执行的线程库
- 线程库是一组供应用程序共享的应用及软件包
- 该线程库提供创建、调度、撤销线程功能
- 在用户态完成
- 对内核是透明的
- 用户线程调度算法决定哪个线程运行,与内核无关,内核只对进程管理
用户级线程代替核心级线程的优点
- 避免在用户、内核之间来回进行模式切换
- 线程之间切换算法可由应用程序确定,线程的切换不会干扰内核调度
- 用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程的实现
用户级线程缺点(主要是由于每次只能有一个线程进入内核执行,而操作系统只感知进入内核的线程,对于操作系统而言,这个进入内核的线程就是整个进程。)
-
用户程序不能充分利用多处理机技术。对于多线程用户程序,由于每次只能有一个线程进入内核,造成其他的处理机不能同时为这个多线程程序服务
-
用户级线程的阻塞,造成它所在的进程中所有线程都被阻塞。
上图中,如果进程1的某个线程在系统调用时,进入内核后阻塞了,由于线程对内核是透明的,系统看不到进程1在用户态的其他线程,于是发生阻塞后,内核会切换到进程2执行。
核心级线程
核心级线程的主要特点
-
线程控制块TCB在系统空间
-
给应用程序提供相应系统调用和应用程序接口,以创建、执行和撤销线程
-
核心级线程可以被调度到不同处理机(下图中的p)上并行执行
-
内核同时负责进程内不同线程调度工作(状态转换),不会出现进程处于阻塞,线程处于执行的状态
核心级线程的核心:用户态线程切换时,由于只能有一个线程进入内核,所以切换线程时,切换TCB,根据TCB中保存的用户栈地址切换到其他线程的用户栈;而核心级线程每一个线程都处于内核中。所以核心态线程切换时,切换TCB,根据TCB切换一套栈(用户栈和核心栈)。
核心级线程的一套栈:核心栈关联着用户栈组成一套栈
线程调度
1.- 用户级线程
-特点
- 内核表现为仅对进程给与时间片控制(内核不知道线程的存在,只知道自己把时间片给了进程)
- 用户中线程调度决定那个线程运行,与内核无关(进程拿到时间片,再由调度算法决定给哪个线程,而且由于多道线程不存在时钟中断,所以得到时间片的线程可以按其意愿运行任意长时间,如果一个时间片用完了还没完成,那么在下次该进程得到时间片时,该线程还会继续拥有时间片执行)
- 若线程用完了分配给进程的时间片,内核就会选择另一个进程投入运行
- 核心级线程
内核选择一个线程运行,赋予时间片,不考虑线程属于哪一个进程。线程用完了时间片就会被内核强制挂起
由于用户级线程的切换只需要少量的机器指令,而内核级线程的切换则需要完整的上下文切换,修改内存映像,使高速缓存失效。因此,在同等条件下的两个处于就绪队列中的,内核更倾向于先执行与上一次执行的线程在同一个进程中的线程。
线程的应用
- 服务器中的文件管理和进程通信控制
- 前后台处理
- 异步处理
- 数据的批处理
- 网络系统中信息发送和接受
-... ...