《操作系统》实验指导手册

《操作系统》实验指导手册

2023年6月22日发(作者:)

《操作系统》实验指导书

成都理工大学工程技术学院

计算机科学与技术系

2009.9

目 录

实验一 熟悉Windows2000/XP中的进程和线程

实验二 编程实现进程的控制

实验三

实验四

实验五

实验六

实验七

实验八

实验九

实验十

Windows中的线程与线程同步现象

操作系统中的经典线程同步问题

死锁避免—银行家算法的实现

Windows内存管理

分页内存管理算法模拟

页面置换算法的模拟实现

磁盘调度中的电梯调度算法实现

Windows中的消息机制

实验一 熟悉Windows2000/XP中的进程和线程

一、实验目的

1、熟悉Windows2000/XP中任务管理器的使用。

2、通过任务管理器识别操作系统中的进程和线程的相关信息。

3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。

二、实验理论基础及教材对应关系

1、实验理论基础:

(1) 操作系统中的进程和线程的概念;

(2) 进程PCB的各项指标含意;

2、本实验内容主要对应于教材第2章。

三、实验内容与步骤

1、启动操作系统自带的任务管理器:

方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”行”,并输入“”。如下图所示:

“运

2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表(填满即可):

表一:统计进程的各项主要信息

序号 进程名称

1

2

3

4

5

6

7

8

进程ID

线程数量 占用内存 优先级

占CPU时间

虚拟内存

3、从桌面启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。再从任务管理器中分别找到下列程序:、、、,试着结束它们,观察到的反应是 ,

原因是 。

4、在任务管理器中找到进程“”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化 、得到的结论是 (说出进程的作用)。

5、运行“spy++.exe”应用软件,点击按钮“程“”的各项信息,并填写下表:

”,切换到进程显示栏上,查看进

表二:统计线程的各项信息

进程: 中的各个线程

序号

1

2

3

4

5

进程ID

线程ID

基本优先级

当前优先级

CPU时间

上下文开关

6

7

8

9

10

11

12

13

14

6、注意某些线程前有“+”,如图所示:的差异是 。

,说明二者之间四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告)

2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。

实验二 编程实现进程的控制

一、实验目的

1、进一步掌握进程的相关概念

2、掌握Windows2000/XP有关进程操作的API函数的使用。

3、了解进程的地址空间的含义。

二、实验理论基础及教材对应关系

1、实验理论基础:

(1)操作系统中的进程和线程的概念;

(2)进程的各种控制;

2、本实验内容主要对应于教材第2章和第3章的内容。

三、实验内容与步骤

1、启动应用程序“Process ”,应出现下面的界面:

2、依次改变上图中“下拉组合框”的选项,读出界面中显示的各项信息,并完成下表(填满即可):(统计中要包含、、、等应用程序)

表一:统计进程的一些信息

序号 进程名称

1

2

3

4

5

6

7

8

进程ID

父进程ID

优先级 线程数

Heaps数量 模块数量

3、从上表中观察“进程ID”和“父进程ID”两栏,总结并画出下列程序间的亲缘关系:、、、。

4、打开“ProcessInfo”工程文件,打开文件“”,找到函数:CreateProcess()的使用方法。按下列步骤建立一个工程项目,将记事本应用程序运行起来,即创建了一个新的进程。

步骤1、创建一个基于MFC的应用程序。 步骤2、在应用程序类型中选取“基于对话框”的选项。

步骤3、直接点击完成,系统将为你创建一个工程项目。

步骤4、然后在“资源视图”中,打开对话框“IDD_MY_DIALOG”,将出现以下对话框:

步骤5、打开界面上的“工具箱”,放置一个“按钮”,如下图:

步骤6、双击上面的“Button1”按钮,切换到代码的编写处: 输入以下语句:

步骤7、编译并运行此工程项目,看看运行的结果。

四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告)

2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。

实验三 Windows中的线程与线程同步现象

一、实验目的

1、掌握Windows中线程的操作。

2、熟悉线程不同步时的现象及环境因素。

