操作系统实习报告全_第1页
操作系统实习报告全_第2页
操作系统实习报告全_第3页
操作系统实习报告全_第4页
操作系统实习报告全_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

进程与线程—Linux进程与线程通讯设计目的深刻理解线程和进程的概念,掌握线程与进程在构成成分上的差别以及与其相适应的通讯方式和应用目的。设计的内容1、以Linux系统进程和线程机制为背景,掌握fork()和clone()系统调用的2、形式和功效以及与其相适应的高级通讯方式。由fork派生的子进程之间通过pipe通讯,由clone创立的线程之间通过共享内存通讯,对于后者需要考虑互斥问题。3、以生产者-消费者问题为例,通过实验理解fork()和clone()两个系统调用的区别。程序规定能够创立4个进程或线程,其中涉及两个生产者和两个消费者,生产者和消费者之间能够传递数据。三、设计准备1、fork系统调用、pid=fork()创立一种子进程,子进程是父进程的完整复制,正常返回值为非负整数,对于父进程来说该数不不大于0,是子进程的编号(pid);对于子进程来说该数为0。正是运用反回值的差别能够决定两者不同的后继动作。2、clone系统调用intclone(int(*fn)(void*arg),void*stack,intflags,void*arg);其中fn是轻进程所执行的函数,stack是轻进程所使用的栈,flag是CLONE_VM,CLONE_FS,CLONE_FILES,LONE_SIGHAND,CLONE_PID的组合,arg是调用过程的对应参数。Clone()的核心是flag的设定,CLONE_VM表达子进程共享父进程内存,CLONE_FS表达子进程共享父进程的文献系统,CLONE_SIGHAND表达子进程共享父进程的消息解决机制,CLONE_PID是指子进程继承父进程的id号。3、pipe系统调用ret_val=pipe(fd);参数定义为intfd[2]。创立一种管道文献,返回两个文献描述符fd[0]和fd[1]分别用于管道文献的读和写操作。管道文献创立后,能够被fork创立的子进程共享。4、sem_wait(&s)和sem_post(&s)分别相称于信号灯的P操作和V操作。其中s是阐明为sem_t类型的信号灯。初始化函数sem_init(s,0,8)。5、pthread_mutex_lock(&mutex)和pthread_mutex_unlock(&mutex)分别用于加锁和解锁。参数为pthread_mutex_tmutex定义的互斥锁。初始化tthread_mutex_init(&mutex,NULL)。四、实验设计1、用pipe()创立一种管道文献2、然后用fork()创立两个生产进程和两个消费进程3、它们之间通过pipe()传递信息4、用clone()创立四个轻进程(线程)5、用参数指明共享内存等资源6、通过共享内存模拟生产消费问题7、运用pthread_mutex_lock(),pthread_mutex_unlock()等函数实现对共享存储区访问的互斥五、程序流程5.1基于fork的程序流程5.2基于clone的程序流程六、成果输出及分析1、基于fork的成果输出分析:由程序(1)成果可见,当一种进程变化其空间数据时,其它进程空间对应数据内容并未变化,阐明在使用fork()语句创立的子进程与其父进程含有相对独立的地址空间,在解决生产消费的问题时,能够采用pipe()进行通信。由于子进程复制了父进程的打开文献表,因此pipe()所建立的通信管道可被子进程继承,生产和消费进程能够通过对同一管道文献的读写进行通讯。程序(1)中,消费者从管道中接受生产者发送的数据,并且和自己存储区中的数据进行比较,两者的数据是不同的,阐明两个进程拥有不同的存储空间。2、基于clone()的成果输出分析:由程序(2)成果可见,clone()语句在创立进程时,可通过参数设定子进程与父进程与否共享存储空间,从而能够创立真正意义上的线程。生产者和消费者进程共享内存,从而能够通过共享内存直接交换数据。但是多个进程共享内存需要互斥机制,程序中定义了临界区变量mutex和两个信号量product,warehouse,临界区变量用于共享内存操作的互斥,信号量分别实现了生产者和消费者的等待。程序(2)中,消费者输出存储区中的数据,并且存储区中的数据随着生产者存入的数据而发生变化,阐明clone()语句通过flag的设定实现了共享内存。若在实验中除去CLONE_VM选项,将出现非预期的成果。七、参考文献[1]计算机操作系统教程左万历周长林编著高等教育出版社.9[2]操作系统教程孙钟秀高等教育出版社.07[3]计算机操作系统汤子瀛哲凤屏汤小丹[4]操作系统习题与实验指导左万历焦素云高等教育出版社[5]嵌入式Linux应用程序开发原则教程(第2版)人民邮电出版社[6]《ProgrammingWindows程式开发设计指南》CharlesPetzold.06附录(1)基于fork()系统调用代码实现#include"sys/types.h"#include"sys/file.h"#include"unistd.h"#include<stdio.h>#include<stdlib.h>charr_buf[4];//读缓冲charw_buf[4];//写缓冲intpipe_fd[2];pid_tpid1,pid2,pid3,pid4;intproducer(intid);intconsumer(intid);intmain(intargc,char**argv){if(pipe(pipe_fd)<0){printf("pipecreateerror\n");exit(-1);}else{printf("pipeiscreatedsuccessfully!\n");if((pid1=fork())==0)producer(1);if((pid2=fork())==0)producer(2);if((pid3=fork())==0)consumer(1);if((pid4=fork())==0)consumer(2);}close(pipe_fd[0]);close(pipe_fd[1]);inti,pid,status;for(i=0;i<4;i++)pid=wait(&status);exit(0);}intproducer(intid){printf("producer%disrunning!\n",id);close(pipe_fd[0]);inti=0;for(i=1;i<10;i++){sleep(3); if(id==1)strcpy(w_buf,"aaa\0");else//生产者2strcpy(w_buf,"bbb\0");if(write(pipe_fd[1],w_buf,4)==-1)printf("writetopipeerror\n"); }close(pipe_fd[1]);printf("producer%disover!\n",id);exit(id);}intconsumer(intid){close(pipe_fd[1]);printf("producer%disrunning!\n",id);if(id==1)strcpy(w_buf,"ccc\0");else//消费者2strcpy(w_buf,"ddd\0");while(1){sleep(1); strcpy(r_buf,"eee\0"); if(read(pipe_fd[0],r_buf,4)==0)break; printf("consumer%dget%s,whilethew_bufis%s\n",id,r_buf,w_buf);}close(pipe_fd[0]);printf("consumer%disover!\n",id);exit(id);}(2)基于clone()系统调用代码实现#include"sched.h"#include"pthread.h"#include"stdio.h"#include"stdlib.h"#include"semaphore.h"intproducer(void*args);intconsumer(void*args);pthread_mutex_tmutex;sem_tproduct;sem_twarehouse;charbuffer[8][4];intbp=0;main(intargc,char**argv){pthread_mutex_init(&mutex,NULL);sem_init(&product,0,0);sem_init(&warehouse,0,8);intclone_flag,arg,retval;char*stack;clone_flag=CLONE_VM|CLONE_SIGNAND|CLONE_FS|CLONE_FILES;inti;for(i=0;i<2;i++){arg=i;stack=(char*)malloc(4096);retval=clone((void*)producer,&(stack[4095]),clone_flag,(void*)&arg);stack=(char*)malloc(4096);retval=clone((void*)consumer,&(stack[4095]),clone_flag,(void*)&arg);}exit(1);}intproducer(void*args){intid=*((int*)args);inti;for(i=0;i<10;i++){ sleep(i+1);sem_wait(&warehouse);pthread_mutex_lock(&mutex);if(id==0)strcpy(buffer[bp],"aaa\0");elsestrcpy(buffer[bp],"bbb\0");bp++;printf("producer%dproduce%sin%d\n",id,buffer[bp],bp-1);pthread_mutex_unlock(&mutex);sem_post(&product);}printf("producer%disover!\n",id);}intconsumer(void*args){intid=*((int*)args);inti;for(i=0;i<10;i++){sleep(10-i);//体现线程速度差别sem_wait(&p

温馨提示

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

评论

0/150

提交评论