(五) 操作系统结构
( OS structure)
( 1) 操作系统采用结构程序设计的必要性
由于 OS日趋庞大,结构日益复杂,错误增加以至不可避免。
例如 IBM/360操作系统第一版化了 5000人年,但在以后每个
新版中都纠错多处。 Microsoft的浏览器程序 Ixplorer也面
临一群潜在性地涉及到严重隐私和安全问题的臭虫,为此发
布了三个补丁程序包含在 IE5.01中。
其次由于 OS存在并发性,进程间执行序列数量巨大,推进序
列不确定性,程序错误的某种表现形式不重复出现,可能使
人误解为一次偶然性机器的故障。这给 OS调试带来了困难。
为了使 OS高可靠、高效能、可理解和可修改,操作系统必须
采 用结构程序设计方法。
( 2) 模块接口( modular programming)
法 /
单一结构( monolithic)法
模块接口法是 OS最早采用的一种结构程序设计方法,早期
操作系统( IBM的 OS)和小型 OS(如 MS-DOS)均属此类型。
? 模块接口法把一个系统按功能分成若干个具有一定独立性和
大小完成某方面功能的模块,并规定好各模块之间的接口。
接着在明确每个模块的内部功能的基础上对它们进行独立设
计。最后在各模块设计完成后按照模块间的接口关系,将所
有模块逐步链接成一个大系统。
? 模块接口法的优点是使 OS设计实现模块化的基本结构程序设
计方法,它增加了 OS灵活性,便于修改和维护。但由于模块
部接口复杂,使得系统的结构关系不清晰,因而使系统的可
靠性降低。故又称模块接口法为无序模块法。
模块组合结构
模块组合结构的特点与适应性
– 模块间转接随便
– 数据基本上作为全程量处理
– 常常关中断,系统的并发性难以提高
( 3) 层次( layered)结构法? 为了减少各模块之间无序调动、互相依赖关系,特别是清除
循环现象,引入层次结构设计法。 它将模块间无序调用变为
有序调用,它把 OS的所有功能模块,按功能流图的调用次序,
排列成若干层,各层之间的模块只能是单向调用关系,即是
只允许上层模块调用下层模块。 这样不但操作系统的结构清
晰,而且不构成循环。
? 层次结构法采用自底向上法形成操作系统。它先在裸机上
添加第一层精心编制的软件,形成比原来机器功能更强的机
器,称为虚拟机 A1。再经过几乎是穷尽无遗的测试后,就有
较大把握确信虚拟机 A1是正确的。然后,再在 A1上增加一层精
心编制的软件,形成功能更强、更接近于实际要求的虚拟机
A2,再经过几乎是穷尽无遗的测试,…… 如此一层一层地自
底向上地铺设各软件层,每一层都实现若干功能,最后构成
满足要求的虚拟机 An。因此只要下层各模块设计是正确的,
就为上层功能模块的设计提供了可靠基础,从而增加了系统
的可靠性。
层次结构法 -1
? 1968年 Dijkstra在 ELX8 机器上编制的操作系统 THE中采用
各层间单向依赖,层内各模块互相独立的全序的层次关系
设计。但该系统通信开销大,系统经过层层调用效率低,
该设计方法不适用大型 OS。在大层 OS中要建立一个全序的
层次结构关系是十分困难,往往无法避免循环现象。因些
层次结构设计应作为 OS设计的原则,尽可能将操作系统各
功能模块排成有序层次,以便尽量减少系统中循环现象。
层次结构
– 例如 E.W.Dijkstra的 THE系统:
1
2
3
4
5
处理器分配和多道程序
内存和磁盘管理
操作员-进程通信
输入 /输出管理
用户程序
操作员
0
( 4)客户/服务器( Client/Server )方
式 /微内核( Microkernel ) 结构 ?
1。操作系统结构技术的发展是与整个计算机技术的发展相联系
的。操作系统采用客户/服务器结构,它将非常适应于分布
式处理的计算机环境中,所以说 C/ S模式是第三代操作系统。
2。 C/ S结构的思想是把 OS分成内核和若干个进程。每个进程实
现单个的一套服务(例如:主存服务、进程生成服务、处理
机调度服务),称为服务器进程。每个服务器进程运行在用
户态,它执行一个循环以检查是否有客户已请求某项服务 。
而客户可以是另外的操作系统成分,也可以是应用程序。 C/
S结构模式的操作系统有卡内基,梅隆大学研制的 Mach OS和美
国微软公司研制的 WindowsNT操作系统等。
微内核模式的特点
? 优点:
– 良好的 扩充性,只需添加支持新功能的服务进程即可
– 可靠性 好:调用关系明确,执行转移不易混乱
– 便于网络服务,实现分布式处理:以同样的调用形式,在
下层可通过核心中的网络传送到远方服务器上 (远地过程
调用 RPC,Remote Procedure Call)
? 缺点:
– 消息传递比直接调用 效率 要低一些 (但可以通过提高硬件
性能来补偿 )
RPC的过程,RPC应用程序-- RPC Stub(client)--
Network-- RPC Server--进行本地调用
客户/服务器( C/ S)方式 -13。 NT OS由 NT执行体和用户态服务器进程两部分组成,
? 运行在核心态内核,WindowsNT称为 NT执行体 。 NT执行体结构
是层次式与微内核的结合,它由一组部件构成。 NT最底层是
硬件抽象层( HAL),NT内核是第二层,它负责对中断和异常
作出响应;调度线程,提供一组基本对象和接口。 NT内核上
是一组部件:对象管理程序、安全调用监视程序、进程管理
程序、本地过程调用功能和虚拟内存管理程序等。 NT执行体
最上层系统服务是 NT执行体为用户态的进程提供的一个接口。
? 运行在用户态的并以客户/服务器方式活动的进程。 用户态
服务器进程又称保护子系统。 WindowsNT有二类保护子系统:
环境子系统和集成子系统。
? 环境子系统有 Win32子系统,OS/ 2子系统和 POSIX子系统
几种,每种子系统为特定的操作系统提供一个 API。集成子系
统是完成重要操作系统功能的服务器。这包括安全子系统,
网络软件中的若干部件(工作站服务和网络服务器服务)。
3。 Windows NT 框架图
Win32 客
户登录进程
POSIX 子系

