博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
操作系统设计与实现:深入解析 1
阅读量:6156 次
发布时间:2019-06-21

本文共 1333 字,大约阅读时间需要 4 分钟。

《Operation System Design and Implementation》(中文名:《操作系统设计与实现》)这本书可以说是讲述操作系统原理的经典之作,但令人意犹未尽的是,书中的内容多侧重于“如何做”,而对“为什么要这么做”往往只有寥寥数语。本文及后续的文章试图从更深入的层次去解析书中的内容,与各位共探讨。我假定您读过这本书,并对书中的内容有一定的熟悉程度,因此对书中原有内容将不再重复。后面的内容均基于该书英文版第三版。在必要的时候我会列出和我所写内容相关的书的章节号。

第一篇 关于临界段(原书相关内容:Section 2.2.3)

先看书的作者给出的解决critical region问题的两段程序:

while(TRUE) {        while(turn != 0);        critical_region();        turn = 1;       noncritical_region();}
while(TRUE) {       while(turn != 1);        critical_region();        turn = 0;        noncritical_region();}

这可以说是解决critical region问题的一个最简方案——不需要特别的硬件支持(不需要CPU有lock类指令)。尽管该方案存在着一些不好的限制(例如两个process只能且必须轮流进入critical region),但我们可以将该解决方案做为讨论问题的起点。

在看过书的作者给出的对以上代码的解释过后,有几个问题自然浮现于脑海:

1. 该方案解决critical region的基本原理是什么?

2. 是否可将该方案推广到任意个process?

3. 是否可以对其进行修改,以解决必须轮流进critical region的问题?

对第一个问题,我们仔细看一下turn变量。两个process进入critical region都会检测turn的值是否为0/1,而在退出critical region时会将turn设置为1/0。如果您曾了解过令牌环网,您也许就会想到,turn在此处实际上相当于一个令牌。两个process在进入critical region之前需要先获取令牌(检测turn为0/1),退出critical region时将该令牌释放(设置turn为1/0)。想到此处,问题2,3就迎刃而解了:

解答2. 将其推广到任意个process

假定我们有N个process,仍然将turn当作令牌来用,为每个process分配一个令牌ID (0~N-1),那么进程n就有如下代码:

while(TRUE) {   while(turn != n);    // 等待令牌    critical_region();     turn = (n+1) % N;    // 将令牌交给下一个进程    noncritical_region();}

 解答3. 如果某个不需要进入critical region的进程得到了令牌,那么只需将令牌直接交给下一个进程即可。相关代码就不详细列出了。

转载地址:http://uiffa.baihongyu.com/

你可能感兴趣的文章
使用SanLock建立简单的HA服务
查看>>
发现一个叫阿尔法城的小站(以后此贴为我记录日常常用网址的帖子了)
查看>>
Subversion使用Redmine帐户验证简单应用、高级应用以及优化
查看>>
Javascript Ajax 异步请求
查看>>
DBCP连接池
查看>>
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>
redhat6.1下chrome的安装
查看>>
cacti分组发飞信模块开发
查看>>
浅析LUA中游戏脚本语言之魔兽世界
查看>>
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
类与成员变量,成员方法的测试
查看>>