北京工业大学 操作系统 实验报告

上传人:z**** 文档编号:114739471 上传时间:2022-06-29 格式:DOC 页数:25 大小:771KB
收藏 版权申诉 举报 下载
北京工业大学 操作系统 实验报告_第1页
第1页 / 共25页
北京工业大学 操作系统 实验报告_第2页
第2页 / 共25页
北京工业大学 操作系统 实验报告_第3页
第3页 / 共25页
资源描述:

《北京工业大学 操作系统 实验报告》由会员分享,可在线阅读,更多相关《北京工业大学 操作系统 实验报告(25页珍藏版)》请在装配图网上搜索。

1、操作系统实验报告姓名: xxx学号: xx完成时间:2013年11月21日目录:实验一:UNIX/LINUIX 入门3实验二:进程管理5实验三:线程的管理11实验四:利用信号量实现进程间通信15实验五:基于消息队列和共享内存的进程间通信20实验六:一个进程启动另一个程序的执行25实验一 UNIX/LINUIX 入门一、实验目的了解UNIX/LINUX运行环境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX 下 c 语言程序的编写、编译、调试和运行方法。二、实验内容1、熟悉UNIX/LINUX的常用基本命令如Is、who、pwd、ps等。2、练习UNIX/LINUX的文本

2、行编辑器vi的使用方法3、熟悉 UNIX/LINUX 下 c 语言编译器 cc/gcc 的使用方法。用 vi 编写一个简单的显示 “HeIIo,WorId” c语言程序,用gcc编译并观察编译后的结果,然后运行它。三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果 并写出实验报告。四、实验设计代码如下:#incIudeint main() printf(HeIIo, worId);return 0;五、运行结果六、收获及机会此次实验让我熟悉了 c语言编译器cc/gcc的使用方法。七、参考资料实验指导书实验二 进程管理一、实验目的加深对进程概念的理解,明确进

3、程与程序的区别;进一步认识并发执行的实质二、实验内容(1) 进程创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一 个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示a“;子进 程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。(2) 进程控制修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程 序执行时屏幕上出现的现象,并分析原因。(3) 进程的管道通信编写程序实现进程的管道通信。使用系统调用pipe()建立一个管道,二个子进程P1和P2 分别向管道各写一句话:Child 1 is sen

4、ding a message!Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果 并写出实验报告。四、实验设计( 1)进程创建使用fork ()创建两个子进程,父进程等待两个子进程执行完在运行。( 2)进程控制使用fork ()创建两个子进程,父进程等待两个子进程分别输出一句话在运行。(3)进程的管道通信 建立一个管道。在程序中先建立一个子进程,然后向管道中输入数据,然后从子进程中 退出到父进程,读出管道数据,然后再建立一个子

5、进程,写入数据,再读出,即可。代码如下:( 1)进程创建:#include#includevoid main() int pid1, pid2;pid1 = fork();if (pid1 0) wait(NULL); pid2 = fork();if (pid2 0) wait(NULL); printf(a); exit(0);(2) 进程控制:#include #include void main() int pid1, pid2;pid1 = fork();if (pid1 0) wait(NULL); pid2 = fork();if (pid2 0) wait(NULL); pri

6、ntf(father an); exit(0);(3) 进程的管道通信#include#include#include#include void main() int pid1, pid2;int pfd2;char *msg1=Child 1 is sending a message!; char *msg2=Child 2 is sending a message!; char buf256;int r,w;if(pipe(pfd)0)printf(pipe create error!n); exit(1);pid1 = fork();if (pid1 0) printf(Fork 1 f