3、掌握一种同步对象的使用。

二、实验理论基础及教材对应关系

1、线程和线程不同步的认识。

2、线程间的同步和通信。

3、本实验内容主要对应于教材第2章中关于线程的各节。

三、实验内容与步骤

1、定义全局变量 int i = 0; 初始值置为 0。

2、创建两个线程,一个对 i 执行加 1 操作,另一个对 i 执行减 1 操作。两个线程执行相同的次数。

显然,正常情况下,i 的仍然保持为 0。

#include

#include

#define MaxCount 9000000 // 循环次数要很大,可多次尝试一些值

DWORD __stdcall fun1( LPVOID p1)

{

}

for( int j =0 ;j < MaxCount;j++){

}

return 0;

i++; DWORD __stdcall fun2( LPVOID p1)

{

}

3、观察两个线程执行后的情况,可以发觉最后 i 的值不一定是 0, 有时是很大的正数,有时是很大的负数,这就是多个线程在操作同一个变量 i时,未同步时带来的严重问题。

还应该了解,在多个线程操作共享的变量时,才需要考虑同步问题。

5、给这两个线程加上同步代码,再来观察对 i 值的影响。步骤2的函数稍微改动即可:

CRITICAL_SECTION cs;

DWORD __stdcall fun1( LPVOID p1)

{

}

DWORD __stdcall fun2( LPVOID p1)

{

for( int j =0 ;j < MaxCount;j++){

::EnterCriticalSection(&cs);

i--;

::LeaveCriticalSection(&cs);

for( int j =0 ;j < MaxCount;j++){

}

::EnterCriticalSection(&cs);

i++;

::LeaveCriticalSection(&cs);

for( int j =0 ;j < MaxCount;j++){

}

return 0;

i--; }

}

加入的同步代码的两个线程,无论如何执行,i 的值总是 0 ,结果是正确的。

6、主函数的写法

int main()

{

}

DWORD id1,id2;

HANDLE hThread[2];

::InitializeCriticalSection(&cs);

hThread[0] = ::CreateThread(0,0,fun1,0,0,&id1);

hThread[1] = ::CreateThread(0,0,fun2,0,0,&id2);

::WaitForMultipleObjects(2,hThread,1,INFINITE);

printf("i = %dn",i);

::DeleteCriticalSection(&cs);

getchar();

return 0;

四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告)

2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。

实验四 操作系统中的经典线程同步问题

一、实验目的

1、加深对线程的理解、掌握Windows中线程的操作。

2、掌握死锁产生的原因。

3、掌握信号量、互斥量、事件、临界区等同步对象的使用。

二、实验理论基础及教材对应关系

1、进程和线程的关系。

2、线程间的同步和通信。

3、本实验内容主要对应于教材第2章中关于线程的各节、第3章中关于死锁的各节。

三、实验内容与步骤

1、运行实验程序“Reader_”,出现如下界面:

2、交替点击“创建读者线程”和“创建写者线程”按钮,出现如下界面:

3、观察第二步的实验现象,多次试验,可总结为:

(1)、当有“读者”的绿灯亮时,其余的“读者”灯的状态是 、其余的“写者”灯的状态是 。

(2)、当有“写者”的绿灯亮时,其余的“写者”灯的状态是 、其余的“读者”灯的状态是 。

这说明“读者”间的关系是 、“读者”之间的关系是 、“读者-写者”之间的关系是 。(填相容、互斥)

4、打开工程文件“Reader_Writer”,查找下列函数的用法:

(1) AfxBeginThread();创建线程。ResumeThread();让线程恢复运行。

(2) CreateMutex();创建互斥量。ReleaseMutex();删除互斥量。

(3) CreateSemaphore();创建信号量。ReleaseSemaphore()删除信号量。

(4) WaitForSingleObject();等待同步对象。

(5) CloseHandle();关闭内核对象的句柄。

5、运行“”应用程序,观察线程间“死锁”时的状态。 6、创建一个“Console”应用程序,在main()函数中创建4个线程,线程的工作就是向屏幕输出几个字符后,就自己结束掉。

