昆明学院
操作系统课程实验指导书
(适用于计算机科学与技术专业软件工程、网络工程、嵌入式
系统方向)
(学分:学时: 20 学时)
信息技术学院
2011年3月
一、实验教学目的及任务
操作系统作为计算机专业的专业必修课,是计算机专业的核心课程之一。通过本实验课程的学习,目的是让学生及时掌握和巩固所学的基本原理和基础理论,使学生理解与掌握操作系统设计所遵循的基本原理、基本方法。通过验证性及综合性实验,帮助学生提高分析问题、解决问题的能力,为将来设计和实现大型应用软件及系统软件打下良好的基础。
二、实验课的基本理论与实验技术知识
1.进程的同步与互斥
2.死锁的应对
3.虚拟内存管理
4.页面置换算法
5.文件操作
6.磁盘的组织与调度算法
7.Linux的使用方法
8.Vi、Gcc的使用方法
三、考核方式及成绩评定标准
1.考核方式:在规定时间内,按要求完成设计并上机调试运行,写出详细的实验报告,在机上向教师演示。
2.成绩评定标准:视程序的质量、完成速度及实验报告分别给予优、良、中、及格、不及格等成绩。
四、实验教材及主要参考资料
主要参考资料:
马海波等编著,《计算机操作系统教程》,清华大学出版社,2009.
汤子瀛等编著,《计算机操作系统》,西安电子科技大学出版社,1996.
张尧学等编著,《计算机操作系统教程》,清华大学出版社,1998.
五、实验项目
实验1 构件实验环境
【实验目的】
(1)掌握实验环境构建方法。
(2)掌握实验工具使用方法。
【实验原理/实验基础知识】
VMWare Workstation 是一款功能强大的桌面虚拟计算机软件,提供用户在单一的桌面上同时运行不同的操作系统,例如,可同时Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。“多启动”系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就像标准Windows应用程序那样切换。
VMware Workstation 同时也是进行开发、测试、部署新的应用程序的最佳解决方案。VMware Workstation可在一部实体机器上模拟完整的网络环境,安装后的操作系统可以进行虚拟分区、配置而不影响真实硬盘的数据,使用更加便捷、灵活,比较适合学习和测试。
RedHat是美国RedHat公司的产品,是一个Linux发行版本,也是目前使用最多的Linux 发行版本。RedHat无论是安装、配置还是使用都十分方便,而且运行稳定,因而成为科研机构研究人员和学习者的学习和研究对象。
【实验环境】VMware Workstation、RedHat
【实验步骤】
(1)安装VMWARE WORKSTATION
步骤1:运行安装文件。
步骤2:选择安装类型,建议选择“典型”。
步骤3:选择安装特性,使用默认选项。
步骤4:选择是否需要软件更新功能。
步骤5:选择软件启动的快捷方式。
步骤6:输入注册码。完成。
(2)在VMWARE中构建虚拟机
步骤1:运行VMware Workstation,单击“File→New→Virtual Machine”命令,进入创建虚拟机向导。
步骤2:弹出的欢迎页中单击“下一步”按钮。
步骤3:在“Virtual machine configuration”选项区域内选择“Custom”单选按钮。
步骤4:在Choose the Virtual Machine Hardware Compatibility页中,选择虚拟机的硬件格式。
步骤5:在Select a Guest Operating System对话框中,选择要创建虚拟机类型及要运行的操作系统,这里选择Linux。
步骤6:在Name the Virtual Machine对话框中,为新建的虚拟机命名并且选择它的保存路径。
步骤7:在Memory for the Virtual Machine页中,设置虚拟机使用的内存,通常情况下,对于Windows 98及其以下的系统,可以设置64MB;对于Windows 2000/XP,最少可以设置96MB。对于Linux,可以设置96MB。
步骤8:在Network Type页中使用默认选项。
步骤9:在Select I/O Adapter Type页中,选择虚拟机的SCSI卡的型号,通常选择默认值即可。
步骤10:Select a Disk页中,选择Create a new virtual disk(创建一个新的虚拟硬盘)。步骤11:Select a Disk Type页中,选择创建的虚拟硬盘的接口方式,通常选择默认值即可。步骤12:在Specify Disk Capacity页中设置虚拟磁盘大小,对于一般的使用来说,选择默认值即可。
步骤13:在Specify Disk File页的Disk file选项区域内设置虚拟磁盘文件名称,通常选择默认值即可,然后单击完成按钮。
(3)虚拟环境下安装RED HAT
使用镜像安装文件安装RED HAT。
步骤1:在Virtual Machine Settings页中的Hardware选项卡中,选择CD-ROM项,在Connection选项区域内选中Use ISO image单选按钮,然后选择浏览,确定安装文件所在路径。
步骤2:选择新建的虚拟机,然后单击工具栏上的播放按钮,启动虚拟机,用鼠标在虚拟机工作窗口中单击一下,进入虚拟机。
步骤3:根据安装向导出现的提示安装操作系统。若需进行第二个安装文件的切换,则单击VMware Wokstation界面右下角光驱图标,重新确定第二个安装文件路径,其他安装文件的切换与此类似。
如果想从虚拟机窗口中切换回主机,需要按下Ctrl及Alt键。
【实验报告】
填写《信息技术学院学生上机实验报告》。
【思考题】
1.在构建好的实践环境中什么是虚拟机?什么是主机?
2.在VMWARE WORKSTATION下安装的操作系统内的操作会不会对硬件有影响?
实验2 Linux的键盘命令
【实验目的】
(1)熟练掌握常用的键盘命令。
(2)了解linux的文本模式操作界面。
【实验原理/实验基础知识】
(1)目录操作
① ls:显示目录的内容,也可以显示文件的属性,比如节点、文件种类、权限、拥有者、大小、创建时间等。
格式: ls [参数] [目录或文件名]。
例:ls /home 表示查看目录home。
② mkdir:目录创建
格式:mkdir [参数选项] 目录
例:mkdir /home/sub 表示在home目录下创建子目录/sub。
③ rmdir:删除空目录工具
格式:rmdir [参数] 目录
例:rmdir /home/sub 表示在home目录下删除子目录/sub。
④ rm:删除一个或多个文件的工具,并且能用于删除非空目录。
格式: rm [参数选项] file1 file2
(2)输入输出重定向
① cat:显示文件内容。
格式:cat [参数] 文件名称
例:cat /home/hello.c 表示显示/home目录下文件hello.c的内容。
② cat >:将键盘输入的字符送入文件。
格式:cat > 文件名
例:cat 〉file< ③ cat:合并文件。 格式:cat 文件1>>文件2 例:cat f1〉〉f2 表示将f2文件内容合并到f1文件中。 (3)文件操作 ① cp:文件或目录的复制 格式:cp [参数] 源文件或目录目标文件或目录 例:cp /home/f1 /home/sub 表示将home目录下文件f1复制到子目录sub下。 ② mv:文件的更名与移动。 格式:mv [参数] 旧文件路径名新文件路径名 例:mv /home/f1 /home/sub/f2 表示将home目录下文件f1移动到home子目录sub下,并更名为f2。 ③ find:查找文件。 格式:find [参数] 查找条件 例:find –name ‘abc’表示查找文件名为abc的文件。 ④ tar:文件打包和解包。 格式:tar [参数] 目标文件名源文件列表 例:tar –cvzf myfile.tar 表示将当前目录下的文件打包并压缩到文件myfile.tar中。注:参数-cvf表示打包,参数-xvf表示解包,参数-z表示对文件进行压缩或解压缩。(4)历史命令的调用 用光标上下移动键显示已使用过的历史命令。 (5)日期与时间 ① date:显示日期时间。 格式:date [参数] 例:date 表示显示系统当前日期及时间。 ② cal:显示日历。 格式:cal [月份] [年份] 例:cal 01 2011表示显示2011年1月日历。 (6)用户管理 ① useradd:创建新用户。 格式:useradd [参数] 用户名 例:useradd u1表示创建新用户u1。 ② passwd:设置及修改用户密码。 格式:passwd 用户名 例:passwd wang 表示为用户wang设置密码,执行命令后系统会提示再次确认密码。 ③ userdel:撤销用户。 格式:userdel [参数] 用户名 例:userdel u1表示删除用户u1。 【实验环境】VMware Workstation、RedHat 【实验步骤】 (1)目录操作 ①在/home下建立子目录,在该子目录下创建第二级子目录。 ②进入/home,查看创建的子目录。 ③删除一个第二级子目录中的目录。 ④显示当前所处的路径。 (2)输入输出重定向 ①键盘输入文件file1的内容。 ②键盘输入文件file2的内容。 ③将file1和file2合并到file中。 ④显示file。 (3)文件操作 ①在目录/home下创建子目录/sub,由键盘输入文字并输入文件f1、f2,将f1、f2存至/sub 目录。 ②将文件f1改名为f11。 ③将sub目录下所有文件打包,并压缩生成doc.tar文件。 ④在sub目录下创建子目录,将doc.tar文件解压到新建子目录下。 ⑤删除sub目录下文件f2。 (4)历史命令的调用 用光标上下移动键显示已使用过的历史命令。 (5)日期与时间 ①显示系统当前日期与时间。 ②显示2012年9月的日历。 ③显示2012年全年日历。 (6)用户管理 ①用root登陆。 ②添加用户名为a1的用户。 ③为该用户设置密码:123456。 ④重启系统,用a1登陆。 ⑤重启系统,用root登陆;显示/etc/passwd和/etc/shadow文件的内容,查看该用户信息。 ⑥删除用户a1。 【实验报告】 填写《信息技术学院学生上机实验报告》。 【思考题】 (1)使用root登陆系统与使用用户创建名登陆系统有什么区别? (2)修改密码时如果不给出用户名,则被修改的密码对应的用户是哪一个? 实验3 Linux进程的创建 【实验目的】 (1)熟悉在c语言源程序中使用linux所提供的系统调用界面的方法。 (2)理解由系统调用创建的子进程的特点。 (3)掌握linux中子进程的创建方法以及调度执行情况,理解进程与程序的区别。 (4)掌握linux提供的c编译器gcc的使用方法。 (5)掌握vi的使用方法。 【实验原理/实验基础知识】 一、由系统调用创建的子进程特点: ①子进程复制了父进程的数据与堆栈空间,继承父进程的用户代码、组代码、环境变量等等。 ②父子映像有各自的存储空间。 ③对于父子进程的调度执行具有随机性。 二、Linux中创建子进程的系统调用 Linux中创建用户子进程系统调用fork()的使用方法: 格式: int fork( ) 返回值:为0时表示创建成功,从子进程返回;大于0时表示创建成功,从父进程返回,其值为子进程的PID号;等于-1时表示创建失败。 三、Vi的使用方法 1.vi的基本概念 vi可以分为两种模式,分别是命令模式、插入模式和底行模式,各模式的功能区分如下: 1) 命令行模式 这是进入vi的默认模式,主要功能是控制屏幕光标的移动,字符、字或行的删除,区段复制。 2) 插入模式 主要功能是完成数据、文字的输入,按「ESC」键可回到命令行模式。 3) 底行模式 主要功能是设置命令,例如保存文件或退出vi等。 2.vi的基本操作 1)进入vi 在系统提示符号输入vi及文件名称后,就可以进入vi默认命令行模式。 2)切换至插入模式编辑文件 进入vi后,按键盘字母i键就可以进入插入模式输入文字或数据。 3)文本修改 在插入模式下只能一直输入文字,如果需要修改输入的文字,则按键盘ESC键返回命令行模式再使用上下键移动光标,再删除文字。 4)退出vi及保存文件 按键盘ESC键又插入模式回到命令行模式,输入冒号进入底行模式,继续输入命令。保存及退出相关命令: : w filename (将文章以指定的文件名filename保存)。 : wq (存盘并退出vi) 。 : q! (不存盘强制退出vi) 。 3、命令行模式功能键 1). 删除文字 x:每按一次,删除光标所在位置的"后面"一个字符。 dd:删除光标所在行。 2). 复制 yw:将光标所在之处到字尾的字符复制到缓冲区中。 #yw:复制#个字到缓冲区,例如单击6yw表示复制6个字。 yy:复制光标所在行到缓冲区。 p:将缓冲区内的字符贴到光标所在位置。所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。 3).撤销上一次操作 撤销前一个操作按u,按多次u可以执行多次撤销。 四、GCC 1.GCC简介 GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器,能够编译C、C++等语言编写的程序。 使用GCC由C语言源代码文件生成可执行文件的过程经历四个步骤:预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。 预编译。GCC调用预处理器将预处理指令如#include包含的文件内容插入程序代码中,并做语法检查。 编译。这个阶段,GCC调用编译器将预处理后的文件进行编译,生成一个汇编语言文件。 汇编。GCC调用汇编器as处理汇编文件,并生成一个以.O为扩展名的目标文件。 链接。GCC调用链接器ld将程序中用到的函数库连同目标文件连接,产生一个可执行文件。 2.GCC的使用 1)Linux下GCC使用的格式命令 gcc [参数] 源文件目标文件 参数: -o file:编译产生的文件以指定文件名保存。若没有指定文件名,则默认文件名为a.out。 -i:在GCCd头文件搜索路径中添加新目录。 -c:仅把源代码编译为目标代码,而不进行函数库链接。完成后产生一个以.O为扩展名的文件。 例:gcc test.c -o t1 表示将test.c进行编译,编译后的可执行文件名为t1。 【实验环境】VMware Workstation、RedHat 【实验步骤】 (1)父进程创建子进程 用vi编写程序,实现父进程创建一个子进程,返回后父子进程都分别循环输出字符串“I am parent”或“I am child”5次,每输出一次后使用sleep(1)延时一秒,然后再进入下一次循环。通过gcc将程序编译链接后执行,观察并分析运行结果。 (2)进程家族树 用vi编写程序,在程序中连续使用4个fork(),不使用if进行返回值的判断,在最后一个fork()后输出字符“A”。通过gcc将程序编译链接后执行,观察并分析运行结果。【实验报告】 填写《信息技术学院学生上机实验报告》。 【思考题】 (1)当创建了子进程后,该程序的执行有什么特点? (2)画出进程家族树? 实验4 Linux父子进程同步 【实验目的】 (1)熟悉在c语言源程序中使用linux所提供的系统调用界面的方法。 (2)理解同步的概念。 (3)使用系统调用wait()和exit(),实现父子进程同步。 【实验原理/实验基础知识】 一、同步 在多道系统中,一个进程相对于另一个进程的运行速度是不确定的,但相互合作的几个进程需要在某些情况下相互协调工作。 同步关系是指多个相互合作的进程,在某些情况下可能需要相互等待或相互交换信息,这种相互制约关系称为进程同步。 二、Linux中父进程等待子进程的同步 Linux中实现进程同步的两个系统调用为wait()和exit(),使用这两个系统调用实现父进程等待子进程的同步。具体实现方法是:子进程终止时执行exit()向父进程发终止信号,父进程使用wait()等待子进程的终止。 1.Wait()系统调用 功能:等待任意一个子进程终止 格式:pid_t wait( ) 例:wait(0)等待任意子进程结束 返回值: 返回值≥0 表示有子进程终止,其值为终止子进程的pid号。 返回值=-1 表示无子进程终止。该进程阻塞,插入等待子进程终止的队列,当有子进程终止时被唤醒。 注意:等待多个子进程终止需要使用多个wait(),如果该进程没有创建自己的子进程就不能使用wait()。 所用头文件:# include < sys / wait.h >,# include < sys / types.h > 2.Exit()系统调用 为了及时回收进程所占用的资源并减少父进程的干预,Linux利用exit( )来实现进程的自我终止,通常父进程在创建子进程时,应在进程的末尾安排一条exit( ),使子进程自我终止。 功能:终止进程,释放其所占有的资源,向父进程发终止信号。 格式:void exit(stat) 例:exit(0) 进程正常终止 返回值:无返回值 头文件: # include < stdlib.h > 【实验环境】VMware Workstation、RedHat 【实验步骤】 (1)使用vi编写程序,通过wait()和exit()实现父子进程同步,其同步方式为父进程等待子进程的同步,即:子进程先循环输出5次,然后父进程再循环输出5次。 (2)使用gcc编译程序。 (3)运行程序。 (4)观察结果。 【实验报告】 填写《信息技术学院学生上机实验报告》。 【思考题】 (1)什么是同步? (2)实验中如何实现父子进程同步? 实验5 动态申请内存 【实验目的】 (1)掌握linux中动态申请内存的方法。 (2)了解操作系统对于高级语言程序设计所提供的环境支撑。 【实验原理/实验基础知识】 为了提高内存利用率,用户程序常采用动态请求内存的方式使用内存。Linux提供了3种动态内存分配方式,3种动态内存分配方式下申请内存空间后,可以调整空间大小,使用完毕后需释放申请到的内存空间。 1.第一种动态内存分配方法 第一种动态内存分配方法作为高级语言的库函数直接提供给用户使用。使用方法如下:1)用malloc()申请一块内存; 2)用realloc()调整内存大小; 3)用free()释放内存。 [例]:申请、使用、释放内存。 #include #include #include Int main(void) { Char *str; If((str=(char*)malloc(10))==null) { Printf(“Not enough memory to allocate buffer\n”); Exit(1); } Strcpy(str,”hello”); Printf(“string is %s\n”,str); Free(str); Return 0; } 2.第二种动态内存分配方法 第二种动态内存分配的方法是逆向栈方式,栈中可以存放任意多个大小不同的存储块,存取方式为后进先出。使用方法如下: 1)使用obstack_init()初始化一个逆向栈; 2)使用obstack_blank()在栈中加入新的可用空间; 3)使用obstack_copy()对该地址空间进行操作; 4)使用obstack_free()释放栈中空间。 3.第三种动态内存分配方法 第三种内存动态分配方法是半自动式,程序员只需要给出申请空间的大小就可以使用内存空间,使用完之后也不需要释放,而是由系统自动释放。使用方法很简单,只需要使用alloca()完成空间申请,使用完后由系统自动释放。 【实验环境】VMware Workstation、RedHat 【实验步骤】 (1)使用键盘命令以字节为单位显示当前系统中内存使用情况,特别是当前系统中的空闲内存大小。 (2)编写一个程序申请两块大小为10的内存,分别存放字符串“123456789”和“987654321”,并输出字符串及存放地址,然后重新调整内存大小为20,再次输出地址。 (3)再次显示系统中的内存使用情况,对比前后系统中的空闲内存大小有无变化。 【实验报告】 填写《信息技术学院学生上机实验报告》。 【思考题】 (1)实验内容1中前后两次输出的内存地址有何不同? (2)在程序中申请使用了内存后有没有释放?如果不释放申请的内存,会产生什么情况? 实验6 Linux文件系统调用 【实验目的】 (1)掌握linux提供的文件系统调用的使用方法。 (2)熟悉文件操作的系统调用用户接口。 (3)了解操作系统文件系统的工作原理和工作方式。 【实验原理/实验基础知识】 Linux为用户提供了各种服务接口,常用系统调用如下: 1.Open系统调用 功能:创建一个文件。 头文件: #include #include #include 格式: int open(const char *pathname, int flags) int open(const char *pathname, int flags, mode_t mode) 返回值:成功返回新分配的文件描述符,出错返回-1。 参数: pathname参数是要打开或创建的文件名,和fopen一样,pathname既可以是相对路径也可以是绝对路径。 flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来,所以这些常数的宏定义都以O_开头,表示or。 mode参数指定文件的访问权限,分为文件所有者、文件用户组和其他用户。 2.Close系统调用 功能:Close函数关闭一个已打开的文件。 头文件: #include 格式: int close(int fd) 返回值:成功返回0,出错返回-1。 参数: fd是要关闭的文件描述符。需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符。 3.Read系统调用 功能:从指定文件中读取指定长度的内容到指定的缓冲区。 头文件: #include #include 格式: int read(int fd,void *buf,size_t nbytes) 参数: fd 为打开文件系统调用返回的文件标识符。 buf 为指定的缓冲区。 nbytes 为要读的字节数。 4.Write系统调用 功能:将指定的数据以指定的大小写入指定的文件中。 头文件: #include #include 格式: int write(int fd,void *buf,size_t nbytes) 参数: fd 为打开文件系统调用返回的文件标识符。 buf 为指定的缓冲区。 nbytes 为要读的字节数。 5.chomd系统调用 功能:修改文件读写权限。 头文件: #include #include 格式: int chmod(char *pathname,mode_t mode) 参数: pathname 为被操作文件的路径名。 mode 为文件的存取权限,详细描述如下: S_IRWXU 00700 文件所有者具有可读、可写、可执行取权限S_IRUSR 00400 文件所有者具有可读取权限 S_IWUSR 00200 文件所有者具有可写入权限 S_IXUSR 00100 文件所有者具有可执行权限 S_IRWXG 00070 用户组具有可读、可写、可执行取权限 S_IRGRP 00040 用户组具有可读取权限 S_IWGRP 00020 用户组具有可写入权限 S_IXGRP 00010 用户组具有可执行权限 S_IRWXO 00007 其他用户具有可读、可写、可执行取权限S_IROTH 00004 其他用户具有可读取权限 S_IWOTH 00002 其他用户具有可写入权限 S_IXOTH 00001 其他用户具有可执行权限 【实验环境】VMware Workstation、RedHat 【实验步骤】 编写一个文件工具file tool,使其具有退出、创建新文件、写文件、读文件、修改文件权限、查看当前文件权限并退出的功能。 (1) 实现界面, 要求提示用户输入功能号,并根据用户输入的功能选择完成相应的功能。 ************************ 0.退出 1.创建新文件 2.写文件 3.读文件 4.修改文件权限 5.查看当前文件权限并退出 ************************** (2) 实现功能:退出、创建新文件、写文件、读文件、修改文件权限、查看当前文件权限并退出。 【实验报告】 填写《信息技术学院学生上机实验报告》。 【思考题】 (1)先做一个只针对一个文件的工具,即处理给定文件。 (2)改进该工具,使该工具能够处理任意文件,文件名由用户从键盘输入。