操作系统原理 第2版 实验与思考 第1-11章 硬件基础 - 操作系统安全_第1页
操作系统原理 第2版 实验与思考 第1-11章 硬件基础 - 操作系统安全_第2页
操作系统原理 第2版 实验与思考 第1-11章 硬件基础 - 操作系统安全_第3页
操作系统原理 第2版 实验与思考 第1-11章 硬件基础 - 操作系统安全_第4页
操作系统原理 第2版 实验与思考 第1-11章 硬件基础 - 操作系统安全_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【实验与思考】熟悉计算机指令的执行

1.实验背景

考虑一个简单的例子。假设一台机器具有图1-18中列出的所有特征,处理器包含一个称为

累加器(AC)的数据寄存器,所有指令和数据长度均为16位,使用16位的单元或字来组织存

储器。指令格式中有4位是操作码,因而最多有24=16种不同的操作码(由1位十六进制数字

表示)。操作码定义了处理器执行的操作。通过指令格式的余下12位,可直接访问的存储器尺

寸最大为212=4096(4K)个字(用3位十六进制数字表示)。

03415

操作码|地址

-(a)指令格式~~

0115

S|地址

(b)整数格式

程序计数器(PC)=指令的地址

指令寄存器(IR)=正被执行的指令

素加器(AC)=临时存储

(c)内部CPU寄存器

0001=从内存中栽入AC

0010=将AC存储到内存

0101=从内存中添加AC

<d)操作码的部分清单

图1-18一台假想机器的特征

图1-19描述了程序的部分执行过程,显示了存储器和处理器寄存器的相关部分。给出的程

序片段把地址为940的存储单元中的内容与地址为941的存储单元中的内容相加,并将结果保

存在后一个单元中。这需要三条指令,可用三个取指阶段和三个执行阶段来描述:

2操作系统原理(第2版)

存储器CPU寄存器存储器CPU寄存器

3001940、300IPC3001940301,PC

1AC

30159413015941>0003AC

3022941>1940IR302294111940IR

J

94000039400003-

94100029410002

步骤1步骤2

存储器CPU寄存器存储器CPU寄存器

3001940301|PC3001940302PC

3015941、0003AC3015941/0005AC

、5941IR30212941

