操作系统实习报告---进程与线程—Linux进程与线程通讯

上传人:lizhe****0001 文档编号:31283547 上传时间:2018-02-06 格式:DOC 页数:13 大小:270KB
返回 下载 相关 举报
操作系统实习报告---进程与线程—Linux进程与线程通讯_第1页
第1页 / 共13页
操作系统实习报告---进程与线程—Linux进程与线程通讯_第2页
第2页 / 共13页
操作系统实习报告---进程与线程—Linux进程与线程通讯_第3页
第3页 / 共13页
操作系统实习报告---进程与线程—Linux进程与线程通讯_第4页
第4页 / 共13页
操作系统实习报告---进程与线程—Linux进程与线程通讯_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《操作系统实习报告---进程与线程—Linux进程与线程通讯》由会员分享,可在线阅读,更多相关《操作系统实习报告---进程与线程—Linux进程与线程通讯(13页珍藏版)》请在金锄头文库上搜索。

1、1进程与线程Linux 进程与线程通讯一、 设计目的深刻理解线程和进程的概念,掌握线程与进程在组成成分上的差别以及与其相适应的通讯方式和应用目标。二、 设计的内容1、以 Linux 系统进程和线程机制为背景,掌握 fork()和 clone()系统调用的2、形式和功能以及与其相适应的高级通讯方式。由 fork 派生的子进程之间通过 pipe 通讯,由 clone 创建的线程之间通过共享内存通讯,对于后者需要考虑互斥问题。3、以生产者-消费者问题为例,通过实验理解 fork()和 clone()两个系统调用的区别。程序要求能够创建 4 个进程或线程,其中包括两个生产者和两个消费者,生产者和消费者

2、之间能够传递数据。三、 设计准备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, LONE_SIGHA

3、ND,CLONE_PID 的组合,arg 是调用过程的对应参数。Clone()的关键是 flag 的设定,CLONE_VM 表示子进程共享父进程内存,CLONE_FS 表示子进程共享父进程的文件系统,CLONE_SIGHAND 表示子进程共享父进程的消息处理机制,CLONE_PID 是指子进程继承父进程的 id 号。23、pipe 系统调用ret_val=pipe(fd);参数定义为 int fd2。创建一个管道文件,返回两个文件描述符 fd0和 fd1分别用于管道文件的读和写操作。管道文件创建后,可以被 fork 创建的子进程共享。4、 sem_wait(&s)和 sem_post(&s)分

4、别相当于信号灯的 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)。四、实验设计1、 用 pipe()创建一个管道文件2、 然后用 fork()创建两个生产进程和两个消费进程3、 它们之间通过 pipe()传递信息4、 用 clone()创建四个轻进程(线程)5、用

5、参数指明共享内存等资源6、 通过共享内存模拟生产消费问题7、利用 pthread_mutex_lock(), pthread_mutex_unlock()等函数实现对共享存储区访问的互斥五、程序流程5.1 基于 fork 的程序流程3开始I #include char 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)prin

6、tf(pipe create error n);exit(-1);elseprintf(pipe is created successfully!n);8if(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( exit(0);int producer(int id)prin

7、tf(producer %d is running!n,id);close(pipe_fd0);int i=0;for(i=1;i10;i+)sleep(3);if(id=1) 9strcpy(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 over!n,id);exit(id);int consumer(int id)close(pipe_fd1); printf(

8、producer %d is running!n,id);if (id=1) strcpy(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);10close(pipe_fd0);printf(consumer %d is over!n, id);exit(id);(2)基于 clone()系

9、统调用代码实现#include sched.h#include pthread.h#include stdio.h#include stdlib.h#include semaphore.hint 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(sem_init(sem_init(int clone_flag,arg

10、,retval;11char *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,stack =(char*)malloc(4096); retval=clone(void*)consumer,exit(1);int producer(void* args)int id = *(int*)args);int i;for(i=0;i10;i+)sleep(

11、i+1); sem_wait(pthread_mutex_lock(if(id=0)strcpy(bufferbp,aaa0);else12strcpy(bufferbp,bbb0);bp+;printf(producer%d produce %s in %dn,id,bufferbp,bp-1);pthread_mutex_unlock(sem_post(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(pthread_mutex_lock(bp-;printf(consumer%d get %s in%dn,id,bufferbp,bp+1);strcpy(bufferbp,zzz0);pthread_mutex_unlock(sem_post(printf(consumer%d is over!n,id);13

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号