OS / 2 客

POSIX 客

Win32子系统
系 统 服 务
I/ O管理程序
对象管理 安全调用 进程管理 本地过程 虚拟内 存 文件 程序
程 序 监视程序 程序 调用功能 管理程序 缓冲存储管理程序
设备驱动程序
内 核 网络驱动程序
OS / 2 子系

安全子系统
硬 件 抽 象 层
消息传递 系统捕获
用户态
核心态
N T
执行体
返 1
WindowsNT的 网络组件
Provider Interface供应商 接口( 网络 API:
命名管道和邮件槽,Winsock,RPC,CIFS,NetBIOS)
Redirector重定向器 Server服务器 ……
Transport Driver Interface( TDI)传输 驱动程序接口
Transport Protocol Drivers传输 协议驱动程序
( TCP/IP,NetBEUI,IPX/SPX( NWLink),DLC...)
NDIS Interface网络驱动程序接口规范 接口
Network adapter card drivers and miniport drivers
网络适配器驱动程序和小端口驱动程序
Network网络(以太网,ATM,IrDA)
Windows 2000/XP系统模型
? 融合了分层操作系统和微内核操作系统的设
计思想,使用面向对象的分析与设计,采用
整体式的实现
? Windows 2000/XP通过硬件机制实现了核心态
以及用户态两个特权级别 。对性能影响很大
的操作系统组件运行在核心态。核心内没有
保护。
? 设计充分体现了机制与策略分离的思想
Structure of Windows 2000
? Shaded area is executed
? Boxes,D,are device drivers
? Service processes are system daemons
系统支撑
处理器
系统支持进程 服务进程 用户程序 环境子系统
子系统动态链接库
用户态
用户态
核心态
核心态
硬件抽象层(HAL)
执行体
核心 设备驱动程序
图形引擎
系统支持进程 服务进程 应用程序
环境子系统
服务管理器
本地安全验证服务
Windows登陆
会话管理器
任务管理器
Windows
浏览器
用户级
应用程序
子系统动态链接库
系统级
线程
用户态
核心态
系统级服务调度进程
核心态可调用接口
图形驱
动程序
I/O设备管理器
设备、文
件系统驱
动程序
局部过程调用
注册表配置管理器
进程和线程虚拟存储器
电源管理器
即插即用设备管
理器
对象管理器
文件系统缓存管
理器
系统核心
硬件抽象层(HAL)
硬件接口
(总线、I/O设备驱动、中断、时钟间隔、直接内存存取(DMA)、存储器缓存控制器等等)
安全指向监视器
Windows 2000/XP的关键系统组件
Windows 2000网络体系结构
(六)实验
( 1) UNIX ( Linux)环境复合命令的使用
man *** 帮助
1.目录和文件操作:
pwd 打印当前工作目录
cd directory 改变当前目录
cd 当前目录变到用户主目录
mkdir 创建目录
rmdir 删除目录
chmod absolute-mode(777) file 改变目录和文件的存取权限
ln 文件链接
ls –laF 列出目录的内容
find directory –type/name –print 在目录下搜索符合条件的文件
cp 拷贝文件
rm 删除文件
mv 移动文件或重命名文件
2.文本文件操作命令:
more 逐屏显示文件
cat 显示文件或合并多个文件
grep [-y…… ] pattern [file…… ]文本文件搜索
sort [-nr…… ][+ position-[position]][file…… ] 文本文件排序
cut –flist[-dchar][file1…… ] 文本文件选择列
paste [-dchar] file1 file2… 文本文件列合并
join 文本文件按关键列合并
cmp 比较俩非文本文件
comm 比较俩文本文件相同
diff 比较俩文本文件不同
wc –lwc file 计数文件的行, 字, 字符
pr 打印
> 输出重定向
>> 附加输出到文件
< 输入重定向
| 管道
3,实验题,Linux环境复合命令的使用
Linux大部分可执行的指令和程序都放在/ bin,/
usr/bin子目录下, 试用 Linux命令组合按字母排序列出
指令的清单, 每行包括文件名, 存取权限, 文件大小 。
(2)linux进程控制类系统调用的使
用1.进程控制类系统调用
? fork系统调用创建新的子进程
格式,pid=int fork()
fork调用返回时,系统中已有两个用户级环境完全相同的进
程存在,这两个进程从 fork调用中得到的返回值不同,其中
子进程得到的返回值为零,父进程得到的返回值是新创建子
进程的进程标识号。
? exec系统调用
格式,(六种)
int execl(path,arg0,arg1,…,argn,(char *)0)
char *path,*arg0,*arg1,…,*argn ;
exec调用进程的正文段被指定的目标文件的正文段所覆盖,
其属性的变化方式与 fork成功后从父进程那里继承属性的方
式几乎是一样的。系统中绝大多数命令都是通过 exec来执行
的,不但 shell进程所创建的子进程使用它来执行用户命令,
shell进程本身和它的祖先进程也是用 exec来启动执行的。
linux进程控制系统调用的使用- 1
? exit系统调用终止进程执行
格式,void exit(status)
int status ;
参数 status是调用进程终止时传递给其父进程的值。如调用进
程还有子进程,则将其所有子进程的父进程改为 1号进程。
? wait系统调用等待子进程暂仃或终止
格式,int wait(stat_loc) int wait((int *)0)
int stat_loc ;
wait调用将调用进程挂起,直到该进程收到一个被其捕获的信
号或者它的任何一个子进程暂仃或终止为止。如果 wait调用之
前已有子进程暂仃或终止,则该调用立即返回。
2.创建子进程的 C语言 程序
# include <stdio.h>
void main()
{ int pid;
pid=fork(); /* fork child process */
if (pid<0){ fprintf(stderr,“Fork Failed”); exit(-1);
}
else if (pid==0) { execlp(“/bin/ls”,”ls”,NULL);
} /* child process */
else { wait(NULL);
printf(“child Complete”);
exit(0);
} /*parent process */
}
3.程序执行说明
该程序说明主进程创建了一个子程序后,二个进
程并发执行的情况。
主进程在执行 fork系统调用前是一个进程,执行 fork
系统调用后,系统中又增加了一个与原过程环境相
同的子进程,它们执行程序中 fork语句以后相同的程
序,父和子进程 中都有自己的变量 pid,但它们的值
不同,它是 fork调用后的返回值,父进程的 pid为大于
0的值,它代表新创建子进程的标识符,而子进程的
pid为 0。这样父子进程执行相同一个程序,但却执行
不同的程序段。子进程执行 if(pid= = 0)以后的大括号
内的程序,即 execlp语句 ; 而父进程执行 else以后的
大括号内的程序。
?
父子进程并发执行,执行序列任意。但由于父进
程执行的第一条语句是 wait(null),它表示父进程将挂
起,直到该进程的一个子进程暂仃或终止为止,所
以,只能子程序执行 execlp语句。子执行执行 execlp
语句后,它的原有正文段程序被指定的目标文件( ls)
所复盖,并执行 ls在屏幕上列出当前目录的文件和子
目录的命令。在子程序执行完毕后退出,它发信号
给等待它终止父进程,激活它继续执行 printf 语句,
在屏幕打印 child complete,最后执行 exit(o)自我终止。
创建子进程的 C语言程序执行情况
# include <stdio.h> 子 进程
void main()
{ int pid; =0
pid=fork(); /* fork child process */
? if (pid<0){ fprintf(stderr,“Fork
Failed”); exit(-1);
}
else if (pid==0)
{ execlp(“/bin/ls”,”ls”,NULL);
} /* child process */
else { wait(NULL);
printf(“child Complete”);
exit(0);
} /*parent process */
}
# include <stdio.h> 父 进程
void main()
{ int pid; =n>0
pid=fork(); /* fork child process */
? if (pid<0){ fprintf(stderr,“Fork
Failed”); exit(-1); }
else if (pid==0)
{ execlp(“/bin/ls”,”ls”,NULL);
} /* child process */
else { wait(NULL);
printf(“child Complete”);
exit(0);
} /*parent process */
}
# include <stdio.h> 父 进程
void main()
{ int pid;
pid=fork(); /* fork child process */
if (pid<0){ fprintf(stderr,“Fork
Failed”); exit(-1); }
else if (pid==0)
{ execlp(“/bin/ls”,”ls”,NULL);
} /* child process */
else { wait(NULL); ?
printf(“child Complete”);
exit(0);
} /*parent process */
}
ls… 子 进程