7、ailed!);if (0 = pid1) close(pfd0); /write sleep(3);if(w=write(pfd1,msg1,strlen(msg1)0) wait(NULL); pid2 = fork();if (pid2 0) close(pfd1); /read sleep(3);if(r=read(pfd0,buf,256)0) printf(read error!n); exit(1); else printf(parent read from pipe: %sn,buf); wait(NULL);close(pfd1); /read sleep(3);if(r=r

8、ead(pfd0,buf,256)0) printf(read error!n);exit(1); else printf(parent read from pipe: %sn,buf);if (0 = pid2) close(pfd0); /write sleep(6);if(w=write(pfd1,msg2,strlen(msg2)0) printf(write error!n);exit(1); else printf(child 2 send msg to pipe!n); exit(0);五、运行结果(1)进程创建2)进程控制3)进程的管道通信六、收获及机会 此次实验让我对进程和管

9、道有了进一步的理解,当需要创建两个子进程的时候,不能直 接在第一个子进程中直接fork(),要保证在在父进程用fork()再次创建子进程,否则创建的不 是两个子进程而会是3 个,关于父子进程的执行顺序,是无法预知的,如果想要先让子进程 运行,那么父进程一定要用wait(NULL)语句进行等待;关于管道,只用一个即可,但必 须在第一个fork()之前创建,否则父子进程不会共享。在向管道中写入数据和从管道中读出 数据的时候,要控制好管道的读写控制,例如读的时候必先关写,但是又不能关闭读(写) 端过多,要确保读(写)的时候总是有端口可读(写),否则的话会造成读(写)失败。这 些是我此次实验最大的收获

10、,还需要在今后的时候发现更多的问题,有更深的理解。七、参考资料实验指导书实验三线程的管理一、实验目的编写 Linux 环境下的多线程程序,了解多线程的程序设计方法,掌握最常用的三个函 数 pthread_create,pthread_join 和 pthread_exit 的用法二、实验内容1、主程序 创建两 个线程myThreadl和myThread2 ,每个线程打印一句话。使 用 pthread_create (&id,NULL,(void *) thread,NULL)完成。提示:先定义每个线程的执行体,然后在 main 中()创建几个线程,最后主线程等待子线程结 束后再退出。2、创建两

11、个线程,分别向线程传递如下两种类型的参数口传递整型值口传递字符三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果, 并写出实验报告。四、实验设计先定义2个线程的带有参数的函数,参数分别为整型(int)和字符型(char),每个函 数中打印出相对应线程的话。在main函数中,利用pthread_create函数创建该两个线 程,在函数参数中的第四位,写入想要传进各进程的参数。然后利用pthread_join等待 第二个结束后退出。代码如下:1、主程序创建两个线程myThreadl和myThread2,每个线程打印一句话。#include#include #i

12、nclude void myThread1(void) printf(This is pthread 1.n);void myThread2(void) printf(This is pthread 2.n);int main(void) pthread_t id1, id2;int ret1, ret2;ret1 = pthread_create(&id1, NULL, (void*)myThread1, NULL);if (0 != ret1) printf(Create pthread 1 error!n);exit(1);ret2 = pthread_create(&id2, NULL

13、, (void*)myThread2, NULL); if (0 != ret2) printf(Create pthread 2 error!n); exit(2); pthread_join(id1, NULL); pthread_join(id2, NULL);return(0);2、创建两个线程,分别向线程传递如下两种类型的参数 #include#include #include void *myThread1(void* arg) int* num;num = (int*)arg;printf(create parameter is %d.n, *num); return (void

14、*)0;void *myThread2(void* arg) char* ch;ch = (char*)arg;printf(create parameter is %c.n, *ch); return (void*)0;int main(void) pthread_t id1, id2;int ret1, ret2;int num = 1;char ch = a;int* p_num = # char* p_ch = &ch;ret1 = pthread_create(&id1, NULL, myThread1, (void*)p_num); if (0 != ret1) print

15、f(Create pthread 1 error!n); exit(1);ret2 = pthread_create(&id2, NULL, myThread2, (void*)p_ch); if (0 != ret2) printf(Create pthread 2 error!n); exit(2); pthread_join(id1, NULL);pthread_join(id2, NULL);return(0);五、运行结果1、主程序创建两个线程 myThread1 和 myThread2, 每个线程打印一句话。2、创建两个线程,分别向线程传递如下两种类型的参数六、收获及体会此次实验让