3022941(5941

9400003940j0003、、♦,J

9410002941|0002M

步骤3步骤4

存储器CPU寄存器存储器CPU寄存器

3001940302|PC3001940I303PC

J0005AC

30159410005AC3015941

3022941—►2941IR302294112941IR

9400003940IT。()3

94100029410005.

步骤5步骤6

图1-19程序执行的例子(存储器和寄存器的内容,以十六进制表示)

(1)PC中包含第一条指令的地址300,该指令内容(值为十六进制数1940)被送入指令

寄存器IR中,PC增lo注意,该处理过程使用了存储器地址寄存器(MAR)和存储器缓冲寄

存器(MBR)。为简单起见,这里未显示这些中间寄存器。

(2)IR中最初的4位(第一个十六进制数)表示需要加载AC,剩下的12位(后三个十

六进制数)表示地址为940。

(3)从地址为301的存储单元中取下一条指令(5941),PC增1。

(4)AC中以前的内容和地址为941的存储单元中的内容相加,结果保存在AC中。

(5)从地址为302的存储单元中取下一条指令(2041),PC增1。

(6)AC中的内容被存储在地址为941的存储单元中。

在该例中,为把地址为940的存储单元中的内容与地址为941的存储单元中的内容相加,

一共需要三个指令周期,每个指令周期都包含一个取指阶段和一个执行阶段。若使用更复杂的

指令集,则需要的指令周期更少。大多数现代处理器都具有包含多个地址的指令,因此指令周

期可能涉及多次存储器访问。此外,除存储器访问外,指令还可用于I/O操作。

2.工具/准备工作

在开始本实验之前,请回顾教科书的相关内容。

需要准备一台运行链接因特网的计算机。

3.实验内容与步骤

第1章硬件基础3

步骤1:如图1-18所示,假设处理器还有两条I/O指令:

0011=从I/O中载入AC

0111=把人<2保存到1/0中

此时,使用12位地址标识一个特殊的外部设备。请给出以下程序的执行过程(按照图1-19

的格式,绘图并黏贴如下):

(1)从设备5中载入AC。

(2)加入内存单元940的内容。

(3)把AC保存到设备6中。

假设从设备5中取到的下一个值为3,内存单元940单元中的值为2o

绘图黏贴于此

步骤2:前面用6步描述了图1-19所示程序的执行情况,请用MAR和MBR扩充这一描述。

答:_____________________________________________________________________________

4.实验总结

5.教师实验评价

4操作系统原理(第2版)

【实验与思考】熟悉操作系统实例

在本节”实验与思考”中,我们来熟悉几个主流的操作系统实例,以帮助读者熟悉现代操作

系统的设计原理和实现问题。

请记录:在下列空格中,填写3个概念中的一个:内核、shell或者文件系统。

①表现为用户界面,把用户的需求翻译为系统活动。

②在用户之间管理和分配资源。

③提供命令解释。

④以层次化的结构组织和存储数据。

⑤进行内存管理。

⑥组成部分是文件和目录。

⑦管理硬盘、磁带机、打印机、终端、通信线路和其他设备。

1.Windows系统

MS-DOS是微软公司最早成功应用于个人计算机上的著名操作系统,1985年,微软公司在

MS-DOS基础上推出WindowsoWindows/DOS于1993年被WindowsNT替代。和以往的Windows

版本相比,WindowsNT有着类似的图形界面,但内核设计更加完善。WindowsNT针对32位计

算机设计,包含了内核和执行体以及一系列面向对象的特征。此后,Windows操作系统不断推

出新版本。Windows8是WindowsNT之后又一次重要革新,是可用于个人计算机、便携式计算

机、平板计算机、家庭影院等硬件设备上的跨平台操作系统。Windows8基于微软的Metro设计

语言对触屏设备进行了优化,这些优化主要体现在操作系统平台和用户接口上,并带来了更好

的用户体验。在Windows8推出前,Windows的内核和执行体一直延续了类似的结构。Windows

8从根本上改变了操作系统的内核结构,尤其是线程管理和虚拟内存管理。

2015年7月29日,微软发布了Windows10正式版,这是一个跨平台及设备应用的操作系

统,有家庭、专业、企业、教育、移动、移动企业和物联网核心等七个发行版本,分别面向不

同用户和设备。

2021年6月24日,微软发布了Windows11桌面端操作系统,应用于计算机和平板电脑等

设备。Windows11提供了许多创新功能,增加了新版开始菜单和输入逻辑等,支持混合工作环

境,侧重于在灵活多变的体验中提高最终用户的工作效率。2022年5月19日,微软宣布Windows

11可以广泛部署,这意味着任何拥有符合Windows11最低配置要求的PC都能够安装该系统。

Windows的内核是用C语言编写的,但其设计原理与面向对象设计密切相关。面向对象方

法简化了进程间资源和数据的共享,便于保护资源免受未经许可的访问。

类似于其他操作系统,Windows分别有面向应用和操作系统核心的软件,后者包括在内核

模式下运行的执行体、内核、设备驱动器和硬件抽象层。在内核模式下运行的软件可以访问系

统数据和硬件,在用户模式下运行的其他软件则不能访问系统数据(见图2-12)。

第1章硬件基础5

Lsass=本地安全认证服务器

POS1X=可移植操作系统接口

GDI=图形设备接口

DLL=动态链接库

图2-12Windows内核体系结构

Windows的体系结构是高度模块化的。每个系统函数由一个操作系统部件管理,操作系统

的其余部分和所有应用程序通过相应的部件使用标准接口来访问这个函数。关键的系统数据只

能通过相应的函数访问。从理论上讲,任何模块都可以移动、升级或替换,而不需要重写整个

系统或其标准应用程序编程接口(APD。

Windows利用一组受环境子系统保护的通用内核模式构件,为多操作系统特性编写的应用

程序提供支持。每个子系统在执行时都包括一个独立的进程,该进程包含共享的数据结构、优

先级和需要实现特定功能的执行对象的句柄。首个这类应用程序启动时,Windows会话管理器

会启动上述进程。子系统进程作为系统用户运行,因此执行体会保护其地址空间免受普通用户

进程的影响。

受保护子系统提供图形或命令行用户界面,为用户定义操作系统的外观。另外,每个受保

护的子系统都会为特定的操作环境提供API,这表明为那些特定操作环境创建的应用程序在

Windows下不用改变即可运行,原因是它们所看到的操作系统接口与编写它们时的接口相同。

请记录:Windows操作系统的主要优点是什么?

答:_____________________________________________________________________________

6操作系统原理(第2版)

2.UNIX系统

UNIX操作系统最初是在贝尔实验室开发的,1970年在PDP-7上开始运行。贝尔实验室和

其他地方关于UNIX的工作,产生了一系列的UNIX版本。第一个里程碑式的成果是把UNIX

系统从PDP-7上移植到了PDP-11计算机上,首次暗示UNIX将成为所有计算机上的操作系统。

另一个里程碑式的成果是用C语言重写了UNIX,而以往人们认为,操作系统这样需要处理时

间限制事件的复杂系统,必须完全用汇编语言编写。如今所有UNIX实现都是用C语言编写的。

1974年,UNIX系统首次出现在一本技术期刊中,这引发了人们对该系统的兴趣,随后UNIX

向商业机构和大学提供了许可证。首个在贝尔实验室外使用的版本是1976年的第6版,随后于

1978年发行的第7版是大多数现代UNIX系统的先驱。最重要的非AT&T系统是加州大学伯克

利分校开发的UNIXBSD,它最初在PDP机上运行,后来在VAX机上运行。AT&T继续开发并

改进这一系统,1982年,贝尔实验室将UNIX的多个AT&T变体合并成为了一个系统,即商业

版的UNIXSystemIII。后来又增加了很多功能组件,形成了UNIXSystemV。

(1)描述。

图2-13概述了UNIX的体系结构。底层硬件被操作系统软件包围,通常称操作系统为系统

内核,以强调它与用户和应用程序的隔离。我们主要关注UNIX内核,但UNIX也拥有许多可

视为系统一部分的用户服务和接口,包括命令解释器、其他接口软件和C编译器部分(编译器、

汇编器和加载器),它们的外层由用户应用程序和到C编译器的用户接口组成。

图2-14深入描述了内核。用户程序既可直接调用操作系统服务,也可通过库程序调用操作

系统服务。系统调用接口是内核和用户的边界,它允许高层软件使用特定的内核函数。另一方

面,操作系统包含直接与硬件交互的原子例程。在这两个接口之间,系统被划分为两个主要部

分:一个关心进程控制,另一个关心文件管理和I/O。进程控制子系统负责内存管理、进程的调

度和分发、进程的同步及进程间的通信。文件系统按字符流或块的形式在内存和外部设备间交

换数据,实现数据交换需要用到各种设备驱动程序。面向块的传送使用磁盘高速缓存方法:在

用户地址空间和外部设备之间,插入了内存中的一个系统缓冲区。

第1章硬件基础7

传统UNIX系统主要是指SystemVRelease3(SVR3)、4.3BSD及更早的版本。关于传统

UNIX可以表述为:它被设计成在单一处理器上运行,缺乏保护数据结构免受多个处理器同时访

问的能力;它的内核不通用,只支持一种文件系统、进程调度策略和可执行文件格式。传统UNIX

的内核不可扩展,不能重用代码。因此,增加不同UNIX版本的功能时,必须添加许多新代码,

因此其内核非常大,且不是模块化的。

(2)现代UNIX系统。

随着UNIX的不断发展,出现了很多具有不同功能的不同版本。因此,人们开始希望得到

具有现代操作系统特征和模块化结构的全新版本。典型的现代UNIX内核具有如图2-15所示,

它有一个以模块化方式编写的小核心软件,该软件可提供许多操作系统进程需要的功能和服务;

每个外部圆圈表示相应的功能及以多种方式实现的接口.

下面给出现代UNIX系统的一些例子。

①SystemVRelease4(SVR4)O由AT&T和Sun共同开发的SVR4结合了SVR3、4.3BSD、

MicrosoftXenixSystemV和SunOS的特点,几乎完全重写了SystemV的内核,形成了一个整

洁且复杂的版本。这一版本的新特性包括实时处理支持、进程调度类、动态分配数据结构、虚

拟内存管理、虚拟文件系统和可抢占的内核。SVR4为商业UNIX的部署提供了统一平台,是最

重要的UNIX变体,它合并了以往UNIX系统中的大多数重要特征,可运行于从32位微处理器

到超级计算机的任何处理器上。

8操作系统原理(第2版)

图2-15现代UNIX内核

②BSDoUNIX的BSD(BerkeleySoftwareDistribution)系列在操作系统设计原理的演化

中意义重大。4.XBSD广泛用于高校,是许多商业UNIX产品的基础,大多数UNIX的增强功能

首先都出现在BSD版中。

4.4BSD是伯克利最后发布的BSD版本,随后其设计和实现小组被解散。它是4.3BSD的重

要升级,包含了一个新的虚存系统,改变了内核结构,增强了一系列其他特性。应用最广且文

档最好的BSD版本是FreeBSD。FreeBSD常用于互联网的服务器、防火墙和许多嵌入式系统中。

③Solaris10oSolaris是Sun基于SVR4的UNIX版本,它具有SVR4的所有特征和许多更

高级的特征,如完全可抢占、多线程内核,完全支持SMP及文件系统的面向对象接口。Solaris

是使用最为广泛且最成功的商用UNIX版本。

请记录:

请通过网络搜索对UNIX操作系统做进一步的深入了解,并简单阐述你对UNIX操作系统

的认识和看法(主要优点)。

答:_________________________________________________________________________________

3.Linux系统

Linux最初是IBMPC(Intel80386)上所用的一个UNIX变体,它由芬兰的计算机科学专

业学生LinusTorvalds编写。1991年,Torvalds在因特网上公布了最早的Linux版本,此后很多

人通过网上合作为Linux的发展做出了贡献。由于Linux免费且源代码公开,很快成为了Sun

第1章硬件基础9

和IBM公司的工作站和其他UNIX工作站的替代操作系统。如今Linux已成为功能全面的UNIX

系统,可在包括IntelPentium和Ilanium、Motorola/IBMPowerPC的所有平台上运行。

Linux是由免费软件基金赞助的免费软件包。FSF的目标是推出与平台无关的稳定软件,这

种软件必须免费、高质,并为用户团体所接受。FSF的GNU项目为软件开发者提供了工具,GNU

PublicLicense(GPL)是FSF正式认可的标志。Torvalds在开发内核时使用了GNU工具,后来

他在GPL下发布了这个内核。因此,我们今天所见的Linux发行版是FSF的GNU项目、Torvald

的个人努力及世界各地很多合作者共同开发的产品。

除了由很多个人程序员使用外,Linux已渗透到了业界,这主要是由于Linux内核的质量很

高。很多天才的程序员共同造就了这一在技术上给人留下深刻印象的产品;Linux高度模块化且

易于配置,因此很容易在各种不同的硬件平台上显示出最佳的性能;另外,由于可以获得源代

码,销售商可以调整应用程序和使用方法,以满足其特定的要求。

(1)模块结构。

大多数UNIX内核都是单体的。单体内核指在一大块代码中包含所有的操作系统功能,并

作为单个进程运行,具有唯一的地址空间。内核中的所有功能部件可以访问所有的内部数据结

构和例程。若对典型单体操作系统的任何部分进行了改变,则变化生效前,所有模块和例程都

须重新链接、重新安装,再重新启动系统。因此,任何修改(如增加一个新的设备驱动程序或

文件系统函数)都很困难,Linux中的这个问题尤其尖锐。

尽管Linux未采用微内核的方法,但由于其特殊的模块结构,因而也具有很多微内核方法

的优点。Linux是由很多模块组成的,这些模块可由命令自动加载和卸载。这些相对独立的块称

为可加载模块(loadablemodule),实质上,模块就是内核在运行时可以链接或断开链接的对象

文件。一个模块通常实现一些特定的功能,如一个文件系统、一个设备驱动或内核上层的一些

特征。尽管模块可以因为各种目的而创建内核线程,但其自身不作为进程或线程执行。当然,

模块会代表当前进程在内核模式下执行。因此,虽然Libux被认为是单体内核,但其模块结构

克服了开发和发展内核过程中所遇到的困难。

(2)内核组件。

图2-16给出了基于IA-64体系结构(如Intel的Itanium)的Linux内核的主要组件。图中显

示了运行在内核上的一些进程。每个方框表示一个进程,每条带箭头的曲线表示一个正在执行

的线程。内核本身包括一组相互关联的组件,箭头表示主要的关联。底层的硬件也是一个组件

集,箭头表示硬件组件被哪个内核组件使用或控制。当然,所有内核组件都在CPU上执行,但

为了简洁起见,图中未显示它们之间的关系。

主要内核组件的简要介绍如下:

•信号:内核使用信号来向进程提供信息。例如,使用信号来告知进程出现了某些错误(如

被零除错误)。

10操作系统原理(第2版)

图2-16Linux内核组件

•系统调用:进程通过系统调用来请求系统服务。系统调用有几百个,大致分为6类:文

件系统、进程、调度、进程间通信、套接字(网络)和其他。

•进程和调度器:创建、管理、调度进程。

•虚存:为进程分配和管理虚存。

•文件系统:为文件、目录和其他文件相关对象提供一个全局的分层命名空间,并提供文

件系统函数。

♦网络协议:为用户的TCP/IP协议套件提供套接字接口。

•字符设备驱动:管理向内核一次发送/接收1字节数据的设备,如终端、调制解调器和打

印机。

•块设备驱动:管理以块为单位向内核发送/接收数据的设备,如各种形式的外存(磁盘、

CD-ROM等)。

•网络设备驱动:管理网卡和通信端口,即管理连接到网桥或路由的网络设备。

•陷阱和错误:处理CPU产生的陷阱和错误,如内存错误。

•物理内存:管理实际内存中的内存页池,并为虚存分配内存页。

•中断:处理来自外设的中断。

请记录:

请列举Linux操作系统的主要组成部分。Linux操作系统的主要优点是什么?

答:_____________________________________________________________________________

4.安卓(Android)系统

安卓(Android)操作系统是为触屏移动设备(如智能手机、平板电脑)设计的基于Linux

第1章硬件基础II

的操作系统,也是最流行的手机操作系统,当然,这只是安卓系统强势增长的原因之一。从更

广泛的层面上来看,操作系统应能在任何含有电子芯片的硬件设备上使用,而不仅仅是在服务

器和个人主机上使用,安卓系统恰恰很好地体现了这一点,也正因为如此,安卓系统成为了“物

联网”操作系统的标杆,它能把传感器和应用更好地联系起来,构建更多、更好的智能设备。

最初的安卓操作系统由Android公司开发,随后该公司于2005年被谷歌公司收购。最早的

商业版本Android1.0于2008年发布。2007年,开放手机联盟(OHA)成立。创立之初,OHA

的成员共有84家公司,它们共同为手机设备制定了公开标准。安卓操作系统的发布由OHA负

责,开源性是安卓操作系统成功的关键因素。

(1)软件体系结构。

安卓是一个包括操作系统内核、中间件和关键应用的软件栈。图2-17显示了安卓的软件体

系结构。因此,安卓应视为一个完整的软件栈,而非单个操作系统。从某种意义上讲,安卓是

一种嵌入式Linux,但它所提供的功能并不是一个简单的嵌入式内核就可以做到的。

应用

(Home)[拨号程序)IM)(浏览器](相机)(报警)(计算器)

(联系人J国拨号(电子由泊日历)(媒体播放罂)(相珊)(时钟j(.)

应用框架

活动管理器Window*管理器)内容提供商通知管理器)

包管理器电话管理器资源管理器XMPP服务)

