操作系统
进程
进程的发展
- 程序:是一个指令序列
- 早期的计算机(只支持单道程序):计算机同一时刻只有一道程序在运行,CPU也只为这一个程序服务,内存也只为这一程序存放信息。内存中有程序段(程序代码)和数据段(程序运行过程中需要的数据)
- 多道程序技术:计算机同一时刻可以有多道程序并发运行,内存中也会有多个程序的数据。为了方便操作系统管理,完成各程序并发执行,引入了进程、进程实体的概念
- 系统为每个运行的程序配置一个数据结构,称为
进程控制块(PCB)
,用来描述进程的各种信息(如程序代码存放位置) - PCB、程序段、数据段三部分构成了
进程实体(进程映像)
,也称为进程
- 所谓
创建进程
,实质上是创建进程实体中断PCB;而撤销进程
,实质上是撤销进程实体中的PCB
-PCB是进程存在的唯一标志
进程的定义
- 从不同角度,进程可以有不同的定义,比较传统的定义有:
- 进程是程序的一次执行过程
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
- 进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
- 三个都在强调进程的
动态性
- 引入进程实体的概念后,可把进程定义为:
1.进程是进程实体的运行过程,是系统继续资源分配和调度的一个独立单位- 进程实体是静态的,进程是动态的
进程的组成
进程由程序段、数据段、PCB三部分组成
程序段
:存放程序代码数据段
:程序运行时使用、产生的运算数据。如全局变量、局部变量、宏定义的常量PCB
:操作系统通过PCB来管理进程,因此PCB中应包含操作系统对其进行管理所需的各种信息
PCB
- 进程标识符PID:当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的ID,用于区分不同的进程(类似于身份证号码)
- 各种寄存器值:当进程切换时需要把进程当前的运行情况记录下来保存在PCB当中,如程序计数器的值表示了当前程序执行到哪一句
进程的组织
在一个系统中,通常有数十、数百乃至数千个PCB。为了能对他们加以有效的管理,应用适当的方式把这些PCB组织起来
- 链接方式
- 按照进程状态将PCB分为多个队列
- 操作系统持有指向各个队列的指针
- 索引方式
- 根据进程状态的不同,建立几张索引表
- 操作系统持有指向各个索引表的指针
进程的特征
进程和程序是两个截然不同的概念
动态性
是进程最基本的特征
进程的状态与转换
进程的状态
三种基本状态
- 运行态:占有CPU,并在CPU上运行(单核处理机每一时刻最多一个进程处于运行态,双核则两个)
- 就绪态:已经具备运行条件,但由于没有空闲的CPU,而暂时不能运行
- 阻塞态,又称等待态:因等待某一事件而暂时不能运行
另外两种状态
- 创建态,又称新建态:进程正在被创建,操作系统为进程分配资源、初始化PCB
- 终止态,又称结束态:进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB
进程状态的转换
进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能
如何实现进程控制
- 用
原语
实现进程控制 - 原语的特点是执行期间不允许中断,只能一气呵成,这种不可被中断的操作即为
原子操作
- 原语采用
关中断指令
和开中断指令
实现
进程控制相关的原语
无论哪个原语,要做的三件事无非是:
- 更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
- 所有的进程控制原语一定都会修改进程状态标志
- 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
- 某进程开始运行前必然要恢复期运行环境
- 将PCB插入合适的队列
- 分配/回收资源
- 阻塞和唤醒要成对出现
进程通信
进程通信就是进程之间的信息交换
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立
为了保证安全,一个进程不能之间访问另一个进程的地址空间
但是进程之间的信息交换又是必须实现的,为了保证进程间的安全通信,操作系统提供了一些方法
- 共享存储:两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现)。操作系统只负责提供共享空间和同步互斥工具(如P、V操作)
- 基于数据结构的共享(比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式)
- 基于存储区的共享(在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下这种共享方式速度更快,是一种高级通信方式)
- 管道通信:是指用于连续读写进程的一个共享文件,又名pipe文件,其实就是在内存中开辟一个大小固定的缓存区
- 管道只能采用半双工通信,某一时间段只能实现单向的传输。如果要实现双向同时通信,则需要两个管道
- 各进程要互斥地访问管道
- 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
- 如果没写满不允许读,没读完不允许写
- 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况
- 消息传递:进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的发送消息/接收消息两个原语进行数据交换
- 消息头:发送进程ID、接收进程ID、消息类型、消息长度等格式化的信息
- 消息体
- 直接通信方式:消息直接挂到接收进程的消息缓冲队列上
- 间接通信方式:消息要先发送到中间实体(信箱)中,因此也称“信箱通信方式”
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步