




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
进程与线程—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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人工作效率统计表格模板(销售人员)
- 全等三角形的判定-角边角课件
- 分数与除法的关系
- 医院临床医院感染管理小组工作手册
- 黄蓝扁平风入职培训模板
- 领导力发展领导团队的艺术
- 音乐节活动的视觉艺术颜色设计与流行元素融合
- 顾客情感在新零售中的影响与策略
- 非遗文化在小学德育课程中的融入与实践
- 顾客体验为核心的新零售办公用品营销
- 第六章神经系统
- 医疗不良事件报告表
- 国开期末考试《建筑制图基础》机考试题及答案(第D-1套)
- SA8000-2014社会责任绩效委员会SPT组织架构、职责和定期检讨及评审会议记录
- 材料加工新技术与新工艺112课件
- 国开作业科研人员TRIZ技术创新方法应用培训-单元测验1(确定项目+描述项目)76参考(含答案)
- 企业安全生产网格化管理体系图空白
- 焊接热处理工艺卡
- 百日咳临床研究进展PPT医学课件
- 大型钢网架整体提升施工工法
- Q∕GDW 12176-2021 反窃电监测终端技术规范
评论
0/150
提交评论