进程

程序的概念:程序就是一个指令序列,早期的计算机只支持单道程序,程序是静态的

引入多道程序技术以后,为了方便操作管理,完成各个程序并发执行,引入了进程,进程实体的概念,进程是动态的

内存中同时放入多道程序,各个程序的代码,运算数据存放的位置不同,操作系统通过进程控制块(PCB)来描述进程的各种信息,如程序代码存放位置

进程实体:程序段,数据段PCB三部分组成了进程实体,一般情况下称为进程,创建进程就是创建PCB,撤销进程就是撤销PCB

在这里插入图片描述

PCB是进程存在的唯一标志

进程是进程定义的运行过程,是系统进行资源分配和调度的一个独立单位

在这里插入图片描述

进程控制块PCB

1.PCB中记录了操作系统所需的,用于描述进程的当前情况以及控制进程运行的全部信息

2.PCB的作用是使一个在多道程序环境下不能独立运行的程序,成为一个独立运行的基本单位,可以与其他进程并发进行

3.操作系统对并发的执行就是通过对PCB进行控制和管理来实现的

进程的组织

进程的组织方式有两种,链接方式和索引方式

  1. 链接方式

    1. 就是按照进程状态将PCB分为多个队列
    2. 操作系统持有指向多个队列的指针
    3. 优先级别高的进程放在队头
  2. 索引方式

    1. 根据进程的不同建立几张索引表
    2. 操作系统持有各个索引表的指针

    在这里插入图片描述

进程的状态及转换

总览

在这里插入图片描述

进程的状态

进程是程序的一次执行,在执行的过程中,有的程序被CPU处理,有的又需要等待CPU,所以进程的状态在不断的变化,为了方便队进程的管理,操作系统需要将进程分为几种状态

运行态(Running):占用CPU,并在CPU上运行,单核的CPU每一时刻最多只能处理一个进程,双核可以同时处理两个进程

就绪态(Ready):已经具备运行条件,但是没有空闲的CPU,所以暂时不能运行

注意:就绪态此时已经拥有除了CPU以外的所有资源,一旦有CPU,立马可以进行运行

阻塞态(Waiting/Blocked):等待某一件事而不能运行,等待操作系统分配打印机,等待读磁盘的操作等。

上面是基本的状态,下面是另外的两种状态

进程创建之前

创建态:又称新建态,进程正在被创建,操作系统为进程分配资源,初始化PCB

进程运行之后

终止态:进程从系统中撤销,操作系统回收进程拥有的资源,撤销PCB

状态转换

在这里插入图片描述

原语对进程的控制

img

知识回顾

什么是原语:原语是一种特殊的程序,最接近硬件的部分,这种程序的运行具有原子性,运行时间短,调用频繁

原语的特点是执行期间不允许中断,一气呵成,这种不可中断的操作为原子操作

原语一般包括设备驱动,CPU切换

进程控制

对系统中的进程进行有效的管理,创建新的进程,撤销已有的进程,实现进程切换的功能

在这里插入图片描述

操作系统通过原语来进行进程的控制

进程控制的五种原语

五种原语:创建,中止,唤醒,阻塞,切换

1.进程的创建原语

在这里插入图片描述

2.进程的中止原语

在这里插入图片描述

3.进程的唤醒原语 4.进程的阻塞原语

进程的唤醒源于和进程的阻塞原语必须成对使用

阻塞原语:由运行态到阻塞态,由系统的自我调用实现

唤醒原语:由阻塞态到运行态

在这里插入图片描述

5.进程的切换原语

在这里插入图片描述

进程的通信

img

进程间的通信(IPC) 指的是两个进程之间产生数据交互

进程是分配系统资源的单位(包括内存地址空间),因此个进程拥有的内存地址空间相互独立

因此需要操作系统的支持完成进程之间的通信

共享存储

进程可以申请共享存储区,可以被其他进程所共享。 P向Q传递数据,可以P 向共享存储区传递数据,Q从共享存储区提取数据。如果多进程共享存储,可以存在冲突,所以要保证各个进程对共享空间的访问应该是互斥的。

基于存储区的共享方式:操作系统只负责划分区域,而数据形式存放位置由通信进程控制,而不是操作系统,是一种高级的通信方式

基于数据结构的共享方式:低级的通信方式

消息传递

进程间的数据交换以格式化的消息为单位,进程通过操作系统提供的”发送消息/接收消息”两个原语进行数据交换

分为直接通信方式:消息发送进程要指明接收进程的ID

image-20230428082139459

间接通信方式:通过信箱间接的通信,信箱通信方式

image-20230428082527429

img

管道通信

img

对于第5条的补充,解决方案有两种:1.一个管道允许多个写进程,一个读进程

2.允许多个写进程,多个读进程,但是系统会让各个进程轮流从管道中读数据

写进程往管道写数据,即使管道没被写满,只要管道没空,读进程就可以从管道读数据

读进程从管道读数据,即便是管道没被读空,只要管道没满,写进程就可以往管道写数据