系统库Android运行时

面管理器]媒体框架)

SQLite核心库

OperGlJESFreeTvpeLibWebCoreDalvik虚拟机

Linux内核

显示驱动相机驱动蓝牙驱动

USB驱动键盘驱动WiFi驱动

实现:

应用、应用框架:Java

系统库、Android运行时:C和C++

Linux内核:C

图2-17安卓软件体系结构

安卓系统的内核与Linux的内核非常相似但不完全相同。变化之一是安卓系统中没有不适

合在移动设备环境中应用的驱动,这使得安卓的内核更小。此外,安卓系统针对移动设备环境

提高了内核的功能。

安卓系统依赖Linux内核来提供核心的系统服务,如安全、内存管理、进程管理、网络协

议栈和驱动模型。内核也扮演硬件和软件中间的抽象层角色,以使安卓系统能使用Linux系统

支持的大多数硬件驱动。

12操作系统原理(第2版)

(2)系统体系结构。

从应用开发者的角度来看,如图2-18所示的安卓系统体系结构是图2-17所示软件体系结构

的简化抽象。

从这个角度来看,安卓包含了如下几层:

(1)应用和框架:应用开发者最关心这一层及访问低层服务的API。

(2)BinderIPC:Binder进程间通信机制允许应用框架打破进程的界限来访问安卓系统服

