一、进程的概念
- 对于每个进程,在进入计算机系统的那一刻,就给它分配了一个数据结构PCB(Process Control Block),PCB记录了进程所有的执行过程。
- 进程是计算机系统资源分配和调度分派的独立单位。
- PCB保存了一个进程在运行过程中的所有状态。
- 资源分配的最小单位:进程
- 调度分派的最小单位:线程
程序和进程
- 程序:就是一个静态的文件,保存在磁盘当中。
- 进程:正在运行的程序,动态的实体,本身有动态性和并发性。
二、进程调度
几种基本的数据结构
- 作业队列(Job queue)
系统当中所有的进程都会在作业队列中对应一个元素
- 长程调度:当作业提交到系统当中,我们把这些所有的作业都集中在磁盘当中的一个 作业池 当中。
- 这里的作业池我们给它起了一个新的名字——作业队列。
- 准备队列/就绪队列(Ready queue)
已经获得了系统当中的内存、I/O等资源,就等调入CPU中运行了(万事具备,只欠CPU),就绪队列就是指那些调入CPU就可以马上运行的所有这类进程的集合构成的队列。
- 设备队列(Device queue)
计算机系统中的每一个设备(例如每一块磁盘)都对应着一个设备队列,当前计算机系统中正在申请对应设备的进程都会排在对应设备的等待队列当中。申请同一个设备的多个进程构成一个设备队列。
- 进程除去在CPU中运行的时间之外就是在不同的进程队列中迁移的过程。
- 长程调度也叫做作业调度。
- 短程调度也叫做CPU调度。
- 长程调度决定多道程序的度。
- 长程调度也决定着就绪队列当中的进程组合问题(即为I/O密集型进程或CPU密集型进程所占的比重)。而我们希望的是一个“Good process mix”。
- 上下文切换:保存正在执行进程的PCB(保存当前正在执行进程的状态),把将要执行进程的状态(PCB中的数值)加载到系统当中。
三、进程的操作
进程的创建
- 对于操作系统来说,所有的进程都是以一种树状的形式来进行组织的。(父进程创建子进程)
- 操作系统在每个进程创建的时候都会给它的PCB分配一个独一无二的进程标识符PID,用于区分进程。
进程创建的步骤
- 给提交到计算机系统的进程分配一个空白的PCB;
- 由操作系统对当前进程所需要的资源进行分配(比如I/O资源、内存资源等);
- 初始化PCB(在PCB中写入一些初始化的信息);
- 把当前进程放入就绪队列当中,然后参与CPU的调度和分派。
进程的结束(process termination)
- 进程执行完其对应的最后一条指令,那么当前进程就正常结束了。
- 一个进程执行完之后,其占用的所有资源都会被操作系统所回收。
- 子进程访问越界,父进程可以终止子进程。
四、协作进程
- 独立进程
独立进程指的是一个进程在执行的过程当中既不影响其他进程的执行,也不受其他进程的影响,这样的一个进程的执行过程就叫做独立进程。与独立进程相对应的叫做协作进程。
- 协作进程
协作进程在执行的过程当中可能会被其他的进程所影响,也可能会影响其他进程的运行,这样的一个进程的执行过程就叫做协作进程。协作进程指的是多个进程彼此协作完成一项任务。
- 协作进程非常方便模块化编程:可把一项工作分解成不同的模块,然后把它分别对应不同的进程,让他们彼此协作完成某一项工作。
进程间通信
第一种方式:内存共享/共享内存(shared memory/memory sharing)
shared memory: processes share some data structure or memory block;
- 在创建一块内存区域的时候,首先要进行一次系统调用,把一块空闲的内存空间加载到一个进程当中,以及与当前进程协作的进程当中,之后所有的信息传递(信息的交互)都是在内存空间完成的。
- 无限制缓冲区(unbounded-buffer):内存区域无空间的限制。
- 有限缓冲区(bounded-buffer):两个进程或者多个进程之间彼此通讯的缓冲区的大小是有一定限制的
有限缓冲区问题也叫做生产者消费者问题
- 生产者进程:往内存等缓冲区中写数据(不读只写);
- 消费者进程:从内存的缓冲区中读数据(只读不写);
- 缓冲区已满时生产者进程应该处于等待状态;
- 缓冲区为空时消费者进程应该处于等待状态。
第二种方式:消息传递(message passing)
message passing: message is the unit of data transmission,which is much more useful for information transfer.
MPS(Message Passing System)消息传递系统。
提供两种原语(系统调用):
- Send
- 该操作把对应的信息放到消息队列中/把信息发送出去;
- Receive
- 该操作从消息队列中取出/接收一个信息;
进程间信息通讯的性质
- 多个进程之间通信的连接是如何建立的?
- 一个链接是能够只链接两个进程还是能够连接多个进程?
- 两个正在通讯的进程之间只能够有一条链路还是可以有多个链路?
- 上述链路上有无信息的承载能力?如果有信息的承载能力,其承载能力是多少?
- 对于要发送的信息其长度是定长的还是变长的?
- 上述逻辑上的链路是单向的还是双向的?
直接通讯
- 直接通讯当中的对称通讯,send和receive操作都需要明确指出对方通讯进程的ID是什么。
- 对于send指令,必须要明确指出要接收信息的进程的名称(进程ID)。send(P, message)
- 对于receive指令,必须要明确指出发送消息的进程的名称(进程ID)。receive(Q, message)
- 对称通讯的链接是自动完成的。
- 直接通讯中的对称通讯只能保证一对进程间的通讯,且这两个进程之间只能有一条链路。
对称通讯的缺点:限制了系统设计的模块化思想。如果当前的进程更换了ID,那么当前进程参与的所有send操作和receive操作都需要相应地更新当前进程的ID。
- 直接通讯当中的非对称通讯,send操作需要明确指出要接受消息的通讯进程的ID,对于receive操作并不需要明确指出发送消息的进程的ID。
间接通讯
间接通信也叫做邮箱通讯(mailbox),这里的“邮箱”指的是操作系统中一种特殊的数据结构。
- 操作系统中的每一个“邮箱”都有一个独一无二的ID。
- 多个进程之间可以进行通讯的其中一个条件是多个进程间至少共享(share)了一个邮箱。想要通讯的多个进程之间共享一个邮箱,那么它们之间就可以通讯了。
- 只有在多个进程共享一个邮箱的情况下,邮箱的link(连接)才会被创建。
- 一个邮箱可以被多个进程所共享,每一对通讯的进程间也可以同时共享多个邮箱。
- 邮箱通讯可以是单向的,也可以是双向的。
间接通讯的操作原语
send(A, message); //send a message to mailbox A.
receive(A, message); //receive a message from mailbox A.
间接通讯会产生的一些问题及解决方案
问题提出:
— P1,P2,and P3 share mailbox A.
— P1 sends; P2 and P3 receive.
— Who gets the message?
解决方案:
— Allow a link to be associated with at most two processes.
— Allow only one process at at a time to execute a receive operation.
— Allow the system to select arbitrarily the receiver. Sender is notified who the receiver was.
第三种方式:管道通信(pipe)
pipe: connect a reading process and a writing process, as the shared file for communication between the two processes;
管道通信指的是多个文件通过一种共享文件的方式来进行通讯。
信息传递的两种形式
Message passing may be either blocking or non-blocking.
- 阻塞的发送/接收(blocking send)
也可理解为同步(对称)的通信(发送/接收)
阻塞发送
- 当前进程执行完发送操作之后,发送的进程就进入等待状态,直到要接收消息的进程接收到消息并且发送一个反馈回来,这时发送的进程才结束其等待状态进一步执行其他的指令。
阻塞接收
- 接收者进程处于等待状态,直到发送者进程发送一个消息过来再进行进一步操作。
Blocking is considered synchronous.
- 非阻塞的发送/接收
也可理解为异步的通信(发送/接收)
非阻塞发送
- 发送者进程执行完发送操作之后,接着执行其他的指令,并不具体等待接收者进行接收(该干什么干什么)。接收者进程接收信息成功之后,将发送一个反馈给发送者进程,发送者进程通过中断接收到这个消息就可以了。(发送消息的过程并未影响到发送者进程的执行)
非阻塞接收
- 接收者进程正常执行其指令(该干什么干什么),发送者进程发送的消息到达后再通过中断的方式接收。(接收消息的过程并未影响到接收者进程的执行)。
Non-blocking is considered asynchronous.