一、线程与进程
1、在没有线程概念的系统中,进程是:
- 资源分配的单位;
- 调度/执行的单位;
2、主要的问题:
- 进程切换的开销大——每次切换都要保存和恢复进程映像;
- 进程占用的资源多——多个同类进程需占用多份资源,而一个进程中的多个同类线程则共享一份资源;
3、定义:线程是一个进程内CPU的基本调度单位。
4、多线程环境下的进程和线程:在多线程操作系统中,进程是拥有系统资源的基本单位,包含多个线程,为其提供资源(线程本身无法直接调用系统资源),而进程本身不再作为可执行的实体。当进程执行的时候实际上是其中某个线程在执行。
进程是资源分配和保护的单位:
- 拥有用于保存进程映像的虚地址空间;
- 受保护地访问处理器、其他进程、文件和I/O资源
- 进程的创建/切换需要创建/切换进程映像
线程是分派的执行单位:
- 包含线程的执行状态;(运行、就绪等状态)
- 保存的线程的CPU上下文;(在线程处于非运行态时保存到线程控制块中)
- 一个执行时的栈;
- 独立的用来存储局部变量的静态存储空间;
- 对进程的内存和其他资源的访问;(与同一进程内的其他线程共享这些资源)
5、线程的本质是将原本为实现进程的时间片划分得更细,也为了让进程可以“同时”进行多种不同功能的操作(比如计算机网络中套接字编程时创建一个接收线程和发送线程)。
6、线程的优点:
- 在已有的进程内创建速度快;
- 终止线程所用的时间少;
- 线程切换需要的时间少,保存和恢复的工作量小;
- 通信效率高,在同一进程内无需调用OS内核,可利用共享的存储空间;
- 占用的资源少;
7、线程的应用:若应用程序可按功能划分成不同的小段或可划分成一组相关的执行实体,则用一组线程可提高执行效率;
- 服务器中的文件管理或通信控制;
- 前台交互和后台更新数据;
- 异步处理、加速执行;
- 模块化程序结构;
8、线程的执行特征:
- 同一个进程内的所有线程共享进程代码和地址空间(线程的CS和DS与进程的相同);线程拥有少量的私有资源,包括自己的寄存器上下文和栈空间,用于存储局部变量和调用参数,运行期间可拥有CPU资源。
- 挂起、终止状态是进程级的概念:挂起一个进程,则该进程的所有线程也挂起(共享地址空间的体现);终止一个进程,则该进程的所有线程也终止(共享代码段的体现)。
9、线程的状态:
- 派生(spawn):线程可派生新线程;
- 阻塞:等待事件发生;
- 唤醒:事件发生后被唤醒,转换到就绪态;
- 调度(schedule):由操作系统将就绪态的线程调度到处理器中执行;
- 完成:释放寄存器上下文和栈;
二、线程的分类
1、用户级线程ULT和内核级线程KLT:
用户级线程:线程管理均由应用程序完成,与内核无关,内核不知道线程的存在。
优点:
- 线程切换不需要进行模式切换;
- 不需要内核支持,线程库可以在任何操作系统上运行;
- 调度算法可以是应用程序的专用算法;
缺点:
- 一个线程阻塞会导致整个进程阻塞;(因为该进程的所有线程对内核来说都是一个调度实体,内核不知道这个进程有哪些线程,无法将其他线程调度到处理器上)
- 不适用于多核/多处理器技术;
内核级线程:线程管理由内核提供API完成,内核的调度是基于线程进行的。(Windows、Linux、iOS)
优点:
- 线程阻塞不会导致对应的进程阻塞;
- 可以利用多核和多处理器技术;
- 内核例程本身也可以使用多线程;
缺点:
- 线程切换需要进行模式切换;
2、现代操作系统结合了用户级线程和内核级线程模型,其中用户级的执行系统负责进程内部在非阻塞时的切换,而内核级的系统负责阻塞线程的切换,即同时实现内核级和用户级的线程管理。
三、其他相关知识
1、微内核( Microkernels):
基本思想:只有最基本的OS功能放在内核中运行在内核模式,其他运行在用户模式;
特点:垂直分层;客户/服务器结构;
优点:
- 所有服务都以消息的形式提供,允许增加新的服务;
- 把系统移植到新处理器上只需要对内核而不需要对其他服务进行修改
三种微内核操作:
- 授权:一个地址空间的所有者可以授权另一个进程使用它的某些页;
- 映射:一个进程可以把它的任何页映射到另一个进程的地址空间,使得两个进程都可以访问这些页;
- 刷新:进程可以回收授权给其他进程或映射到另一个进程的任何页;
2、进程间的通信:
- 消息是进程间通信的基本形式;
- 消息结构为:消息头+消息体;
- 端口:发往某个特定进程的消息序列;