务代码,从而允许系统的高层框架API与安卓的系统服务进行交互。

(3)安卓系统服务:框架中大部分能够调用系统服务的接口都向开发者开放,以便开发者

能够使用底层的硬件和内核功能。安卓系统服务分为两部分:媒体服务处理播放和录制媒体文

件,系统服务处理应用所需要的系统功能。

(4)硬件抽象层(HAL):提供调用核心层设备驱动的标准接口,以便上层代码不需要关

心具体驱动和硬件的实现细节。安卓的HAL与标准Linux中的HAL基本一致。

(5)Linux内核:己被裁剪到满足移动环境的需求。

请记录:

请简述,安卓操作系统的主要优点是什么?

答:_____________________________________________________________________________

第1章硬件基础13

5.实验总结

6.教师实验评价

14操作系统原理(第2版)

【实验与思考】Windows进程的“一生”

i.背景知识

Windows所创建的每个进程都从调用CreateProcess()API函数开始,该函数的任务是在对象

管理器子系统内初始化进程对象。每一进程都以调用ExilProcessO或TerminaleProcess()API函

数终止。通常应用程序的框架负责调用ExitProcess()函数。对于C++运行库来说,这一调用

发生在应用程序的main。函数返回之后。

(1)创建进程。

CreateProcessO调用的核心参数是可执行文件运行时的文件名及其命令行。表3-6列出了每

