一.进程的概念
程序:静态的,存放在磁盘里的可执行文件,一系列的指令集合
进程:进程实体的运行过程(类比:类和对象)是系统进行资源分配盒调度的一个独立单位
动态的,程序的一次执行过程,由PCB、程序段、数据段三部分组成。
(同一个程序多次执行会产生多个进程,例:多次打开QQ会产生多个进程)
注意:进程是动态的,进程实体(进程映像)是静态的
PID,UID,内存,使用哪些I/O设备,CPU使用时间,磁盘使用时间,网络流量使用情况 以上信息会存放在PCB(Process Control Block进程控制块)中(进程描述信息、进程控制和管理信息、资源分配清单、处理机相关信息)
PS:PCB是进程存在的唯一标志,进程创建时,操作系统为其创建PCB,进程结束时,回收其PCB
程序段:能被进程调度程序调度到CPU执行的程序代码段。
注意:程序可被多个进程共享,即多个进程可以运行同一个程序。
数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。
二.进程的特征
- 动态性(进程最基本的特征),进程是程序的一次执行过程,是动态地产生、变化和消亡
- 并发性 内存中多个进程实体,各进程可并发执行
- 独立性 进程是能独立进行、独立获得资源、独立接受调度的基本单位
- 异步性:各进程按各自的、不可预知的速度向前推行,操作系统要提供“进程同步机制”来解决异步问题
- 结构性:每个进程都会配置一个PCB。结构上看进程由程序段、数据段、PCB组成。
三.进程的状态
状态 使用的资源
1.创建态
2.就绪态 其他所需资源
3.运行态 CPU、其他所需资源
4.阻塞态 都没有
5.终止态
注意:一个进程从运行态变成阻塞态是主动的行为,而从阻塞态变成就绪态是被动的行为,需要其他相关进程的协助。
进程的组织方式
1.链接方式(主流方式)
2.索引方式
四.进程的控制
进程控制:改变进程的状态
如何实现进程的控制:
如何实现原语(Primitive)的原子性(不能被中断):通过关中断指令和开中断指令(两个特权指令)实现内核在其过程中不再一条指令后检查中断指令,从而实现原子性。
1.进程的创建
允许一个进程创建另一个进程,此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将其在父进程那里获得的资源归还给父进程。在撤销父进程时,通常也会同时撤销其所有的子进程。
2.进程的终止
3.进程的堵塞和唤醒![](https://img-blog.csdnimg.cn/3f812034afad4797acda3109127e83ce.png)
Block阻塞和Wakeup唤醒是成对存在的。
4.进程的切换
总结:
1.更新PCB中的信息
2.将PCB插入合适的队列
3.分配/回收资源
五.进程的通信
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存空间相互独立
1.共享存储
原则上,进程有独属于自己的存储空间(为了进程之间不会互相访问存储空间,确保安全)但为了方便进程间的通信,设置了共享存储。
共享存储分为两类:基于数据结构的共享、基于存储区的共享。
基于数据结构的共享:定义一个数组,类似于全局变量,多个进程可以读写,这种共享方式速度慢、限制多,是一种低级通信的方式。
基于存储区的共享:操作系统划分出一块共享存储区,数据的形式、存放位置、读写顺序都由通信进程决定,而不是操作系统。这种共享方式,速度很快,是一种高级通信方式。
在共享存储中,进程1可以写入数据,进程2可以访问进程1在共享存储空间写入的数据,达到一个进程之间通信的目的。但是为了避免共享存储空间内的数据被覆盖,每个进程对共享空间的访问都是互斥的 如何做到互斥?各个进程可以使用操作系统内核提供的同步互斥工具(PV操作)。
例:
Linux中
int shm_open( ); 通过shm_open系统调用,申请一片共享内存区。
void *mmap( ); 通过mmap系统调用,将共享内存区映射到进程自己的空间。
2.消息传递
1.直接通信方式:消息发送进程要指明接收进程的ID。
操作系统的内核区域管理着各个进程的PCB(进程控制块),PCB中包含消息队列(其他进程要发给本进程的消息都在消息队列中)。
进程1用发送原语send(2,msg)使操作内核接收到msg,操作内核会将msg挂到进程2的消息队列,进程2使用接受原语receive(1,&msg),接收进程2 的消息。
进程1 的内存空间—复制—》内核空间——》进程2 的内存空间
2.间接通信方式:通过“信箱”间接地通信。
进程1向操作系统申请一个邮箱A,用发送原语将send(A,msg) //A:信箱的ID
进程2使用接受原语receive(A,&msg),间接接收进程2 的消息。注意:间接通信只是指明了信箱的ID,没有指明进程ID
可以多个进程往一个信箱send消息,也可以多个进程从同一个信箱中receive信息。
3.管道通信
管道是指一个特殊的共享文件,又名pipe文件。就是在内存中开辟一个大小固定的内存缓冲区。管道通信要求:先进先出!(循环队列)。与共享内存类似,但是共享内存中数据的形式、存放位置、读写顺序都由通信进程决定
注意:
- 管道只能采用半通信,某一段时间段内只能实现单向传输。如果要实现双向传输,则需要设置两个管道。
- 各进程要互斥地访问管道(由操作系统实现)
- 当管道写满时,写进程将阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。
- 当管道读空时,读进程将阻塞,直到写进程往管道中写入数据,即可唤醒读进程。
- 管道的数据一旦被读出,就彻底消失。因此,当多个进程读同一个管道时,可能会错乱。
两种解决方案:
- 一个管道允许多个写进程,一个读进程
- 允许多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据。(Linux)
好了,这次先写到这,希望对大家能有所帮助
本次博客的图片均来自网络