1.进程和线程
进程的两个特性:分配资源(内存、设备、文件等),被调度执行(CPU时间片)
进程:分配资源的单位,不频繁地进行切换
线程:被调度运行的单位,不拥有资源,可频繁调度切换,轻装运行,也被称为轻装LWP
要注意:线程≠子进程,光是资源这一点来说就完全不一致,子进程拥有自己的一份代码空间和数据集,而线程的资源则是共享的。不是自己所私有的。
多个线程共享进程空间(内存、文件等),通信快
子进程空间各自独立,通信时需要借助IPC机制(进程间通信,如消息、管道、信号、共享内存区等),慢
进程和线程的区别:
进程是资源分配和抢占CPU的单位,进程的资源以及地址空间供其所有的线程共享
线程不拥有系统资源,线程的执行环境小,同一进程的不同线程间切换和通信时开销小
线程是一个进程内部的基本流调单位。一个进程可派生多个线程(执行多条代码流),线程间是并发执行的
1.1进程模型
单线程进程模型:此模型下只有一个用户栈和内核栈
多线程下,各进程拥有各自的寄存器和用户栈、内核栈,有独立的线程控制块对线程进行控制。
进程的所有线程共享该进程的用户地址空间和资源:所有线程可以访问同样的代码、数据和文件
资源利用率高。多线程并发执行。可以利用多核处理器
1.2多线程的优点
①创建/终止一个线程比创建/终止一个进程的时间要少。
②上下文切换开销少,对进程不频繁地进行切换,同一进程内各线程的切换速度快
③并发程度高,可利用多处理器结构,这个的含义是,当单线程时,多个模块只能串行执行,会造成另一CPU闲置,而多线程时,多个线程代码模块并发/并行执行
1.3线程的作用
前台/后台处理:一个进程产生多个线程来接收用户的不同请求,并分别放在前台和后台处理,后台任务在处理机闲置时进行
异步处理:将程序中可同时执行的若干部分或异步的外部事件用不同线程来同时执行和处理
远程过程调用RPC:对客户端发出的每个RPC使用一个独立的线程,获取服务器的响应
应用实例:Web服务器中,一个文件/通信服务进程可派生出多个线程,构成线程池。有请求时,唤醒一个工作者线程提供服务,服务完毕后放回池中休眠
2.线程的三种状态
线程的基本状态:运行态、就绪态、阻塞态
挂起/终止一个进程会导致其含有线程被同时挂起/终止
与进程类似,多个线程并发执行可以提高系统效率,但需要线程间的同步互斥
3.线程分类
3.1 用户级线程和内核级线程
用户级线程的创建、撤销和调度与OS内核无关,由用户空间中的线程库完成,OS内核并不知道用户级线程的存在,进程管理各自的线程
需要注意的是,当线程提出I/O时,线程自身不会变为阻塞态,而是这个线程所对应的进程进入了阻塞,这样做的目的是为了当进程解除阻塞态变为运行态时,线程能够立即进入运行态,减少调度时间,在用户级线程下,内核感知不到线程的存在,尽管I/O是线程提出的,内核依然认为是进程提出了I/O。
用户级线程的优点
①一个进程中的ULT切换时,不需要切换到系统态
②进程自己决定如何调度线程,更加灵活
③只要有线程库,用户级线程可以在任何OS上运行,而不需要修改底层的内核代码
用户级线程的缺点
①当ULT提出阻塞式系统调用时,将阻塞所属进程
②ULT对OS不可见,而CPU分配是以进程为单位进行分配的,因此无法利用多CPU结构
内核级线程的创建、撤销、调度、以及同步互斥由OS内核完成,OS通过TCB控制内核级线程。对内核级线程的管理类似于进程
那么最大的不同就是ULT管理机制下,TCB是放置进程内部,由进程自己管理的,而在KLT管理机制下,TCB与PCB是平级关系,都属于内核管理的范畴
内核级线程的优点
①可以同时把一个进程的多个KLT调度到多个CPU上
②一个KLT阻塞时,OS可以调度该进程的另一个KLT
内核级线程的缺点
在调度KLT时,需要切换到系统下,开销较大
用户级线程和内核级线程的比较
用户级线程(ULT) | 内核级线程(KLT) | |
调度和切换 | 在一个进程的线程间切换,快,以进程为单位分配CPU,无法利用多CPU结构 | OS管理内核级线程,以内核级线程为单位分配CPU。可以利用多CPU结构 |
当调用阻塞式系统调用时 | 阻塞该用户级线程所属的进程 | 只阻塞内核级线程本身 |
运行时间 | 一个进程内所有用户级线程分享一个时间片 | 每个内核线程运行一个时间片 |
4.其他方案
线程:进程 | 描述 | 实例系统 |
1:1 | 传统的单线程进程。一个进程只产生一个线程 | UNIX |
M:1 | 一个进程拥有地址空间和资源。在该进程中创建和执行多个线程 | Windows NT |
1:M | 一个线程可从一个进程环境迁移到另 一个进程环境,甚至横跨不同计算机。 线程迁移时携带状态信息。 | RS |
M:N | 多个线程可在一个域(地址空间)中 执行,应用程序可能在多个域中执行 (产生多个进程)。线程可在域间迁移。 | TRIX |
在多核系统上,多线程可提升程序加速比和数据库负载及吞吐量。