操作系统学习笔记「进程」

进程的定义

程序:就是一个指令序列。

程序的代码放在程序段内,程序运行过程处理的数据放在数据段内

早期的计算机只支持单道程序

在引入多道程序技术后,为了方便操作系统管理,完成各程序并发执行,引入了进程、进程实体的概念

系统为每个运行的程序配置一个PCB(Program Control Block),即程序控制块,用来描述进程的各种信息

进程实体(进程):由程序段、数据段、PCB组成

PCB是进程存在的唯一标志

进程的定义

  1. 进程是程序的一次执行过程
  2. 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
  3. 进程时具有独立功能的程序在数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位

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

进程的组成

graph LR 进程 --> PCB 进程 --> 程序段 进程 --> 数据段 PCB --> 进程标识符PID PCB --> 处理机状态 PCB --> 进程调度信息 PCB --> 进程控制信息

有关进程管理的所有数据都存放在PCB中

进程标识符PID: 当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的ID,用于区分不同的进程

进程的组织方式

一个系统中,通常由大量的PCB。为了能对它们进行有效的管理,需要使用适当的方式组织这些PCB

进程的组成讨论一个进程内部构成的问题

进程的组织方式讨论多个进程之间的组织方式问题

链接方式

按照进程状态将PCB分为多个队列,操作系统由指向各个队列的指针

graph LR 执行指针 --> 当前处于运行态的进程 就绪队列指针 --> 指向当前处于就绪态的进程5 --> 指向当前处于就绪态的进程1--> 指向当前处于就绪态的进程4 阻塞队列指针

⚠️通常会把优先级高的进程放在队头

索引方式

根据进程状态不同,建立几张索引表,操作系统持有指向各个索引表的指针

graph LR 执行指针 --> 当前处于运行态的进程1 就绪表指针 --> 就绪索引表--> 指向当前处于就绪态的进程5 就绪索引表 --> 指向当前处于就绪态的进程4 阻塞队列指针 --> 阻塞索引表 阻塞索引表 --> 指向当前处于阻塞态的进程2 阻塞索引表 --> 指向当前处于阻塞态的进程3

进程的特征

  • 动态性

    进程是程序一次执行过程,是动态地产生、变化和消亡的

  • 并发性

    内存中有多个进程实体,各程序可并发执行

  • 独立性

    进程是能独立运行、独立获得资源、独立接受调度的基本单位

  • 异步性

    各进程按各自独立的、不可预知的速度向前推进。

    (异步会导致并发程序执行结果具有不确定性)

  • 结构性

    每个进程都会配置一个PCB

进程程序是两个截然不同的概念

进程 --> 行中的

动态性是进程最基本的特征

进程的状态

进程的三种基本状态运行态、就绪态、阻塞态

  • 运行状态

    进程占有CPU,并在CPU上运行

    ⚠️单核处理机下,每个时刻最多只有一个进程处于运行态

  • 就绪状态

  • 进程已经具备运行条件,但由于没有空闲的CPU,而暂时不能运行

  • 阻塞状态

  • 进程因等待某一事件而暂时不能运行

  • 创建状态

  • 操作系统为该进程分配所需的内存空间等系统资源,并为其创建、初始化PCB

  • 终止状态

  • 进程运行结束,需要撤销进程。终止状态下,操作系统需要完成资源回收撤销PCB等工作

进程状态间的转换

graph LR 创建态 --> 就绪态 就绪态--> 运行态 运行态 --> 终止态 运行态 --> 就绪态 运行态 --> 阻塞态 阻塞态 --> 就绪态
  • 就绪态 --> 运行态

  • 当进程在就绪态被调度,则会变为运行态

  • 运行态 --> 就绪态

  • 处于运行态的进程时间片到,或处理机被抢占,则会变为就绪态

    ⚠️处理机与CPU不同,处理机包含CPU的一系列硬件

  • 运行态 --> 阻塞态

  • 处于运行态的进程以system_call的方式申请某种系统资源,或请求等待某个事件的发生,则会变为阻塞态

    ⚠️运行态--> 阻塞态是进程自身做出的主动行为

  • 阻塞态 --> 就绪态

  • 处于阻塞态的进程所申请的资源被分配,或等待的事件发生,则由阻塞态变为就绪态。

    ⚠️阻塞态-->就绪态不是进程自身能控制的,是一种被动行为

不能由阻塞态之间转换为运行态,也不能由就绪态之间转换为阻塞态

