《计算机操作系统》实验指导苏州科技学院电子与信息工程学院计算机工程系二O一四年九月1目录Linux平台实验一命令解释程序...............................................................................................................................2实验二进程管理.......................................................................................................................................3实验三进程间通信...................................................................................................................................5实验四存储管理.....................................................................................................................................14实验五设备管理.....................................................................................................................................22实验六软盘I/O......................................................................................................................................32实验七文件系统.....................................................................................................................................41Windows平台实验一进程同步.....................................................................................................................................42实验二内存管理实验.............................................................................................................................44实验三快速文件系统实习.....................................................................................................................46实验四进程之间通信.............................................................................................................................47实验五Windows应用程序与动态链接库............................................................................................49实验六WDM驱动程序开发..................................................................................................................502实验一命令解释程序实验名称:命令解释程序实验项目性质:设计性所涉及课程:操作系统计划学时:2承担实验室:计算机实验室实验环境要求:RedhatLinux适用专业:计算机科学与技术一、实验目的1、通过本实验熟悉UNIX/LINUX操作系统及C语言。2、熟悉系统调用的编程方法。二、实验预备内容查阅实验中相关函数调用的用法(可用man命令):gets,strcspn,strncpy,strcmp,system等三、实验内容利用C语言编写一个微型命令解释程序minishell.c,该程序可接收并解释以下命令:(1)dir列出当前目录(2)copfile1file2拷贝文件(3)erafilename删除文件(4)dispstring显示字符串(5)end结束,退出要求:(1)检查命令的合法性,如果有错误,显示出错信息,等待重新输入;(2)命令前后有空格示为合法命令。四、示例程序minishell.c//文件名minishell.cpp//功能小型SHELL命令解释程序//开发环境#definetrue1#defineflase0#includestdio.h#includestring.h#includestdlib.hvoidmain(){charcmdl[80];char*scwt[]={exit,dir,time};staticintcmdnum=3;//可用的命令数charcmd[80];3intj,n;while(true){printf(Pleaseinputcommand:);gets(cmdl);//取命令行输入n=strcspn(cmdl,);//取命令命令部分if(n0||strlen(cmdl)0){strnexicpy(cmd,cmdl,n);cmd[n]='\0';for(j=0;jcmdnum;j++)if(strcmp(cmd,scwt[j])==0)break;if(j==0)//是exit命令?exit(0);if(jcmdnum)//其他合法命令{system(cmdl);continue;}printf(Badcommand!\n);//命令错}}}实验二进程管理实验名称:进程管理实验项目性质:验证性所涉及课程:操作系统计划学时:2承担实验室:计算机实验室实验环境要求:RedhatLinux适用专业:计算机科学与技术一、实验目的1、加深对进程概念的理解,明确进程和程序的区别。2、进一步认识并发执行的实质。3、分析进程竞争资源的现象,学习解决进程互斥的方法。二、实验预备内容1、阅读Linux的sched.h源代码文件,加深对进程管理概念的理解。2、阅读Linux的fork.c源代码文件,分析进程的创建过程。3、查阅系统调用fork(),lockf(),exit(),wait(),sleep()等的用法。三、实验内容41、进程的创建编写一段程序,使用系统调用fork()创建两个子进程。让父进程显示字符串‘Parent:’;两个子进程分别显示字符串‘Child1:’和‘Child2:’。多次运行此程序,观察屏幕显示的结果,并分析原因。2、进程控制修改已编写的程序,将输出多次重复的一句话,观察程序执行时在屏幕上显示的结果,并分析原因。若在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察屏幕显示的结果,并分析原因。四、函数调用示例1、系统调用fork()原型:#includesys/types.h#includeunistd.hpid_tfork(void);返回值:子进程中为0,父进程中为子进程ID,出错为-1由fork创建的新进程被称为子进程(childprocess)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进程的进程ID。fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID(进程ID0总是由交换进程使用,所以一个子进程的进程ID不可能为0)。子进程和父进程继续执行fork之后的指令。子进程是父进程的复制品。例如,子进程获得父进程数据空间、堆和栈的复制品。注意,这是子进程所拥有的拷贝。父、子进程并不共享这些存储空间部分。如果正文段是只读的,则父、子进程共享正文段。2、fork()调用示例#includestdio.hmain(){intp1,p2;while((p1=fork())==-1);if(p1==0)//是子进程?putchar('b');else//父进程{putchar('a');}}5实验三进程间通信实验名称:进程间通信实验项目性质:综合性所涉及课程:操作系统计划学时:4承担实验室:计算机实验室实验环境要求:RedhatLinux适用专业:计算机科学与技术一、实验目的1、了解和熟悉Linux支持的消息通信机制、管道道通信、共享存储区机制及信息量机制。2、掌握利用Linux系统的进程通信机制(IPC)实现进程间交换数据的方法。二、实验预备内容1、阅读Linux系统的msg.c、sem.c和shm.c等源码文件,熟悉Linux的三种通信机制。2、查阅系统调用pipe(),write(),read(),exit(),wait(),sleep()等的用法。三、实验内容1、进程通信编写一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线:两个子进程P1和P2分别向管道各写一句话:Child1issendingamessage!Child2issendingamessage!父进程则从管道中读出来自两个了进程的信息,显示在屏幕上。要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。(可以通过sleep()将自身进入睡眠)2、消息的创建,发送和接收.(1)使用系统调用msgget(),msgsnd(),msgsrv()及msgctl()编制一长度为1K的消息(如个人通信录信息)的发送和接收程序.①观察上面程序,说明控制消息队列系统调用msgctl()②共享存储区的发送和接收。(2)使用共享存储区相关的系统调用shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序.(3)比较上述两种消息通信机制中数据传输的时间。四、函数调用示例1、管道1)系统调用pipe()原型:intpipe(intfd[2]);返回值:如果系统调用成功,返回0如果系统调用失败返回-1:errno=EMFILE(没有空闲的文件描述符)EMFILE(系统文件表已满)EFAULT(fd数组无效)参数是一个包括两个整数的数组。如果系统调用成功,此数组将包括管道使用的两个文件描述符。创建一个管道之后,一般情况下进程将产生一个新的进程。注意fd[0]用于读取管道,fd[1]用于写入管道。一旦创建了管道,就可以创建一个新的子进程:62)pipe()调用示例#includestdio.hmain(){intid,fd[2];charbuf[50],s[50];pipe(fd);while((id=fork())==-1);if(id==0){sprintf(buf,Childissendingmessage!);write(fd[1],buf,50);exit(0);}else{wait(0);read(fd[0],s,50);print