个参数的类型和名称。

表3-6CreateProcessO函数的参数

参数名称使用目的

LPCTSTRIpApplivationName全部或部分地指明包括可执行代码的EXE文件的文件名

LPCTSTRIpCommandLine向可执行文件发送的参数

LPSECURIITY.ATTRIBUTES返回进程句柄的安全属性。主要指明这•句柄是否应该由其他

IpProcessAttributes子进程所继承

LPSECURIITY_ATTRIBUTES

返回进程的主线程的句柄的安全属性

IpThreadAttributes

BOOLblnheritHandle一种标志,告诉系统允许新进程继承创建者进程的句柄

DWORDdwCreationFlage特殊的创建标志(如CREATE_SUSPENDED)的位标记

LPVOIDIpEnvironmcnt向新进程发送的一套环境变量;如为null值则发送调用者环境

LPCTSTRIpCurrentDirectory新进程的启动目录

STARTUPINFOIpStartupInfoSTARTUPINFO结构,包括新进程的输入和输出配置的详情

LPPROCESS.INFORMATION

调用的结果块;发送新应用程序的进程和主线程的句柄和ID

IpProcessInfbrmation

可以指定第一个参数,即应庠程序的名称,其中包括相对于当前进程的当前目录的全路径

或者利用搜索方法找到的路径;IpCommandLine参数允许调用者向新应用程序发送数据;接下