四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告)

2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。

实验五 死锁避免—银行家算法的实现

一、实验目的

1、掌握死锁产生的原因和必要条件。

2、掌握银行家算法的实现

二、实验理论基础及教材对应关系

1、处理机调度与死锁。

2、死锁的产生与预防。

3、银行家算法。

三、实验内容与步骤

1、创建C语言工程项目,按照教材上的有关说明,定义相应的数据结构。

int AllocMatrix[5][4] // 已经分配资源矩阵

int RequestMatrix[5][4] // 需求矩阵

int AvailResource[4] // 可用资源向量

int TryProcess[5] // 尝试序列

2、给各个数据结构设定合适的初始值。

按照教材课后习题22的内容给上述数据结构设定初始值。

如:int AllocMatrix[5][4]={

{0,0,3,2},

{1,0,0,0},

{1,3,5,4},

{0,3,3,2},

{0,0,1,4}

};

// 已经分配资源矩阵

注意:步骤1、2可同时进行,即利用C语言中的定义变量就可同时初始化的方式进行数值初设。

3、依据银行家算法的描述依次进行资源的试探性分配,直至成功或失败,成功则说明当前状态是安全的;失败后,还应该将资源回到初始状态,并进行另一次试探;只有所有的试探都失败了,才能说明当前状态是不安全的。 通常,这种试探性算法采用递归的方法是很合适的,程序也是很简洁的。

代码片段:

if( AvailResource[0] >= RequestMatrix[k][0]

&& AvailResource[1] >= RequestMatrix[k][1]

&& AvailResource[2] >= RequestMatrix[k][2]

for(int i=0;i<4;i++)

int SearchSecurity(int level) //递归函数

{

if(level == 4){

}

else{

}

……

SearchSecurity(level+1); // 有条件递归调用自己

……

AvailResource[i] -= AllocMatrix[k][i]; // 恢复资源

&& AvailResource[3] >= RequestMatrix[k][3])//若资源能使进程ProcessID结束

} 其余由大家自行完成。

四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告)

2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。 实验六 Windows内存管理

一、实验目的

1、熟悉程序的运行时动态链接。

2、熟悉Windows中内存的分页管理方式。

3、了解虚拟内存的用法,熟悉Windows中相应的API函数。

二、实验理论基础及教材对应关系

1、应用程序的动态链接。

2、内存的分页管理、虚拟内存的技术。

3、本实验内容主要对应于教材第4章。

三、实验内容与步骤

1、运行“”应用程序,出现如下界面:

从该界面上可以看到Windows2000/XP系统中的分页大小(Page Size)是:4,096,即4K字节,也可以看到本机所安装的处理器的个数是:1个。

打开工程文件,熟悉信息获取函数的使用:

SYSTEM_INFO sinf;

GetSystemInfo(&sinf);

2、运行“”应用程序,出现如下界面: 从界面上可以看到,本计算机中所安装的物理内存的大小“TotalPhys”,可用物理内存的大小“AvailPhys”。

打开源文件,熟悉或者信息函数的使用:

MEMORYSTATUS ms = { sizeof(ms) };

GlobalMemoryStatus(&ms);

3、运行“”应用程序,掌握其用法和功能:

打开源文件,熟悉以下操作虚拟存储空间函数的使用:

VirtualAlloc( )、VirtualQuery( )、VirtualFree( )。

4、运行“”应用程序,了解程序的功能,读懂其显示的每一行信息的含义: 从上面显示的信息中,谈谈自己对虚拟储存空间的认识(100字以内)。

四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告)

2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。

实验七 分页内存管理算法模拟

一、实验目的

1、熟悉基本分页存储管理。

2、建立描述分页内存管理中的页目录表、页表结构。

3、实现进行虚拟内存到物理内存的映射算法。

二、实验理论基础及教材对应关系

1、操作系统中内存管理。

2、基本分页内存、分段内存管理。

3、页目录表、页表的作用,以及虚拟地址到物理地址的映射关系。

