第3章 进程
3.1 进程概念
3.1.1 进程
进程是执行中的程序(unformal)
进程包括文本段、数据段、堆、栈
程序不是进程,程序是被动实体,进程是活动实体,当可执行文件载入Mem的时候,程序才会变成进程
进程本身也可以作为其他程序的运行环境(如JVM)
3.1.2 进程状态
3.1.3 进程控制块PCB
- 进程状态
- PC
- CPU Reg
- CPU调度信息
- 内存管理信息
- 记账信息
- I/O状态信息
3.1.4 线程
3.2 进程调度
3.4 进程间通信(IPC, Interprocess Communication)
系统中的进程可能是独立(independent)或协作(cooperating)的
-
独立进程和其他进程互不影响
-
协作进程可能影响其他进程,或被其他进程影响,包括共享数据
协作进程的理由:
- 信息共享
- 计算提速
- 模块化(modularity)
- 便捷性
协作进程需要IPC
IPC的两种模型:
- 共享内存(shared memory)
- 信息传递(message passing)
3.5 共享内存中的IPC
消费者-生产者问题
- 无限缓冲
- 有限缓冲
共享内存:
- 在希望通讯的进程间共享的内存区域
- 通信在用户进程的控制下,而非OS
- 主要问题是提供在用户进程访问共享内存时,允许它们同步操作的机制
- (有关同步的详细内容见Chap 6&7)
3.6 信息传递中的IPC
进程通信和同步操作的机制
消息系统:进程相互通信而不采取共享的变量
进程间通信设施提供两个操作:
- send(message)
- receive(message)
message的大小可以固定也可以变化
若P、Q之间想要通信,则它们需要:
- 在它们之间建立通信连接(communication link)
- 通过send/receive交换消息
通信连接的应用:
- 物理上的
- 共享内存
- 硬件总线
- 网络
- 逻辑上的
- 直接/间接
- 同步/异步
- 自动/显式缓冲
3.6.1 命名(Naming)
-
直接通信
-
进程必须显式给其他进程命名
send(P, message):给进程P发送一条消息
receive(Q, message):从进程Q接收一条消息
-
通信连接的性质
- 连接是自动建立的
- 一个连接只对应一对通信进程
- 在每一对进程间也只存在一个连接
- 连接可以单向,但通常是双向的
-
-
间接通信
-
消息通过邮箱(mailbox)(也叫端口port)接收/发送
- 每个邮箱有一个独一无二的id
- 仅当进程间共享邮箱时,可以相互通信
-
通信连接的性质
- 仅当进程共享邮箱时连接建立
- 一个连接可能和许多进程相联系
- 每对进程可能共享多个通信连接
- 连接可能是单向或双向的
-
操作
- 创建一个新邮箱(端口)
- 通过邮箱发送和接收消息
- 摧毁邮箱
-
原语定义为
- send(A, message) 发送一条消息到邮箱A
- receive(A, message) 从邮箱A接收一条消息
-
邮箱共享
-
多个进程接收消息,谁会得到消息?
解决方案:
- 只允许连接和两个进程关联
- 一次只允许一个进程执行接收操作
- 允许系统任意选择接收者,通知发送方谁是接收者
-
-
3.6.2 同步(Synchronization)
消息传递可以是阻塞或非阻塞的
阻塞被认为是同步的
- 阻塞发送:发送者被阻塞,直到消息被接收
- 阻塞接受:接收者被阻塞,直到可以收到消息
非阻塞被认为是异步的
- 非阻塞发送:发送者发送了消息,继续该干嘛干嘛
- 非阻塞接收:接收者收到了一条正确的消息或空消息
不同组合都是可能的:
若发送和接收者都被阻塞了,称这种情况为会合(rendezvous)
3.6.3 缓冲(Buffering)
与连接相连的消息队列
三种应用方式:
- 0容量(zero capacity):连接的队列里没有消息,发送者必须等待接收者
- 有限容量(bounded capacity):有限长度n条消息,若连接满,发送者必须等待
- 无限容量:无限长度,发送者从来不等
3.7 IPC系统的实例
3.8 客户-服务器系统中的交流
3.8.1 套接字(Sockets)
套接字是通信的结束点
IP地址和端口(到主机上不同网络服务的消息包的开头所包含的一个数字)的级联
套接字161.25.19.8:1625表示在主机161.25.19.8的1625端口
通信由一对套接字组成
特殊的IP地址127.0.0.1(loopback 回送)指正在运行进程的系统
3.8.2 远程过程调用(Remote Procedure Calls)
抽象了网络系统中进程间的过程调用
- 仍然用端口来区分服务
存根(stub):服务器上实际程序的客户端代理
客户端存根位于服务器上并编组(marshall)参数
服务器存根接收消息,解组参数,并在服务器上执行过程
在Windows上,存根代码从用MIDL(Microsoft Interface Definition Language)写的规格编译
通过外部数据表示格式(XDL)处理的数据表示以说明不同的体系结构
- 大端和小端
远程通信比本地更易发生错误
消息只能被传递一次,而不是最多一次
OS一般提供会合(rendezvous)服务(或称matchmaker)来连接客户端和服务器