….




…# include <stdio.h> main 父 进程
void main()
{ int pid;
? pid=fork(); /* fork child process */
if (pid<0){ fprintf(stderr,“Fork Failed”);
exit(-1); }
else if (pid==0)
{ execlp(“/bin/ls”,”ls”,NULL);
} /* child process */
else { wait(NULL);
printf(“child Complete”);
exit(0);
} /*parent process */
}
main 父 进程 main 父 进程 执行 fork后 main 子 进程 执行 exec后
习题
1,(6分 )为什么要引入进程概念?进程的基本特征是什么?它与
程序有何区别?
2.(5分 )在操作系统中进程是一个具有一定独立功能程序在某个
数据集合上的一次 ﹎﹎ A﹎﹎,进程是一个 ﹎﹎ B﹎﹎ 概念,
而程序是一个 ﹎﹎ C﹎﹎ 的概念。在一单处理机中,若有 5个
用户进程,在非管态的某一时刻,处于就绪状态的用户进程
最多有 ﹎﹎ D﹎﹎ 个,最少有 ﹎﹎ E﹎﹎ 个。
A,(1)并发活动; (2)运行活动; (3)单独操作; (4)关联操作。
B,C,(1)组合态; (2)关联态; (3)运行态; (4)等待态; (5)
静态; (6)动态。
D,E,(1)1; (2)2; (3)3; (4)4; (5)5; (6)0。
(解 )
习题 -13,(6分 )我们常用进程状态转换图来说明处理机管理的许多问题,
例如下列进程状态转换图,请回答,
( 1) 什么 "事件 "引起每次显著的状态转换?
( 2) 在什么情况下,如果有的话,将发生下述因果转换?
a,② --->① ; b,③ --->② ; c,④ --->① 。
( 3) 我们观察系统中所有进程时,常看到某一进程 P产生的一次
状态转换可能引起另一进程 q作一次状态转换 。 试分析在什么
情况下,a,进程 P的转换 ③ 能引起进程 q的转换 ①? b.进程 P
的转换 ④ 能引起进程 q的转换 ②? (解 )
运 行
就 绪 阻 塞
1
2 3
4
习题 -2
4.(5分 )从静态角度看, 进程由 ﹎﹎ A﹎﹎, ﹎﹎ B﹎﹎ 和 ﹎﹎ C
﹎﹎ 三部分组成, 用户可通过 ﹎﹎ D﹎﹎ 建立和撤消进程, 通
常用户进程被建立后, ﹎﹎ E﹎﹎ 。
A,(1)JCB; (2)DCB; (3)PCB; (4)PMT。
B,(1)程序段; (2)文件体; (3)I/O; (4)子程序。
C,(1)文件描述块; (2)数据空间; (3)EOF; (4)I/O缓冲区。
D,(1) 函数调用; (2)宏指令; (3)系统调用; (4)过程调用。
E,(1)便一直存在于系统中,直到被操作人员撤消;
(2)随着作业运行正常或不正常结束而撤消;
(3)随着时间片轮转而撤消与建立;
(4)随着进程的阻塞或唤醒而撤消与建立。
5.(5分 )为什么说进程控制块( PCB)是进程存的唯一标志?
(解 )
习题 -3
6,(8分 )正在执行的进程由于其时间片完而被暂停执行, 此时
进程应从 运行 态变为 ﹎﹎ A﹎﹎ 状态;处于静止阻塞状态的进
程, 在进程等待的事件出现后, 应转变为 ﹎﹎ B﹎﹎ 状态;若
进程正处于运行态时, 应终端的请求而暂停下来以便研究其
运行情况 (执行 挂起进程原语 ),这时进程应转变为 ﹎﹎ C﹎﹎
状态, 若进程已处于阻塞状态, 则此时应转变为 ﹎﹎ D﹎﹎ 状
态, 若进程已处于就绪状态, 则此时应转变为 ﹎﹎ E﹎﹎ 状态;
执行解除 挂起进程原语后, 如挂起进程处于就绪状态, 则应
转变为 ﹎﹎ F﹎﹎ 态, 如处于阻塞状态, 则应转变为 ﹎﹎ G﹎
﹎ 态; 一个进程刚被创建时, 它的初始状态为 ﹎﹎ H﹎﹎ 。
A,...,H,(1)静止阻塞; (2)活动阻塞; (3)静止就绪; (4)
活动就绪; (5)执行 。 (解 )
7,有挂起状态的状态转换图有哪五种状态? 试描绘它的状态转
换图, 举例说明其转换原因 。
8,为什么要引入线程概念? 多线程文件服务器有何优点?