操作系统第一次与第二次实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
实验1 Linux基本环境
1、实验目的
(1)熟悉Linux下的基本操作,学会使用各种Shell命令去操作Linux,对Linux 有一个感性认识。
(2)学会使用vi编辑器编简单的C语言程序,并能对其编译和调试。
2、实验内容
(1)以root用户身份登陆,并使用“ls”,“cat”“cd”等命令来实现基本的文件操作并观察Linux文件系统的特点;
(2)使用vi编辑器编写一C程序,并用gcc命令进行编译和链接,并用a.out 来进行输出结果。
3、实验结果
(1) a.输入“ls”后,vi编辑器显示主文件夹下的所有文件及目录名。使用dir 查看当前目录内容。
b.输入“cat”后,会显示文件:cat 文件名建立文件:cat >文件名,
ctrl+d结束输入。
c.输入“cd”,改变当前目录,cd ..回到上层目录,cd /回到根目录。(2) a.在命令行键入vi filename.c 然后回车。
b.按一下键盘上的I键(insert),进入编辑模式。(a与i是相同的用法)
c.当文件编辑完后,按Esc 键;输入:wq) ,保存退出。
d.对刚才编写的程序进行编译。编译的命令是:gcc filenam
e.c
e.最后运行程序,命令式:./a.out
4、实验总结
通过做本次实验,我熟悉了Linux环境下的基本操作,学会使用各种命令去操作Linux,也学会使用vi编辑器编辑简单的程序,并能对其编译
和调试。了解并掌握了对vi编辑器的一些基本使用方法等。可能由于初次接触Linux环境,所以刚开始编程时出现了许多错误,但我及时找同学或老师来帮忙,解决我的问题,这些错误能够让我更清楚地了解自己对哪些知识掌握的不够透彻,让自己对知识掌握的更牢固。
实验2 进程管理
1、实验目的
(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质。
(3)分析进程竞争资源现象,学习解决进程互斥的方法。
(4)了解Linux系统中进程通信的基本原理。
2、实验内容
(1)进程的创建
编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕
上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和
字符“c”。试观察纪录屏幕上的显示结果,并分析原因。
(2)进程的控制
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。
如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程
之间的互斥,观察并分析出现的现象。
(3)①编写一段程序,使其现实进程的软中断通信。
要求:使用系统调用fork()创建两个子进程,再用系统调用signal()
让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号
后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信
号后分别输出下列信息后终止:
Child Processll is Killed by Parent!
Child Processl2 is Killed by Parent!
父进程等待两个子进程终止后,输出如下的信息后终止
Parent Process is Killed!
②在上面的程序中增加语句signal (SIGNAL, SIG-IGN) 和signal
(SIGQUIT, SIG-IGN), 观察执行结果,并分析原因。
(4)进程的管道通信
编制一段程序,实现进程的管理通信。
使用系统调用pipe()建立一条管道线;两个子进程P1和P2 分别向管道
中写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的
消息。
3、实验结果
(1)bca(有时会出现bac)
分析:从进程执行并发来看,输出bac,acb等情况都有可能。
原因:fork()创建进程所需的时间多于输出一个字符的时间,因此在主进程创建进程2的同时,进程1就输出了“b”,而进程2和
主程序的输出次序是有随机性的,所以会出现上述结果。
(2)child….
son…
daughter…
daughter…
或child
…son
…child
…son
…daughter
有时会出现child... son... daughter...
分析:由于函数printf()输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。但是 , 由于进程并发执行时的
调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先
后随着执行的不同而发生变化。这与打印单字符的结果相同。
如果在程序中使用调用lockf()来给每一个子进程加锁之后出现的情况:
大致与未上锁的输出结果相同,也是随着执行时间不同,输出结果的顺
序有所不同。
分析:因为上述程序执行时,不同进程之间不存在共享临界资源(其中打印机的互斥性已有由操作系统保证)问题,所以,加锁与不加
锁效果相同。
(3)child process2 is killed by parent!
parent process is killed!
分析:由于stop函数和waiting函数共同作用。保证了parent process is killed!一定在child process1 is killed by parent!
child process2 is killed by parent!之后出现。
当增加语句signal (SIGNAL, SIG-IGN) 和signal (SIGQUIT,SIG-IGN ) parent process is killed!然后程序处于保持阻塞状态。
分析:由于忽略了中断与退出信号,程序会一直保持阻塞状态而无法退出。
(4)延迟5秒后显示:
child1 process is sending message!
再延迟5秒:
child2 process is sending message!
分析:程序通过sleep()函数使当前的进程自我阻塞,而在阻塞过程中没有运行其他进程是因为通过lockf()进行了锁定,从而实
现进程的互斥。
4、实验总结