分布式系统(3)-进程
Aug 29th, 2019
0
线程
分布式系统中用线程而不是进程
- 避免不必要的阻塞,在进行I/O操作的时候,对具备多个线程的进程,OS可以将CPU切换到进程的另外 一个线程
- 发挥并行性
- 避免代价过高的进程上下文的切换
上下文
系统运行过程中的一系列状态,状态的含义因系统的不同而不同
- 处理器上下文
- 处理器用于运行一系列指令的保存在寄存器中的最小数据集合(如:栈指针、地址寄存器、程序计数器)
- 线程上下文
- 用于执行一系列指令的保存在寄存器和内存中的最小的数据集合(如:处理器上下文、状态等)
- 进程上下文
- 用于执行线程的保存在寄存器和内存中的最小的数据集合(线程上下文、MMU寄存器值、TLB)
线程切换特性
- 线程共享相同的地址空间(但也更容易出错),线程上下文的切换可以独立于操作系统
- 一般来讲进程之间的切换要更复杂、代价更高,因为需要陷入到O内核才能完成
- 创建和销毁线程的代价要远远小于对进程的创建和销毁
线程实现方式
- 线程包形式
- 完全在用户空间下创建线程库
- 由内核掌管线程并进行调度
- 好处:上下文切换代价小
- 缺陷:线程阻塞->进程阻塞
- 应用:
- 多线程web客户端隐藏网络延迟
- 服务期间多个请求-响应调用
- 服务器高IO需求,多线程防止阻塞
虚拟化
虚拟化(软硬件多路复用):模拟接口
- 硬件比软件变化得快
- 需要灵活的可移植性和代码迁移
- 失效和攻击隔离
虚拟化不同方式
- 进程虚拟机(Process VM):分离的指令集合,实际上是运行在操作系统之上的解释器(JVM)或模拟器(Qemu)
- 原生虚拟机监控器(Native VMM):底层指令,同时具有跑在硬件上的最小操作系统
- 主机虚拟机监控器(Hosted VMM):底层指令,需要一个完整的OS
服务器
在客户端-服务器模型中,服务器的状态主要分为两种
- 无状态服务器:不记录文件是否被打开,不保证清空客户端cache,不追踪客户信息
- 有状态服务器:记录打开文件(可以提前实现预取),直到客户端缓存哪些数据,允许客户端在本地保存共享数据的备份
代码迁移
- 防止浪费资源
- 使计算贴近数据,最小化通信代价(如移动计算)
代码迁移模型
代码段(code) + 执行段(exec) + 资源段(resource)
- 代码段:正在运行程序的所有指令
- 资源段:指向进程需要的外部资源指针,文件、打印机、设备、其他进程
- 执行段:进程的当前执行状态量(私有数据、栈、程序计数器)
代码迁移方式
- Client-Server (CS):执行前后三者都在服务器端
- Remote Evaluation (REV):执行后将code迁移到服务器端
- Code on Demand (CoD):执行前客户端有exec和resource,执行后服务器端卸载code(与REV反)
- Mobile Agents (MA):执行前客户端和服务器端都有resource,执行后code和exec迁移至服务器
移动性
- 弱移动性:仅仅移动代码和数据片段(重启执行)
- 强移动性:移动组件,包括执行状态
- 迁移(migration):将整个对象从一台机器移动到另一台机器
- 克隆(cloning):将其设置为相同执行状态
虚拟机迁移
- 将内存持续的推送到新的机器上,在迁移过程中重新发送被修改过的页面
- 停止当前的虚拟机,迁移内存,然后重新启动
- 让新的虚拟机按序拉取内存页面:在新的虚拟机上立即创建进程,并且按需要拷贝内存页面