本章目标:
- 介绍进程的概念:执行中的程序
- 描述进程的特征:如调度、创建、终止
- 探索进程间通信:使用共享内存和消息传递
- 描述客户端-服务端框架下的通信
Abbr.
PC: Program Counter
PCB: Process Control Block
PID: Process ID
IPC: InterProcess Communication
RPC: Remote Procedure Call
3.1 进程概念
进程
process vs program
program是在存储在内存中的可执行文件,而process是正在执行过程中的program,强调active,包含PC(Program Counter,指向下一条执行的指令)和一些相关资源
进程状态
同一时刻一个处理器上只能有一个进程在运行。
- 新建态new
- 就绪态ready
- 等待态waiting
- 运行态running
- 终止态terminated
PCB 进程控制块
记录关于进程的一些信息:
- 进程状态
- PC
- CPU寄存器
- CPU调度信息:进程优先级,调度队列指针和一些调度相关的参数(chap 6)
- 内存管理信息(chap 8)
- accounting信息:CPU使用数量,时间限制,进程数量等
- I/O状态信息:分配给该进程的I/O设备信息
线程
现代操作系统拓展进程的概念,允许一个进程有多个线程同时执行,在multicore系统上尤为高效(chap 4)
3.2 进程调度
调度队列
Job Queue:系统中所有进程
Ready Queue:内存中处于就绪态的进程队列
Device Queue:每个I/O设备会有自己的进程队列
下图为队列图表示进程调度示例:
就绪态的进程一旦开始执行,可能出现以下几种情况
- 进程产生一个I/O请求于是被放入I/O队列
- 进程产生了一个子进程,子进程进入ready queue等待执行
- 时间片用完
- 需要等待某个中断操作,被移出CPU直到中断操作发生则重新进入ready queue
调度器
Long term scheduler(Job Scheduler): 挑选放入ready queue的进程;调用不频繁;控制multiprogramming的程度
Short term scheduler(CPU Scheduler):挑选接下来执行哪个进程;调用很频繁,ms级别
Medium term scheduler:灵活地remove和reintroduce进程。SWAP操作(chap 8)
进程可分为I/O bound 和 CPU-bound
上下文切换
- 切换时需要保存旧进程的状态并加载新进程之前的状态。
- 上下文Context:PCB中的信息
- 上下文切换的时间属于overhead,越少越好,切换所需时间依赖硬件
3.3 进程相关操作
进程创建
- 进程通过PID进行标识管理
- 父进程创建子进程(树状结构)
- 资源共享:父进程和子进程之间可能共享所有/部分/无资源
- 执行:并发执行或父进程等待子进程终止
- 地址空间:子进程复制父进程;子进程单独load
- UNIX 例子
- fork:创建新进程
- exec:在fork后调用,将新程序加载进进程的内存空间
进程终止
- exit:进程执行完最后一条指令后就向OS请用删除它
- wait:父进程获取子进程的输出返回
- OS释放进程资源
- abort:父进程终止子进程
- 子进程使用超出分配的资源
- 任务不再需要执行
- 父进程exit:子进程也终止(cascading termination)
3.4 进程间通信ipc
IPC(InterProcess Communication)包括shared memory和message passing两种model
内存共享
producer process:提供信息
comsumer process:获取信息
在内存中开辟一块由producer和consumer共享的buffer。
- unbounded buffer:producer可以源源不断提供新信息
- bounded buffer
- 通过in和out两个标记循环使用buffer
- in标记buffer中下一个空闲的位置,for producer填入
- out标记buffer中第一个有信息的位置,for consumer获取
- in == out 时说明buffer空
- (in + 1) % BUFFER_SIZE == out时说明buffer满
消息传递
- Naming
- 直接通信
- 定义:send(P, message) & receive(Q, message) P\Q为对应进程
- 性质
- 自动连接
- 一个link只连系一对processes
- link可以是单向的,通常是双向的
- 间接通信
- 定义:message通过mailboxes(A.K.A ports)传送
- 每个mailbox有唯一对应的id
- 性质
- 进程共享一个mailbox时才连接
- 一个link可以连系多个processes
- 一对processes可以有多个links
- 单向或双向
- 直接通信
- 同步Synchronization
- Synchronization:Blocking, sender和receiver交替进行,不可同时
- Asynchronization:Non-Blocking,sender和receiver可以同时进行
- 缓存
- 无论是直接还是间接通信,交换的信息都在一个临时队列里,这种队列有三种方式
- zero capacity:发送端在接收端收到之前必须block
- bounded capacity:有限的信息可以暂存在队列中
- unbounded capacity
- 无论是直接还是间接通信,交换的信息都在一个临时队列里,这种队列有三种方式
3.5 IPC系统例子
本节介绍了POSIX shared memory和Mach message passing的例子,有基础的API使用,略。
Windows使用ALPC(advanced local procedure call)进行信息传输,类似标准的RPC(3.6.2),略。
3.6 Client-Server系统通信
Sockets
- 定义:通讯的endpoint,由ip address+port number组成
- ip address:定位设备
- 127.0.0.1 表示本机
- port number
- 定位进程使用的”mailbox“
- 16位 65536个
- 0~1023个为一些通用的
- FTP —— 21
- SSH —— 22
- DNS —— 53
- HTTP —— 80
- HTTPS —— 443
- 一个通讯一定有两个sockets
- 一个进程可以有多个port
- ip address:定位设备
- Java提供三种不同类型的sockets
- TCP:定向连接,例如获取当前时间
- UDP:Connectionless,不需要建立connection,易丢包
- Multicast:广播,多个接收方
RPC
- Remote Procedure Call : 本机通过网络调用远端remote上的程序
- Stub:local上的remote代理,local和stub通讯来控制remote
- 定位remote的位置并把要传给remote的参数进行包装(marshall)
- 通过matchmaker port获取通讯使用的port number
- daemon(发音DEE-muhn)是一段连续运行的程序,用于处理计算机系统希望接收到的阶段性的服务需求
Pipes
full-duplex:数据可同时双向传输
half-duplex:支持双向,但不能同时,即同一时间只能单向
Simplex:只能单向
Original Pipes
- UNIX将pipe当作文件一样对待,通过系统调用read和write来access
- fd (file descriptor)
- fd[0]: read-end of the pipe
- fd[1]: write-end of the pipe
- pipe通信
- 父进程通过fork创建pipe与子进程通信
- 进程外不可访问
- 子进程继承pipe
Named Pipes
- 双向通信 & 没有父子关系,更powerful
- 一个pipe一旦建立,可被多个进程用于通信(可有多个writers
例子:UNIX命令行中, |
可创建pipe,如 ls | grep example
Takeaways
- 进程的五种状态
- 进程切换时save & load PCB
- 进程间通信
- shared memory
- message passing
- socket : ip + port
- RPC: stub
- pipe