三、实验内容与步骤

题目:分页存储管理的设计与实现。

某系统采用了两级页表机制,可使页表所占用内存尽量少,分页地址变换机构如下图所示:

分页地址变换机构 页目录表共1024项,每个页表1024项,每页的大小是4K个字节。地址转换时,先由分段部件生成线性地址,再由上面所述的分页部件,根据线性地址中的页目录索引在页目录表中找相应的项,该项值为所需页表在内存的块号,找到该页表后,然后按第21-12位的页表索引找到所需页的物理内存起始地址,把它与12位偏移直接相加得到32位的物理地址。

设系统有如表1中所示的10个段,已知:1-8段从内存的200000H处开始由低地址到高地址连续存放,映射到3G+4M开始的线性地址空间;9段(缓冲区)放在400000H开始的内存,映射的线性地址同物理地址;显存从B8000H开始,映射到3G开始的线性地址空间。

表1

(1)、请设计并填写页目录表和页表(需说明每张表的内存地址)

(2)、线性地址为:C0401010H、C0404010H、C0414010H,则物理地址是多少,所在段的段名是什么?(需写出计算的详细步骤)

实验步骤:

1、定义页目录表、页表的数据结构,以及必要的数据。

#define Page_Size 4096 // 页面大小

#define Pages 26 // 本题定义的总的页面个数

#define FirstLinearAddr 0xC0000000+0x400000// 线性地址3G + 4M

#define SecondLinearAddr 0x400000 // 线性地址0x400000

#define ThirdLinearAddr 0xC0000000// 线性地址3G

#define IDT 0

#define TSS 1

#define GDT 2

#define PDT 3 // 页目录表的下标

#define PT1 4 // 第1 个页表的下标

#define PT2 5 // 第2 个页表的下标

#define PT3 6 // 第3 个页表的下标

#define PT4 7 // 第4 个页表的下标

// ......省略其它页表

#define CODE 20

#define STACK 21

#define DATA 22

#define BUFFER 23

#define DISPLAYMEM 24

2、初始化页目录表、页表中的数据

p = (unsigned int *)PysicalMemAddr[PDT]; // p 指向页目录表

p[FirstLinearAddr>>22] = (unsigned int)PysicalMemAddr[PT1];// 将第1 个页表的地址填入页目录表中

p = (unsigned int *)PysicalMemAddr[PT1]; // p 指向第1 个页表

p[(FirstLinearAddr+4096*IDT)>>12 & 0x3FF] = (unsigned int)PysicalMemAddr[IDT];//

将 IDT 页的起始地址填入页表

p[(FirstLinearAddr+4096*TSS)>>12 & 0x3FF] = (unsigned

int)PysicalMemAddr[TSS];// 将 TSS 页的起始地址填入页表

p[(FirstLinearAddr+4096*GDT)>>12 & 0x3FF] = (unsigned

int)PysicalMemAddr[GDT];// 将 GDT 页的起始地址填入页表

p[(FirstLinearAddr+4096*PDT)>>12 & 0x3FF] = (unsigned

int)PysicalMemAddr[PDT];// 将 PDT 页的起始地址填入页表

p[(FirstLinearAddr+4096*PT1)>>12 & 0x3FF] = (unsigned

int)PysicalMemAddr[PT1];// 将 PT1 页的起始地址填入页表

p[(FirstLinearAddr+4096*PT2)>>12 & 0x3FF] = (unsigned

int)PysicalMemAddr[PT2];// 将 PT2 页的起始地址填入页表

p[(FirstLinearAddr+4096*PT3)>>12 & 0x3FF] = (unsigned

int)PysicalMemAddr[PT3];// 将 PT3 页的起始地址填入页表

p[(FirstLinearAddr+4096*PT4)>>12 & 0x3FF] = (unsigned

int)PysicalMemAddr[PT4];// 将 PT4 页的起始地址填入页表

3、虚拟地址到物理地址的变换

linear = 0xC0401010;

p = (unsigned int *)PysicalMemAddr[PDT]; // p 指向页目录表

