操作系统实验指导书3rd.doc_第1页
操作系统实验指导书3rd.doc_第2页
操作系统实验指导书3rd.doc_第3页
操作系统实验指导书3rd.doc_第4页
操作系统实验指导书3rd.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

版本号:3.0 撰写人:孙自广合作者:陈波(博士) 欧阳浩日期:2011-09-08操作系统实验指导书(第3版) 广西工学院计算机工程系 2011年09月前言 操作系统是计算机科学与技术专业(软件工程方向)的一门非常重要的专业课程,操作系统是应用软件与底层硬件的桥梁。通俗的说“只有搞懂了操作系统,才能真正理解计算机”。学好操作系统课程可以提升学生应用计算机解决问题的能力,并获得开发大型复杂软件的经验。操作系统至关重要,但学好它并不容易。虽然Windows界面友好,方便使用,但是底层运行机制被有效的隐藏,在很多人眼里计算机还是一个黑匣子。在选择教学用操作系统上颇费苦心,目前可用于教学的操作系统有Minix, Nochos, Geekos, JOS,FreeBSD等,而Linux不仅是开源的,而且资料丰富并拥有大量的应用软件,所有我们选择了Linux作为实验的平台。本实验指导书参阅了很多网上的优秀资源,在此对提供这些资源的作者,表示感谢。 目 录前言1实验1 Linux的安装与使用3实验2 Linux的键盘命令4实验3-1 Linux进程的创建与父子进程同步8实验3-2 Linux子进程映像的重新加载10实验4-1 Linux软中断通信11实验4-2 Linux管道通信13实验4-3 Linux信息缓冲通信14实验4-4 Linux共享存储通信16实验5 Linux 信号量与 P、V操作函数的定义18实验6 在Linux中增加一个新的系统调用函数20实验7 动态申请内存21实验8 Linux字符设备驱动22实验9 Linux 文件系统调用23实验1 Linux的安装与使用1. 实验目的在做本课程系列实验之前需要先安装Linux系统。如果你的计算机上已经安装了Linux,则本实验可以不做。熟悉Linux提供的图形用户界面。2. 实验预备知识Linux系统的安装方法和图形界面基本操作请参考相关资料。3. 实验内容(1)在虚拟机软件VMWare上安装Linux操作系统,版本是Red Hat Linux 9。(2)进入Linux的资源管理器,以树状结构查看系统目录,并在/home目录下创建子目录,目录名任意。(3)实现文本方式与图形方式的切换。(4)打开文字处理器,输入一段文字后存盘,与Word进行比较。(5)插入软盘,单击桌面上的软盘上的软盘标志,观察软盘驱动器的动作,观察窗口上显示的问价名,核对是否是软盘上的文件。(6)进入Linux的控制面板,参考Windows进行设置。比如设置文字为中文、设置显示器等。(7)进入/usr/src/linux-2.4子目录下查看有哪些文件夹,在进入其中的kernel子目录中看看,再进入其中的include/linux子目录看看有哪些头文件。该文件夹是本课程后续章节所看到的数据结构集中存放的地方。(8)选择菜单“红帽子”“系统工具”“系统监视器”,进入Linux的系统监视器看看,与Windows的任务管理器进行比较。4. 实验要求与思考(1)按照系统提示进行安装,同时学习VMWare的使用方法。(2)以Windows操作系统窗口的操作方式使用Linux图形界面,比较它们的异同。(3)比较Linux的文本方式和窗口方式,哪种更受用户欢迎?(4)可以打开多个虚拟文本窗口吗?比较它与实验2-1的文本有什么相同和不同之处。实验2 Linux的键盘命令1. 实验目的(1)通过本实验使学生了解Linux所提供的用户界面中的键盘命令操作界面;(2)熟练掌握常用的键盘命令;(3)了解Linux的实模式文本操作界面。2. 实验预备知识请参考相关资料学习Linux的命令。3. 实验内容进入Linux的文本方式,完成以下键盘命令的操作。(1) 目录操作 在/home下建立自己的子目录,子目录名自己取,然后在自己的子目录下再创建子 目录,可以多建几个。 进入/home,查看创建的子目录。 删除一部分自己的子目录下的子目录。 再回自己的子目录,显示当前目录清单。 显示当前目录所处的路径。 在自己的子目录下再创建子目录sub和sub1。 进入sub子目录。(2) 文件操作 复制一部分文件到sub子目录(当前目录)cp /usr/src/linux-2.4/kernel/*.c .注意:命令最后有一个小数点,表示目标地址为当前目录,后面的命令中也要注意。 用长格式显示目录清单,看看文件的权限。 查看sub目录中是否有sys.c文件(只显示该文件名)。 将sys.c改名为mysys.c 查看sub目录中是否有mysys.c文件,是否还有sys.c文件。 建立mysys.c的一个文件链接文件名为mydoc.c。 查看上述两个文件是否有相同的i节点号。 使用格式: ls -i 文件名 /查看该文件的节点号 按页显示文件mysys.c的内容(分别使用more 和 less)。 将mysys.c按高比例进行压缩,压缩前后的文件大小进行观察和比较。 将sub子目录下的所有文件进行打包,并压缩生成doc.tar文件。 查看该文件,注意文件名的颜色。 进入sub1子目录。 在sub1子目录下将sub中的doc.tar文件解压到当前目录。 查看sub1子目录下的文件,查看是否已经解压包解压。 删除sub1下的所有文件(一次性删除,不用选择提示)。 返回父目录。 查找文件mysys.c。 进入sub子目录。 修改文件mysys.c的权限为如下。文件拥有者:可读,可写,可执行。所属同组用户:可读,可执行。不同组用户:可读。 删除sub子目录下的所有文件,mysys.c除外,并查看是否完成。21 删除mysys.c。22 返回用户目录。23 删除sub和sub1子目录。 历史命令的调用用光标移动键和显示已经用过的命令,体会其方便之处。 日期与实践 显示系统当前时间和日期。 显示2002年12月的日历。 显示2002年全年的日历。 输入输出重定向 键盘输入文件file1的内容(用d存盘退出)。 键盘输入文件file2的内容。 分别显示file1和file2。 将文件file1,file2合并到file中。 显示file。 将file追加到file1的末尾。 显示file1.(6) 管理操作用一条命令合并file, file1,file2,并显示(使用管道)。(7) 安装与卸载U盘(以下操作注意观察软驱是否运转)1 将U盘插入驱动器,并挂接到安装点上。2 将文件file1复制到U盘上。3 显示U盘上的文件清单(文本文件与DOS兼容)。4 显示file1的内容(该内容可以在Windows下显示出来)。5 将U盘卸载。(8)用户管理1 用root登录。2 添加用户名为a1的用户。3 为该用户设置密码:1234564 重新启动系统。5 用a1登录并输入密码。6 注意用户状态下的提示符与管理员状态下的不同。7 重新启动系统,用root登录.8 显示/etc/passwd/和/etc/shadow文件的内容,查看该用户信息。9 删除用户a1。10 重新启动系统再用a1登录,看系统是否允许;若不允许,则用root登录。11 在/home下建子目录abc。12 再添加用户b1,并指定其主目录为/home/abc。13 显示/etc/passwd/和/etc/shadow文件的内容,查看该用户信息。14 使用用户名b1进入该用户的主目录,查看是否进入/home/abc。15 删除用户b1。4.实验注意事项(1) 在用root登陆时,注意是以特权用户的身份登录的,具有最大的实用权利,因此也极易破坏系统。(2) 在修改密码时要注意,如果不给出用户名,则系统默认用户就是特权用户,被修改的密码是特权用户的密码。实验3-1 Linux进程的创建与父子进程同步1. 实验目的(1)熟悉在C语言源程序中使用Linux所提供的系统调用界面的方法;(2)掌握Linux中进程的创建方法以及调度执行情况,理解进程与程序的区别;(3)使用系统调用wait()和exit(),实现父子进程同步;(4)了解Linux提供的C编译器gcc的调用;(5)进一步掌握vi的使用。2. 实验预备知识(1)vi的使用请参考相关资料。(2)C编译器gcc的使用请参考相关资料。3. 实验内容 (1)父进程创建子进程,返回后父子进程都分别循环输出字符串“I am parent.”或“I am child.”5次,每输出一次后使用sleep(1)延时1秒,然后再进入下一次循环,如下所示。将该源程序链接后执行,观察并分析运行结果。 父进程返回后执行: for(i=0;i5;i+)printf(“I am parent.n”);sleep(1); 子进程返回后执行: for(i=0;i5;i+)printf(“I am child.n”);sleep(1); (2)进程家族树 在源程序中连续使用4个fork(),而不是用if()进行返回值的判段,在4个fork()语言后面输出字符“A”。观察并分析该程序编译连接执行后的输出结果。(3)父子同步进程 修改第(1)题的程序,使用exit()和wait()实现父子进程同步,其同步方式为父进程等待子进程的同步,即:子进程先循环输出5次,然后父进程再循环输出5次.观察是否有不同的结果出现。4. 实验要求与思考(1)观察运行结果,分析结果产生的原因。(2)当程序中创建了子进程后,该程序的执行有什么特点?为什么?(3)如果连续创建多个子进程而不使用条件进行各自空间的分隔,会出现什么情况?请画出第(2)题实验的进程家族树。(4)如何实现父子进程之间的父进程等待子进程的同步?实验3-2 Linux子进程映像的重新加载1. 实验目的(1)掌握在Linux中如何加载属于子进程自己的程序,以取代在子进程创建时由系统复制的父进程的程序;(2)掌握父进程通过创建子进程来完成某项任务的方法;(3)熟悉系统调用execv()和execl()的使用。2. 实验预备知识有关Linux子进程映像的重新加载的知识点请相关资料。3. 实验内容(1)由父进程创建一个子进程,子进程的功能是输出26个英文字母,使用execl()加载子进程的程序。(2)创建一个子进程,并使用execv()给它加载程序,其功能是调用键盘命令ps a.已知键盘命令ps的路径与文件名为:/bin/ps。4. 实验思考(1)加载子进程映像的目的何在?(2)如何加载子进程映像?实验4-1 Linux软中断通信1. 实验目的(1) 掌握软中断通信信号的使用;(2) 熟悉通过软中断信号实现子进程等待父进程的同步;(3) 了解使用软中断通信实现异步事件的方法;(4) 熟悉线程的使用。2. 实验预备知识(1) 与本实验软中断通信有关的知识点请参考相关资料。(2) 与本实验线程有关的知识点请参考相关资料。3. 实验内容(1) 编写一个程序循环显示“How are you?”,当键盘输入Ctrl+C的组合键后中断循环显示,执行软中断程序,软中断程序的功能是修改循环变量的值终止循环,然后输出“Byebye”。(2) 使用软中断实现父子进程同步,同步方式为:父进程先输出字符“A”,然后子进程再输出“B”。(3) 编写一个程序,完成以下功能。 父进程创建两个子进程P1和P2; 父进程捕捉从键盘上通过Ctrl+C键发来的中断信号; 父进程获得中断信号后使用系统调用kill()向两个子进程分别发终止执行信 号SIGUSR1和SIGUSR2; 子进程捕捉到各自的信号后分别输出:Child1 is killed by parent!和Child2 is killed by parent!然后终止执行(无先后次序的要求): 父进程等待两个子进程终止后输出以下信息,然后终止执行: Parent process is killed!(4) 编写一个程序,完成以下功能。 由进程创建一个线程,并定义软中断信号Ctrl+C终止进程执行。运行后,父子两个线程分别循环输出“Thiss is main pthread.n”和“This is the second pthread.n”。父进程接收软中断信号出循环,然后显示“Byebye!n”后终止执行。说明:由于线程没有自己的地址空间,所以父进程执行终止后其子线程也会随之终止,因此该程序中只需要父线程接收软中断信号后终止即可。4. 实验思考(1) 对实验内容(1)进行改进,先输出10次“How are you?”,在此过程中使用Ctrl+C不能中断循环显示,10次以后使用Ctrl+C可以中断循环。(2) 本次实验内容(2)实现子进程等待父进程,而实验3-2中实现了父进程等待子进程,它们分别采用了什么方法?相互之间可不可以代替?(3) 实验内容(3)中一共存在几个进程?它们执行的顺序是怎么样的?如果现在要求实现进程间的同步关系child1、child2、parent,需要怎样改进?(4) 线程的创建与执行与进程有何区别?当程序后中使用了创建线程的调用后,其编译参数与进程有何不同?实验4-2 Linux管道通信1. 实验目的(1)掌握父子进程使用管道进行通信的方法。(2)了解管道通信的特点和使用上的限制。2. 实验预备知识了解无名管道工作原理和无名管道编程实现。3. 实验内容编写一个程序,实现以下功能。(1)父进程使用系统调用pipe()建立一个无名管道;(2)创建两个子进程,分别向管道各分布下面中一条信息后结束; Child 1 is sending a message to parent! Child 2 is sending a message to parent!(3) 父进程从管道中分别接收两个子进程发来的消息并显示该消息,然后父进程结束。(4) 两个子进程的发送没有先后要求。4、实验思考(1)管道通信与软件中断通信在信息量的大小上有何区别?(2)共享同一个管道进行通信的读写进程之间必须满足什么关系?为什么?实验4-3 Linux信息缓冲通信1. 实验目的(1) 掌握Linux中进程之间使用消息缓冲实现进程通信的方法;(2) 了解消息缓冲通信的特点;(3) 了解Linux提供的IPC机制。2. 实验预备知识查找资料了解消息缓冲通信的实现方法。3. 实验内容(1)父进程创建一个消息队列和一个子进程,由子进程发送消息,父进程等待子进程结束后接收子进程发来的消息,并显示消息内容。以“end”作为结束消息。(2)分别编写发送进程和接收进程,由发送进程发送消息,接收进程接收消息。采用先执行发送进程后执行接收进程的方式同步。以“end”作为结束消息。(3)模拟C/S通信,要求如下。 模拟客户(Client端)程序client,其功能如下。a) 显示下列服务功能菜单:Enter your choice:1. Save money2. Take monerb) 接收用户键入的功能号进行选择;c) 将用户键入的功能号作为一条信息发送消息队列,然后结束。 模拟服务器端(Server端)程序server,其功能如下。a) 从消息队列接搜Client端发来一条消息:b) 根据消息作如下处理。若消息为“1”,则创建子进程1,由子进程1加载服务模块save,该模块的作用为显示以下信息:Your money was saved!若消息为“2”,则创建子进程2,由子进程2加载服务模块take,该模块的作用为显示以下消息:Please take your money!c) 等待子进程终止后,Server进程删除消息队列,然后结束。注意: save和take要事先编译连接好,放在合适的子目录下; 采用先运行客户端进程,然后运行服务器端进程的方式实现同步; 子进程的加载方法请参考实验3-2。4. 实验思考(1) 消息缓冲通信有哪些特点?(2) 在使用消息缓冲通信进行通信时,发送和接收之间的同步机制由谁提供?(3) 消息缓冲通信与管道通信有哪些不同之处?当两个独立的进程之间需要传递大量信息时,应该使用其中哪一种通信方式?实验4-4 Linux共享存储通信1. 实验目的(1) 掌握Linux提供的共享存储区通信方式的使用方法。(2) 了解共享存储区通信方法的特点。(3) 了解实现进程间通信的不同方法之间的区别、特点和适用情况。2. 实验预备知识(1) 了解共享存储区通信方式的适用方法。(2) 了解子进程等待父进程的同步的实现方法。3.实验内容(1)编写发送信息程序shmsnd.c和接受信息程序shmrcv.c,其功能分别为: /shmsnd.c/ 创建一个共享存储区间; 将它附接到自己的地址空间; 循环写入若干信息,以“end”结束(提示:信息以追加方式存放到共享区中,可以用strcat()函数实现追加); 断开共享区; 结束。 /shmrcv.c/ 创建/获取同一个共享存储区; 将它附接到自己的地址空间; 输入其中已经由发送地方输入的内容; 断开共享区 删除共享区 结束。 采用先执行发送进程、后执行接受进程来实现同步。 (2) 父进程创建一个共享存储区,然后创建子进程;采用终端实现父进程发送信息和子进程接受信息的同步;信息以“end”作为结束标志。4. 实验思考(1) 共享存储区间通信有哪些优点?使用上有哪些限制?适用于哪种场合?(2) 总结共享存储区通信与消息缓冲通信、管理通信方式各有哪些特点?实验5 Linux 信号量与 P、V操作函数的定义1. 实验目的(1) 掌握Linux信号量的使用方法和P、V操作函数的定义;(2) 掌握使用P、V操作实现进程之间的同步和互斥的方法;(3) 加深对进程同步互斥概念的理解。2. 实验预备知识(1) Linux信号量的使用方法请参考附件材料。(2) 共享存储通信请参考实验4-4.(3) 用P、V操作实现进程互斥与同步请参考附件材料。3. 实验内容(1) 使用信号量及P、V操作实现进程互斥。阅读附件材料中例4-9,将程序编译连接后运行,观察运行结果。(2) 使用信号量及P、V操作实现子进程之间通过共享内存通信的读写同步,如实验图5-1所示。要求如下:生产者进程 消费者进程A sum父进程 消费者进程B 实验图 5-1 请参考附件材料中的例4-11,设计一个父进程,创建三个子进程。3个子进程中一个是生产者进程,两个是消费者进程。父子进程都使用父进程创建的共享存储区进行通信。 由生产者进程发送数值110到由5个缓冲区组成的共享内存中,两个消费者进程轮流接受并输入这10个数据,同时将两个消费者进程对读出的所有数据进行累加求和。 3个子进程结束后,由父进程输出两个消费者进程所读出数据的累加和。它们的同步关系使用P、V操作系统。提示:在例4-11使用2个共享内存的基础上再使用一个共享内存来存放读出信息的累加和,由两个消费者进程和父进程共享使用。4. 实验思考(1) 针对每个信号量需要进行哪些定义?(2) 总结使用信号量系统调用的步骤与方法。(3) 进程之间如何使用信号量及其P、V操作实现互斥?(4) 进程之间如何使用信号量及其P、V操作实现同步?(5) 总结数值型共享内存作为变量或作为数组的使用方法。实验6 在Linux中增加一个新的系统调用函数1. 实验目的(1) 了解在Linux内核中增加一个系统调用函数的方法;(2) 了解内核被修改后必须重新编辑连接的道理,了解编译连接的过程。2. 实验预备知识(1) 系统调用的实现原理请参考相关材料;(2) 在Linux内核中增加一个系统调用的方法和步骤请参考附件材料。3. 实验内容在Linux内核中增加一个系统调用函数,其功能是输出一个字符串,并返回数值5。测试函数中调用该函数,并输出其返回值,查看是否将字符串和返回值输出。4. 实验思考(1) 作为操作系统,为用户提供系统调用用户界面需要做那些工作?(2) 用户如何将新的系统调用函数增加到Linux内核中?(3) 在实现的过程中,遇到了那些困难?是如何解决的?实验7 动态申请内存1. 实验目的(1) 掌握Linux中动态申请内存的方法;(2) 了解操作系统对于高级语言程序设计所提供的环境变量支撑。2. 实验预备知识 Linux内存分配策略和系统调用请参考附件材料。3. 实验内容(1) 使用键盘命令以字节为单位显示系统中的内存使用情况,特别是当前系统中的空闲内

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论