当前位置:范文大全 > 调查报告 > 操作系统实验报告bx|

操作系统实验报告bx|

发布时间: 2021-10-24 18:58:59

操作系统实验报告

目录

1 ?进程管理

2 ?线程的管理

113 ?利用信号量实现进程控制

11

4 ?基于消息队列和共享内存的进程间通信 13

5?一个进程启动另一个程序的执行

5?一个进程启动另一个程序的执行

17

196 ?个人总结

19

实验二进程管理

【实验目的】

加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行 的实质。

【实验内容】

进程创建

编写一段程序,是系统调用fork ()创建两个子进程。当此程序运行时,在 系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字 符:父进程显示a;子进程分别显示b和c。

进程控制

修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句 话,再观察程序执行时屏幕上出现的现象

进程的管道通信

编写程序实现进程的管道通信。使系统调用pipe ()建立一个管道,两个子 进程 P1 和 P2 分别向管道各写一句话:child 1 is sending a message! child 2 is sending a message!父进程从管道中读出两个来自子进程的信息并显示

【实验要求】

按照要求编写程序,放在相应的口录中,编译成功后执行,并按照要求分析 执行结果,并写出实验报告

【实验设计】

⑴进程创建

(J secondJL.c x

#include<stdio.h> int main()

{

int vail,val2;

while((vall=fork())==-l); if(vall==0)

{

printf (,,bH);

}

else

{

while((val2=fork())==-!); if(val2==0)

{

printf (,,cH);

}

else

p rintf( "a ");

}

return 0;

⑵进程控制

second2?c (~

File Edit View Search Tools Documents 旦 wlp

0

Q

1勺

1臨e

New

Ope n

Save

Print...

Undo

Redo

:opy F

[J second2.c x

#include<stdio ? h> int main()

int vail,vaL2;

while((vall=fork())==-l);

if(vall==0)

{

printf(B,rm childll;B,);

}

else

{

while* (val2=fork() )==-l);

if(val2==0>

{

printfCTm child2;T;

}

else

printf ("parent;M);

}

}

⑶进程的管道通信

second3.c - gedit

-DX

£ile Edit View Search loots

Qocuments help

甸 Hv ft ft I B ?

New Open Save Print

Paste Find Replace

0 second3 .c x

#include<stdio.h>

#include<unistd.h>

#include<string.h>

int main()

{

int

int file[2];

char buf[100];

pipe(file);

while((vall=fork()>==-1);

if(vall==0)

{

printf(*ch丄Id】 is in process I\n*);

close(file[OJ);

writ e( filejlL *Chil.dl is sending a message! \n*, st rlen( MChildl is sending a message!\nR));

}

else

{

sleep(2);

while((val2=fork())==-l);

if(val2==0)

{

p「intf("child2 is in process!\nr);

close(file[0]);

v/rite(fileil]j"Child2 is sending a message!\nB,st「len("Child2 is sending a message!\nu));

}

else

{

printf("parent is in process!\nH);

close(file[l]);

read(file[O],buf,sizeof(buf));

printf( %s\n?,buf);

v/ait();

read(Tile[0],buf,sizeof(buf));

pnntf (buf);

}

}

}

【实验测试结果及分析】

⑴进程创建

显示顺序为bee的原因:在创建两个子进程时分别在两个子进程

中写入了需要显示的字符,但因为创建的顺序有先后所以显示顺序是

be,父进程中的3是最后显示的。父进程在子进程开始前就会执行, 但是子进程中的代码先后性是随机的,不一定那一个先执行完,所以 在实验中通过ifelse的语句能分清两个子进程的先后顺序。

⑵进程控制

显示顺序与创建顺序有关。

⑶进程的管道通信

先创建了两个子进程和一个父进程,分别在屏幕上显示出进程的 创建状态,显示顺序由创建顺序而得,在创建两个子进程时也创建了 管道,分别在管道内写入了相应需要显示的字符串,在父进程中调用 了管道中的数据,所以会分别显示出来。通过管道pipe,进行数据输 入的时候,主要学会了如何和再合适的时间里封闭和打开p管道的出 入口,从而使得父子进程能够方便调用。

⑵进程控制[root@nodQGH gcc second2.c -o second2[root@node01 ~]# ./second2I"m childll;I"m child2;parent;[root@node01 -]#【运行结果】

⑵进程控制

[root@nodQGH gcc second2.c -o second2

[root@node01 ~]# ./second2

I"m childll;I"m child2;parent;[root@node01 -]#

root@node01:-

□ X

⑴进程创建

File Edit View Terminal labs 旦clp [rootQnodeOl gcc secondl.c ?o secondl

[root@node01 ./secondl

bca[ root(3node01 ~]#

⑶进程的管道通信File Edit view Terminal laps tieip [rootQnodeOl ~]# gcc second3?c ?o second3 [rootQnodeOl ~]# ./second3 childl is in process!

⑶进程的管道通信

child2 is in process! parent is in process!

Childl is sending a message!

Child2 is sending a message!

【参考资料】

实验指导书

实验三线程的管理

【实验目的】

编写Linux环境下的多线程程序,了解多线程的程序设计方法,掌握最常 用的三个函 pthread_create, pthreadJoin 和 pthread_exit 的用法

【实验内容】

1、 主程序创建两个线程myThreadl和myThread2,每个线程打印一句话。使用 pthread_create (&id, NULL, (void *) thread, NULL)完成。

提示:

定义每个线程的执行体,然后在main中()创建儿个线程,最后主线程等待 子线程结束后再退出。

2、 创建两个线程,分别向线程传递如下两种类型的参数

传递整型值

传递字符

【实验要求】

按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要

求分析执行结果,并写出实验报告

【实验设计】

(1)线程的创建

0 31.C X

ncludevstdio.h> #include<pthread.h> void thread!void) {

int i;

for(i=|0;i<3;i++)

printf (Hthis is a pthread. \rT);

}

int main(void)

{

pthread t id;

int i,ret;

ret=pthread_create(&id/NULL/(void*)thread #NULL); if(ret!=0){_

printf(Mcreate pthread erroriXn1); exit(1);

}

for(i=0;i<3;i++)

printf("this is the main process An"); pthread_join(id 丿 NULL);

return(G);

(2)利用线程传递参数

pthread_t id;

int i;

int testl=9;

char test2=*J';

int *attrl=&testl;

char *attr2=&test2;

int retl,ret2;

retl=pthreadmereate(&id,NULL,myth readlr(void*)attrl);

if(retl!=0){"

printf("create pthread error!\nw); exit(1);

}

pthread_t tidp;

ret2=pthread_create(&tidp,NULL,mythread2,(void*)attr2); if(ret2!=0){"

printf("create another pthread error!\nM); exit(l);

}

pnis the main process ?\n11); pthreadJoindd^ULL);

pthread_join(tidp,NULL);

}

【实验测试结果及分析】

通过木次实验我知道了如何建立一个线程,并通过对

pthread_create ()函数的学习,知道如何利用指针进行参数的传递 和利用。

【运行结果】

(1)线程的创建

Eile Edit View ]erminal Ta^s Help [root@nodeDl ~]老?/31

this is the nain process ? this is the naln process. this is the main process? this is a pinread? this is a pthread ? this is a ptbread?

[root@nodeBl -]#

(2)利用线程传递不同类型参数

File Edit View Terminal Tabs 旦alp

[root@node01 -]# this is the main create parameter

./32 process ? is 9

create another parameter is J [root@node01 -]#

【参考资料】

实验指导书

实验四利用信号量实现进程控制

【实验目的】

学习使用UNIX类操作系统信号量机制,编写Linux环境下利用信号量实现 进程控制的方法,掌握相关系统调用的使用方法。

【实验内容】

创建4个线程,其中两个线程负责从文件读取数据到公共的缓冲区,另两个 线程从缓冲区读取数据作不同的处理,使用信号量控制这些现成的执行。

【实验要求】

按照要求编写程序,放在相应的目录中,编译成功后执行,并按

照要求分析执行结果,并写出实验报告。

【实验设计】

41.c (~)? gedlt

41.c (~)? gedlt

Ale Edit yiew Search Jbols Qocuments Help

New Open Save Print...n fc S ?

New Open Save Print...

n fc S ?

Paste Rnd Replace

O41.c x

#includ?vstdio? h>

#mclude<pthread ? h>

#include<semaphore.h>

int 5tack[2];

sem_t single_operation;

sem_t empty;

sem_t fulll;

sem^t Tull2;

voi|d ReadDatal(void}{

FILE *fp=fopen(Ml.txt\l,ru);

while(!feof(fp))

{

sem_wait(&single_operation); sem_wait(&ompty);

fscant(tpf^SstacklO],&stack[l]); printf(rgct datal %d %d \n",stack(0],stack[1]); sem j)ost(&fulll};

sem_post(&single_ope「ation);

fclose(fp);

pthread_exit(NULL);

} _

void Plus(void){

while(l}{

sem_wait(&fulll);

printf("plus result:%d+%d=%d\nH f stack[0]r stack[l]f stack[0]+5tack[l]); sem_post(&empty);

}

}

void Multiply(void){

while(l){

sem_wait(&fu!12);

printf("multiply resultstack[0]?stack[1 ],stack[()]*stack[l]);

sem_post(&ompty);

}

}

int main(void){

sem_i nit(fiempty r 0 r Q);

sem imt(&fulllr0r0):

sem init (&full2 r0; 0) ;|

sem_init(&single_oper8tionO 0); pthread__t tl,t2,t3,t4;

sem_post(&singl€_ope「ation);

sem_post(&wmpty);

pthread^createC&tlJIULL, (void*)Plus,NULL); pthread2create(&t2/NULL/(void*)Multiply ? NULL); pthread_create(&t3』ULL, (void*)ReadDataiNULL); pthread_create(&t4,NULL,(void*)ReadData2fNULL); pthreadjoin( t3 rNULL);

pthread_join(t4,NULL);

}

【实验测试结果及分析】

此程序主要通过建立(void*)ReadDatal. (void*)ReadData2T (void*)Multiply, (void*)Plus四个函数进行操作。并且通过信号量的使用,实现对四个函数先后执 彳亍的区分。其中,信号量empty判断缓冲区是否为空,operation_signal判断当 前缓冲区是否只有一个生产者在操作(避免数据覆盖)。通过信号量的控制以保 证子线程的先后顺序。

【运行结果】

0le Edit View Jerminai Tabs Help

[root@node01 -/41

get datal 1 42 plus result:1+42=43 get datal 43 45 plus result:43+45=88 get datal 39 5 plus resutt:39+5=44 get datal 28 9 plus resutt:20+9=29 get datal 20 9 plus resutt:20+9=29 get data2 29 3135

multiplyresult:29*3135=90915get data2 21 344

multiply

result:29*3135=90915

get data2 21 344

21*344=722461*19=1159

21*344=7224

61*19=1159

81-29=2349

81*29=2349

[root@node91 -]#

multiply result get data2 61 19 multiply result get data2 81 29 multiply result get data2 81 29 multiply result

【参考资料】

实验指导书,百度知道

实验五基于消息队列和共享内存的进程间通信

【实验目的】

Linux系统的进程通信机构允许在任意进程间大批量地交换数 据。木实验要求了解熟悉Linux支持的消息通信机制机器使用方法和 Linux系统的共享存储区的原理和使用方法。

【实验内容】

消息的创建,发送和接收

使用msgget(), msgsnd(), msggrev(), msgctrl()编制长度为1K的消息的发送 和接收程序。

共享存储区的创建,附接和断接

使用shmgetf), shmat(), shmctIO, shmctl(),编制一个与上述功能相同的程 序。

【实验要求】

按照要求编写程序,放在相应的目录中,编译成功后执行,并按 照要求分析执行结果。

【实验设计】

消息的创建,发送和接收

51.C (H

-gcdlt

-a X

File Edit yiew

Search

Dois

documents Help

B 口 ■

口 1

a

|令勺|野

9

New Open

Save

Pnnt...

1 Unde Redo 1 Cut C

Paste

Find

Replace

O51.C x]

#includevsys/msg ?h> #include<sys/ipc? h> #include<sys/types ? h> #include<stdio.h>

#defme MSGKEY 75

struct msgbuf{

long mtype; char mtext[1024];

|}msg;

int msgid;

int i;

void client(){ int i;

msgid=msgget(MSGKEY,G777); for(i=10;i>=l;i--){ msg ?mtype=i;

51.c (~)? gedlt

File Edit View Search Tools Documents Help

弓口 ▼口 (2> ◎ S 囱

New Open Save Print... Riste Rnd Replace

printf('client sent\n");

msgsnd(msgid,&msg,1024.0);

}

exit(0);

}

void server(){

msgid=msgget(hfSGKEYf0777|IPC CREAT);

do{

msgrcv(msgid;&msg f 1024r 0r 0);

p nnt f ( wsever received\n*');

}while(msg ?mtype! = 】);

msgctl(msgid;IPC_RMIDrO);

exit(O);

}

int main(){

while((i=fork(})==-l);

if(!i)

{ serverO;}

while((i=fork(})==-!);

{ clientO;} wait(0); wait(0);

52.c (-) - gedit0ieEdit ViewSearch

52.c (-) - gedit

0ie

Edit View

Search

Ibols

Documents

Help

B

□ 1

3

1和

刃ft

a

New

Ope n

Save

Print...

Undo Red

3 | Cut

Paste

Find

Replace

g

c X

#include<sys/msg ? h> #include<sys/ipc.h> #include<sys/types.h> #include<stdio.h>

^define MSGKEY 75

int shmid.i; int *add r;

void client(){ int i;

shmid=shmget(MSGKEY,1024r 0777); addr=shmat(shmidr0f0); for(i=9;i>=0;i--){ while(*addr!=-l);

printf("client sent\n-); *addr=i;

}

exit(0);

}

52.c -

52.c - gedft

【实验测试结果及分析】

第一个实验主要利用msgget();创建一个队歹lj,并利用msgsnd();和 msgrcv() 把msg结构体和队列之间进行传入和传出操作,并进行输出。

第二个实验利用shmget()创建出一块共享内存,通过指针eddr的附接,进 行对内存中数据的写入和输岀。

【运行结果】

1.消息的创建,发送和接收

root@nodc01;-

root@nodc01;-

File Edit View Terminal Tabs Help mis is a pthread.

this is a pthread. this is a pthread.

[root@node01 -]# clear [rootgnodeOL -Jtf ./51 client sent client sent client sent client sent client sent client sent client sent client sent client sent client sent sever received sever received sever received sever received sever received sever received sever received sever received sever received sever received

[root@node01 *1# |

2.共享存储区的创建,附接和断接

root^nodcOl:* -

n

X

Elie Edit iflew Ifermlnal "Os Help

[rooT^nodeGL ./52 上

die nt sen t

sever received

client sent

sever received

client sent

sever received

client sent

sever received

client sent

sever received

client sent

sever received

cllcnT sent

sever received

die nt sent

sever received

client sent

sever received

die nt sen t

sever received

[roorgnodeOl -]# ■

【参考资料】

实验指导书,百度百科

实验六一个进程启动另一个程序的执行

【实验目的】

在Linux环境下,fork ()与exec ()的结合使用实现一个进程启动另一个 程序的知性的基本方法。

【实验内容】

父进程从终端读取要执行的命令,并交给子进程执行。父进程等待子进程结 束,并打印子进程的返回值。

【实验要求】

按照要求编写程序,放在相应的目录中,编译成功后执行,并按

照要求分析执行结果,并写出实验报告。

【实验设计】

w

61.C (-:

1 - gedlt

■ a

File

Edit View

Search

Tbols Documents

Help

s

D ▼

凸 £ 勺

1 *

E ?

New

Open

Save

Print...

} 1 Cut

Paste

Find

Replace

0 61 cx|

elude <stdio.h>

#include <string ?h>

char command[256];

int main()

{

int rtn;

int errorno;

whiled) {

printfC>B);

fgets(command,256,stdin);

command[strlen(command)-L]=0;

char *subcomand[2];

subcoma nd [0] = st rtok( command, *'"); subcomand[1] = strtok(NULLj - ■);

if(fork()==0){

errorno=execlp(subcomand[0] ,subcomand[0] ,subcomand[1]r(char)t); perror( command);

exit(errorno);

}|

else{

wait(&rtn);

printf("chi Id process return %d\n* # rtn);

}

subcomand[0] = NULL;

subcomand[1] = NULL;

}

return 0;

【实验测试结果及分析】

此程序通过对execlp()函数的调用,使得通过输入命令被执行。

输入的命令用馆ets()存入command字符串中,然后用execlp()函数执行 command的内容,如果不正确返回值给errorno,否则执行此命令。

通过我们之前做的儿个实验的实验结果来验证这个实验是否能够正确的运 行。

【运行结果】

【参考资料】

实验指导书

个人总结

通过此次Linux实验,我对操作系统的相关知识有了更加深入的 了解和体会。

首先我对如何建立进程,以及对进程的调用有着一定的理解,一 开始做实验,我遇到了种种困难,可以说进行的不是很顺利,但当我 理解了编程思想以及方法的时候,问题都一一解决了,所以在当我做 到线程实验的时候也就更加的顺利,对通过线程的调用来实现相关的 运算有了更深刻的理解并且进行了实际的操作。在编写信息量相关程 序的代码的过程中,我知道了怎么样利用信号量来控制线程的发生, 不只是把sem_wait(闲sem_post()放到函数前后就可以,而是要根据 特定的情况通过对变量的初始化,采用不同的放置,才能使函数能够 按照自己的意愿进行。在编写基于消息队列和共享内存的进程间通信 的实验时,里面各类函数的功能和应用我研究的时间比较长,这让我 对编程有了更为深刻的理解。

除了对代码的熟悉之外,更多的是对linux操作系统有了 了解, 我认识并且熟悉了这种用代码操作的平台,不仅仅限于听说。与此同 时也接触了虚拟机等相关的知识,让自己以此为机会查资料学习,并 最终完成实验,实验虽然不难,但是开始的熟悉还是需要一段过程, 熟悉之后让我对以后对相关知识的学习也有了更多的信心,希望能越 做越好。

相关热词搜索: 实验报告 操作系统 实验 报告 操作系统实验报告bx

版权所有:杨帆范文网 2010-2024 未经授权禁止复制或建立镜像[杨帆范文网]所有资源完全免费共享

Powered by 杨帆范文网 © All Rights Reserved.。鲁ICP备16030136号