来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。

然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予新进程什么行为。经常

使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停。当准备好时,应该使用

ResumeThread()API来启动进程。另一个常用的标志是CREATE_NEW_CONSOLE,告诉新进

程启动自己的控制台窗口,而不是利用父窗口。这一参数还允许设置进程的优先级,用以向系

统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间。

第1章硬件基础15

接着是CreateProcess()函数调用所需要的三个通常使用缺省值的参数。第一个参数是

IpEnvironment参数,指明为新进程提供的环境;第二个参数是IpCurrentDirectory,可用于向主

创进程发送与缺省目录不同的新进程使用的特殊的当前目录;第三个参数是STARTUPINFO数

据结构所必需的,用于在必要时指明新应用程序的主窗口的外观。

CreateProcess()的最后一个参数是用于新进程对象及其主线程的句柄和ID的返回值缓冲

区。以PROCESS」NFORMATION结构中返回的句柄调用CloseHandle()API函数是重要的,因

为如果不将这些句柄关闭的话,有可能危及主创进程终止之前的任何未释放的资源。

(2)正在运行的进程。

如果一个进程拥有至少一个执行线程,则为正在系统中运行的进程。通常,这种进程使用

主线程来指示它的存在。当主线程结束时,调用ExitProcess()API函数,通知系统终止它所拥有

