1. 进程
用户下达运行程序的命令后,就会产生进程。同一程序可产生多个进程(一对多关系),以允许同时有多位用户运行同一程序,却不会相冲突。
进程需要一些资源才能完成工作,如CPU使用时间、内存、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程。
内容
一个计算机系统进程包括(或者说“拥有”)下列数据:
- 那个程序的可运行机器码的一个在内存的映像。
- 分配到的内存(通常是虚拟的一个内存区域)。内存的内容包括可运行代码、特定于进程的数据(输入、输出)、调用堆栈、堆栈(用于保存运行时运输中途产生的数据)。
- 分配给该进程的资源的操作系统描述符,诸如文件描述符(Unix术语)或文件句柄(Windows)、数据源和数据终端。
- 安全特性,诸如进程拥有者和进程的权限集(可以容许的操作)。
- 处理器状态(内文),诸如寄存器内容、物理内存定址等。当进程正在运行时,状态通常存储在寄存器,其他情况在内存。
状态
进程在运行时,状态(state)会改变。所谓状态,就是指进程目前的动作:
- 新生(new):进程新产生中。
- 运行(running):正在运行。
- 等待(waiting):等待某事发生,例如等待用户输入完成。亦称“阻塞”(blocked)
- 就绪(ready):排班中,等待CPU。
- 结束(terminated):完成运行。
各状态名称可能随不同操作系统而相异;对于单CPU系统(UP),任何时间可能有多个进程为等待、就绪,但必定仅有一个进程在运行。
2.进程控制块
进程控制块(PCB,Process Control Block),是操作系统核心中一种数据结构,主要表示进程状态。
虽各实际情况不尽相同,PCB通常记载进程之相关信息,包括:
- 进程状态:可以是new、ready、running、waiting或 blocked等。
- 程序计数器:接着要运行的指令地址。
- CPU寄存器:如累加器、变址寄存器、堆栈指针以及一般用途寄存器、状况代码等,主要用途在于中断时暂时存储数据,以便稍后继续利用;其数量及类别因电脑架构有所差异。
- CPU排班法:优先级、排班队列等指针以及其他参数。
- 内存管理:如页表等。
- 会计信息:如CPU与实际时间之使用数量、时限、账号、工作或进程号码。
- 输入输出状态:配置进程使用I/O设备,如磁带机。
总言之,PCB如其名,内容不脱离各进程相关信息。
3.页表
在操作系统中使用虚拟内存,每个进程会认为使用一块大的连续的内存。事实上,每个进程的内存散布在物理内存的不同区域。或者可能被调出到备份存储中(一般在硬盘)。当一个进程请求自己的内存,操作系统负责把程序生成的虚拟地址,映射到实际存储的物理内存上。操作系统在分页表中存储虚拟地址到物理地址的映射。每个映射被称为分页表项(PTE—)。
转换过程
CPU的内存管理单元(memory management unit MMU)存储最近用过的映射缓存,来自操作系统分页表。被称为转译后备缓冲器(translation lookaside buffer, TLB)。TLB是一个索引缓存。
转换失败
有两种原因导致分页表查找失败。第一种,如果该地址没有可用的转换,这意味该虚拟地址的存储器访问是无效的。这通常是程序错误导致,操作系统需要处理这个问题。现代操作系统会发送一个段错误信号给出错程序。
当物理内存中不存在这个页,也会引起分页表查找失败。如果请求的页面被调出物理内存,给其他页腾出空间,会引起这个错误。这种情况下,页被分配到存储在介质上的辅助存储,例如硬盘。(这种辅助存储,或叫备用存储,如果是一个硬盘分区或者交换文件, 经常称之为交换分区,如果是文件,叫做分区文件或页文件。)这时候,分页需要从硬盘放回到物理内存中。
当物理内存没满的时候,这是一个简单操作。页被写回物理内存,页表和转换备用缓冲会更新,指令重启。然而,当物理内存已满,一个或多个页要被调、为请求的页面腾出空间时候。页表需要更新,标识出那些在物理内存被调出的页,然后标识那些从硬盘调入物理内存的页。TLB也需要更新,包括去掉调出的页,重启指令。页的调入调出请见页置换算法。
4.线程
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
线程是独立调度和分派的基本单位。线程可以操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
一个进程可以有很多线程,每条线程并行执行不同的任务。
在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责IO处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。