2.1 进程与线程
2.1.1 进程的概念和特征
进程的概念
从不同角度,进程可以有不同定义,比较典型的有:
1)进程是程序的一次执行过程。
2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3)进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block, PCB)。系统利用PCB来描述进程的基本情况和运行态,进而控制和管理进程。
相应地,由程序块、相关数据段和PCB三部分构成了进程映像(进程实体)。所谓创建或撤销进程,实质上是创建或撤销进程的PCB。
引入了进程实体的概念后,可把传统操作系统中的进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
进程的特性
动态性、并发性、独立性、异步性、结构性。(不需要记忆,理解即可)
2.1.2 进程的状态和转换
五种状态:
状态 | 说明 |
---|---|
运行态 | 进程正在处理机上运行。 |
就绪态 | 进程已处于准备运行的状态,即进程获得了除处理机以外的一切资源。 |
阻塞态/等待态 | 进程正在等待某一事件而暂停运行。 |
创建态 | 进程正在被创建。尚未转到就绪态。 |
结束态 | 进程正从系统中消失。 |
三种基本状态
运行态、就绪态、阻塞态。
进程状态的转换:
就绪态->运行态:处于就绪态的进程被调度后,获得处理机资源。
运行态->就绪态:处于运行态的进程在时间片用完后,让出处理机。
运行态->阻塞态:进程请求某一资源的使用和分配或等待某一事件的发送时,就从运行态转换为阻塞态。
阻塞态->就绪态:进程等待的事件到来时,就从阻塞态转换为就绪态。
2.1.3 进程控制
一般把进程控制用的程序段成为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。
进程的创建(创建原语)
1>为新进程分配一个唯一的进程标识号,并申请一个空白的PCB。若PCB申请失败,则创建失败。
2>为进程分配资源,为新进程的程序和数据及用户栈分配必要的内存空间(在PCB中体现)。若资源不足,处于阻塞态。
3>初始化PCB。
4>若进程就绪队列能够接纳新进程,则将新进程插入就绪队列,等待被调度运行。
进程的终止(撤销原语)
1>根据被终止进程的标识符,检索PCB,从中读出该进程的状态。
2>若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。
3>若该进程还有子进程,则应将其所有子进程终止。
4>将该进程所拥有的全部资源归还给其父进程,或归还给操作系统。
5>将该PCB从所在队列(链表)中删除。
进程的阻塞(阻塞原语)
1>找到将要被阻塞进程的标识号对应的PCB。
2>若该进程为运行态,则保护其现场,将其状态转为阻塞态,停止运行。
3>把该PCB插入相应事件的等待队列。
进程的阻塞(唤醒原语)
1>在该事件的等待队列中找到相应进程的PCB。
2>将其从等待队列中移出,并置其状态为就绪态。
3>把该PCB插入就绪队列,等待调度程序调度。
2.1.4 进程的组织
进程控制块
PCB通常包含的内容:
进程描述信息 | 进程控制和管理状态 | 资源分配清单 | 处理机相关信息 |
---|---|---|---|
进程标识符PID | 进程当前状态 | 代码段指针 | 通用寄存器值 |
用户标识符UID | 进程优先级 | 数据段指针 | 地址寄存器值 |
代码运行入口地址 | 堆栈段指针 | 控制寄存器值 | |
程序的外存地址 | 文件描述符 | 标志寄存器值 | |
进入内存时间 | 键盘 | 状态字 | |
信号量使用 |
程序段
程序段就是能被进程调度程序调度到CPU执行的程序代码段。
数据段
一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。
2.1.5 进程的通信
进程通信是指进程间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方式主要有以下三类:
共享存储
在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行读写操作实现信息交换,
消息传递
进程间的数据交换是以格式化的消息为单位的。进程通过系统提供的发送消息和接收消息两个原语进行的数据交换。
管道通信
“管道”是指用于连接读进程和写进程以实现它们之间的通信的一个共享文件。可以理解为共享存储的优化和发展,属于半双工通信。
2.1.6 线程模型和多线程模型
线程的基本概念
线程最直接的理解是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合、堆栈组成。
线程与进程的比较
进程 | 线程 | |
---|---|---|
调度 | 传统操作系统中,拥有资源和独立调度的基本单位都素进程。 | 引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。 |
并发性 | 进程之间可以并发执行。 | 不仅进程,线程之间也可以并发执行,提高了系统的吞吐量。 |
系统开销 | 创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等,开销较大。 | 切换线程时只需保存和设置少量寄存器内容,开销很小。 |
地址空间 | 进程的地址空间之间相互独立。 | 同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见。 |
通信方面 | 进程间通信需要进程同步和互斥手段的辅助。 | 线程间可以直接读/写进程数据段(如全局变量)来进行通信。 |
线程的属性
1>不拥有系统资源,但每一个线程都应有一个唯一的标识符和一个进程控制块。
2>不同的线程可以执行相同的程序。
3>同一个进程中的各个线程共享该进程所拥有的资源。
4>多个线程可以并发执行。
5>线程在生命周期内会经历阻塞态、就绪态和运行态等各种状态变化。
线程的实现方式
用户级线程:线程管理的所有工作都由应用程序完成。
内核级线程:线程管理的所有工作由内核来完成。
多线程模型
(1)多对一模型。将多个用户级线程映射到一个内核级线程。
优:线程管理在用户空间进行,因而效率较高。
缺:一个线程在使用内核服务时被阻塞,所有线程都会被阻塞。
(2)一对一模型。将每个用户级线程映射到一个内核级线程。
优:一个线程被阻塞后,允许另一个线程继续执行。
缺:每创建一个用户级线程都要创建一个内核级线程与其对应,创建线程的开销较大。
(3)多对多模型。将n个用户级线程映射到m个内核级线程,要求m<=n。
具备多对一和一对一各自的优点,同时对各自的缺点进行折中。