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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

linux进程与线程通讯实验报告Word格式.docx

1、程序要求能够创建 4 个进程或线程,其中包括两个生产者和两个消费者,生产者和消费者之间能够传递数据。设计准备1、 fork 系统调用、pid=fork()创建一个子进程,子进程是父进程的完整复制,正常返回值为非负整数,对于 父进程来说该数大于 0,是子进程的编号 (pid); 对于子进程来说该数为 0。正是利用反回值的差别可以决定二者不同的后继动作。2、 clone 系统调用int clone(int (*fn)(void * arg), void *stack, int flags, void * arg);其中 fn 是轻进程所执行的函数, stack 是轻进程所使用的栈, flag 是C

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

3、(&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)四、实验设计2、然后用 fork() 创建两个生产进程和两个消费进程7、利用 pthread_mutex_lock(), pthread_mutex_unlock() 等函数实现对共享

4、存储区访问的互斥分析结果 :由程序(1) 结果可见,当一个进程改变其空间数据时,其他进程空间对应数据 内容并未改变,说明在使用 fork() 语句创建的子进程与其父进程具有相对独立的 地址空间,在解决生产消费的问题时,可以采用 pipe() 进行通信。因为子进程复 制了父进程的打开文件表,所以 pipe() 所建立的通信管道可被子进程继承,生产 和消费进程可以通过对同一管道文件的读写进行通讯。程序 (1) 中,消费者从管道中接收生产者发送的数据,并且和自己存储区中的 数据进行比较,两者的数据是不同的,说明两个进程拥有不同的存储空间。2、 基于 clone() 的结果输出分析结论 :由程序(2)

5、 结果可见, clone() 语句在创建进程时,可通过参数设定子进程与父 进程是否共享存储空间,从而可以创建真正意义上的线程。生产者和消费者进程共 享内存,从而可以通过共享内存直接交换数据。但是多个进程共享内存需要互斥机 制,程序中定义了临界区变量 mutex和两个信号量Product , warehouse,临界区变量用于共享内存操作的互斥,信号量分别实现了生产者和消费者的等待。程序(2) 中,消费者输出存储区中的数据,并且存储区中的数据随着生产者存入的数据而发生变化,说明 clone() 语句通过 flag 的设定实现 了共享内存。若在实验中除去 CLONE_Va项,将出现非预期的结果。篇

6、三: 操作系统实验报告 _进程和线程计算机科学与软件学院操作系统上机实验报告学生姓名 : 学号 : 班级: 班 实验日期 : 2014.4.17实验名称 :进程和线程实验目的 :理解 unix/Linux 下进程和线程的创建、并发执行过程。实验内容:1(进程的创建2(多线程应用实验步骤及分析 :( 此部分为关键内容 : 要求整理实验主要步骤,总结编写实验过程中遇到哪些问题,如何解决的,若未解决也应总结,回答思考题的答案 )、进程的创建F面这个C程序展示了 UNIX系统中父进程创建子进程及各自分开活动的情况。1、实验指导fork( )创建一个新进程。系统调用格式 :pid=fork( )参数定义

7、 :int fork( )fork( ) 返回值意义如下 :0:在子进程中, pid 变量保存的 fork( ) 返回值为 0,表示当前进程是子进程。在父进程中, pid 变量保存的 fork( ) 返回值为子进程的 id 值(进程唯一标 识符)。 -1: 创建失败。如果fork()调用成功,它向父进程返回子进程的 PID,并向子进程返回0,即 fork()被调用了一次,但返回了两次。此时 OS在内存中建立一个新进程,所建的新进程是调用 fork( ) 父进程 (parent process) 的副本,称为子进程 (child process) 。子进程继承了父进程的许多特性,并具有与父进程完

8、全相同的用户级上 下文。父进程与子进程并发执行。2、参考程序代码/*process.c*/#include stdio.h#include sys/types.hmain(int argc,char *argv)int pid;/* fork another process */pid = fork();if (pid 0) /* error occurred */fprintf(stderr, Fork Failed);exit(-1);else if (pid = 0) /* child process */execlp( /bin/ls, ls,NULL);else /* parent

9、process */* parent will wait for the child to complete */wait(NULL);printf( Child Complete );exit(0);3、编译和运行$gcc process.c - o processs4、运行$./process 程序运行截图(2)扩展程序,在父进程中输出 1到 5,在子进程中输出 6-10,要求父子进程并发输出; 记录实验结果,并给出简单分析。6.实验中遇到的问题和解决方法、多线程应用编写 unix/Linux 下的多线程程序,需要使用头文件 pthread.h ,连接时需要使 用库 libpthread.

10、a 。下面是一个最简单的多线程程序 example1.c 。1. 实验指导面的示例中,要使用到两个函数, pthread_create 和 pthread_join ,并声明了一个 pthread_t 型的变量。函数 pthread_create 用来创建一个线程,它的原型为 :extern int pthread_create _P (pthread_t *_thread, _constpthread_attr_t *_attr,void *(*_start_routine) (void *), void*_arg);第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个 参数

11、是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的 函数 thread 不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。当创建线程成功时,函数返回 0,若不为 0则说明创建线程失败,常见的错误返回代码为 EAGAINffi EINVAL前者表示系统限制创建新的线程,例如线程数目过多了后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程 则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。函数 pthread_join 用来等待一个线程的结束。函数原型为 :extern int pthread_join

12、_P (pthread_t _th, void第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可 以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数 将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调 用它的线程也就结束了 ; 另一种方式是通过函数 pthread_exit 来实现。它的函数原 型为:exter n void p thread_exitP (void *_retval) _attribute_ (_noreturn_);唯一的参数是函数的返回代码,只

13、要 pthread_join 中的第二个参数thread_return 不是 NULL,这个值将被传递给 thread_return/* thread.c*/#include pthread.hvoid thread(void)int i;for(i=0;i3;i+)printf(This is a pthread.n);int main(int argc,char *argv)int i,ret;ret=pthread_create(&id,NULL,(void *) thread,NULL);if(ret!=0)printf (Create pthread error!n);exit (1);printf(This is the main process.n);pthread_join(id,NULL);return (0);编译此程序 :gcc example1.c -lpthread -o example1-lpthread: 使用线程库运行example1,得到如下结果:This is the main process.This is a pthread.再次运行,可能得到如下结果 :程序运行截图4、思考(1) 程序运行后,进程 thread 中有几个线程存在 ,(2) 为什么前后两次运行结果不一样 , 答(1)5.实验中遇到的问题和解决方法运行结果并没有出现预期效果

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

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