的所有正在运行、准备运行或正在挂起的其他线程。当进程正在运行时,可以查看它的许多特

性,其中少数特性也允许加以修改。

首先可查看的进程特性是系统进程标识符(P1D),可利用GetCurrentProcessId()API函数来

查看,与GetCurrenlProcess。相似,对该函数的调用不能失败,但返回的PID在整个系统中都

可使用。其他的可显示当前进程信息的API函数还有GetStartupInfo()和

GetProcessShutdownParameters()>可给出进程存活期内的配置详情。

通常,一个进程需要它的运行期环境的信息。例如API函数GetModuleFileName()和

GetCommandLine(),可以给出用在CreateProcess。中的参数以启动应用程序。在创建应用程序

时可使用的另一个API函数是IsDebuggerPresent()。

可利用API函数GetGuiResourcesO来查看进程的GUI资源。此函数既可返回指定进程中

的打开的GUI对象的数目,也可返回指定进程中打开的USER对象的数目。进程的其他性能信

息可通过GetProcessIoCounters()、GetProcessPriorityBoost()、GetProcessTimes()和

GetProcessWorkingSetSizeOAPI得到。以上这几个API函数都只需要具有

PROCESS_QUERY_INFORMATION访问权限的指向所感兴趣进程的句柄。

另一个可用于进程信息查询的API函数是GetProcessVersionO。此函数只需感兴趣进程的

PID(进程标识号)。本实验的程序清单3-2中列出了这一API函数与GetVersionEx()的共同作

用,可确定运行进程的系统的版本号。

(3)终止进程。

所有进程都是以调用ExitProcess()或者TerminateProcess()函数结束的。但最好使用前者而

不要使用后者,因为进程是在完成了它的所有的关闭“职责”之后以正常的终止方式来调用前

者的。而外部进程通常调用后者即突然终止进程的进行,由于关闭时的途径不太正常,有可能

引起错误的行为。

TerminateProcess()API函数只要打开带有PROCESS_TERMINATE访问权的进程对象,就

可以终止进程,并向系统返回指定的代码。这是一种“野蛮”的终止进程的方式,但是有时却

是需要的。

16操作系统原理(第2版)

如果开发人员确实有机会来设计“谋杀”(终止别的进程的进程)和“受害”进程(被终止

的进程)时,应该创建一个进程间通讯的内核对象一一如一个互斥程序一一这样一来,“受害”

进程只在等待或周期性地测试它是否应该终止。

2.工具/准备工作

在开始本实验之前,请回顾教科书的相关内容。

需要准备一台运行Windows操作系统的计算机,且该计算机中需安装VisualC++。

3.实验内容与步骤

本节“实验与思考”的目的是:

(1)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉

操作系统的进程概念,理解Windows进程的“一生”。

(2)通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。

请回答:

Windows所创建的每个进程都是以调用API函数开始和

以调用或API函数终止。

(1)当前进程对象信息的获取。

操作系统将当前运行的行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄

(HANDLE)的号码,就可与进程对象交互。这一号码只对当前进程有效。

本实验表示了一个简单的进程句柄的应用。在系统中运行的任何进程都可调用