16、我对线程的创建有了初步的理解,在熟练掌握pthread_create和pthread_join 两个函数的应用上,学会了如何向线程中传入参数。七、参考资料实验指导书实验四 利用信号实现进程间通信一、实验目的学习UNIX类(SystemV)操作系统信号机制,编写Linux环境下利用信号实现进程 间通信的方法,掌握相关系统调用的使用方法。二、实验内容 创建4个线程,其中两个线程负责从文件读取数据到公共的缓冲区,另两个线程从缓冲区读取数据作不同的处理(加和乘运算)。使用信号量控制这些线程的执行。三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果 并写出实验报告。

17、四、实验设计4个线程,两个生产者两个消费者;3个信号量:信号量n确保消费者不会从空的缓冲 区取数;信号量 S 确保所有参与者之间互斥对缓冲区操作(防止出现两个生产者同时向一个 缓冲区部分写,或写的同时有消费者来读的情况);信号量e确保缓冲区满后不会再向其中 写。两个生产者分别从两个文件中读取数据写到缓冲区,两个消费者分别做“+”和“*”操 作代码如下:#include#include#include #include#define DATA1 data1.txt#define DATA2 data2.txt#define MAX_BUFFER 5int in = 0;int out = 0;i

18、nt count1 = 0;int count2 = 0;int num_bufferMAX_BUFFER;sem_t n;sem_t s;sem_t e;void* produceThread1(FILE* fp1) int num;while (fscanf(fp1, %d, &num) != EOF) sem_wait(&e); sem_wait(&s);printf(produceThread 1 put %d in buffer%d.n, num, in); num_bufferin = num;in+;in = in % MAX_BUFFER;sem_post(&s); sem_p

19、ost(&n);void* produceThread2(FILE* fp2) int num;while (fscanf(fp2, %d, &num) != EOF) sem_wait(&e);sem_wait(&s); printf(produceThread 2 put %d in buffer%d.n, num, in); num_bufferin = num;in+;in = in % MAX_BUFFER; sem_post(&s);sem_post(&n);void* consumeThread3() int nums2;int result;while (1) sem_wait

20、(&n); sem_wait(&s);numscount1 = num_bufferout;printf(consumeThread3 Get %d from buffer%d.n, numscount1, out); out+;out = out % MAX_BUFFER;count1+;if (2 = count1) result = nums0 + nums1;printf(%d + %d = %d.n, nums0, nums1, result); count1 = 0;sem_post(&s); sem_post(&e);void* consumeThread4() int nums

21、2;int result;while (1) sem_wait(&n); sem_wait(&s);numscount2 = num_bufferout;printf(consumeThread4 Get %d from buffer%d.n, numscount2, out); out+;out = out % MAX_BUFFER;count2+;if (2 = count2) result = nums0 * nums1;printf(%d * %d = %d.n, nums0, nums1, result);count2 = 0;sem_post(&s); sem_post(&e);v

22、oid main() int ret1, ret2, ret3, ret4;pthread_t id1, id2, id3, id4;sem_init(&n, 0, 0);sem_init(&s, 0, 1);sem_init(&e, 0, MAX_BUFFER);FILE* fp1 = NULL;FILE* fp2 = NULL;fp1 = fopen(DATA1, r);fp2 = fopen(DATA2, r);if (NULL = fp1) exit(1);if (NULL = fp2) exit(2);ret1 = pthread_create(&id1, NULL, produce

23、Thread1, fp1);if (0 != ret1) printf(Create pthread 1 error!n);exit(1);ret2 = pthread_create(&id2, NULL, produceThread2, fp2);if (0 != ret2) printf(Create pthread 2 error!n);exit(2);ret3 = pthread_create(&id3, NULL, consumeThread3, NULL);if (0 != ret3) printf(Create pthread 3 error!n);exit(3);ret4 =

