操作系统
1 第一章 分布式系统概述
1.1 什么是分布式系统
- 是若干独立计算机的集合,对用户来说就像一个系统。
1.2 分布式系统中透明性定义,种类
- 定义:在用户和应用程序面前呈现为单个计算机系统,这样的分布式系统就称为是透明的。
- 分类:
- 访问透明性、位置透明性、迁移透明性、重定位透明性、复制透明性、并发透明性、故障透明性、持久性透明性
1.3 分布式系统中的扩展技术有哪些?
- 隐藏通信等待时间(针对客户端而言,异步通信)
- 分布技术(针对服务端而言,切分)
- 复制技术(例如:缓存)
2 第二章 体系结构
2.1 客户端-服务器模型
-
服务器(server):实现某个特定服务的进程
-
客户(client):向服务器请求服务的进程
-
交互方式:请求、应答
-
连接方式:
- 基于无连接的:高效,易出故障。适合局域网
- 基于有连接(TCP/IP)的:相对低效。适合广域网
-
客户端-服务器模型:通常分为三个层
(1)用户界面层:负责与用户交互
(2)处理层:处理业务逻辑
(3)数据层:负责数据存储与数据一致性
3 第三章 分布式进程管理
3.1 进程和线程的比较
-
相同点:生命周期相同(新建、就绪、运行、阻塞、死亡)
-
不同点
(1)起源不同:先有进程,后有线程(线程的出现目的是提高CPU的利用效率)
(2)概念不同:进程:资源分配的基本单位。 线程:CPU调度的基本单位
(3)内存共享方式不同:进程:IPC。 线程:进程内部的不同线程可以共享资源,直接通信
(4)拥有的资源不同:进程拥有的资源比线程多
(5)数量不同:一个进程可以对应多个线程
(6)开销不同:线程开销小且线程间切换速度快
3.2 多线程服务器的优点?
- 简化服务器代码
- 使开发高性能服务器变得容易
3.3 代码迁移的动机有哪些?
- 定义:是将程序(或执行中的程序)传递到其它计算机。根本目的:提高系统的整体性能。
- 动机:实现负载均衡(防止某台机器压力过大)、改善通信性能(通信密集的进程集中到一台机器上)、可用性(关闭机器时必须迁移)、使用特殊功能、灵活性
3.4 代码迁移时进程对资源的绑定类型有哪些?
-
标识符(例如:URL)、值(例如:编程语言中的头文件)、类型(例如:对打印机的引用)
上面三种资源与进程的绑定关系是由强到弱
3.5 代码迁移时资源对机器的绑定类型有哪些?
- 未连接(例如:数据文件,不依赖于机器)、附着连接(例如:数据库,不依赖于机器)、紧固连接(例如本地设备,依赖于机器)
4 第四章 分布式系统通信
4.1 什么是远程过程调用?远程过程调用的步骤。
-
定义:远程过程调用,即RPC。指本地程序调用位于其他机器上的进程,调用方和被调用方通过消息交流。
-
步骤:
- 去:客户调用客户存根 ----> 客户存根生成消息后调用本地OS ----> 本地OS将消息发给远程OS ----> 远程OS将消息交给服务器存根 ----> 服务器存根提取参数,执行
- 回:服务器将执行结果返回给服务器存根 ----> 服务器存根将结果打包成消息后调用服务器OS ----> 服务器OS将消息发送给客户端OS ----> 客户端OS将消息交给客户端存根 ----> 客户端存根提取结果,返回给用户
4.2 消息持久通信与暂时通信的区别?
- 消息持久通信:通信双方不必时刻保持运行,消息由通信系统存储,例如邮件系统。实时性要求低
- 消息暂时通信:通信双方通信过程中必须保持运行状态。例如导弹的控制。实时性要求高
4.3 消息同步通信与异步通信的区别?
- 消息同步通信:发送者发送消息后什么都不做就一直等待回信(就像痴情的人呀)
- 消息异步通信:发送者发送消息后就去干别的了(万花丛中过,片叶不沾身😊)
4.4 能够判断消息通信的类型。
4.5 多播通信:反熵和 gossiping。
-
多播通信:一个服务器向其他多台台服务器发送更新
-
反熵:服务器 P 周期的随机选取一台服务器 Q 交换更新,交换更新有三种方式:
(1)P把自己的更新发给Q(push)
(2)P拉取Q的更新信息(pull)
(3)P和Q交换信息(push-pull)
可以证明,最后一种效率最高。
-
gossiping(流言蜚语):如果服务器P刚刚因为数据项 x 而被更新,那么它联系任意一个其他服务器Q,并试图将更新推入Q。如果 Q 已经被其他服务器更新了, P可能会失去继续扩散的兴趣,变成隔离的(这种可能性是1/k) 。
(可以类比生活中:如果你听到一个奇闻异事,你会大概率分享给朋友,但如果朋友和你说已经听说过了,你可能就不会再和其他朋友说了,概率是1/k)
优缺点:快速传播更新的方法;但不能保证所有的服务器都被更新了。
5 第五章 命名系统
5.1 移动实体定位的方法有哪些?
- 方法1:广播和多播。包含该实体所用标识符的消息会广播到每台机器上,并请求每台机器查看它是否拥有该实体,有则返回。缺点:不适用于大型网络
- 方法2:转发指针。当实体从A移动到B后,它将在A上留下一个指向B的指针,顺着A就能找到该实体。缺点:链太长开销大、链脆弱易断开。
- 方法3:给实体指定起始位置。实体转移时,会通知起始位置自己当前位置,定位实体时,询问起始位置即可。缺点:延迟高、起始位置不能随意改变。
- 方法4:分层方法。网络划分为不同的域,域可以组合成更高的域。只有一个顶级域。实体位于叶节点。每个域的根节点知道该域中存储的所有实体的地址。
5.2 描述分层方法中查找一实体的过程。
- 如上图,在叶域D中定位实体E。若E的地址在D中可直接返回结果,否则向上请求,直到找到第一个存储了E的位置记录的节点M,M通过指向子域的指针最终到达叶节点L,L将E的地址返回给用户即可。
5.3 描述分层方法中插入一实体的过程。
- 首先查找到实体E。若E的地址在D中可直接返回,否则向上请求,直到找到第一个存储了E的位置记录的节点M,M通过指向子域的指针最终到达叶节点L,此时找到实体E的地址。
- 然后节点M会创建一指针,指向转发插入请求的那个节点,直到到达叶节点为止。
- 最后在D中创建一条记录,存储实体E的地址。
6 第六章 同步
6.1 Lamport 时间戳算法的思想
- Lamport 是一种逻辑时钟,可以对系统中的事件进行完全排序。
- 思想:同一台机器上的时钟相同,不需要考虑同步问题。考虑不同进程运行在不同机器上,每台机器时钟不同,时钟的运行速度也不同。进程 i 在发送消息时,将自己当前的时间(记为t1)一起发送,接受进程 j 接到消息后(j 接收到消息的时间设为t2)更新自己的时钟为max(t1 + 1,t2)。
- 另外还有一个问题,如果两个不同机器上的进程发送消息的时间(指各自机器上的时间)相同,可以通过在时间加上(0.k)解决时间相同的问题(k为进程编号,不会相同)
6.2 选举算法中 Bully 算法的思想
-
Bully 算法又被称为欺负算法(因为总是存活的最大的进程取得胜利,以大欺小),前提假设:任意一个进程都知道其他进程的编号。
-
思想:当任一进程(设为P)发现协调者崩溃后,他会发起一次选举,过程如下:
(1)P向所有编号比它高的进程发 ELECTION 消息
(2)如果得不到任何进程的响应,进程 P 获胜,成为协调者
(3)如果有进程号比它高的进程响应,该进程接管选举过程,进程 P 任务完成
当其他进程都放弃,只剩一个进程时,该进程成为协调者;一个以前被中止的进程恢复后也有选举权。
6.3 选举算法中环算法的思想
-
思想:不使用令牌,按进程号排序,每个进程都知道自己的后继者,当进程 P 注意到需要选举一个进程作协调者时,按照下面的过程选举协调者:
(1)创建一条包含该进程号的 ELECTION 消息,发给后继进程
(2)后继进程再将自己的进程号加入 ELECTION 消息,依次类推
(3)最后回到进程 P,它再发送一条 COORDINATOR 消息到环上,包含新选出的协调者进程 (进程号最大者)和所有在线进程,这消息在循环一周后被删除,随后每个进程都恢复原来的工 作。
6.4 实现事物的方法
-
私有工作空间
- 为进程提供一个私有工作空间,包含进程要访问的所有对象。进程的读写操作在私有工作空间进行,而不对实际的文件系统进行。
- 如果事务中止,私有工作空间被释放,指向的私有块被删除。如果事务提交,私有索引被移到父辈空间,不再被访问的块被释放掉。
-
写前日志
- 先写日志,再做修改
- 日志内容:增删改
6.5 分布式的死锁检测 Chandy-Misra-Haas 算法的思想?
- CMH算法允许进程一次请求多个资源(如锁)。
- 当某个进程等待资源时,例如 P0 等待 P1,将调用 CMH 算法。生成一个探测消息并发送给占用资源的进程。消息由三个数字构成:(阻塞的进程,发送消息的进程,接受消息的进程)。消息到达后,接受者将更新消息后,继续发给它所等待的其他进程,如果最终P0又接收的它发出去的消息,说明存在死锁。
7 第七章 一致性和复制
7.1 复制的目的和代价。
- 目的:提高系统的可靠性和性能
- 代价:为了确保各个副本的一致性,需要付出如下代价:
- 网络通信开销
- 网络延迟使得强一致性难以完成
7.2 能区分是否符合严格一致性、顺序一致性、因果一致性和FIFO 一致性。
约定:下面的图形时间轴总是水平绘制的。
W i ( x ) a W_i(x)a Wi(x)a 表示进程 P i P_i Pi 把数据值a写入数据项x, R i ( x ) b R_i(x)b Ri(x)b 表示进程 P i P_i Pi 从数据项x读取数据的返回值为b。
假设每个数据的初始值为NIL。
当不会混淆哪个进程访问数据时,我们可以将 W W W 和 R R R 的下标去掉。
- 严格一致性:任何对数据项x 的读操作将返回最近一次对x 进行写操作的值。
- 顺序一致性:多个进程对数据项x 读取的内容顺序一致。
- 因果一致性::所有进程必须以相同的顺序看到具有潜在因果关系的写操作,不同机器上的进程可以以不同的顺序看到并发的写操作。
- FIFO一致性:由某一个进程完成的写操作可以被其他所有的进程按照顺序感知到。进程间的写操作顺序无所谓。
7.3 能区分是否符合单调读、单调写、写后读和读后写。
约定:下面的图形时间轴总是水平绘制的。 如果从上下文可以清楚判断时间顺序,那么时间可以不写。
x i [ t ] x_i[t] xi[t] 表示t 时刻本地副本 L i L_i Li 中数据项x 的版本。
初始化后,对 L i L_i Li 中的 x 进行一系列写操作将得到版本 x i [ t ] x_i[t] xi[t] ,我们将这些操作的集合记为 W S ( x i [ t 1 ] ) WS(x_i[t_1]) WS(xi[t1]) 。如果在随后的 t 2 t _ 2 t2 时刻, W S ( x i [ t 1 ] ) WS(x_i[t_1]) WS(xi[t1]) 中的操作也已经在本地副本 L j L_j Lj 上执行完毕,那么记作 W S ( x i [ t 1 ] , x j [ t 2 ] ) WS(x_i[t_1], x_j[t_2]) WS(xi[t1],xj[t2]) 。
注意:以下都是针对一个进程的操作,即一个进程在两个不同的备份上的操作。
- 单调读::如果一个进程读取数据项 x 的值,那么该进程对 x 执行的任何后续读操作将总是得到第一 次读取的那个值或更新的值。
- 单调写:如果一个进程对数据项x执行的写操作必须在该进程对x执行的任何后续写操作之前完成。
- 写后读:一个进程对数据项 x 执行的写操作结果总会被该进程对 x 执行的任何后续读操作看见。
- 读后写:同一个进程对数据项 x 执行的读操作之后的写操作,保证发生在与 x 读取值相同或更新的值上。
7.4 基于主备份的协议: 远程写协议、本地写协议
在基于主备份的协议中,每个数据项 x 都有一个关联的主备份,负责协调 x 的写操作。根据主备份是否被固定在一个远程服务器上,或将主备份移动到启动写操作的进程那里之后写操作是否可在本地执行,可以区分各种基于主备份协议。根据主备份的位置可将基于主备份的写协议分为远程写协议和本地写协议。
- 远程写协议:写操作被发送到远程主服务器。读操作在本地服务器即可
- 本地写协议:读写都在本地服务器。注意:写进程在哪,主服务器就移动到哪,需要被更新的数据只存在一份,也同时移动到哪。
7.5 掌握基于复制的写协议。
-
主动复制(了解):
- 写操作可以在多个副本上执行,每个副本对应一个进程,该进程执行更新操作;
- 写操作导致更新传播
- 操作需要在各地按相同顺序进行(时间戳、定序器)
-
基于法定数目的协议
8 第八章 容错性
8.1 什么叫容错性?
- 系统即使发生故障也能提供服务.
8.2 拜占庭将军问题
- Lamport 证明在具有 m 个故障进程的系统中,只有存在 2m+1 的正常工作的进程才能达成协议, 即总进程为 3m+1。
8.3 什么叫原子多播?
-
在分布式系统中经常需要保证消息要么被发送给所有的进程,要么就不向任何进程一个也不发送。 另外,如果传送的话,通常还需要所有的消息都按相同的顺序发送给所有的进程。这种方式称为原子多播。
-
虚拟同步:保证多播到组视图的消息被传送给组中的每个正常进程,如果发送消息的进程在多播期间失败,则消息或者传递给剩余的所有进程,或者被每个进程忽略。具有这种属性的可靠多播称为虚拟同步。
-
消息排序
- 可靠不排序的多播:对接收不同进程发送的消息的次序不做任何保证
- FIFO 顺序的多播:按照消息发送的顺序传送同一进程的消息,对不同进程发送的消息的传送 顺序没有约束
-
按因果关系排序的多播(了解)
-
全序多播:无论消息传送是无序、 FIFO 顺序还是按因果关系排序,对所有的组成员按相同的次序传送
8.4 分布式提交—两阶段提交的思想?
-
分为两个阶段,如下的(1)(2)属于第一阶段;(3)(4)属于第二阶段
(1)协调者向所有的参与者发送一个 VOTE_REQUEST 消息。
(2)当参与者收到 VOTE_REQUEST 消息时,如果同意返回VOTE_COMMIT,不同意返回VOTE_ABORT。
(3)协调者收集来自参与者的所有选票。有一个不同意则取消事务。
(4)参与者等待协调者的最后反应。如收到GLOBAL_COMMIT,就本地提交事务,收到GLOBAL_ABORT则取消本地事务。
-
另外,可能的阻塞状态:
- 参与者在 INIT 状态等待协调者的 VOTE_REQUEST 消息;
- 协调者在 WAIT 状态等待来自每个参与者的表决;
- 参与者在 READY 状态等待协调者发送的全局表决消息;
9 第九章 分布式安全
9.1 什么是机密性和完整性?
- 机密性:指计算机系统的一种属性,系统凭借此属性使得信息只向授权用户公开。
- 完整性:是指对系统资源的更改,只能以授权方式进行。
9.2 对称加密系统和公钥系统的区别?
-
对称加密系统:加密与解密秘钥相同,即 P = D k ( E k ( P ) ) P=D_k(E_k(P)) P=Dk(Ek(P)) ,也称为共享秘钥系统。
-
公钥系统:也称为非对称加密系统,加密秘钥和解密秘钥不同(一个公开、一个保密),但构成唯一一对,即 P = D k d ( E k e ( P ) ) P=D_{kd}(E_{ke}(P)) P=Dkd(Eke(P))。
后者计算上更加复杂。用 RSA 加密消息比 DES 慢大约 100-1000 倍。所以一般用 RSA 以安全方式交换共享密钥,很少用它来实际加密“标准”数据。
9.3 什么是安全通道?
- 保证客户和服务器之间的安全通信的通道称为安全通道。
- 使客户与服务器之间的通信保持安全,免受对消息的窃听、修改和伪造的攻击。
- 安全通道包含如下内容:
- 身份验证:通信双方需要验证身份
- 基于共享密钥的身份验证
- 使用密钥发布中心的身份验证
- 使用公钥加密的身份验证
- 消息的完整性和机密性:消息未受到窃听、修改和伪造的攻击
- 身份验证:通信双方需要验证身份
9.4 阐述基于共享密钥的身份验证的思想。
共享公钥只有Alice和Bob才知道。
- 如图9.13 Alice请求与Bob建立通信,给Bob提出问题 R A R_A RA ;
- Bob对问题加密,同时将自己的问题 R B R_B RB 发给Alice;
- Alice收到加密后的 R A R_A RA 后就可以确定对方是Bob,然后Alice将加密后的 R B R_B RB 发给Bob;
- Bob收到加密后的 R B R_B RB 后就可以确定对方是Alice。可以建立通话。
9.5 阐述使用密钥发布中心的身份验证的思想。
目的是减少秘钥的数量,下面是对左图的描述
- Alice想和Bob通信,发送消息A,B给KDC;
- 然后KDC将A,B间的共享秘钥 K A , B K_{A,B} KA,B 加密后分别发给Alice和Bob,然后两者就可以通信了。
上面的方法存在问题:KDC发给Bob的信息可能会有延迟,但Alice已经认为和Bob建立联系了。右图避免了这个问题。
9.6 阐述使用密钥发布中心的身份验证的思想。
Alice、Bob分别拥有对方的公钥。
- Alice请求与Bob建立通信,将自己的请求A和问题 R A R_A RA 用Bob的公钥加密后发给Bob;
- Bob通过自己的私钥解密后,将 R A R_A RA 以及自己的问题 R B R_B RB 以及之后通话的共享秘钥 K A , B K_{A,B} KA,B 一起用Alice的公钥加密后发给Alice;
- Alice通过自己的私钥解密后,发现了自己的问题 R A R_A RA ,可以确定对方是Bob,然后将 R B R_B RB 通过 K A , B K_{A,B} KA,B 加密后发给Bob;
- Bob收到消息后,发现Alice可以解密自己发送过去的消息,可以确定对方是Alice。
9.7 使用公钥加密对消息进行数字签名的思想。
- 数字签名利用了公钥、私钥对唯一对应的思想。这样就将人和消息一一对应了起来。目的是为了保证消息的完整性。
- Alice将想要发送的消息m发送给Bob,将消息m用自己的私钥(这里可以保证一一对应,即数字签名)加密,然后用Bob的公钥加密,之后Bob进行解密即可。
上述缺点:Alice 可以声称其私钥被盗,存在安全性问题。另外发送的消息m可能很大,加密开销大。可以通过哈希函数来解决,如下图:
9.8 Diffie-Hellman 建立共享密钥的原理。
Diffie-Hellman 是公钥加密系统,目的是建立共享密钥。
- 首先,Alice 和 Bob 双方约定 2 个大整数 g 和 n,其中 1< g < n,这两个整数无需保密。然后执行下面的过程:
- Alice 随机选择一个大整数 x (保密),并计算 X= g x g^x gx mod n
- Bob 随机选择一个大整数 y (保密),并计算 Y= g y g^y gy mod n
- Alice 把 X 发送给 Bob,Bob 把 Y 发送给 Alice,然后两者可以计算出共享秘钥K
- Alice 计算 K= Y x Y^x Yx mod n = g x y g^{xy} gxy mod n
- Bob 计算 K= X y X^y Xy mod n = g x y g^{xy} gxy mod n
9.9 权能和委派
-
权能:对于指定资源的一种不可伪造的数据结构,指资源的拥有者关于该资源的访问权限。
-
委派:将某些访问权限从一个进程传送到另一个进程,使得在多个进程间分布工作变的更容易,而又不会对资源保护产生明显影响。
10 第十章 分布式文件系统
10.1 NFS 的共享预约
- 一种锁定文件的隐含方法。
- 客户指定它需要的访问类型(读、写、Both),服务器根据当前文件的权限确定该文件是否能满足客户的请求。
10.2 NFS 的重复请求高速缓存
- 每个来自客户的 RPC 请求头部都有一个唯一的 XID(事务处理标识符)。当 RPC 请求到来时,服务器缓存其标识符。只要服务器还没有发出响应,就说明正在处理这个 RPC 请求。当服务器处理了某个请求后,也缓存该请求的关联响应,此后该响应才返回客户。现在需处理如下三种情况:
- 客户启动计时器,超时前若客户没有收到响应,就使用与原 XID 请求重传。若服务器还没处理完原先的请求,忽略此重传请求。
- 服务器刚向客户端返回响应后收到重传请求。如果重传请求到达时间与服务器发送应答时间接近,服务器忽略此重传请求。
- 响应确实丢失了,应该向客户端发送操作的缓存结果以响应重传的请求。
10.3 Coda 的回叫承诺
- 对于每个文件,客户从服务器获取文件时,服务器记录哪些客户在本地缓存了该文件的拷贝,此时称服务器为客户记录回叫承诺。
10.4 Coda 的储藏技术
- Coda 允许客户在断开连接时的继续操作。
- 使用本地备份,再次连接后回传服务器。基于事实,两个进程打开相同的文件进行写操作很罕见。
- 为了成功地完成断开连接操作,需要解决的问题是确保客户缓存包含连接断开期间将访问的那些文件。
- 如果采用简单的缓存方法,可以证明客户可能由于缺少必要的文件而不能继续执行。预先使用适当的文件填充高速缓存称为储藏。