ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:353.59KB ,
资源ID:3610895      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3610895.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(北京工业大学操作系统实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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

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

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

4、ild 1 is sending 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#includevoid main() int pid1, pid2; pid1 = fork(); if (pid1 0) wait(NULL); pid2 = fork(); if (pid2 0) wait

6、(NULL); printf(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 (pi

7、d1 0) printf(Fork 1 failed!); 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(pf

8、d1); /read sleep(3); if(r=read(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)进程创建

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

10、否则的话会造成读(写)失败。这些是我此次实验最大的收获,还需要在今后的时候发现更多的问题,有更深的理解。七、参考资料实验指导书实验三 线程的管理一、实验目的 编写 Linux 环境下的多线程程序,了解多线程的程序设计方法,掌握最常用的三个函数pthread_create,pthread_join 和pthread_exit 的用法二、实验内容 1、主 程 序 创 建 两 个 线 程 myThread1 和myThread2 , 每个线程打印一句话。使用pthread_create(&id,NULL,(void *) thread,NULL)完成。提示:先定义每个线程的执行体,然后在 main

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

12、 myThread1 和myThread2, 每个线程打印一句话。#include#include#includevoid 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 pthrea

13、d 1 error!n); exit(1); ret2 = pthread_create(&id2, NULL, (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#includevoid *myThread1(void* arg) int* num; num = (int*)ar

14、g; printf(create parameter is %d.n, *num); return (void*)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_cre

15、ate(&id1, NULL, myThread1, (void*)p_num); if (0 != ret1) printf(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、主程序创建两个线程 myThr

16、ead1 和myThread2, 每个线程打印一句话。2、创建两个线程,分别向线程传递如下两种类型的参数六、收获及体会此次实验让我对线程的创建有了初步的理解,在熟练掌握pthread_create和pthread_join两个函数的应用上,学会了如何向线程中传入参数。七、参考资料实验指导书实验四 利用信号实现进程间通信一、实验目的 学习 UNIX 类(System V)操作系统信号机制,编写Linux 环境下利用信号实现进程间通信的方法,掌握相关系统调用的使用方法。二、实验内容 创建4个线程,其中两个线程负责从文件读取数据到公共的缓冲区,另两个线程从缓冲区读取数据作不同的处理(加和乘运算)。使

17、用信号量控制这些线程的执行。三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计4个线程,两个生产者两个消费者;3个信号量:信号量n确保消费者不会从空的缓冲区取数;信号量S确保所有参与者之间互斥对缓冲区操作(防止出现两个生产者同时向一个缓冲区部分写,或写的同时有消费者来读的情况);信号量e确保缓冲区满后不会再向其中写。两个生产者分别从两个文件中读取数据写到缓冲区,两个消费者分别做“+”和“*”操作代码如下:#include#include#include#include#define DATA1 data1.txt#define

18、 DATA2 data2.txt#define MAX_BUFFER 5int in = 0;int out = 0;int 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); n

19、um_bufferin = num; in+; in = in % MAX_BUFFER; sem_post(&s); sem_post(&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_

20、post(&n); void* consumeThread3() int nums2; int result; while (1) sem_wait(&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

21、, result); count1 = 0; sem_post(&s); sem_post(&e); void* consumeThread4() int nums2; 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 * n

22、ums1; printf(%d * %d = %d.n, nums0, nums1, result); count2 = 0; sem_post(&s); sem_post(&e); void 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 = fope

23、n(DATA2, r); if (NULL = fp1) exit(1); if (NULL = fp2) exit(2); ret1 = pthread_create(&id1, NULL, produceThread1, 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 = pt

24、hread_create(&id3, NULL, consumeThread3, NULL); if (0 != ret3) printf(Create pthread 3 error!n); exit(3); ret4 = 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); pthr

25、ead_join(id4, NULL); fclose(fp1); fclose(fp2);五、运行结果六、收获及体会此次实验让我实践了在Linux 环境下利用信号量实现生产者消费者问题的解决,掌握了信号量相关函数的使用方法。七、参考资料实验指导书实验五 基于消息队列和共享内存 的进程间通信一、实验目的 Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉:1.Linux支持的消息通信机制及其使用方法2.Linux系统的共享存储区的原理及使用方法。二、实验内容 1.消息的创建、发送和接收 使用消息调用msgget()、msgsnd()、msggrev()、msgctrl()编制长度为1K的消息的发送和接收程序。2.共享存储区的创建、附接和断接使用系统调用shmget()、shmat()、shmctl(),编制一个与上述功能相同的程序。三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计1.消息队列:先定义一个消息结构,包含消息类型和文本长度(1024)。在主函数中,首先获得一个KEY为75的消息的描述符,然后在client子进程中连续发消息类型为101的十条消息。然后在server

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1