计算机操作系统实验报告 本文关键词:操作系统,实验,计算机,报告
计算机操作系统实验报告 本文简介:计算机操作系统实验报告实验一一、实验目的在单处理器环境下,实现互斥和同步的控制。熟悉并掌握常用Windows命令行。更进一步理解PV操作的并发控制的实现。二、Windows命令行常用命令dir是英文单词directory(目录)的缩写,主要用来显示一个目录下的文件和子目录。md是英文makedire
计算机操作系统实验报告 本文内容:
计算机操作系统实验报告
实验一
一、实验目的
在单处理器环境下,实现互斥和同步的控制。
熟悉并掌握常用Windows命令行。
更进一步理解PV操作的并发控制的实现。
二、Windows命令行常用命令
dir是英文单词directory(目录)的缩写,主要用来显示一个目录下的文件和子目录。
md是英文make
directory(创建目录)的缩写。功能:创建一个子目录
cd是英文change
directory(改变目录)的缩写,功能:改变目录
rd是英文remove
directory(删除目录)的缩写,功能;:删除目录
copy功能:复制一个或一组文件至指定的目录中
del是英文delete(删除)的缩写,功能:删除指定目录下一个或一组文档
edit功能:edit是一个简单的编辑软件,可用于编辑程序或批处理文件。
bacc功能:编译指定的文件(如bacc
dd)
bainterp功能:运行指定文件(如:bainterp
dd)
三、并发程序设计
题目:在BACI环境下,对程序并发执行的实验:
(1)没有控制时正确的程序执行的结果不正确;
(2)BACI中PV操作的并发控制的实现。
实验1、多进程共享内存堆栈
(1)设计思路:
(2)代码:
int
stack[10];
semaphore
s=1;
int
top=4;
void
release(int
free)
{
p(s);
top++;
coutbuf;
if(buf%2)
v(s2);
else
v(s3);}
void
w1()
{
p(s2);
cout0配合使用,返回队列中第一个类型不为msgtyp的消息
?IPC_NOERROR
如果队列中满足条件的消息内容大于所请求的msgsz字节,则把该消息截断,截断部分将丢失。
msgrcv手册中详细给出了消息类型取不同值时(>0;
<0;
=0),调用将返回消息队列中的哪个消息。
msgrcv()解除阻塞的条件有三个:
1.消息队列中有了满足条件的消息;
2.
msqid代表的消息队列被删除;
3.调用msgrcv()的进程被信号中断;
调用返回:成功返回读出消息的实际字节数,否则返回-1。
3)int
msgsnd(int
msgqid,struct
msgbufmsgp,size_t
msgsz,int
msgflg)
向msgid代表的消息队列发送一个消息,即将发送的消息存储在msgp指向的msgbuf结构中,消息的大小由msgze指定。
对发送消息来说,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待。造成msgsnd()等待的条件有两种:
?当前消息的大小与当前消息队列中的字节数之和超过了消息队列的总容量;
?当前消息队列的消息数(单位“个“)不小于消息队列的总容量(单位“字节数“),此时,虽然消息队列中的消息数目很多,但基本上都只有一个字节。
调用返回:成功返回0,否则返回-1。
4)int
msgctl(int
msgqid,int
cmd,struct
msgqid_dsbuf)
该系统调用对由msqid标识的消息队列执行cmd操作,共有三种cmd操作:IPC_STAT、IPC_SET
、IPC_RMID。
1.
IPC_STAT:该命令用来获取消息队列信息,返回的信息存贮在buf指向的msqid结构中;
2.
IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf指向的msqid结构中;可设置属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。
3.
IPC_RMID:删除msqid标识的消息队列;
调用返回:成功返回0,否则返回-1。
四、消息队列应用实例
(1)题目:基于通信的字符串传递,实现在客户端输入一个字符串,服务器端进行倒序,再到客户端输出。
client.c
#include
#include
#include
#define
MSGKEY
75
struct
msgform
{
long
mtype;
char
sour[256];
char
dest[256];
int
sour_pid;
char
mtext[256];
};
int
length
=
sizeof(struct
msgform)-sizeof(long);
main()
{
struct
msgform
msg;
int
msgqid,pid;
msgqid
=
msgget(MSGKEY,0777);
printf(“msgqid=%d/n“,msgqid);
pid=getpid();
printf(“input
string
:“);
scanf(“%s“,msg.sour_pid
=
pid;
msg.mtype=1;
msgsnd(msgqid,msgrcv(msgqid,printf(“client:
msgqid
=
%d/n“,msgqid);
printf(“receive
from
pid
=
%d/n“,msg.sour_pid);
printf(“receive
string
is
%s/n“,msg.dest);
}
server.c
#include
#include
#include
#define
MSGKEY
75
struct
msgform
{
long
mtype;
char
sour[256];
char
dest[256];
int
sour_pid;
char
mtext[256];
}msg;
int
msgqid;
int
length
=
sizeof(struct
msgform)-sizeof(long);
main()
{
int
i,pid;
extern
cleanup();
for(i=0;i=0;i--)
msg.dest[j++]
=
msg.sour[i];
printf(“string
is
%s/n“,msg.dest);
msgsnd(msgqid,}
}
cleanup(){
msgctl(msgqid,IPC_RMID,0);
exit(0);
}
(2)两个进程利用通信进行协作,实现简单的四则运算。一个进程称为客户进程(Client),其任务是从键盘上接收3个参数:两个操作数和一个运算操作符,然后把这3个参数发送给另一个进程,即服务器进程(Server);服务器进程接收客户进程的请求,并根据提供的运算操作符,对两个操作数进行运算,服务器把运算的结果返回给客户。
client:
#include
#include
#include
#define
MSGKEY
75
struct
msgform
{
long
mtype;
float
a,b,result;
char
f[3];
int
sour_pid;
};
int
length
=
sizeof(struct
msgform)-sizeof(long);
main()
{
struct
msgform
msg;
int
msgqid,pid;
msgqid
=
msgget(MSGKEY,0777);
pid=getpid();
printf(“input
a
=
“);
scanf(“%f“,printf(“input
b
=
“);
scanf(“%f“,printf(“input
operator
=
“);
scanf(“%s“,if(msg.f[0]==
/
return
0;}
msg.sour_pid
=
pid;
msg.mtype=1;
msgsnd(msgqid,msgrcv(msgqid,printf(“result
=
%f/n“,msg.result);}
server:
#include
#include
#include
#define
MSGKEY
75
struct
msgform{
long
mtype;
float
a,b,result;
char
f[3];
int
sour_pid;};
int
msgqid;
int
length
=
sizeof(struct
msgform)-sizeof(long);
main()
{
struct
msgform
msg;
int
i,pid;
extern
cleanup();
for(i=0;i<20;i++)
signal(i,cleanup);
msgqid
=
msgget(MSGKEY,0777|IPC_CREAT);
printf(“server
is
waiting./n“);
for(;;)
{
msgrcv(msgqid,printf(“a
=
%f/n“,msg.a);
printf(“b
=
%f/n“,msg.b);
printf(“f
=
%s/n“,msg.f);
if(msg.f[0]==
+
)
msg.result
=msg.
a+msg.b;
else
if(msg.f[0]==
-
)
msg.result
=
msg.a-msg.b;
else
if(msg.f[0]==
)
msg.result
=
msg.a*msg.b;
else
if(msg.f[0]==
/
)
msg.result
=
msg.a/msg.b;
msg.mtype
=
msg.sour_pid;
msg.sour_pid
=
getpid();
printf(“%f
%s
%f
=
%f/n“,msg.a,msg.f,msg.b,msg.result);
msgsnd(msgqid,}}
cleanup(){
msgctl(msgqid,IPC_RMID,0);
exit(0);}
实验心得:每一次课程设计度让我学到了在平时课堂不可能学到的东西。所以我对每一次课程设计的机会都非常珍惜。不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。总结一下有以下体会。
1、同学间的讨论,这是很重要的。老师毕竟比较忙。对于课程设计最大的讨论伴侣应该是同学了。能和学长学姐讨论当然再好不过了,没有这个机会的话,和自己班上同学讨论也是能够受益匪浅的。大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。
2、敢于攻坚,越是难的问题,越是要有挑战的心理。这样就能够达到废寝忘食的境界。当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。
3、最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。比如当时我遇到我以前从未遇到的段错误的问题,让我都不知道从何下手。在经过大量的资料查阅之后,我对段错误有了一定的了解,并且能够用相应的办法来解决。
13