什么是进程:进程状态上下文中的执行流。
执行流:执行指令流、一段运行的代码、指令的顺序、控制线程。
进程状态:运行的代码能影响或者被影响的方面。
进程与程序区别
- 程序是静止的,进程是代码和数据的动态实例。
- 程序和进程之间没有一对一的映射。
- 同一个程序中可以有多个进程:很多用户同时运行“ls命令”
- 一个程序可以调用多个进程:make命令
每个进程都处于运行(占用cpu)、就绪(等待cpu)、阻塞(睡眠,等待I/O或者同步完成)三种状态。
UNIX进程内存创建
资源管理
- 创建新的进程时,分配地址空间、复制数据。
- 调度
- 上下文切换
- 进程上下文:CPU上下文和存储上下文
- 上下文切换
- 协作
- 进程间通信
- 共享内存
线程是最小的处理器,在其上下文中可以执行一些指令,保存线程上下文意味着停止当前的执行并保存所有需要的数据,以便在以后的阶段继续执行。
上下文切换
- 处理器上下文:存储在CPU寄存器中用于执行一系列指令的最小值的集合(栈断点、地址寄存器、程序计数器)
- 线程上下文:存储在寄存器和内存中用于执行一系列指令的最小值的集合。(CPU上下文、状态)
- 进程上下文:存储在寄存器和内存中,用于执行一系列线程的最小值的集合。(线程上下文、内存管理单元MMU的值)
线程共享相同的地址空间、线程上下文切换完全独立于操作系统。
进程上下文切换通常代价更大,涉及到捕获操作系统内核等操作,创建和销毁线程的代价比进程小。
用户级线程:
所有的线程都在用户的进程地址空间中创建。
优点:所有的操作都能在单个进程中完成,导致实现起来很高效。
缺点:难以从操作系统和block中得到支持。内核提供的所有服务都是代表线程所在的进程执行的,如果内核决定阻塞一个线程,那么整个进程将被阻塞。
线程和操作系统:
让内核包含线程包的实现,则所有的操作以系统调用的方式返回:
- 操作系统堵塞线程不再成为问题:内核在同一进程中调用另一个可用的线程。
- 处理外部事件也很简单:内核调度和事件相关联的线程。
- 缺点在于由于每个线程操作都需要一个内核陷阱而导致的效率损失。
线程实现
尝试将用户级线程和内核级线程混合到一个概念中,然而,性能的提高并没有抵消复杂性的增加。
隐藏网络延迟:Web浏览器扫描传入的HTML页面,发现需要获取更多的文件。每个文件通过独立的线程获取,每个线程做一个HTTP获取,当所有的文件传进来,浏览器将其显示。
对其他计算机(RPC)的多个请求-响应调用:一个客户端同时做出多个请求,每一个请求由一个线程完成;等待直到所有的结果都返回。如果请求的是不同的服务器,可能需要一个线性加速。
提高性能:
- 启动线程比启动进程代价小得多
- 单线程服务器禁止简单地扩展到多处理器系统
- 与客户端一样:在响应前一个请求时,通过响应下一个请求来隐藏网络延迟
改进的结构:
- 大多数服务器都有很高的I/O要求。使用简单、易于理解的阻塞调用可以简化整个结构。
- 由于简化了控制流,多线程程序往往更小,更容易理解。
虚拟化
虚拟化越来越重要:
- 硬件改变得越来越快
- 易于移植和代码迁移
- 故障或受攻击组件的隔离
虚拟化可以在非常不同的级别上进行,主要取决于各种系统组件提供的接口:
计算机系统多种界面
进程VM与VM监视器
进程VM(进程虚拟机):将程序编译为中间(可移植的)代码,然后由运行时系统执行(例如:Java VM)
VM监视器(虚拟机监视器):一个独立的软件层模拟硬件指令集,生成一个完整的操作系统,并支持它的应用程序(例如:VMware、KVM、XEN)
进程虚拟机(a)虚拟机监视器(b)
操作系统上的VM监视器:
- 执行二进制转换:在执行应用程序或操作系统时,将指令转换为底层机器的指令。
- 区分敏感指令:捕获原始内核(考虑系统调用或特权指令)。
- 将敏感指令替换为对VMM的调用。
客户端:用户接口
客户端软件的主要部分是(图形化)用户界面
X Windows系统基本组织结构
客户端软件 一般为分布透明度量身定做
- 访问透明性:用于RPCs的客户端存根位置/迁移透明性:让客户端软件跟踪实际位置
- 故障透明性:通常只能放在客户端(我们试图掩盖服务器和通信故障)。
- 复制透明性:由客户端存根处理的多个调用
服务器
服务器是一个在特定传输地址等待传入服务请求的进程。实际上,端口和服务之间存在一对一的映射。
文件服务器:
调度程序/工作程序模型中组织的多线程服务器:
服务器:类型
- 超级服务器:监听多个端口的服务器。提供多项独立服务。实际上,当出现服务请求时,它们启动一个子进程来处理请求(UNIX inetd)
- 迭代与并发服务器:与并发服务器相比,迭代服务器一次只能处理一个客户端
服务器一旦接受(或正在接受)服务请求,是否可以中断它?
紧急数据使用单独的端口:
- 服务器有一个单独的线程/进程来处理紧急消息
- 紧急信息传来,有关的请求暂时搁置
- 注意:我们要求操作系统支持基于优先级的调度
使用传输层的带外通信设施:
- 例如:TCP允许在同一连接中发送紧急消息
- 可以使用OS信令技术捕获紧急消息