![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ee75e1a8caaedfc93a7074a1ff83902e.png)
进程
概念
程序:是静态的,是内存放在磁盘里的可执行文件下,是一系列指令的集合。
进程:是动态的,是程序的一次执行过程。
了解进程与程序的主要区别:
(1)程序是存在在外存上的,是永久的;进程是有生命周期的,是程序在数据集上的一次执行,有创建有撤销;
(2)程序是静态的概念,进程是动态的概念;
(3)进程具有并发性,而程序没有;
(4)进程是分配计算机资源的基本单位,程序不是;
(5)进程和程序不是一―对应的:一个程序可对应多个进程即多个进程可执行同一程序;一个进程可以执行一个或几个程序;
(6)进程除了包含代码和数据外,还包括进程存在的唯一标识PCB。
组成
PCB
- 当进程被创建时,操作系统会为该进程分配唯一的不重复的“PID”。
- 操作系统要记录PID,进程所属用户ID(UID)用于区分各个进程。记录给进程分配了哪些资源,如正在使用哪些I/O设备,正在使用哪些文件等,用于实践操作系统对资源的管理;记录进程的运行情况,如CPU使用时间,磁盘使用时间,网络流量使用情况等,用于实现操作系统对进程的控制,调度。这些信息被保存在一个数据结构PCB中,即进程控制块。操作系统需要对各个并发运行的进程进行管理,只要管理时所需信息都会被放在PCB中。
- PCB是进程存在的唯一标志,当进程被创建时,操作系统为其创建PCB;进程结束时,会回收PCB。
程序段
程序的代码,或指令序列。
数据段
运行过程中产生的各种数据。
PCB是给操作系统用的,程序段和数据段是给进程自己用的。
一个进程实体(进程映像)由PCB,程序段,数据段组成。
进程是动态的,进程实体是静态的。进程实体反映了进程在某一时刻的状态。进入进程实体的概念后,可把进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。PCB是进程存在的唯一标志。
特征
- 动态性:进程最基本的特征。进程是程序的依次执行过程,是动态地产生,变化和消亡的。
- 并发性:内存中有多个进程实体,各进程可以并发执行。
- 独立性:进程是能独立运行,独立获得资源,独立接受调度的基本单位。
- 异步性:各进程按独立自主的不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题。
- 结构性:每个进程都会配置一个PCB。
状态
- 创建太(新建态):进程正在被创建时,它的状态是“创建态”,在这个阶段操作系统会为进程分配资源,初始化PCB。
- 就绪态(等待态):当进程创建完成后,便进入就绪态,处于就绪态的进程已具备运行条件,但由于没有空闲CPU,就暂时不能运行。
- 运行态:如果一个进程此时在CPU上运行,那么这个进程处于“运行态”,CPU会执行该进程对应的程序(执行指令序列)。
- 阻塞态:在进程运行过程中,可能会请求等待某个事件的发生,在这个事件发生之前,进程无法继续往下执行,此时操作系统就会让这个进程下CPU在,并进入阻塞态。
- 终止态(结束态):一个进程可以执行exit系统调用,请求操作系统中值该进程,此时该进程会进入“终止态”,操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收PCB。
状态间的转换
阻塞–>就绪:不是进程自身控制的,是被动的;
运行–>阻塞:是进程自身做出的主动行为。
进程PCB中会有一个变量state来表示进程的当前状态。
控制
实现进程状态转换,用原语实现。
原语是一种特殊的程序,它的执行具有原子性。这段程序必须一气呵成,不可中断,否则会导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作。
原子性的实现:“关中断指令”和“开中断指令”两个特权指令。
进程控制相关原语
-
进程的创建
创建原语:申请空白PCB,为新的进程分配所需资源,初始化PCB,将PCB插入就绪队列。
引起进程创建的条件:用户登录,作业调度,提供服务,应用请求。 -
进程的终止
撤销原语:从PCB集合中终止进程的PCB,若进程正在运行,立即剥夺CPU,将CPU分配给其他进程,终止所有子进程,将该进程拥有的所有资源归还给父进程或者操作系统,删除PCB。
引起进程终止的条件:正常结束,异常结束,外界干预。 -
进程的阻塞
阻塞原语:找到要阻塞的进程对应的PCB;保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止执行,将PCB插入相应事件的等待队列。
引起进程阻塞的条件:需要等待系统分配某种资源,需要等待相互合作的其他进程完成工作。 -
进程的唤醒
唤醒原语:在时间等待队列中找到PCB,将PCB从等待队列移除,设置进程为就绪态,将PCB插入就绪队列,等待被调用。
引起进程唤醒的事件:等待的事件发生。 -
进程的切换
切换原语:将运行环境信息存入PCB,PCB移入相应队列,选择另一个进程执行,并更新PCB,根据PCB恢复新进程所需的运行环境。
引起进程切换的事件:进程时间片到,有更高优先级的进程到达,当前进程主动阻塞,当前进程终止。
通信
进程通信(IPC)指两个进程之间产生数据交互
- 共享存储:通过增加“页表项/段表页”即可将同一片共享内存区域映射到各个进程的地址空间中。
基于数据结构的共享:比如共享空间里只能放一个长度为10的数组,这种共享方式速度慢,限制多,是一种低级通信方式。
基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式,放置位置都由通信进程控制,而不是操作系统,这种共享方式速度很快,是一种高级通信方式。 - 消息传递:进程间的数据交换以格式化的消息为单位,进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
直接通信方式:消息发送进程要指明接收进程的ID。
间接通信方式:通过“信箱”间接地通信,又称“信箱通信方式”。 - 管道通信:“管道”是一种特殊的共享文件,是在内存中开辟一个大小固定的内存缓冲区。
管道只能采用半双工通信,某一时间段内只能实现单向传输,如果要实现双向同时通信,则需设置两个管道。
各进程互斥地访问管道(由操作系统实现)。
当管道写满时,写进程将阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。
当管道读空时,读进程将阻塞,直到写进程在管道中写入数据,即可唤醒读进程。
管道中的数据一旦被读出去,就彻底消失,因此,当多个进程读同一个管道时,可能会错乱,对此有两种解决方案:1.一个管道允许多个写进程,一个读进程。2.允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据(Linux的方案)。
线程
有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序,为此引入了“线程”来增加并发度。
线程是一个基本的CPU执行单元,也是程序执行流地最小单元
引入线程机制后的变化
- 资源分配,调度:传统进程机制中,进程是资源分配。调度的基本单位。引入线程后,进程是资源分配的基本单位,线程是调度的基本单位。
- 并发性:传统进程机制中,只能进程间并发。引入线程后,各线程间也能并发,提升了并发度。
- 系统开销:传统的进程间并发需要切换进程的运行环境,系统开销大。线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,开销小。引入线程后,并发所带来的系统开销小。
属性
- 线城是处理机调度的基本单位
- 多CPU计算机中,各线程可占用不同的CPU
- 每个线程都有一个线程ID–线程控制块TCB
- 线程也有就绪,阻塞,运行三种基本状态,其切换方式与进程相同
- 线程几乎不用有系统资源
- 同一进程的不同线程间共享进程的资源
- 由于共享内存地址,同一进程中的线程间通信甚至无需系统干涉
- 同一进程中的线程切换不会引起进程切换
- 不同进程中的线程切换会引起进程切换
- 切换同进程内的线程系统开销很小
- 切换进程系统开销较大
实现方式
用户级线程
用户级线程由应用程序通过线程库实现,所有的线程管理工作都应由应用程序负责(包括线程切换)。
用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预,
在用户看来,是有多个线程,但在操作系统内核来看,并不意识到线程的存在。用户级线程就是“从用户视角能看到的线程”。
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
- 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核CPU上运行。
内核级线程
内核级线程的管理工作由操作系统内核完成。
线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下完成。
操作系统会为每个内核级线程就是“从操作系统内核视角能看到的线程”。只有内核级线程才是处理机调度的基本单位。
- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可以在多核处理机上并行执行。
- 缺点:一个用户进程会占用多个内核级线程,线程的切换由操作系统内核级完成,需要切换到核心态,因此线程的管理成本高,开销大。
多线程模型
在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型:
一对一模型
一个用户级线程映射到一个内核级线程在,每个用户进程有与用户级线程同数量的内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强,多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
多对一模型
多个用户级线程映射到一个内核级线程,且一个进程只被分配一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核CPU上并行运行。
多对多模型
n个用户级线程映射到m个内核级线程(n>=m)。每个用户级线程对应m个内核级线程。克服了多对一并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一中一个用具进程占用太多内核级线程,开销大的缺点。
组织与控制
TCB中包含:
- 线程标识符:TID,与PID类似
- 程序计数器PC:线程目前执行到哪儿
- 其他寄存器:线程运行的中间结果
- 堆栈指针:堆栈保存函数调用信息,局部变量等
- 线程运行状态:运行/阻塞/就绪
- 优先级:线程调度。资源分配的参考
其中程序计数器PC,其他寄存器和堆栈指针是线程切换时需要保存或者恢复的。