什么是进程
以下几种说法我感觉都是正确的理解:
1.进程是一个动态执行的过程,是CPU分配虚拟内存空间的基本单位。
2.进程包含了程序,是程序执行的一种表现,二者之间呈现多对多的一种关系。
进程包含了什么
包含的内容非常丰富:
1.执行的程序代码
2.程序代码运行时候产生的临时变量
3.指令执行的地址信息
4.系统资源信息,例如正在打开的文件
简单一句话就是进程包含了一个程序在运行时候所需要的所有资源信息。
程序和进程的关系
程序是进程的一个基础,计算机执行的所有功能都是基于进程为单位进行的,但是进程内部真正执行任务的核心却是程序的代码逻辑,程序的每次执行都有可能构成不同的进程。
虽然我们的程序一般都是存储在磁盘当中,但是数据如果不一样的,就有可能进程的执行最终结果不一样,从而说明进程不一样。所以一个程序其实是可以对于多个进程的。二者的关系准确应该说是多对多的关系。
程序:静态的代码结合
进程:程序的执行表现
程序进入内核态
例如一个进程需要读取磁盘文件的信息,此时需要和系统的硬盘打交道,那么这个时候读取文件的信息就需要交给操作系统内核来替代进程执行,这种场景我们一般就称之为进程进入了内核态。
进程的状态
创建
此时会向操作系统内核申请一个PCB,在此过程中需要向操作系统申请一些管理进程的基本信息,完成资源的分配,如果操作系统此时没有额外的空间就无法满足,此时会导致进程无法正常进入创建状态。
就绪
当操作系统为进程创建并开辟了一定的资源空间之后,只需要等待CPU的时间分片进程便可以开始执行。此时进程在外存,但只要进入内存,即可运行。
执行
CPU调度开始执行指定的进程,进程进入执行状态。
阻塞
已经在运行的进程如遇到了一些io堵塞,或者缓存区申请失败的问题,就会处于一个阻塞的状态。此时进程在外存并等待某事件的出现。
终止
进程执行结束,或者被意外终止,就会进入一个终止的状态。
状态切换的本质,CPU时间片切换
OS的底层实际上有着一个专门处理CPU调度的模块用于给不同的进程分配时间片:
看起来我们在使用计算机的时候各个程序都是在同时运行,但是实际上是cpu给不同程序分配了不同的时间片执行,然后进行快速切换,由于切换的速度非常快,所以让人们从宏观的角度上看起来似乎都在并行执行。
CPU分片给到指定的程序执行,如果分片时间截止,进程依旧没有执行完毕,那么此时CPU会将时间片剥夺分给下一个进程。如果在分片期间遇到了进程堵塞状态,那么CPU也会自动将时间片提早结束分配给下一个进程使用。
进程之间的通信
无名管道
A,B两个进程在进行通信的时候无法读取到各自的用户态中的变量信息,此时需要进行通信的话需要将变量统一写入到操作系统内核一个共享缓冲区中,然后供对方进行内核调用的时候去读取,就如同下图所示:
图片
这种方式进行进程间通信的弊端在于多次的用户态到内核态的调用会比较消耗计算机性能。
局限性:
1.只能用作与具有亲缘关系的进程之间进行通信操作,例如 父子进程。
2.固定了管道的读取和写入端,它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。如下图:
图片
按照上图所示,当父进程希望和子进程进行通信的时候,首先父进程需要开启写入口,然后子进程开启读入口。
FIFO命名管道
FIFO命名管道是利用了文件来充当共享数据区域,将变量都存储到这个区域之后对该文件进行写入和读取数据从而实现进程间的通信功能。
类似的案例:服务端和客户端利用FIFO进行进程间的通信功能。
如下图所示:
但是这种设计有个弊端,就是当有多个客户机发送请求的时候,服务端需要针对不同客户机进行响应数据的时候会比较麻烦,因此就有了以下设计:
消息队列进行通信
在unix操作系统内部,提供了消息队列相关的接口供外界进行调用使用,多个进程之间进行通信可以借助消息队列的帮助,这种通信是同步的机制,一端写入,一端读取即可。如下图:
信号量进行通信
信号量只允许程序对其访问是原子操作,只允许进程对它进行等待操作。对信号量进行+ 或者 - 操作(即P(信号变量))和发送(即V(信号变量)) 来限制多个进程之间对相同共享资源的访问,是属于同步进程的一种操作(使在任一时刻只能有一个执行线程访问代码的临界区域)。
共享内存
对一片共享的内存区域进行加锁控制,防止多进程访问出现资源竞争,然后往里面写入和读取数据,从而实现多进程的互相通信。
进程控制块PCB
什么是进程控制块
描述进程的数据结构,操作系统管理控制进程运行所用的信息集合。可以用于作为进程存在的唯一标识。
当创建了一个进程之后就会立即创建一个PCB控制块。
PCB用于存储进程在执行过程中需要用到当一些内存信息,上下文资源内容。
PCB内部有什么
1.进程创建者标识记录信息。
2.进程执行程序的过程中需要使用到的寄存器信息,栈指针信息
3.进程控制信息,例如进程执行程序中打开的资源文件信息,调度状态信息,进程间通信信息等等。
PCB的组织方式
统一状态的进程其PCB成一链表,多个状态对应多个不同的链表,各状态的进程形成不同的链表,例如就绪链表和阻塞链表。
索引链表
同一状态的进程归入一个index表(由index指向PCB),多个状态对应多个不同的index,各状态的进程形成不同的索引表,例如就绪索引表,阻塞索引表。
各状态的进程形成不同的链表,例如:就绪状态:就绪链表,堵塞状态:堵塞链表。
多进程和多线程之间的性能开销差异性
多个进程之间的通信是比较复杂的,开销较大,需要额外分配资源,建立PCB,回收资源等等。所以在处理一些复杂程序的时候,我们更加愿意使用多线程技术。