操作系统课程设计文档格式.docx
《操作系统课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
步骤4:
将清单1-1所示的程序清单复制到新创建的C/C++源程序中。
编译成可执行文件。
步骤5:
在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序,列出运行结果(如果运行不成功,则可能的原因是什么)
如果运行不成功可能是路径有问题或者没有通过编译。
(2)创建进程
本实验显示了创建子进程的基本框架。
该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。
创建一个“Win32ConsolApplication”工程,然后拷贝清单1-2中的程序编译成可执行文件。
在“命令提示符”窗口运行步骤1中生成的可执行文件,列出运行结果。
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性。
运行结果:
]
在“命令提示符”窗口加入参数重新运行生成的可执行文件,列出运行结果。
步骤4:
nclone为线程开始运行的编号,当nclone的值大于或者等于c_nCloneMax时程序运行一次即跳出;
变量的定义和初始化方法(位置)对程序的执行结果有影响;
(3)父子进程的简单通信及终止进程
创建一个“Win32ConsolApplication”工程,然后拷贝清单1-3中的程序,编译成可执行文件。
步骤2:
在VC的工具栏单击“ExecuteProgram”(执行程序)按钮,或者按Ctrl+F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件,列出运行结果。
%
按源程序中注释中的提示,修改源程序1-3,编译执行(执行前请先保存已经完成的工作),列出运行结果。
在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。
给出程序执行过程的大概描述。
通过main(intargc,char*argv[])传递参数,每次运行时先检测argc的值,若小于1程序运行结束,否则继续往下执行
按源程序中注释中的提示,修改源程序1-3,编译执行,列出运行结果。
参考MSDN中的帮助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。
给出父子进程同步过程的一个大概描述。
CreateMutex()创建互斥体,OpenMutex()打开互斥体,ReleaseMutex()释放互斥体,WaitForSingleObject()检测hHandle事件的信号状态,通过这些方法可实现当前只有一个进程被创建或使用,实现进程的同步。
首先,进程创建一个互斥体,打开互斥体,如遇到互斥,则进行处理,处理完后,释放互斥体,下面便是进程等待一个要处理的项目
三、?
四、实验心得与体会
每个进程都从调用CreateProcess()API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。
每一进程都以调用ExitProcess()或TerminateProcess()API函数终止。
通常应用程序的框架负责调用ExitProcess()函数。
进程都是有始有终,其中有中断,还有处理进程间互斥的函数,已达到进程的完成后自然终止。
实验二Linux进程管理
一、实验目的
通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程和程序之间的区别。
二、背景知识
在Linux中创建子进程要使用fork()函数,执行新的命令要使用exec()系列函数,等待子进程结束使用wait()函数,结束终止进程使用exit()函数。
fork()原型如下:
pid_tfork(void);
fork建立一个子进程,父进程继续运行,子进程在同样的位置执行同样的程序。
对于父进程,fork()返回子进程的pid,对于子进程,fork()返回0。
出错时返回-1。
exec系列有6个函数,原型如下:
externchar**environ;
intexeclp(constchar*file,constchar*arg,...);
intexecle(constchar*path,constchar*arg,...,char*constenvp[]);
intexecv(constchar*path,char*constargv[]);
intexecve(constchar*filename,char*constargv[],char*constenvp[]);
intexecvp(constchar*file,char*constargv[]);
exec系列函数用新的进程映象置换当前的进程映象.这些函数的第一个参数是待执行程序的路径名(文件名)。
这些函数调用成功后不会返回,其进程的正文(text),数据(data)和栈(stack)段被待执行程序程序覆盖。
但是进程的PID和所有打开的文件描述符没有改变,同时悬挂信号被清除,信号重置为缺省行为。
在函数execl,execlp,和execle中,constchar*arg以及省略号代表的参数可被视为arg0,arg1,...,argn。
它们合起来描述了指向NULL结尾的字符串的指针列表,即执行程序的参数列表。
作为约定,第一个arg参数应该指向执行程序名自身,参数列表必须用NULL指针结束。
execv和execvp函数提供指向NULL结尾的字符串的指针数组作为新程序的参数列表。
作为约定,指针数组中第一个元素应该指向执行程序名自身。
指针数组必须用NULL指针结束。
execle函数同时说明了执行进程的环境(environment),它在NULL指针后面要求一个附加参数,NULL指针用于结束参数列表,或者说,argv数组。
这个附加参数是指向NULL结尾的字符串的指针数组,它必须用NULL指针结束。
其它函数从当前进程的environ外部变量中获取新进程的环境。
execlp和execvp可根据path搜索合适的程序运行,其它则需要给出程序全路径。
execve()类似execv(),但是加上了环境的处理。
wait(),waitpid()可用来等待子进程结束。
函数原型:
#include<
sys/>
pid_twait(int*stat_loc);
pid_twaitpid(pid_tpid,int*stat_loc,intoptions);
当进程调用wait,它将进入睡眠状态直到有一个子进程结束。
wait函数返回子进程的进程id,stat_loc中返回子进程的退出状态。
waitpid的第一个参数pid的意义:
pid>
0:
等待进程id为pid的子进程。
pid==0:
等待与自己同组的任意子进程。
>
pid==-1:
等待任意一个子进程
pid<
-1:
等待进程组号为-pid的任意子进程。
因此,wait(&
stat)等价于waitpid(-1,&
stat,0),waitpid第三个参数option可以是0,WNOHANG,WUNTRACED或这几者的组合。
三、实验内容与步骤
(1)进程的创建
任务要求:
编写一段程序,使用系统调用fork()创建两个子进程。
当此程序行在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:
父进程显示字符“a”;
两子进程分别显示字符“b”和字符“c”。
步骤1:
使用vi或gedit新建一个程序,然后拷贝清单2-1中的程序,使用cc或者gcc编译成可执行文件fork_demo。
例如,可以使用gcc–ofork_demo完成编译。
步骤2:
在命令行输入./fork_demo运行该程序。
(2)子进程执行新任务
任务要求:
编写一段程序,使用系统调用fork()创建一个子进程。
子进程通过系统调用exec更换自己原有的执行代码,转去执行Linux命令/bin/ls(显示当前目录的列表),然后调用exit()函数结束。
父进程则调用waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正常结束。
程序执行过程如图2-1所示。
使用vi或gedit新建一个程序,然后拷贝清单2-2中的程序(该程序的执行如图2-1所示),使用cc或者gcc编译成可执行文件exec_demo。
例如,可以使用gcc–oexec_demo完成编译。
在命令行输入./exec_demo运行该程序。
步骤3:
观察该程序在屏幕上的显示结果,并分析。
《
图2-1程序的执行过程
四、实验心得及体会
这个课题的实验让我学会了Windows系统下虚拟机中的基本程序的编写,第一次在虚拟级的环境中编写了这一个程序。
并通过进程的创建。
撤销和运行加深对进程概念和进程并发执行的理解,明确了进程和程序之间的区别。
实验三互斥与同步
1)回顾操作系统进程、线程的有关概念,加深对Windows线程的理解。
2)了解互斥体对象,利用互斥与同步操作编写生产者-消费者问题的并发程序,加深对P(即semWait)、V(即semSignal)原语以及利用P、V原语进行进程间同步与互斥操作的理解。
{
1)生产者消费者问题
步骤1:
创建一个“Win32ConsolApplication”工程,然后拷贝清单3-1中的程序,编译成可执行文件。
仔细阅读源程序,找出创建线程的WINDOWSAPI函数,回答下列问题:
线程的第一个执行函数是什么(从哪里开始执行)它位于创建线程的API函数的第几个参数中
答:
第一个执行函数是Producer;
位于创建线程API函数的第三个参数中
步骤4:
修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。
察看运行结果,从中你可以得出什么结论
当生产者数目大于消费者时,生产者需要等待消费者;
当消费者数目大于生产者时,消费者要经常等待.
步骤5:
修改清单3-1中的程序,按程序注释中的说明修改信号量EmptySemaphore的初始化方法,看看结果有何不同。
步骤6:
根据步骤4的结果,并查看MSDN,回答下列问题:
1)CreateMutex中有几个参数,各代表什么含义。
有三个参数;
1)LPSECURITY_ATTRIBUTESIpMutexAttributes代表安全属性的指针2)BOOLbInitialOwner代表布尔bInitialOwner3)LPCTSTRIpName代表LPCTSTR类型IpName
2)CreateSemaphore中有几个参数,各代表什么含义,信号量的初值在第几个参数中。
有四个参数;
1)表示采用不允许继承的默认描述符;
2)设置信号机的初始计数;
3)设置信号机的最大计数;
指定信号机对象的名称.
3)程序中P、V原语所对应的实际WindowsAPI函数是什么,写出这几条语句。
P:
WaitForSingleObject(EmptySemaphore,INFINITE);
;
WaitForSingleObject(Mutex,INFINITE);
WaitForSingleObject(FullSemaphore,INFINITE);
V:
ReleaseMutex(Mutex);
ReleaseSemaphore(FullSemaphore,1,NULL);
ReleaseSemaphore(EmptySemaphore,1,NULL);
4)CreateMutex能用CreateSemaphore替代吗尝试修改程序3-1,将信号量Mutex完全用CreateSemaphore及相关函数实现。
写出要修改的语句。
可以;
Mutex=CreateSemaphore(NULL,1,1,NULL);
…
WaitForSingleObject(Mutex,INFINITE);
ReleaseSemaphore(Mutex,1,NULL);
三、实验总结
这次实验加深了对Windows线程的理解,了解互斥体对象,通过对生产者消费者等进程间同步与互斥经典算法的实现,加深对P、V原语以及利用P、V原语进行进程间同步与互斥操作的理解,将信号量看做生产或消费的一个对象,将信号量的生成和销毁操作如同P操作和V操作一样,生成者消费者问题模拟的就是对信号量的生成和销毁,其中牵涉了信号量的同步,这也是该问题为何成为同步的经典问题的原因。
实验四银行家算法的模拟与实现
(1)进一步了解进程的并发执行。
(2)加强对进程死锁的理解,理解安全状态与不安全状态的概念。
(3)掌握使用银行家算法避免死锁问题。
二、实验基本知识与原理
,
1)基本概念
死锁:
多个进程在执行过程中,因为竞争资源会造成相互等待的局面。
如果没有外力作用,这些进程将永远无法向前推进。
此时称系统处于死锁状态或者系统产生了死锁。
安全序列:
系统按某种顺序并发进程,并使它们都能达到获得最大资源而顺序完成的序列为安全序列。
安全状态:
能找到安全序列的状态称为安全状态,安全状态不会导致死锁。
不安全状态:
在当前状态下不存在安全序列,则系统处于不安全状态。
2)银行家算法
银行家算法顾名思义是来源于银行的借贷业务,一定数量的本金要满足多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其它进程使用资源。
如果资源分配不当,就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
当一进程提出资源申请时,银行家算法执行下列步骤以决定是否向其分配资源:
1)检查该进程所需要的资源是否已超过它所宣布的最大值。
2)检查系统当前是否有足够资源满足该进程的请求。
3)系统试探着将资源分配给该进程,得到一个新状态。
三、详细设计
(1)数据结构
资源总量向量Resource,m维,表示m种资源的总量。
可用资源向量Available,m维,表示未分配的各种可用资源数量。
$
需求矩阵Claim,n*m矩阵,表示n个进程对m类资源的最大需求。
分配矩阵Allocation,n*m矩阵,表示n个进程已分配的各种资源数.
(2)编程实现
/*安全性检查函数*/
intchkerr()统执行安全性算法
第二部分主要是进行资源的修改。
在这里可以修改资源的可用资源和资源还需求资源。
多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。
银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。
实验五内存管理
[
(1)通过对Windowsxp“任务管理器”、“计算机管理”、“我的电脑”属性、“系统信息”、“系统监视器”等程序的应用,学习如何察看和调整Windows的内存性能,加深对操作系统内存管理、虚拟存储管理等理论知识的理解。
(2)了解Windowsxp的内存结构和虚拟内存的管理,理解进程的虚拟内存空间和物理内存的映射关系。
(1)观察和调整WindowsXP的内存性能。
阅读“背景知识”,请回答:
1)什么是“分页过程”
当Windows求助于硬盘以获得虚拟内存时,这个过程被称为分页(paging)。
分页就是将信息从主内存移动到磁盘进行临时存储的过程。
2)什么是“内存共享”
应用程序经常需要彼此通信和共享信息。
从性能的角度来看,共享内存的能力大大减少了应用程序使用的内存数量。
运行一个应用程序的多个副本时,每一个实例都可以使用相同的代码和数据,这意味着不必维护所加载应用程序代码的单独副本并使用相同的内存资源。
无论正在运行多少个应用程序实例,充分支持应用程序代码所需求的内存数量都相对保持不变。
3)什么是“未分页合并内存”和“分页合并内存”
未分页合并内存:
包含必须驻留在内存中的占用代码或数据,这些程序在系统重新启动或关闭之前一直驻留在内存的特定部分中。
内存中包含的进程保留在主内存中,并且不能交换到磁盘上物理内存的这个部分用于内核模式操作(例如,驱动程序)和必须保留在主内存中才能有效工作的其他进程。
没有主内存的这个部分,内核组件就将是可分页的,系统本身就有变得不稳定的危险。
#
分页合并内存:
存储迟早需要的可分页代码或数据的内存部分,虽然可以将分页合并内存中的任何系统进程交换到磁盘上,但是它临时存储在主内存的这一部分,以防系统立刻需要它。
在将系统进程交换到磁盘上之前,Windows会交换其他进程。
Windowsxp中,未分页合并内存的最大限制是多少
最大限制为256MB
4)Windowsxp分页文件默认设置的最小容量和最大容量是多少
步骤2:
登录进入Windowsxp。
步骤3:
查看包含多个实例的应用程序的内存需求。
1)启动想要监视的应用程序,例如Word。
2)右键单击任务栏以启动“任务管理器”。
3)在“Windows任务管理器”对话框中选定“进程”选项卡。
4)向下滚动在系统上运行的进程列表,查找想要监视的应用程序。
请在表5-3中记录:
表5-3实验记录
映像名称
PID
CPU
CPU时间
内存使用
1640
00
0:
00:
08
16996K
*32
3548
?
2048K
5836
02
38
59264K
“内存使用”列显示了该应用程序的一个实例正在使用的内存数量。
5)启动应用程序的另一个实例并观察它的内存需求。
请描述使用第二个实例占用的内存与使用第一个实例时的内存对比情况。
步骤4:
未分页合并内存
估算未分页合并内存大小的最简单方法是使用“任务管理器”。
未分页合并内存的估计值显示在“任务管理器”的“性能”选项卡的“核心内存”部分。
总数(K):
8122*_1024
分页数:
328*1024
未分页(K):
116*1024
还可以使用“任务管理器”查看一个独立进程正在使用的未分页合并内存数量和分页合并内存数量。
操作步骤如下:
1)单击“Windows任务管理器”的“进程”选项卡,然后从“查看”菜单中选择“选择列”命令,显示“进程”选项卡的可查看选项。
2)在“选择列”对话框中,选定“页面缓冲池”选项和“非页面缓冲池”选项旁边的复选框,然后单击“确定”按钮。
返回WindowsXp“任务管理器”的“进程”选项卡时,将看到其中增加显示了各个进程占用的分页合并内存数量和未分页合并内存数量。
仍以刚才打开观察的应用程序(例如Word)为例,请在表5-4中记录:
表5-4实验记录
》
映像名称
PID
CPU
CPU时间
12
17248K
10
73888K
/
0;
01;
14
67088K
从性能的角度来看,未分页合并内存越多,可以加载到这个空间的数据就越多。
拥有的物理内存越多,未分页合并内存就越多。
但未分页合并内存被限制为256MB,因此添加超出这个限制的内存对未分页合并内存没有影响。
步骤5:
提高分页性能。
在Windowsxp的安装过程中,将使用连续的磁盘空间自动创建分页文件。
用户可以事先监视变化的内存需求并正确配置分页文件,使得当系统必须借助于分页时的性能达到最高。
虽然分页文件一般都放在系统分区的根目录下面,但这并不总是该文件的最佳位置。
要想从分页获得最佳性能,应该首先检查系统的磁盘子系统的配置,以了解它是否有多个物理硬盘驱动器。
1)在“开始”菜单中单击“设置”–“控制面板”命令,双击“管理工具”图标,再双击“计算机管理”图标。
2)在“计算机管理”窗口的左格选择“磁盘管理”管理单元来查看系统的磁盘配置。
请在表5-5中记录:
表5-5实验记录
卷
布局
类型
文件系统
容量
状态
简单
基本
;
状态良好(OEM分区)
C:
NTFS
&
状态良好(系统,启动,页面