1.进程和线程管理
1.1 进程的概念
进程: 运行中的程序
例:4个程序组成的多道程序
- 逻辑上, 4个独立的、 顺序的进程的概念模型
- 物理上, 任意时刻只有一个是活动的
进程的本质:
- 本质上实现了“并发透明性”与“虚拟处理器”
- 从进程的角度,感知不到其他进程的存在
- 从系统的角度,进程之间相互独立,互不干扰
1.2 进程的状态
- 进程a等待输入而暂停执行, 进入阻塞队列
- 时间片到, 进程a暂停执行, 进入就绪队列, 调度器选择另一个就绪进程b
- 启动进程b运行
- 当输入完成后,进程 a进入就绪队列
1.3 进程的实现 - 进程表(PCB)
进程管理 | 内存管理 | 文件管理 |
---|---|---|
Registers Program counter Program status word Stack pointer Process state Priority Scheduling parameters |
Pointer to text segment Pointer to data segment Pointer to stack segment |
Root directory Working directory File descriptors User ID Group ID |
Process ID Parent process Process group Signals Starting time CPU time used Children’s CPU time Time of next alarm |
1.4 多进程模型的问题
- 进程切换开销大
- 进程间通信开销大
- 这是为实现透明性所付出的代价!
1.5 线程的概念
进程: 相关的运行资源的管理单位
-
内存空间
-
打开的文件
-
子进程、 信号处理、 记账信息等
-
资源分组
线程(线索): 在CPU上执行的脉络, 多线程是指操作系统的这样一种设计: 它允许在一个进程内部, 有多个执行路线“同时”进行
-
程序计数器、 寄存器、 栈
-
执行
1.6 线程模型
多线程进程: 一个线程被阻塞时, 可运行同一进程中的另一线程(阻塞→就绪→运行)
线程 → 进程; 进程 → 处理机;
每个线程可共享所属进程的资源
每个进程的项目 | 每个线程的项目 |
---|---|
地址空间 全局变量 打开的文件 子进程 挂起警报 信号和信号处理器 计费信息 |
程序计数器 堆栈 寄存器 状态 |
每个线程拥有自己的栈:局部变量、返回地址
1.7 线程用途
(1)进程间通信(IPC)
大型应用程序需要进程间通信:进程间通信IPC中的上下文切换
缺点:切换开销大
解决方案:线程切换
(2)多线程服务器
举例: 多线程的Web服务器
多线程服务器的组织方式
(a)分派者 / 工作者模型
(b)团队模型
(c)管道模型
1.8 多线程的实现方式
(1)用户级线程
**用户级线程的优点 **
- 切换开销小
- 调度策略“因应用而异”
- 与操作系统关联少, 可移植性好
用户级线程的缺点
- 一个线程因系统调用阻塞, 导致整个进程阻塞
- 纯ULT中, 由于一个进程只能分配 一个处理机, 所以ULT无法利用多处理机带来的并行运算优势
(2)内核级线程(KLT)
**内核级线程(Kernel Level Thread, KLT) **
- 操作系统全权负责线程管理
- 操作系统内核提供API
**内核级线程的优点 **
- 一个线程阻塞, 其它线程不受影响
- 可以利用多处理机优势
- 操作系统内核本身也可以实现为多线程
**内核级线程的缺点 **
- 线程切换和管理开销大, 性能优势有损失
不同实现方法开销对比(VAX机, UNIX系统)
操作 | ULT | KLT | 进程 |
---|---|---|---|
仅生成一个线程 | 34 | 948 | 11,300 |
唤醒等待实体 | 37 | 441 | 1,840 |
(3)轻量级进程(LWP)
轻量级进程(Light Weight Process, LWP)
- 线程的创建、 调度、 同步都实现在用户级
- KLT被用作线程“代理”
- 试图综合ULT与KLT的优点
1.9 Job、 Process、 Thread的相互关系
2.虚拟化技术
2.1 虚拟化技术
**虚拟化在分布式系统中的作用 **
- 支持遗留软件(legacy software)
- 减少软件平台和机器类型的数量
- 高移植性和灵活性
虚拟化系统结构
(a) 程序、 接口、 和系统之间的通用结构
(b) 在系统B之上的虚拟化系统A的通用结构
2.2 虚拟化系统提供4种接口
(1)硬件虚拟化: 由机器指令组成的硬件和软件间接口 (通用指令)
- 可被任何程序调用
(2)硬件虚拟化: 由机器指令组成的硬件和软件间接口(特权指令)
- 只可被特权程序(如OS内核) 调用
(3)OS虚拟化: 由系统调用(如OS提供) 组成的接口
(4)编程虚拟化: 由子程序库调用组成的接口
- 通常构成应用程序接口 (API).
- 很多情况下, 上述系统调用隐藏在 API中
2.3 虚拟机体系结构
**两种虚拟化方式 **
- 构建一个运行时系统, 如 Java运行环境, 或者, 进程 虚拟机
- 完全屏蔽硬件, 提供另一种机器指令界面, 称为虚拟监控器(VMM) , 如VMware 系统, Xen系统(可提供给不同的程序, 多操作系统并发)
2.4 虚拟化技术的比较
虚拟化技术 | 优点 | 缺点 |
---|---|---|
硬件虚拟化 | 每个虚拟机都构成一个独立完整的计算环境。 虚拟机的性能高、 安全性好、 隔离性好。 | 不同的处理器需采用不同的虚拟软件。 软件成本高、 很难实现真正的物理级兼容性 |
操作系统虚拟化 | 每台计算机只虚拟一种操作系 统。 管理简单、 性能较高, 安 全性中等。 | 只能支持同一操作系统下的不同应用。 主操作系统决定虚拟操作系统的安全性 |
虚拟化PC | 每台PC机可提供2个操作系统的虚拟组合, 在X86体系结构上应用比较成功。 性能取决于PC机的硬件配置 | 硬件兼容性不全面, 性能和安全性较差。 |
编程虚拟化 | 兼容性取决于JVM。 支持跨平台应用, 大幅度减少应用程序移植的工作量。 | 大并发程序执行的性能、 可靠性、 安全性存在风险 |
3.客户进程设计
3.1 用户接口
客户程序: 用户接口
3.2 网络化用户接口
带专用协议的网络化应用程序
支持访问远程应用程序的通用方案
举例: X-Window图形接口系统
- X-kernel: Windows manager
3.3 客户程序对分布透明性的支持
存取透明性
- 客户存根程序(stub):代理程序
- 隐藏客户和服务器主机之间的硬件差异和通信
位置透明性、迁移透明性、重定位透明性
- 命名系统:全局逻辑名字
- 重新绑定机制:当服务器改编为之后,通知客户重新自动绑定
举例: 使用客户端解决服务器复制透明性的方案
复制透明性
- 客户代理(proxy),转化到来的请求
**失败透明性 **
- 重新连接: 通信失败时, 重试
- 本地数据缓存: 例, 脱机方式
**并发透明性、 持久透明性 **
- 需要客户软件的支持很少
- 并发透明性: 事务监控器(中介服务器) 实现并发控制和恢复
- 持久透明性一般完全由服务器处理
4.服务器进程设计
4.1 基本概念
服务器:为一组客户提供专门服务的进程
A server is a process implementing a specific service on behalf of a collectionof clients. In essence, each server is organized in the same way: it waits for anincoming request from a client and subsequently ensures that the request istaken care of, after which it waits for the next incoming request.
设计问题一:服务器的组织形式
- 迭代服务器: 服务器自己处理请求
- 并发服务器: dispatcher与worker
设计问题二:客户机如何接入服务器
- End point(port)
4.2 服务器设计
(1)Client-to-Server两种绑定策略
- (a) 静态:由daemon进程负责(如,DCE)
- (b) 动态:由superserver进程负责(如,Unix inetd;YARN)
(2)设计问题三:服务中断处理策略
客户重启: 中断连接
客户发送out-of-band命令
发送方法:
- 利用单独另外的控制端点, 或者,
- 利用同一链路, 如, TCP中发送urgent data
(3)设计问题四:服务器设计为无状态/有状态
Client-to-Server两种连接方式
- 无状态服务器:服务器不保存客户程序的状态,如,Web服务器
- 有状态服务器:保存客户程序的状态,如,NFS文件服务器
- 文件使用表(客户,文件,可更新否)
- 服务器重启时:回复故障前状态
用无状态服务器实现有状态服
- 仿真方式: 例: Read文件Open, Read, Close
Cookie: 客户的标识数据
- 在Web服务器中记录客户的行为历史信息, 利用Cookie机制进行管理
- 对用户是透明的。 如保存用户的登录信息
- 缺点: 违反隐私权, 有安全性隐患(仿冒ID)
4.3 服务器集群
服务器集群: 一组由网络连接的机器, 每台机器上运行一个或多个服务器进程
系统结构:逻辑上由三层组成
TCP转发原理
**负载平衡策略 **
- 轮转法
- 内容感知的请求分布
4.4 分布式服务器
配置可动态变化的机器群
访问点也可以变化
实现技术 :MIPv6支持移动节点的机制
移动节点
- 原籍网络(home network)
- 原籍地址(home address) : 稳定、 不变化
- 原籍代理(home agent) : 特别的路由器
- 暂住地址(care of address) : 临时的网络地址
路由优化
4.5 服务器机群管理
通用方法
- 在普通节点上通过远程登录:监控、 安装、 改变组件
- 在管理机操作:收集信息、 升级组件、 增减节点
4.6 例:PlanetLab -协作型分布式系统
VMM – 虚拟机监控器
Vserver – 虚拟服务器(程序库、 通信)
节点管理器: 管理工具
- 节点拥有者: 提供资源
- 切片授权者: 子资源管理
- 管理授权者: 节点管理
- 服务提供者: 使用者
实体间的管理关系
- 节点拥有者把它的节点加入到管理授权者的范围下, 以适当地限制使用
- 管理授权者提供必要的软件, 在PlanetLab系统中增加节点
- 服务提供者向管理授权者注册, 对后者提供的节点表示信任
- 服务提供者联系切片授权者, 请求在一组节点上创建一个切片
- 切片授权者需要对服务提供者进行授权认证
- 节点拥有者为切片授权者提供切片创建服务。 实质上是向切片授权者委托资源管理
- 管理授权者向切片授权者委托切片创建
5.代码迁移
5.1 代码迁移目的
**操作传送(operation shipping) **
- 代码迁移(code migration)
- 进程迁移(process migration)
**目的: **
- 改进性能
- 负载平衡, 例: 网格计算
- 减少通信量, 例, query shipping
- 并行性, 例, 并行搜索Web
- 灵活性:动态配置分布式程序
- 攻击
5.2 代码迁移的原因
实现客户与服务器通信的动态配置原理:客户首先取得必需的软件, 然后调用服务器
代码迁移的主要问题是: 安全性问题, 易受攻击
5.3 代码迁移模型
**进程的组成 **
- 代码段: 指令集
- 资源段: 外部资源引用, 文件、 打印机、 设备等
- 执行段: 状态, 私有数据、 SP, PC等
**移动方式 **
- 弱移动性: 只移动代码段
- 强移动性: 移动代码段、 执行段
发起方式
- 发送者发起: 上载程序(MapReduce)
- 接收者发起: 下载程序(applet)
代码迁移的分类
5.4 局部资源
**代码迁移过程中对资源如何处理? **
**“进程-资源”绑定关系 **
- By-identifier: 通过标识符, 如URL
- By-value: 引用资源的值, 如标准函数库
- By-type: 引用某个类型的资源, 如打印机
**“资源-机器”绑定关系 **
- Unattached: 独立于机器, 如数据文件
- Fastened: 与机器有关联, 难以移动, 如局部数据库
- Fixed: 与机器密切绑定, 不能移动, 如硬件设备
解决对局部资源引用的方法
- GR: 建立全局引用。 例, URL
- MV: 移动资源
- CP: 拷贝资源的值
- RB: 重新绑定局部可用资源。
5.5 异构系统中的代码迁移
**异构系统: 不同的硬件和操作系统 **
弱移动性: 重新编译源代码, 生成新的代码段
强移动性:
-
避免执行段中有平台相关的数据
例: 迁移栈(migration) 方法
- 迁移只能发生在固定点: 子程序调用
- 程序栈保存在迁移栈中
- 在迁移时, 全局数据和迁移栈内容发给目标机器
-
虚拟机方法。 在虚拟机上执行源代码或中间代码, 支持可移植语言
迁移栈方法的工作原理
5.6 D‘Agents中的代码迁移
D’Agent, 也称为Agent Tcl
**支持代码迁移的中间件平台系统 **
- sender发起的弱迁移性
- 进程迁移执行的强迁移性
- 进程克隆执行的强迁移性
**Agent: 可在不同机器上迁移的程序 **
- 解释型语言: Tcl, Java,等
- 脚本(Script) :指令序列
举例: 独立进程执行的弱迁移,向远程机器交付一个脚本
proc factorial n { # 计算n的阶乘n!
if ($n <= 1) { return 1; } # fac(1) = 1
expr $n * [ factorial [expr $n – 1] ] # fac(n) = n * fac(n – 1)
}
set number … # tells which factorial to compute
set machine … # identify the target machine
agent_submit $machine –procs factorial –vars number –script {factorial $number }
agent_receive … # receive the results (left unspecified for simplicity)
举例: sender发起的强迁移
tcl Agent迁移到另一台机器上执行UNIX who 命 令
all_users $machines
proc all_users machines {
set list "" # Create an initially empty list
foreach m $machines { # Consider all hosts in the set of given machines
agent_jump $m # Jump to each host
set users [exec who] # Execute the who command
append list $users } # Append the results to the list
return $list # Return the complete list when done
}
set machines … # Initialize the set of machines to jump to
set this_machine # Set to the host that starts the agent
# Create a migrating agent by submitting the script to this machine, from where
# it will jump to all the others in $machines.
agent_submit $this_machine –procs all_users -vars machines script { all_users $machines }
agent_receive … #receive the results (left unspecified for simplicity)
5.7 实现技术
**D‘Agents系统体系结构 **
- 服务器: agent管理, 授权,通信管理
- RTS内核: agent模型, 启动和结束agent, 迁移操作, agent间通信
- 解释器: 解释器组件, 安全性模块, 内核接口, 代理运行状态
**D‘Agents 中代理的状态构成 **
- 4张表: 纪录数据状态
- 2个栈 : 记录执行命令
状态 | 描述 |
---|---|
全局解释器变量表 | agent 解释器需要的变量 |
全局系统变量表 | 返回代码, 错误代码, 错误消息串等 |
全局程序变量表 | 程序中用户定义的全局变量 |
过程定义表 | Agent执行的脚本定义 |
命令栈 | 当前执行命令的命令栈 |
调用祯栈 | 激活记录栈, 每条命令一个 |