GetCurrentProcess()API函数和GetCurrentProcessId(),GetCurrentProcess()函数可返回标识进程本

身的句柄,GetCurrentProcessId()函数可返回进程标识号。然后就可在Windows需要该进程的有

关情况时,利用这一句柄或进程标识号来获取。

步骤1:在C++开发环境中输入程序3-1.cpp,

清单3-1通过句柄或进程标识号获取当前进程信息。

#include<windows.h>

#include<iostream>

intmain(){

//从当前进程中提取句柄

HANDLEhProcessThis=::GetCurrentProcess();

//提取当前进程的ID号

DWORDdwIdThis=::GetCurrentProcessId();

//获得这•进程所需的操作系统版本

DWORDdwVerReq=::GetProcessVersion(dwIdThis);

WORDwMajorReq=(WORD)(dwVerReq»16);//右移16位

第1章硬件基础17

WORDwMinorReq=(WORD)(dwVerReq&Oxffff);

std::cout«”当前进程标识号:dwIdThis«",所需的操作系统版本:”

<<wMajorReq<<"."«wMinorReq«std::endl;

//设置版本信息的数据结构,以便保存操作系统的版本信息

OSVERSIONINFOEXosvix;

::ZeroMemory(&osvixzsizeof(osvix));

osvix.dwOSVersionInfoSize=sizeof(osvix);

//提取当前操作系统的版本信息

::GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvix));

std::cout当前操作系统版本:osvix.dwMajorVersion«"."

<<osvix.dwMinorVersion<<std::endl;

//请求内核提供该进程所属的优先权类

DWORDdwPriority=::GetPriorityClass(hProcessThis);

//发出消息,为用户描述该类

std::cout<<"Currentprocesspriority:";

switch(dwPriority)

(

caseHIGH_PRIORITY_CLASS:std::cout«"高”;break;

caseNORMAL_PRIORITY_CLASS:std::cout«“普通”;break;

caseIDLE_PRIORITY_CLASS:std::cout«"空闲”;break;

caseREALTIME_PRIORITY_CLASS:std::cout«”实时“;break;

default:std::cout«"未矢口";break;

}

std::cout«std::endl;

getchar();//仅仅为了让窗口停下来,以便观察

return0;

}

清单3-1中列出的是一种获得进程句柄的方法。对于进程句柄可进行的惟一有用的操作是

在API调用时,将其作为参数发还给系统,正如清单3-1中对GetPriorityClass。API函数的调用

那样。在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应

用程序。

OpenProcess()和CreateProcess。API函数也可以用于提取进程句柄。前者提取的是已经存

在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。

步骤2:编译源程序。

你采用的编译方法是(写出编程软件):_____________________________________________

18操作系统原理(第2版)

步骤3:运行可执行文件。(请直接找到可执行文件(如3-l.exe),右键一以管理员身份运

行,下同)。

运行结果:_______________________________________________________________________

步骤4:通过改编程序,增加第二次进程优先级的输出。功能要求如下,在进程运行期间,

打开任务管理器,找到当前进程,右键一一设置优先级,然后更改当前进程的优先级,完成优

先级设置后,使进程执行第二次输出优先级的代码,观察结果。

请问在任务管理器观察到的当前进程的进程名(映像名称)是:

进程标识号是:___________________________________________________________________

请描述这次的运行结果:__________________________________________________________

步骤5:改编程序,在第二次进程优先级输出前,用编程的方式修改进程优先级。改变优先

级的API函数SetPriorityClass()的调用方法如下:

::SetPriorityClass(进程句柄,进程优先级)

其中进程优先级使用的是优先级类中的成员,如HIGH_PRIORITY_CLASSo

给出更改进程优先级的代码:

运行结果:_______________________________________________________________________

通过上述三次运行结果,观察进程标识号有什么规律?是同一个进程吗?为什么?

知识点回顾:

@获取当前进程的API:____________________________________________________

②获取当前进程的进程标识号(PID)的API:

③获得进程所需的操作系统版本的API:

④获得进程优先级的API:__________________________________________________

⑤设置进程优先级的API:_________________

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论