⚠️进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求

进程控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能

进程的控制就要实现进程状态转换

原语:用于实现进程控制

原语的特点是执行期间不允许中断

这种不可被中断的操作即原子操作

原语采用“关中断”和“开中断”指令实现

⚠️开/关操作的权限非常大,是只允许在核心态下执行的特权指令

进程控制相关原语

⚠️阻塞和唤醒要成对出现

原语言的作用

  1. 更新PCB中的信息

    • 所有的进程控制原语一定都会修改进程状态标志
    • 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
    • 某进程开始运行前必然要恢复其运行环境
  2. 将PCB插入合适的队列

  3. 分配/回收资源

进程的创建

graph LR 申请空白PCB --> 为新进程分配所需资源 --> 初始化PCB --> 将PCB插入就绪队列

引起进程创建的事件

  • 用户登录

    分时系统中,用户登录成功,系统会为其建立一个新的进程

  • 作业调度

    多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程

  • 提供服务

    用户向操作系统提出某些请求时,会新建一个进程处理该请求

  • 应用请求

    由用户进程主动请求创建一个子进程

进程的终止

graph LR A[从PCB集合中找到终止进程的PCB] --> B{进程正在进行}; B --是-->C[剥夺CPU,将CPU分配给其他进程]; C --> E[终止所有子程序] E --> F[将该进程拥有的所有资源归还给父进程或操作系统] F --> G[删除PCB] B --否-->G

引起进程终止的事件:

  • 正常结束
  • 异常结束
  • 外界干预

进程的阻塞

graph LR 找到要阻塞的进程对于的PCB --> 保护现场-->将PCB设置为阻塞态 --> 暂停进程 --> 将PCB插入相应事件的等待队列

引起进程阻塞的事件:

  • 需要等待系统分配某种资源
  • 需要等待相互合作的其他进程完成工作

进程的唤醒

graph LR 在事件等待队列中找到PCB --> 将PCB从等待队列中移除 --> 设置进程为就绪态 --> 将PCB插入就绪队列

引起进程唤醒的事件:

  • 等待的事件发生

进程的切换

graph LR 将运行环境信息存入PCB --> PCB移入相应队列 --> 选择另一个进程执行 --> 更新PCB --> 根据PCB恢复新进程所需的运行环境

引起进程切换的事件

  • 当前进程时间片到
  • 有更高优先级的进程到达
  • 当前进程主动阻塞
  • 当前进程终止

进程通信

进程通信:进程之间的信息交换

为了保证系统安全,一个进程不能直接访问另一个进程的地址空间

各进程拥有的内存地址空间相互独立。进程是分配系统资源的单位

共享存储

graph LR 进程1 --> 共享空间 -->进程2 进程2--> 共享空间 -->进程1

两个进程对共享空间的访问必须是互斥

基于数据结构的共享

这种共享方式速度慢、限制多,是一个种低级通信

比如共享空间内只能放一个长度为10的数组

基于存储区的共享

在内存中划出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。

相比之下,这种共享方式速度更快,是一种高级通信方式

管道通信

graph LR 进程1 --写数据--> A[(管道1)] --读数据--> 进程2 进程2--写数据--> B[(管道2)] --读数据--> 进程1

所谓管道,是指用于连接一个读进程和写进程以实现它们之间的通信的一个共享文件,又名pipe文件。

管道文件与其他文件不同,管道是一个固定大小的缓冲区,在Linux中,限制为4KB,当所有数据已被读取时,管道变空,此时,read()调用将默认阻塞。

  1. 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道
  2. 各进程要互斥地访问管道
  3. 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
  4. 如果没写满,就不允许读。如果没读空,就不允许写
  5. 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能由一个,否则可能会用读错数据的情况

消息传递

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

消息消息头和消息体组成

消息头包括:

  • 发送进程ID
  • 接受进程ID
  • 消息类型
  • 消息长度
  • .......

直接通信方式

graph LR 进程 --> B[消息1] subgraph A[消息缓冲队列] B --> C[消息2] C--> D[消息3] end

消息直接挂到接收进程的消息缓冲队列上

间接通信方式

graph TD 进程1 --> B subgraph A [信箱] B[消息] C[消息] D[消息] F[消息] end F --> 进程2

消息要先发送到信箱中

posted @ 2021-02-12 16:18  VanGy  阅读(111)  评论(0编辑  收藏  举报