pTable = (unsigned int *)p[linear>>22]; // pTable 指向页表

pChar = (char *)pTable[linear>>12 & 0x3FF]; // pChar 指向物理内存

printf("Linear: 0x%X is in %sn",linear,pChar);

自行变换线性地址:C0404010H、C0414010H 四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告)

2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。

实验八 页面置换算法的模拟实现

一、实验目的

1、熟悉基本分页存储管理。

2、掌握FIFO页面置换算法。

3、掌握LRU页面置换算法。

二、实验理论基础及教材对应关系

1、操作系统中内存管理。

2、基本分页内存、分段内存管理。

3、常用页面置换算法的实现。

三、实验内容与步骤

1、定义相关数据

#define InitPysiBlocks 4

#define MaxPages 16:

unsigned int PysicalBlocks[InitPysiBlocks] = { 0 };

unsigned int PageSequence[30] = { 1,2,3,6,4,7,3,2,1,4,7,5,6,5,2,1};

2、按照教材中FIFO、LRU算法描述进行算法设计

unsigned FIFO(unsigned *py,unsigned *pg)

unsigned LRU(unsigned *py,unsigned *pg)

3、查看运行结果是否与手工计算一致。

四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告) 2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。

实验九 磁盘调度中的电梯调度算法实现

一、实验目的

1、掌握操作系统中I/O管理。

2、理解磁盘的工作原理与各种调用算法。

3、掌握SCAN(电梯调度)算法的实现。

二、实验理论基础及教材对应关系

1、操作系统中IO管理。

2、操作系统的磁盘调度算法。

三、实验内容与步骤

1、参照教材第5章第6节的相关描述和图5-27的具体数据,进行算法设计并验证是否与手工计算相一致。

其余步骤前述实验(略)。

四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告)

2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。

实验十 Windows中的消息机制

一、实验目的

1、掌握操作系统中消息的概念。

2、理解消息机制的实现。

3、掌握Windows中消息的操作函数。

二、实验理论基础及教材对应关系

1、操作系统中消息的概念和作用。

2、操作系统的内存管理。

3、本实验内容主要对应于教材第2、3、4章。

三、实验内容与步骤

1、通过应用程序观察消息在进程中的传递,同时运行两个“”应用程序,下面界面所示:

图1、进程 A 的运行界面

图2、进程 B 的运行界面

2、点击进程A的“Send Data1to other windows”按钮,可以看到“Data1”数据发送到了进程B的信息框内了。点击进程A的“Send Data2 to other windows”,数据将发到进程B的第二个信息框内。同样,操作进程B的按钮,具有类似的效果。

3、实验用到的主要API函数和结构:

(1)、功能:寻找参数lpszClass所指定的窗口,由于进程A、B之间相互发现对方。

HWND FindWindowEx(

HWND

hwndParent,

);

(2)、功能:发送消息给其他窗口:

LRESULT SendMessage(

);

(3)、进程间通过WM_COPYDATA消息进程数据传输用到的结构体:

typedef struct tagCOPYDATASTRUCT {

ULONG_PTR dwData;

DWORD cbData;

PVOID lpData;

HWND

hWnd,

UINT

Msg,

WPARAM

wParam,

LPARAM

lParam

HWND

hwndChildAfter,

LPCTSTR

lpszClass,

LPCTSTR

lpszWindow

} COPYDATASTRUCT, *PCOPYDATASTRUCT;

4、看懂源代码,自己实现类似的功能。

四、实验材料的提交与成绩评定

1、本实验的实验报告一份(电子版或纸质版一份,具体形式由任课教师确定,格式参考学院统一实验报告) 2、实验源程序一份,请表明题号(电子版)

备注:做下一次实验之时提交上一次实验的材料,由各班学习委员以班为单位收集并上交任课教师。

3、实验成绩总分为10分,由指导老师根据学生实验表现和实验材料进行评定,本门课程结束后实验平均成绩(实验总成绩/实验次数)按照10%的比例记入期末考试总成绩。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687426625a9204.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信