天津科技大学操作系统实验

  • 格式:doc
  • 大小:916.50 KB
  • 文档页数:40

下载文档原格式

  / 40
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2012-2013学年第一学期

计算机操作系统实验报告

专业:软件工程

班级:111033

学号:11103325

姓名:孟翔

提交日期:2013年11月27日

目录

实验一 Windows多线程..................................................1实验二 Windows线程同步机制...........................................5 实验三 Windows线程通信................................................9 实验四银行家算法模拟.................................................15 实验五页面置换算法模拟...............................................22

实验一 Windows多线程

【开发语言及实现平台或实验环境】

C++/C#

Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET

【实验目的】

(1) 进一步理解操作系统的并发性;

(2) 了解Windows线程创建方法,并通过查阅资料理解各参数的含义;

(3) 了解多线程程序设计方法,并进行简单应用。

【实验要求】

(1) 逐程序进行简要分析、运行各程序并仔细阅读注释;

(2) 查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;

(3) 完成实验报告。

【相关知识】

一、核对象

(一) 核对象的概念

核对象是核分配的一个存块,这种存块是一个数据结构,表示核对象的各种特征。并且只能由核来访问。应用程序若需要访问核对象,需要通过操作系统提供的函数来进行,不能直接访问核对象(Windows 从安全性方面来考虑的)。

核对象通过Create* 来创建,返回一个用于标识核对象的句柄,这些句柄(而不是核对象)可在创建进程围使用,不能够被传递到其他进程中被使用。

(二) 核对象使用的计数

因为核对象的所有者是核,而不是进程,所以何时撤销核对象由核决定,而核做这个决定的依据就是该核对象是否仍然被使用。那么如何判断核对象是否被使用呢?可以通过核对象的“使用计数”属性,一旦这个值变成0了,核就可以释放该对象了。

(三) 创建核对象

1、进程与句柄表

每个进程在初始化的时候,将被分配一个句柄表,该句柄表中只存储核对象的句柄,不存储用户对象的句柄。句柄表的详细结构微软没有公布,但是大致包含三个容:核对象句柄,核对象地址,访问屏蔽标志。

2、创建核对象及操作系统部机制

利用CreateSomeObject 的函数来创建核对象。调用该函数的时候核就为该对象分配一个存块,并进行初始化,然后核再扫描该进程的句柄表,初始化一条记录并放在句柄表中。

3、进程中使用核对象的部机制

假设函数 F 使用某个核对象,其参数为Handle1,则该函数部需要查找该进程的句柄表,找出参数句柄对应的记录,然后才能使用该核对象。

(四) 关闭核对象

无论进程怎样创建核对象,在不使用该对象的时候都应当通过bool

CloseHandle(HANDLE hobj) 来向操作系统声明结束对该对象的访问。为什么叫声明呢?是因为此时也许还有其他进程对该对象的访问,操作系统可能并不立即释放该对象。操作系统需要做的是:从进程的句柄表中删除该核对象的记录,另外再考察该核对象的使用计数以决定是否需要释放该对象。

(五)核对象的共享

说到共享,与之孪生的就是共享权限。Windows 核对象的共享有三种方式:

1、继承式共享(父子进程间)

只有当进程是父子关系的时候,才能使用此种方式的共享。特别要注意的是继承的是核对象的句柄,核对象本身是不具备继承性。要达到这种继承的效果需要做以下几件事:在进程创建核对象的时候,需要一个安全结构sa (SECURITY_ATTRIBUTES 类型,以向OS 声明对象的访问方式)作为参数。继承式共享需要将结构的成

员sa.bInheritHandle 设置为TRUE 。此时OS 部的处理式将进程的句柄表中的该对象的访问屏蔽字段设置成“可继承”。

在创建子进程(CreateProcess 函数)时,设置创建参

数bInheritHandles 为TRUE 。表示被创建的子进程可以继承父进程中的所有可继承核对象。OS 部的处理是:复制父进程句柄表中的记录到子进程的句柄表中,并使用相同的句柄值;为核对象的使用计数器加 1 。

特别说明:子进程能够继承的的核对象仅局限于父进程创建它的时候所拥有的可继承核对象。子进程诞生后,父进程再搞出什么可继承的东西,子进程是不能用的。这就需要在子进程中使用继承的核对象的时候需要慎重,以确定核对象是否已被继承了。

利用SetHandleinformation 方法可以随时修改核对象句柄的一些属性,目前公开的句柄属性有两种,一种是该句柄是否能被继承,另一种是该句柄是否能被关闭。

2、同名共享

同名共享,不需要共享进程之间存在父子关系。但局限于核对象是否支持这种共享方式。创建核对象的Create 函数中是否包含pszName 是该核对象是否支持同名共享的标志。

方法一:当Process1 通过CreateObject(…”someName”)创建了一个名字

为someName 的核对象后,Process2 也调用了CreateObject(…”someName”),此时核的动作是:在全局中查询发现已经存在someName1 的对象;为Process2 的句柄