linux进程和线程通信.doc_第1页
linux进程和线程通信.doc_第2页
linux进程和线程通信.doc_第3页
linux进程和线程通信.doc_第4页
linux进程和线程通信.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

课 程 设 计课程设计名称: linux进程和线程通讯 专 业 班 级 : 学 生 姓 名 : 学 号 : 指 导 教 师 : 课程设计时间: 计算机科学与技术 专业课程设计任务书学生姓名专业班级学号题 目Linux进程和线程通讯课题性质其它课题来源自拟课题指导教师同组姓名无主要内容1. 以Linux系统进程和线程机制为背景,掌握fork()和clone()系统调用的形式和功能以及与其相适应的高级通信方式。由fork派生的子进程之间通过pipe通信,由clone创建的线程之间通过共享内存通信。2.以生产者-消费者为例,通过实验理解fork和clone两个系统调用的区别。程序要求能够创建4个进程或线程,其中包括两个生产者和两个消费者,生产者和消费者之间能够传递数据。任务要求1. 深刻理解线程和进程的概念,2. 掌握线程和进程在组成成分上的差别以及与其相适应的通信方式和应用目标。参考文献 1 张尧学,史美林.计算机操作系统教程.北京:清华大学出版社,2000 2 孟庆昌.操作系统教程.北京:电子工业出版社,20043 Gary Nutt.操作系统现代观点.孟祥由译.北京:机械工业出版社,20044 陈向群,杨芙清.操作系统教程.2版.北京:北京大学出版社,20065 汤小丹.计算机操作系统第三版.西安:西安电子科技大学出版社,2007审查意见指导教师签字:教研室主任签字: 年 月 日 说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页141 需求分析深刻理解线程和进程的概念,掌握线程和进程在组成成分上的差别以及与其相适应的通信方式和应用目标。 此次课程设计以Linux系统进程和线程机制为背景,掌握fork()和clone()系统调用的形式和功能以及与其相适应的高级通信方式。由fork派生的子进程之间通过pipe通信,由clone创建的线程之间通过共享内存通信。以生产者-消费者为例,通过实验理解fork和clone两个系统调用的区别。程序要求能够创建4个进程或线程,其中包括两个生产者和两个消费者,生产者和消费者之间能够传递数据。2 概要设计进程是系统分配资源的基本单位,是一个具有独立功能的程序段对某个数据集的一次执行活动。进程具有动态性,并发性等特点。反映进程动态特性的是进程状态的变化。进程要经历创建,等待资源,就绪准备执行,以及执行前和执行后释放资源小王等几个过程和状态。进程的状态转换要有不同的原语句执行完成。进程的并分特性反映在进程对资源的竞争以及有资源竞争所引起的对进程执行速度的制约。这种制约可分为直接制约和间接制约。进程间的直接制约是被制约进程和制约进程之间,存在着对方资源的需求,只有制约进程执行后,被制约进程才能继续往前推进。进程间的间接制约是被制约进程共享某个一次只能供一个进程使用的系统资源,只有得到资源的进程才能向前推进,其他进程在获得资源进程执行期间不允许交叉执行,因此直接制约进程之间具有固定的执行顺序,而间接制约的进程之间则没有固定的执行顺序。线程是为了提高操作系统的执行效率而引入的,它是进程内的一段程序的基本调度单元。线程可分为用户级线程和系统级线程。用户级线程的管理全部由线程库完成,与操作系统内核无关,线程有寄存器,堆栈以及程序计数器等组成,同意进程的线程共享该进程的进程空间和其他所有资源。线程主要用于多级系统以及网络系统的操作系统中,Linux系统中的fork()保持了unix大的经典语义,被创建的进程具有独立于独立于父进程的地址空间,二者之间的通讯通常可采用pipe机制。Clone()是linux系统特有的系统调用,可以通过参数确定父子进程之间是否共享空间资源,在地址空间等资源共享等情况下,clone实质是哪个相当于创建了一个轻进程或线程,这是clone的通常用法。实际上在linux系统中,fork以及用户线程pthread都是基于clone实现的。有fork派生出的子进程之间通过pipe通讯,由clone创建的线程之间通过共享内存通讯,对于后者需要考虑互斥问题。Fork()系统用pipe()创建一个管道文件,然后用fork()创建两个生产进程和两个消费进程,它们之间通过pipe()传递信息。Clone()系统用clone()创建四个轻进程(线程),用参数指明共享内存等资源,通过共享内存模拟生产消费问题,利用pthread_mutex_lock(), pthread_mutex_unlock()等函数实现对共享存储区访问的互斥开始fork()系统调用流程图: 空闲进程控制块队列为空? N取空闲进程控制块的第一个 生产者,消费着挂入就绪队列输入就绪队就绪队列为空Fork创建两个生产者和两个消费者创建一个管道文件创建失败 N 结束开始 clone()系统调用流程图: 解锁输出消费者bp-解锁生产者bp+1bp-bp+加锁加锁i10;i+i10;i+定义消费者定义生产者i=0;i2;i+数据初始化 Y Y输出生产者结束3 运行环境硬件环境:AMD速龙双核250处理器,主频3.0GHZ,320G硬盘,2G内存,软件环境:ubuntu12.04版本4 开发工具和编程语言 linux系统下自带c语言编译工具5 详细设计(1)fork系统调用 pid=fork() 创建一个子进程,子进程是父进程的完整复制,正常返回值为非负整数,对于父进程来说该数大于0,是子进程的编号(pid);对于子进程来说该数为0。正是利用反回值的差别可以决定二者不同的后继动作。(2)clone系统调用int clone(int (*fn)(void * arg), void *stack, int flags, void * arg);其中fn是轻进程所执行的函数,stack是轻进程所使用的栈,flag是CLONE_VM, CLONE_FS, CLONE_FILES, CLONE_SIGHAND,CLONE_PID的组合,arg是调用过程的对应参数。Clone()的关键是flag的设定,CLONE_VM表示子进程共享父进程内存,CLONE_FS表示子进程共享父进程的文件系统,CLONE_SIGHAND表示子进程共享父进程的消息处理机制,CLONE_PID是指子进程继承父进程的id号。(3)pipe系统调用 ret_val=pipe(fd); 参数定义为int fd2。创建一个管道文件,返回两个文件描述符fd0和fd1分别用于管道文件的读和写操作。管道文件创建后,可以被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_t mutex定义的互斥锁。初始化tthread_mutex_init(&mutex,NULL)。Fork()系统主程序:#include#include#include#include#include#include#include#include#includechar r_buf4;/读缓冲char w_buf4;/写缓冲int pipe_fd2;pid_t pid1,pid2,pid3,pid4;int producer(int id);int consumer(int id);int main(int argc,char*argv)if(pipe(pipe_fd)0)printf(pipe create error.n);exit(-1);elseprintf(pipe is create successfully!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_fd0);/需要加上这两句,否则会有读者或写者永远等close(pipe_fd1);int i,pid,status;for(i=0;i4;i+)pid=wait(&status);exit(0);int producer(int id)printf(producer %d is runningn,id);close(pipe_fd0);int i=0;for(i=1;i10;i+)sleep(3);if(id=1)/生产者1strcpy(w_buf,aaa0);else/生产者2strcpy(w_buf,bbb0);if(write(pipe_fd1,w_buf,4)=-1)printf(write to pipe errorn);close(pipe_fd1);printf(producer%d is overn,id);exit(id);int consumer(int id)close(pipe_fd1);printf(consumer%d is running!n,id);if(id=1)/消费者1strcpy(w_buf,ccc0);else/消费者2strcpy(w_buf,ddd0);while(1)sleep(1);strcpy(r_buf,eee0);if(read(pipe_fd0,r_buf,4)=0)break;printf(consumer%d get %s,while the w_buf is %sn,id,r_buf,w_buf);close(pipe_fd0);printf(consumer %d is over!n,id);exit(id);Clone()系统主程序:#include#include#include#include#include#include#include#include#includeint producer(void *args);int consumer(void *args);pthread_mutex_t mutex;sem_t product;sem_t warehouse;char buffer84;int bp=0;main(int argc,char *argv)pthread_mutex_init(&mutex,NULL);sem_init(&producer,0,0);sem_init(&warehouse,0,8);int clone_flag,arg,retval;char *stack;clone_flag=CLONE_VM|CLONE_SIGNAND|CLONE_FS|CLONE_FILES;int i;for(i=0;i2;i+)/创建四个线程arg=i;stack=(char*)malloc(4096);retval=clone(void*)producer,&(stack4095),clone_flag,(void*)&arg);stack=(char*)malloc(4096);retval=clone(void*)consumer,&(stack4095),clone_flag,(void*)&arg);exit(1);int producer(void*args)int id=*(int*)args);int i;for(i=0;i10;i+)sleep(i+1);/表现线程速度差别sem_wait(&warehouse);pthread_mutex_lock(&mutex);if(id=0)strcpy(bufferbp,aaa0);elsestrcpy(bufferbp,bbb0);bp+;printf(producer%d produce %s in %dn,id,bufferbp,bp-1);pthread_mutex_unlock(&mutex);sem_post(&product);printf(producer %d is over!n,id);int consumer(void*args)int id=*(int *)args);int i;for(i=0;i10;i+)sleep(10-i);/表现线程速度差别sem_wait(&product);pthread_mutex_lock(&mutex);bp-;printf(consumer %d get %s in %dn,id,bufferbp,bp+1);strcpy(bufferbp,zzz0);pthread_mutex_unlock(&mutex);sem_post(&warehouse);printf(consumer %d get %s is over!n,id);6 调试分析在fork()系统调用中,消费者从管道中接收生产者的数据,并且将其和自己的存储区中的数据进行比较,两者数据不同,说明两个进程拥有不同的存储空间。在clone系统调用中,消费者输出存储区的数据,并且存储区的数据随着生产者存入的数据而发生变化,说明clone()语句通过flag的设定实现了共享内存,如在实验中出去clone_vm选项,将出现非预期的结果。7 测试结果

温馨提示

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

评论

0/150

提交评论