分布式系统(3)-进程

线程

分布式系统中用线程而不是进程

  1. 避免不必要的阻塞,在进行I/O操作的时候,对具备多个线程的进程,OS可以将CPU切换到进程的另外 一个线程
  2. 发挥并行性
  3. 避免代价过高的进程上下文的切换

上下文

系统运行过程中的一系列状态,状态的含义因系统的不同而不同

  • 处理器上下文
    • 处理器用于运行一系列指令的保存在寄存器中的最小数据集合(如:栈指针、地址寄存器、程序计数器)
  • 线程上下文
    • 用于执行一系列指令的保存在寄存器和内存中的最小的数据集合(如:处理器上下文、状态等)
  • 进程上下文
    • 用于执行线程的保存在寄存器和内存中的最小的数据集合(线程上下文、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):将其设置为相同执行状态

虚拟机迁移

  • 将内存持续的推送到新的机器上,在迁移过程中重新发送被修改过的页面
  • 停止当前的虚拟机,迁移内存,然后重新启动
  • 让新的虚拟机按序拉取内存页面:在新的虚拟机上立即创建进程,并且按需要拷贝内存页面