计算机操作系统实验报告表格资料.docx
- 文档编号:26958947
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:33
- 大小:71.80KB
计算机操作系统实验报告表格资料.docx
《计算机操作系统实验报告表格资料.docx》由会员分享,可在线阅读,更多相关《计算机操作系统实验报告表格资料.docx(33页珍藏版)》请在冰豆网上搜索。
计算机操作系统实验报告表格资料
====================================================================
实验报告
姓名
学号:
专业:
~学年第学期
年级班级:
阜阳师范学院
FuyangTeachersCollege
实验报告
实验项目
实验一:
Linux入门
实验目的
1)了解Linux运行环境的命令及使用格式
2)熟悉Linux的常用基本命令
3)练习并掌握Linux下C语言程序的编写、编译、调试和运行方法。
实验器材
PC、虚拟机
实验内容
1)熟悉Linux的常用基本命令如logout/exit、adduser、userdel、ls、cd、pwd、mkdir、rmdir、rm、cp、mv、cat、man等。
2)用vim编写一个简单的显示“helloword!
”的程序,用gcc编译并观察编译后的结果,运行生成的可执行文件。
实验要求
记录自己实验课上具体的操作内容、过程
实验原理(指导)
(一)介绍虚拟机安装以及使用方法
利用软件技术,在母机hosts中虚拟出另外一台或者几台子机guests,而在子机中,可以随意进行任何操作,并且都不会影响主机。
Vmware中创建的OS实际上是在硬盘上创建了一个文件夹,该OS中的所有东西都保存在这个文件夹中的文件里面。
设置共享的路径:
Windows:
d:
\lin_share
Linux:
/mnt/hgfs/sha_fd
(二)常用基本命令的使用
用root账号(超级用户)注册,口令为ubuntu(注意大小写)。
注册成功出现#号(超级用户系统提示符,普通用户的系统提示符为$)。
命令格式:
命令[选项][处理对象]
注意:
(1)命令一般是小写字串。
注意大小写有别
(2)选项通常以减号(-)再加上一个或数个字符表示,用来选择一个命令的不同操作
(3)同一行可有数个命令,命令间应以分号隔开
(4)命令后加上&可使该命令后台(background)执行
命令名
功能
实例
命令
功能
实例
(三)使用编辑器vim编辑文件
vim提供二种工作模式:
输入模式(insertmode)和命令模式(commandmode)。
1.进入Linux的文本模式之后,在命令行键入vimfilename.c然后回车。
首先vim命令是打开vim编辑器。
后面的filename.c是用户即将编辑的c文件名字,注意扩展名字是.c;也可以直接用vi打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。
2.最基本的命令I:
当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I键(insert),插入的意思,就可以进入编辑模式了(a与i是相同的用法)
3.当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:
1)按一下键盘上的Esc键;
2)键入冒号(:
),紧跟在冒号后面是wq(意思是保存并退出)。
如果不想保存退出,则在第二步键入冒号之后,键入!
q(不带w,机尾部保存)。
4.在输入模式下,按ESC可切换到命令模式。
命令模式下,可选用下列指令离开vi:
:
q!
离开vi,并放弃刚在缓冲区内编辑的内容
:
wq
将缓冲区内的资料写入磁盘中,并离开vi
:
ZZ
同wq
:
x
同wq
:
w
将缓冲区内的资料写入磁盘中,但并不离开vi
:
q
离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:
w配合使用
5.退出vi编辑器的编辑模式之后,要对刚才编写的程序进行编译
(四)GNUC编译器
Linux上可用的C编译器是GNUC编译器。
通常后跟一些选项和文件名来使用GCC编译器。
GCC命令的基本用法如下:
gcc[options][filenames]。
当不用任何选项编译一个程序时,GCC将建立(假定编译成功)一个名为a.out的可执行文件。
也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。
例如:
gcc–ocountcount.c此时得到的可执行文件就不再是a.out,而是count。
最后一步是运行程序,执行文件格式:
./可执行文件名
(五)GDB调试工具
gdb是一个用来调试C和C++程序的强有力调试器。
它使你能在程序运行时观察程序的内部结构和内存的使用情况。
在编译时用–g选项打开调试选项。
命令
描述
file
装入欲调试的可执行文件
kill
终止正在调试的程序
list
列出产生执行文件的源代码部分
next
执行一行源代码但不进入函数内部
step
执行一行源代码并进入函数内部
run
执行当前被调试的程序
quit
终止gdb
break
在代码里设置断点,使程序执行到这里时被挂起
make
不退出gdb就可以重新产生可执行文件
shell
不离开gdb就执行UNIXshell命令
实验过程
【任务】:
编写一简单程序,对其编译、调试并执行
程序体
实验结果
及分析
注意事项
实验小结
教师评语
实验成绩
教师签名
实验日期
实验报告
实验项目
实验二:
Linux进程控制
实验目的
1)加深对进程概念的理解,明确进程和程序的区别;
2)进一步认识并发执行的概念,区别顺序执行和并发执行;
3)掌握进程创建的方法
4)熟悉进程的睡眠,同步和撤销等进程控制方法
5)分析进程争用临界资源的现象,学习解决进程互斥的方法;
实验器材
PC、虚拟机
实验内容
1)编写一段程序,使用系统调用fork()创建两个子进程。
各进程显示不同的信息,如父进程显示字符“a”,子进程分别显示字符“b”和“c”。
多次运行观察显示结果,并分析产生这种执行效果的原因。
2)修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因
3)一个父进程创建一个子进程,子进程通过exec系统调用执行另一个文件。
各自的代码中显示不同的信息,从其运行结果可看出两个进程并发执行的效果。
4)利用wait()来控制进程执行顺序,并用exit()来终止进程执行,分析wait()是如何实现进程同步的
5)选作:
如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
实验要求
1)仔细观察实验中的各种现象及出现的问题。
分析产生各种现象的原因。
寻找解决问题的办法。
2)实验报告中给出程序的主要语句并且加入相应的注释即可,程序太多时不需要给出程序的全部语句,给出输出的结果及对各种现象的分析意见
实验原理(指导)
(一)所涉及的系统调用
函数名
功能
调用格式
1.fork()
创建一个新进程。
Intpid=fork()
说明:
fork()返回值意义如下:
0:
在子进程中,pid变量保存的fork()返回值为0,表示当前进程是子进程。
>0:
在父进程中,pid变量保存的fork()返回值为子进程的id值(进程唯一标识符)。
-1:
创建失败。
如果fork()调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork()被调用了一次,但返回了两次。
函数名
功能
调用格式
2.getpid()
取得目前进程的识别码(进程ID),
intgetpid()
3.getppid()
取得目前进程的父进程识别码
intgetppid()
说明:
头文件#include
函数名
功能
调用格式
4.execl()
把一个新程序装入内存,来改变调用进程的执行代码,从而形成新进程
intexecl(path,arg0[,arg1,...argn],0);
char*path,*arg0,*arg1,...,*argn;
说明:
①如果exec()调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新进程,新进程的进程标识符id与调用进程相同,exec()没有建立一个与调用进程并发的子进程,而是用新进程取代了原来进程。
②系统调用exec和fork()联合使用能为程序开发提供有力支持。
用fork()建立子进程,然后在子进程中使用exec(),这样就实现了父进程与一个与它完全不同子进程的并发执行。
③头文件:
#include
函数名
功能
调用格式
5.wait()
等待子进程运行结束
intwait(status)
int*status;
其中,status是用户空间的地址。
说明:
如果子进程没有完成,父进程一直等待。
wait()将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。
如果在wait()前已有子进程暂停或终止,则调用进程做适当处理后便返回
函数名
功能
调用格式
6.exit()
终止进程的执行
voidexit(status)
intstatus;
其中,status是返回给父进程的一个整数,
说明:
exit(0)正常终止;exit
(1)异常终止
函数名
功能
调用格式
7.lockf(files,function,size)
用作锁定文件的某些段或者整个文件。
intlockf(files,function,size)
intfiles,function;
longsize;
其中:
files是文件描述符;function是锁定和解锁:
1表示锁定,0表示解锁。
size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾。
(二)进程创建程序实示例:
#include
main()
{intp;
while((p=fork())==-1);/*进程创建失败*/
if(p==0)
printf(“Thisisachildprocess.”);/*在子进程中*/
else{printf(“Thisisaparentprocess.”);/*在父进程中*/
}
}
实验过程
【子任务1】:
使用系统调用函数fork()创建子进程,用getpid()获取父子进程的ID号,用getppid()获取子进程的父进程的ID,记录实验结果,观察并分析它们之间的关系。
程序体
实验结果
及分析
【子任务2】:
修改程序,用fork()建立子进程,然后在子进程中使用execl(),记录实验结果,并对实验结果进行分析系统调用函数excel()的工作原理。
程序体
实验结果
及分析
【子任务3】:
修改程序,编写一段程序,使用系统调用fork()创建两个子进程。
各进程显示不同的信息。
多次运行观察结果,分析执行效果的原因,说明进程并发执行的特点。
程序体
实验结果
及分析
【子任务4】:
修改程序,使用系统调用wait()、exit()和sleep(),实现简单的进程同步,多次运行观察结果,分析执行效果的原因,说明如何使得进程实现简单的同步。
程序体
程序体
实验结果
及分析
注意事项
实验小结
教师评语
实验成绩
教师签名
实验日期
实验报告
实验项目
实验三:
Linux进程通信
实验目的
4)了解什么是信号以及熟悉Linux系统中进程之间软中断通信的基本原理
5)了解什么是管道以及熟悉Linux支持的管道通信方式
6)了解什么是消息以及熟悉消息传送的机理
实验器材
PC、虚拟机
实验内容
任务一:
进程的软中断通讯
任务二:
进程的管道通信
任务三:
消息通信
实验原理(指导)
(一)所涉及的系统调用
函数名
功能
调用格式
1.kill()
发送者进程发送信号。
intkill(pid,sig)
intpid,sig
说明:
其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。
(1)pid>0时,核心将信号发送给进程pid。
(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。
(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。
函数名
功能
调用格式
2.signal()
预置对信号的处理方式,允许调用进程控制软中断信号。
signal(sig,function)
intsig;
void(*func)()
说明:
头文件#include
其中sig用于指定信号的类型,sig为0则表示没有收到任何信号,常用如下表:
值
名字
说明
01
SIGHUP
挂起(hangup)
02
SIGINT
中断,当用户从键盘按^c键或^break键时
03
SIGQUIT
退出,当用户从键盘按quit键时
16
SIGUSR1
用户自定义信号1
17
SIGUSR2
用户自定义信号2
18
SIGCLD
某个子进程死
function的解释如下:
(1)function=1时,进程对sig类信号不予理睬,亦即屏蔽了该类信号;
(2)function=0时,缺省值,进程在收到sig信号后应终止自己;
(3)function为非0,非1类整数时,function的值即作为信号处理程序的指针。
函数名
功能
调用格式
3.pipe()
建立一无名管道。
intpipe(filedes);
intfiledes[2];
其中,filedes[1]是写入端,filedes[0]是读出端。
说明:
头文件:
#include
#inlcude
#include
函数名
功能
调用格式
4.read()
从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。
如该文件被加锁,等待,直到锁打开为止。
intread(fd,buf,nbyte);
intfd;
char*buf;
unsignednbyte;
5.write()
把nbyte个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。
如文件加锁,暂停写入,直至开锁。
intwrite(fd,buf,nbyte)
intfd;
char*buf;
unsignednbyte;
函数名
功能
调用格式
6.msgget()
创建一个消息,获得一个消息的描述符。
intmsgget(key,flag)
key_tkey;
intflag;
说明:
其中,key是用户指定的消息队列的名字;flag是用户设置的标志和访问方式。
如:
IPC_CREAT|0400是否该队列已被创建。
无则创建,是则打开;
IPC_EXCL|0400是否该队列的创建应是互斥的。
msgqid是该系统调用返回的描述符,失败则返回-1。
位置到文件尾。
函数名
功能
调用格式
7.msgsnd()
发送一消息。
向指定的消息队列发送一个消息,并将该消息链接到该消息队列的尾部。
intmsgsnd(msgqid,msgp,size,flag)
intmsgqid,size,flag;
structmsgbuf*msgp;
说明:
其中,msgqid是返回消息队列的描述符;msgp是指向用户消息缓冲区的一个结构体指针。
缓冲区中包括消息类型和消息正文,
即{longmtype;/*消息类型*/
charmtext[];/*消息的文本*/}
size指示由msgp指向的数据结构中字符数组的长度;即消息的长度。
flag规定当核心用尽内部缓冲空间时应执行的动作,进程是等待(若在标志flag中未设置IPC_NOWAIT位),还是立即返回(若是设置IPC_NOWAI)。
函数名
功能
调用格式
8.msgrcv()
接受一消息。
从指定的消息队列中接收指定类型的消息。
intmsgrcv(msgqid,msgp,size,type,flag)
intmsgqid,size,flag;
structmsgbuf*msgp;
longtype;
说明:
其中,msgqid,msgp,size,flag与msgsnd中的对应参数相似,type是规定要读的消息类型,flag规定倘若该队列无消息,核心应做的操作。
如此时设置了IPC_NOWAIT标志,则立即返回,若在flag中设置了MS_NOERROR,且所接收的消息大于size,则核心截断所接收的消息。
函数名
功能
调用格式
9.msgctl()
消息队列的操纵。
读取消息队列的状态信息并进行修改,如查询消息队列描述符、修改它的许可权及删除该队列等。
intmsgctl(msgqid,cmd,buf);
intmsgqid,cmd;
structmsgqid_ds*buf;
说明:
其中,函数调用成功时返回0,不成功则返回-1。
buf是用户缓冲区地址,供用户存放控制参数和查询结果;cmd是规定的命令
实验过程
【任务1】:
修改参考程序,使用系统调用fork()创建子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL或ctrl+c键);当捕捉到中断信号后,父进程用系统调用kill()向子进程发出信号,子进程捕捉到信号后输出下列信息后终止:
stop子进程IDbysignal16(或17)!
ChildProcesslisKilled!
父进程等待子进程终止后,输出如下的信息后终止
stop父进程IDbysignal2!
ParentProcessisKilled!
实验要求
分析利用软中断通信实现进程同步的机理,signal()放在程序的不同位置处①-③,记录输出结果并分析原因,修改参考程序,按任务中要求的输出结果形式输出,若需要修改程序,直接在参考程序上修改,并加注释。
参考程序
修改后程序
#include
#include
#include
intwait_mark;
voidwaiting(),stop();
main()
{intp1;
①
while((p1=fork())==-1);
if(p1>0)
{
wait_mark=1;
②signal(SIGINT,stop);
waiting();
kill(p1,16);
printf(“parentprocessiskilled!
\n”);
}
else
{
wait_mark=1;
③
signal(16,stop);
waiting();
printf(“childprocessiskilled!
\n”);
}
voidwaiting()
{
while(wait_mark!
=0);
}
voidstop()
{
wait_mark=0;
}
实验结果
及分析
【任务2】:
用系统调用pipe()建立一管道,二个子进程P1和P2分别向管道各写一句话:
Child1issendingamessage!
Child2issendingamessage!
父进程从管道中读出二个来自子进程的信息并显示。
实验要求
(1)要求先接收P1,后P2
(2)必须考虑其中都有哪些同步和互斥,同时向管道输入端写的字节数必须和从输出端读的字节数一致,若不一致,则会出现什么问题。
(3)修改参考程序,按任务中要求的输出结果形式输出,若需要程序,直接在参考程序上修改,并加注释。
参考程序
修改后程序
#include
#include
#include
main()
{
intpid1,pid2;
intfd[2];
charoutpipe[100],inpipe[100];
pipe(fd);
while((pid1=fork())==-1);
if(pid1==0)
{
sprintf(outpipe,"child1processissendingmessage!
");
write(fd[1],outpipe,50);
}
else
{while((pid2=fork())==-1);
if(pid2==0)
{
sprintf(outpipe,"child2processissendingmessage!
");
write(fd[1],outpipe,50);
}
else
{read(fd[0],inpipe,50);
printf("%s\n",inpipe);
read(fd[0],inpipe,50);
printf("%s\n",inpipe);
}
}}
实验结果
及分析
【任务3】:
使用系统调用msgget(),msgsnd(),msgrev(),及msgctl()编制一长度为1k的消息发送(client.c)和接收(server.c)的程序。
实验要求
(1)二个程序分别编辑、编译为client与server。
(2)执行:
./server&
ipcs-q
./client
(3)观察上面的程序,记录实验结果,说明控制消息队列系统调用msgctl()在此起什么作用?
(4)(选作:
为了便于操作和观察结果,用一个程序为“引子”,先后fork()两个进程,server和client进行通信。
)若需要程序,直接在参考程序上修改,并加注释。
参考程序
修改后程序
1.client.c
#include
#include
#include
#defineMSGKEY75
structmsgform
{longmtype;
charmtext[1000];
}msg;
intmsgqid;
voidclient()
{inti;
msgqid=msgget(MSGKEY,0777);
for(i=10;i>=1;i--)
{msg.mtype=i;
printf(“(client)s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 实验 报告 表格 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)