操作系统课程设计(共24页).docx
《操作系统课程设计(共24页).docx》由会员分享,可在线阅读,更多相关《操作系统课程设计(共24页).docx(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上湖南科技大学计算机科学与工程学院操作系统课程设计报告 学 号 : * 姓 名 : * * 班 级 : *指导老师: *完成时间: *.*.* 目录 实验一 Windows进程管理 实验二 Linux进程管理 实验三 互斥与同步 实验四 银行家算法的模拟与实现 实验五 内存管理 实验六 磁盘调度 实验七 进程间通信实验一 Windows进程管理一、 实验目的1) 学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解 Windo
2、ws 进程的“一生”。3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。二、实验内容和步骤(1)编写基本的 Win32 Consol Application 步骤1:登录进入 Windows 系统,启动 VC+ 。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 ConsolApplication”,然后在“Project name”处输入工程名,在“Location” 处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“
3、C+ Source File”,然后在“File” 处输入 C/C+源程序的文件名。 步骤4:将清单 1-1 所示的程序清单复制到新创建的 C/C+源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入 Windows“命令提示符”窗口,然后进入工程目录中的 debug 子目录,执行编译好的可执行程序,列出运行结果(如果运行不成功,则可能的原因是什么) 如果运行不成功 可能是路径有问题或者没有通过编译。(2) 创建进程 本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程 ID和它在进程列表中的位置。 步骤1:创建一个“
4、Win32 Consol Application”工程,然后拷贝清单 1-2 中的程序编译成可执行文件。 步骤2:在“命令提示符”窗口运行步骤 1 中生成的可执行文件,列出运行结果。按下ctrl+alt+del,调用 windows 的任务管理器,记录进程相关的行为属性。运行结果: 步骤3:在“命令提示符”窗口加入参数重新运行生成的可执行文件,列出运行结果。按下ctrl+alt+del,调用 windows 的任务管理器,记录进程相关的行为属性。运行结果: 步骤4:nclone为线程开始运行的编号,当nclone的值大于或者等于c_nCloneMax时程序运行一次即跳出;变量的定义和初始化方法
5、(位置)对程序的执行结果有影响;(3)父子进程的简单通信及终止进程 步骤1: 创建一个“Win32 Consol Application”工程,然后拷贝清单 1-3 中的程序,编译成可执行文件。 步骤2:在 VC 的工具栏单击“ Execute Program” (执行程序) 按钮,或者按 Ctrl + F5 键,或者在“命令提示符”窗口运行步骤 1 中生成的可执行文件,列出运行结果。 步骤3: 按源程序中注释中的提示,修改源程序 1-3,编译执行(执行前请先保存已经完成的工作),列出运行结果。在程序中加入跟踪语句,或调试运行程序,同时参考 MSDN 中的帮助文件CreateProcess()
6、的使用方法,理解父子进程如何传递参数。给出程序执行过程的大概描述。通过main(int argc,char* argv)传递参数,每次运行时先检测argc的值,若小于1程序运行结束,否则继续往下执行 步骤4:按源程序中注释中的提示,修改源程序 1-3,编译执行,列出运行结果。 步骤5:参 考 MSDN 中 的 帮 助 文 件 CreateMutex() 、 OpenMutex() 、 ReleaseMutex() 和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。给出父子进程同步过程的一个大概描述。CreateMutex()创建互斥体,OpenMut
7、ex()打开互斥体,ReleaseMutex()释放互斥体,WaitForSingleObject()检测hHandle事件的信号状态,通过这些方法可实现当前只有一个进程被创建或使用,实现进程的同步。首先,进程创建一个互斥体,打开互斥体,如遇到互斥,则进行处理,处理完后,释放互斥体,下面便是进程等待一个要处理的项目三、 实验心得与体会每个进程都从调用CreateProcess()API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess()或TerminateProcess()API函数终止。通常应用程序的框架负责调用ExitProcess()函数
8、。进程都是有始有终,其中有中断,还有处理进程间互斥的函数,已达到进程的完成后自然终止。实验二 Linux进程管理一、 实验目的 通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程和程序之间的区别。二、 背景知识在 Linux 中创建子进程要使用 fork()函数,执行新的命令要使用 exec()系列函数,等待子进程结束使用 wait()函数,结束终止进程使用 exit()函数。fork()原型如下: pid_t fork(void); fork 建立一个子进程,父进程继续运行,子进程在同样的位置执行同样的程序。对于父进程,fork()返回子进程的 pid, 对于子进程, f
9、ork()返回 0。出错时返回-1。 exec 系列有 6 个函数,原型如下: extern char *environ; int execlp( const char *file, const char *arg, .); int execle( const char *path, const char *arg , ., char * const envp); int execv( const char *path, char *const argv); int execve (const char *filename, char *const argv , char *const env
10、p); int execvp( const char *file, char *const argv); exec 系列函数用新的进程映象置换当前的进程映象.这些函数的第一个参数是待执行程序的路径名(文件名)。这些函数调用成功后不会返回,其进程的正文(text),数据(data)和栈(stack)段被待执行程序程序覆盖。但是进程的 PID 和所有打开的文件描述符没有改变,同时悬挂信号被清除,信号重置为缺省行为。 在函数 execl,execlp,和 execle 中, const char *arg 以及省略号代表的参数可被视为 arg0,arg1, .,argn。它们合起来描述了指向 NUL
11、L 结尾的字符串的指针列表,即执行程序的参数列表。作为约定,第一个 arg 参数应该指向执行程序名自身,参数列表必须用 NULL 指针结束。 execv 和 execvp 函数提供指向 NULL 结尾的字符串的指针数组作为新程序的参数列表。作为约定,指针数组中第一个元素应该指向执行程序名自身。指针数组必须用 NULL 指针结束。 execle 函数同时说明了执行进程的环境(environment),它在 NULL 指针后面要求一个附加参数,NULL 指针用于结束参数列表,或者说,argv 数组。这个附加参数是指向 NULL 结尾的字符串的指针数组,它必须用 NULL 指针结束。其它函数从当前进
12、程的 environ 外部变量中获取新进程的环境。 execlp和execvp可根据path搜索合适的程序运行,其它则需要给出程序全路径。 execve()类似 execv(),但是加上了环境的处理。 wait() , waitpid()可用来等待子进程结束。函数原型: #include pid_t wait(int *stat_loc); pid_t waitpid(pid_t pid, int *stat_loc,int options);当进程调用 wait,它将进入睡眠状态直到有一个子进程结束。 wait 函数返回子进程的进程 id,stat_loc 中返回子进程的退出状态。 wait
13、pid 的第一个参数 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()创建两个子进程。当此程序行 在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示
14、一个字符:父进程显示字符“ a”;两子进程分别显示字符“ b”和字符“ c”。 步骤 1:使用 vi 或 gedit 新建一个 程序,然后拷贝清单 2-1 中的程序,使用 cc或者 gcc 编译成可执行文件 fork_demo。例如,可以使用 gcc o fork_demo 完成编译。 步骤 2:在命令行输入./fork_demo 运行该程序。 (2) 子进程执行新任务 任务要求:编写一段程序,使用系统调用 fork()创建一个子进程。子进程通过系统调用 exec更换自己原有的执行代码,转去执行 Linux 命令/bin/ls (显示当前目录的列表),然后调用 exit()函数结束。父进程则调
15、用 waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正常结束。程序执行过程如图 2-1 所示。 步骤 1:使用 vi 或 gedit 新建一个 程序,然后拷贝清单 2-2 中的程序(该程序的执行如图 2-1 所示),使用 cc 或者 gcc 编译成可执行文件 exec_demo。例如,可以使用 gcc o exec_demo 完成编译。 步骤 2:在命令行输入./exec_demo 运行该程序。 步骤 3:观察该程序在屏幕上的显示结果,并分析。 图2-1 程序的执行过程四、 实验心得及体会这个课题的实验让我学会了Windows系统下虚拟机中的基本程序的编写,第一次在虚
16、拟级的环境中编写了这一个程序。并通过进程的创建。撤销和运行加深对进程概念和进程并发执行的理解,明确了进程和程序之间的区别。实验三 互斥与同步一、实验目的1)回顾操作系统进程、线程的有关概念,加深对 Windows 线程的理解。2)了解互斥体对象,利用互斥与同步操作编写生产者-消费者问题的并发程序,加深对 P (即semWait)、 V(即 semSignal)原语以及利用 P、 V 原语进行进程间同步与互斥操作的理解。二、实验内容和步骤1)生产者消费者问题步骤 1:创建一个“Win32 Consol Application”工程,然后拷贝清单 3-1 中的程序,编译成可执行文件。 步骤 2:在
17、“命令提示符”窗口运行步骤 1 中生成的可执行文件,列出运行结果。 步骤 3:仔细阅读源程序,找出创建线程的 WINDOWS API 函数,回答下列问题:线程的第一个执行函数是什么(从哪里开始执行)它位于创建线程的 API 函数的第几个参数中答:第一个执行函数是Producer;位于创建线程API函数的第三个参数中 步骤 4:修改清单 3-1 中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。察看运行结果,从中你可以得出什么结论当生产者数目大于消费者时,生产者需要等待消费者;当消费者数目大于生产者时,消费者要经常等待. 步骤 5:修改清单 3-1 中的程序
18、,按程序注释中的说明修改信号量 EmptySemaphore 的初始化方法,看看结果有何不同。 步骤 6:根据步骤 4 的结果,并查看 MSDN,回答下列问题: 1)CreateMutex 中有几个参数,各代表什么含义。有三个参数;1)LPSECURITY_ATTRIBUTESIpMutexAttributes代表安全属性的指针2)BOOL bInitialOwner代表布尔 bInitialOwner3)LPCTSTR IpName代表LPCTSTR类型 IpName 2)CreateSemaphore 中有几个参数,各代表什么含义,信号量的初值在第几个参数中。有四个参数;1)表示采用不允许
19、继承的默认描述符;2)设置信号机的初始计数;3)设置信号机的最大计数;指定信号机对象的名称.3)程序中 P、V 原语所对应的实际 Windows API 函数是什么,写出这几条语句。P:WaitForSingleObject(EmptySemaphore, INFINITE); WaitForSingleObject(Mutex, INFINITE); WaitForSingleObject(FullSemaphore, INFINITE);V:ReleaseMutex(Mutex); ReleaseSemaphore(FullSemaphore, 1, NULL); ReleaseSemap
20、hore(EmptySemaphore, 1, NULL);4) CreateMutex 能用 CreateSemaphore 替代吗尝试修改程序 3-1,将信号量 Mutex 完全用CreateSemaphore 及相关函数实现。写出要修改的语句。可以;Mutex = CreateSemaphore(NULL, 1, 1, NULL); P:WaitForSingleObject(Mutex, INFINITE); V:ReleaseSemaphore(Mutex, 1, NULL); 三、 实验总结 这次实验加深了对Windows线程的理解,了解互斥体对象,通过对生产者消费者等进程间同步与
21、互斥经典算法的实现,加深对P、V原语以及利用P、V原语进行进程间同步与互斥操作的理解,将信号量看做生产或消费的一个对象,将信号量的生成和销毁操作如同P操作和V操作一样,生成者消费者问题模拟的就是对信号量的生成和销毁,其中牵涉了信号量的同步,这也是该问题为何成为同步的经典问题的原因。实验四 银行家算法的模拟与实现一、实验目的(1) 进一步了解进程的并发执行。(2) 加强对进程死锁的理解,理解安全状态与不安全状态的概念。(3) 掌握使用银行家算法避免死锁问题。二、实验基本知识与原理1)基本概念 死锁:多个进程在执行过程中,因为竞争资源会造成相互等待的局面。如果没有外力作用,这些进程将永远无法向前推
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 24
限制150内