目录
一、什么是进程?
1、什么是程序?
- 程序就是一个指令序列
2、什么是进程控制块(PCB)?
- 系统为每个运行的程序排至一个数据结构,称为进程控制块 (PCB——progress control block)
- 里面有进程的寄存器、进程编号、内存界限、程序计数器等
3、什么是进程实体(进程映像)?
- PCB、程序段、数据段三部分构成进程实体
- PCB:内存中存储,记录进程生存周期内状态变化的存储区域。不同操作系统有不同的进程控制块格式和信息,但基本包括进程标识符,当前状态,现场保护区,存储指针,占用资源表以及进程优先级等信息。它是进程存在的唯一标志。
- 程序段:描述进程本身要完成的功能
- 数据段:程序加工的对象和场所
4、什么是进程?
- 进程是进程实体的运行过程,是系统进行资源和资源调度的一个独立单位
- 进程并不等同于进程实体,进程实体是静态的,进程是动态的
4.1、进程的五种基本状态:
创建态:进程正在被创建,系统为其初始化PCB,分配资源。
运行态:占有cpu,并且就在cpu上执行。
就绪态:已经具备运行条件,但由于没有空闲cpu,而暂时不能运行。(也就是cpu没有调度到它)
阻塞态:因等待某一事件而不能运行。
终止态:进程正在从系统中撤销,回收进程的资源,撤销其PCB。
图示:
注:
- 就绪态通过进程调度可以变为运行态,运行态通过中断变为就绪态,运行态通过io请求等待事件进入阻塞态,阻塞态被唤醒,即等待事件结束,就变为了就绪态。
- 不能由阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态
- 运行态——>阻塞态是一种进程自身做出的主动行为
4.2、 进程的执行周期
为了管理进程,系统会先创建一个PCB,PCB被创建后,会做以下五项工作:
- 标记进程身份:为每个进程创建一个pid,用于区分不同的进程;
- 标记进程状态:运行、阻碍、就绪等状态;
- 存储进程的内存指针;
- 为进程创建描述符表;
- 记录进程的调度信息:如执行了多少行代码,等待了多久等;
4.3、并发和并行
- 系统以时间片轮转的方式“同时”执行多个进程的情况,我们把它叫做并发;
- 随着计算机硬件水平的飞速发展,如今的计算机不再是单一核心的CPU,多核心的好处就是每一个核心都能执行一个进程,所以一个CPU可以同时执行多个进程,我们把这种情况叫做并行;
二、为了实现进程调度的一些基本属性
状态
这个状态描述了当前这个进程接下来应当怎么调度
就是上述的五种基本状态
优先级
先给谁分配时间,后给谁分配时间
以及给谁分的多,给谁分的少
记账信息
统计了每个进程,都分别执行了多久,分别执行了哪些指令
分别都排队等了多久
给进程调度是供指导依据的
上下文
就表示了上次进程被调度出CPU的时候,当时程序的执行状态
下次进程上CPU的时候,要可以恢复之前的状态,然后继续执行下去。
进程呗调度出CPU之前,要先把cpu中的所有寄存器中的数据都给保存到内存中
详单与存档了
下次进程再被调度上CPU的时候,就可以从刚才的内存中恢复这些数据到寄存器中
相当于读档
存档+读档----
所谓的调度就是进行时间管理
进程的调度,其实就是系统在考虑CPU资源如何给各个进程分配~
由于操作系统上,同时进行多个进程
如果某个进程,出现BUG,进程崩溃了,是否影响其他进程呢?
依靠“进程的独立性”来保证,依靠“虚拟地址空间'
进程之间现在通过虚拟地址空间,已经各自隔离开了
但实际工作中进程之间的的时候还是需要相互交互的。
三、进程间通信
进程通信的方式分类:
![](https://img-blog.csdnimg.cn/63f94eedd7bd402f8bd1c65df778d97b.png)
第一种:共享存储。
共享存储就是操作系统另外分配一个内存区域用于进程间的通信,这就是共享空间,两个进程都可以访问这个共享空间,但是两个进程对共享空间的访问必须是互斥的,即同一时间段只能有一个进程访问这个空间。
然后共享存储又分为基于数据结构的共享和基于存储区的共享。
- 基于数据结构的共享:比如它的共享空间只能放一个长度为10的数组,数据量比较小,存储的数据形式也有限制。所以这种方式速度慢,限制多, 是一种低级通信
- 基于存储区的共享:此时操作系统只负责提供内存,然后由进程来控制数据的形式和存放位置。所以这种方式速度更快,是一种高级的共享方式。
第二种进程通信方式:消息传递。
进程间的数据交换以格式化的消息为单位,进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。也就是说:一个进程调用“发送原语"这个api就可以把消息发送出去,通过”接收原语“就能取出消息。
一个消息包括消息头和消息体,消息头包括:发送进程的id,接收进程id,消息类型,消息长度等格式化的消息(计算机网络中发送的”报文“其实就是一种格式化的消息)。而消息体就是消息内容了。
消息传递又包括两种通信方式:直接通信方式和间接通信方式。
- 直接通信方式:消息直接挂到接收进程的消息缓冲队列上。也就是说,每个进程都有一个消息缓存队列。当进程A要给进程B通信,就先调用发送原语,把消息发送到进程B的消息缓存队列当中,然后进程B会调用接收原语,从自己的消息缓存队列当中取出消息。
- 间接通信方式:消息要先发送到中间实体(信箱)中,因此也称信箱通信方式,比如计算机网络中的电子邮箱系统。这就类似于,有一个中间部门专门管理这些信息,每个进程发送消息都是发送到这里,每个进程接收消息都是从这里取出。因为有消息头的目的进程id等信息,所以这一切都可以实现。
第三种通信方式:管道通信
管道:是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。它的大小一般是和系统的内存页面大小一样,比如linux默认的内存页面大小是4kb,所以linux的管道大小也是4kb.
1.管道是才有半双工通信,简单说就是同一时间只能实现单向传输,要实现双向同时通信,则需要两个管道。
2.各进程要互斥地访问管道。
3.数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待进程将数据读走。当都进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
4.如果没写满,就不会允许读。如果没读空,就不允许写。
5.数据一旦被读出,就会从管道中抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。
目前,主流操作系统提供的进程通信机制有如下: