湖南科技大学计算机科学与工程学院操作系统课程设计报告学号:********姓名:**班级:***指导老师:***完成时间:****.**.**目录实验一Windows进程管理实验二Linux进程管理实验三互斥与同步实验四银行家算法的模拟与实现实验五内存管理实验六磁盘调度实验七进程间通信实验一Windows进程管理一、实验目的1)学会使用VC编写基本的Win32ConsolApplication(控制台应用程序)。2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。二、实验内容和步骤(1)编写基本的Win32ConsolApplication步骤1:登录进入Windows系统,启动VC++。步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32ConsolApplication”,然后在“Projectname”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++SourceFile”,然后在“File”处输入C/C++源程序的文件名。步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序,列出运行结果(如果运行不成功,则可能的原因是什么)如果运行不成功可能是路径有问题或者没有通过编译。(2)创建进程本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。步骤1:创建一个“Win32ConsolApplication”工程,然后拷贝清单1-2中的程序编译成可执行文件。步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件,列出运行结果。按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性。运行结果:步骤3:在“命令提示符”窗口加入参数重新运行生成的可执行文件,列出运行结果。按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性。运行结果:步骤4:nclone为线程开始运行的编号,当nclone的值大于或者等于c_nCloneMax时程序运行一次即跳出;变量的定义和初始化方法(位置)对程序的执行结果有影响;(3)父子进程的简单通信及终止进程步骤1:创建一个“Win32ConsolApplication”工程,然后拷贝清单1-3中的程序,编译成可执行文件。步骤2:在VC的工具栏单击“ExecuteProgram”(执行程序)按钮,或者按Ctrl+F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件,列出运行结果。步骤3:按源程序中注释中的提示,修改源程序1-3,编译执行(执行前请先保存已经完成的工作),列出运行结果。在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。给出程序执行过程的大概描述。通过main(intargc,char*argv[])传递参数,每次运行时先检测argc的值,若小于1程序运行结束,否则继续往下执行步骤4:按源程序中注释中的提示,修改源程序1-3,编译执行,列出运行结果。步骤5:参考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()可用来等待子进程结束。函数原型:#includesys/pid_twait(int*stat_loc);pid_twaitpid(pid_tpid,int*stat_loc,intoptions);当进程调用wait,它将进入睡眠状态直到有一个子进程结束。wait函数返回子进程的进程id,stat_loc中返回子进程的退出状态。waitpid的第一个参数pid的意义:pid0:等待进程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所示。步骤1:使用vi或gedit新建一个程序,然后拷贝清单2-2中的程序(该程序的执行如图2-1所示),使用cc或者gcc编译成可执行文件exec_demo。例如,可以使用gcc–oexec_demo完成编译。步骤2:在命令行输入./exec_demo运行该程序。步骤3:观察该程序在屏幕上的显示结果,并分析。图2-1程序的执行过程四、实验心得及体会这个课题的实验让我学会了Windows系统下虚拟机中的基本程序的编写,第一次在虚拟级的环境中编写了这一个程序。并通过进程的创建。撤销和运行加深对进程概念和进程并发执行的理解,明确了进程和程序之间的区别。实验三互斥与同步一、实验目的1)回顾操作系统进程、线程的有关概念,加深对Windows线程的理解。2)了解互斥体对象,利用互斥与同步操作编写生产者-消费者问题的并发程序,加深对P(即semWait)、V(即semSignal)原语以及利用P、V原语进行进程间同步与互斥操作的理解。二、实验内容和步骤1)生产者消费者问题步骤1:创建一个“Win32ConsolApplication”工程,然后拷贝清单3-1中的程序,编译成可执行文件。步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件,列出运行结果。步骤3:仔细阅读源程序,找出创建线程的WINDOWSAPI函数,回答下列问题:线程的第一个执行函数是什么(从哪里开始执行)它位于创建线程的API函数的第几个参数中答:第一个执行函数是Producer;位于创建线程API函数的第三个参数中步骤4:修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。察看运行结果,从中你可以得出什么结论当生产者数目大于消费者时,生产者需要等待消费者;当消费者数目大于生产者时,消费者要经常等待.步骤5:修改清单3-1中的程序,按程序注释中的说明修改信号量EmptySemaphore的初始化方法,看看结果有何不同。步骤6:根据步骤4的结果,并查看MSDN,回答下列问题:1)CreateMutex中有几个参数,各代表什么含义。有三个参数;1)LPSECURITY_ATTRIBUTESIpMutexAttributes代表安全属性的指针2)BOOLbInitialOwner代表布尔bInitialOwner3)LPCTSTRIpName代表LPCTSTR类型IpName2)CreateSemaphore中有几个参数,各代表什么含义,信号量