24、pthread_create(&id4, NULL, consumeThread4, NULL); if (0 != ret4) printf(Create pthread 4 error!n); exit(4);pthread_join(id1, NULL);pthread_join(id2, NULL);pthread_join(id3, NULL);pthread_join(id4, NULL);fclose(fp1);fclose(fp2);五、运行结果六、收获及体会 此次实验让我实践了在 Linux 环境下利用信号量实现生产者消费者问题的解决,掌握 了信号量相关函数的使用方法。七、参

25、考资料实验指导书实验五基于消息队列和共享内存的进程间通信一、实验目的Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目 的是了解和熟悉:1. Linux支持的消息通信机制及其使用方法2. Linux系统的共享存储区的原理及使用方法。二、实验内容1. 消息的创建、发送和接收使用消息调用msgget()、msgsnd()、msggrev()、msgctrl()编制长度为IK的消息 的发送和接收程序。2. 共享存储区的创建、附接和断接使用系统调用shmget()、shmat()、shmctl(),编制一个与上述功能相同的程序。三、实验要求 按照要求编写程序,放在相应的

26、目录中,编译成功后执行,并按照要求分析执行结果并写出实验报告。四、实验设计1.消息队列:先定义一个消息结构,包含消息类型和文本长度(1024)。在主函数中,首先 获得一个KEY为75的消息的描述符,然后在client子进程中连续发消息类型为101的 十条消息。然后在server子进数中,用while(i!=1)循环接受消息,以i=msg.mymsgtype=1 作为结束条件。接受完后撤销消息队列。#include #include #include #include #include #include #include #define MAX 1024struct mymsglong int

27、mymsgtype;char textMAX;msg;int msgid;int i=1;void main() pid_t pid_client;pid_t pid_server;msgid=msgget(75,0777|IPC_CREAT);/huode xiaoxi duilie miaoshufuif(pid_client=fork()=0) while(i11) msg.mymsgtype=11-i;printf(Client sent (No.%d)(type:%d)n,i,msg.mymsgtype);i+;msgsnd(msgid,&msg,MAX,0);exit(0); el

28、se /sleep(1);if(pid_server=fork()=0) i=10;while(i!=1) msgrcv(msgid,&msg,MAX,0,0);i=msg.mymsgtype;printf(Server received(No.%d)(type:%d)n,11-i,i);msgctl(msgid, IPC_RMID,0);exit(0); else wait(0);wait(0);exit(0);/return 0;2共享存储区:在主进程中先建立共享存储区,KEY为75,并获得描述符,然后将该共享 存储区附接到 virtual_address 这个虚拟地址上,在 client

29、 子进程中利用 while 循环从 10 到 1 打印输出,并将i值赋给virtual_addressi。在server子进程中,循环取出virtual_addressi 中的内容并打印输出。最后在主程序中断开附接,并撤销共享存储区。代码如下:#include #include #include #include #include #include #include #define MAX 1024#define KEY 75int main() int id,i,pid_server,pid_client;char *virtual_address;id=shmget(KEY,sizeof(

30、char)*MAX,IPC_CREAT|0777);/create a shm virtual_address=shmat(id,0,0);/return to address of the shm(fujie) if(pid_server=fork()=-1) printf(Fork server failed!n);exit(1);if(pid_server=0) sleep(1);for(i=0;i=10;i+)printf(Server received %dn,virtual_addressi);exit(0); else if(pid_client=fork()=-1) print

31、f(error in fork an);exit(1);if(pid_client=0) i=0;while(1) virtual_addressi=i;printf(Client sent %dn,virtual_addressi); if(virtual_addressi=10)break;i+;exit(0); else wait(0);wait(0);shmdt(virtual_address);/duankai lianjieshmctl(id, IPC_RMID, 0);exit(0);return 0;五、运行结果1 消息队列:L-fltorLgyihao(S)Jotalhot:

32、_ XFile Edit view searchIfenninal 旦已Ip*congyihaolocalhost $ ./54 Client sent (No.1)ttype:10)Server receivedNo.1type: IS) client sent (No.2)(type:9) server receivedCNo.2)(type:9) Client sent (No.3)(type;8) Server receivedtNo.3)(type:B) Client sent (No.4)(type;7) Server receivea(No.4)(type:71 Client s

33、ent (No.5)(type:6J Server receivedCNo.5)(type:6) Client sent (No.6)(type:5) Server receivedCNo.6)(type:5) Client sent (No.7)(type:4) Server receivedNo.7(type:4 Client sent fNo.8)ftype:3) Server receivedfNo.B(type:3) Client sent (No.9)(type:2) Server receivedNo.9(type:2 Client sent (No.10)(type:1) Se

34、rver receivedCNo.10)(type:l) Lcongyihaolocalhost -s 2、共享存储区:EcongyitiaoJocalhost:-_ XFile Edit Viewsearchwrmlnal Helpcorgyihaolocalhost -s 751Clientsent 0Clientsent 1clientsent 2clientsent 3ClientsenL 4ClientsenL 5Clientsent 6Clientsent 7Clientsent 8Clientsent 9Clientsent IQServerreceivedaServerrece

35、ivedIkServerreceived尹Severreceived3Serverreceived4Serverreceived5Severreceived6Serverreceived7ServerreceivedSSeverreceivedgServer已 ceived10(rgyihaolocairiost -5六、收获及体会此次实验让我对消息队列的获取、消息的传送和共享存储区有了初步的了解七、参考资料实验指导书实验六 一个进程启动另一个程序的执行一、实验目的编写Linux环境下,fork()与exec()的结合使用实现一个进程启动另一个程序的执行的基 本方法,掌握exec()的集中调用

36、方法。二、实验内容 父进程从终端读取要执行的命令,并交给子进程执行。父进程等待子进程结束,并打印子进程的返回值。提示:从终端读取要执行的命令可用fge ts()实现。三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计在主进程中定义一个字符数组来放置命令字符,并用馆ets()来实现从键盘终端读取用户 输入的命令字符并存入字符数组。子程序中调用execlp()执行此指令,在父进程中wait 等到子进程执行完,然后打印出子进程的返回值。代码如下:#include char command256;int main() int rtn;

37、int errorno;while(1) printf( );fgets( command, 256, stdin ); commandstrlen(command)-1 = 0;if ( fork() = 0 ) errorno=execlp(command, command, NULL, NULL);perror( command );exit(errorno); else wait ( &rtn );printf( child process return %dn, rtn );return 0;五、运行结果r =0fom=yikiaolcHalhost:_ n xX-一File Edi

38、t View search TbnninaiHelpcorigyihaolocalhost -$ ./61ls2BB.C-27.c41.c55. cdatai.txt-0S3.pdf21.027.C-50. C55test.cdataz.txtos-lab-instructions-2012-09.pdf222.C-3136data2.txt-Pictures22. c3031.c56. cDeakt叩processmanage.c22. c-30. c51.c环.cDacumentaPublic2330. s52. c-60DownloadsTemplates23. c3153. c-60.

39、 chellotest21.c-23. C31.c5469. c-”hello.ctash codeM.S31. c54.c6Lhello .c-Videos25t.c40. o54.0GL.cliniixqq .deb宜验指导书.pdf26 . c415561. cMusic2741,C55. Cdatal.txt052. pdfchildprocessreturn0六、收获及体会此次实验让我对exec类的函数有了一个初步的理解,我知道一个进程一旦调用exec类 函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈 段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而 言,还是同一个进程,不过已经是另一个程序了。同时也学会了 fge ts()的用法。在本段程序中,每当子进程调用了 execlp ()函数,无论是否成功执行指令,子进程的代 码都已被替换成了从终端输入的指令,所以子进程相当于死亡了,只留下了进程号。而父进 程并没有死亡,所以while(1)循环还会继续从终端读取指令。七、参考资料实验指导书

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!