网站大量收购闲置独家精品文档,联系QQ:2885784924

实验一进程与线程范例.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
程序(1) 由程序(1)结果可见,当一个进程改变其空间数据时,其他进程空间对应数据内容并未改变,说明在使用fork()语句创建的子进程与其父进程具有相对独立的地址空间,在解决生产消费的问题时,可以采用pipe()进行通信。因为子进程复制了父进程的打开文件表,所以pipe()所建立的通信管道可被子进程继承,生产和消费进程可以通过对同一管道文件的读写进行通讯。 程序(1)中,消费者从管道中接收生产者发送的数据,并且和自己存储区中的数据进行比较,两者的数据是不同的,说明两个进程拥有不同的存储空间。 程序(2) 由程序(2)结果可见,clone()语句在创建进程时,可通过参数设定子进程与父进程是否共享存储空间,从而可以创建真正意义上的线程。生产者和消费者进程共享内存,从而可以通过共享内存直接交换数据。但是多个进程共享内存需要互斥机制,程序中定义了临界区变量mutex和两个信号量product,warehouse,临界区变量用于共享内存操作的互斥,信号量分别实现了生产者和消费者的等待。 程序(2)中,消费者输出存储区中的数据,并且存储区中的数据随着生产者存入的数据而发生变化,说明clone()语句通过flag的设定实现了共享内存。若在实验中除去CLONE_VM选项,将出现非预期的结果。 思考题 在Linux环境中,除pipe和clone公共内存通讯外,还可以采用shm和msg通讯方式,试查阅相关资料了解这些通讯方式,并使用上述任一种方式模拟实现“生产者/消费者”问题。 比较Linux系统中pipe、clone、shm和msg四种高级通讯方法的优缺点以及各自适应的环境。 * * * 实验一 进程与线程——Linux 进程与线程通讯 实验目的 实验内容 实验准备 实验设计 参考代码 实验结果 思考题 实验目的 深刻理解线程和进程的概念,掌握线程与进程在组成成分上的差别,以及与其相适应的通讯方式和应用目标。 实验内容 以Linux系统进程和线程机制为背景,掌握fork()和clone()系统调用的形式和功能,以及与其相适应的高级通讯方式。由fork派生的子进程之间通过pipe通讯,由clone创建的线程之间通过共享内存通讯,对于后者需要考虑互斥问题。 以生产者/消费者问题为例,通过实验理解fork()和clone()两个系统调用的区别。程序要求能够创建4个进程或线程,其中包括两个生产者和两个消费者,生产者和消费者之间能够传递数据。 实验准备 fork系统调用 clone系统调用 pipe系统调用 sem_wait(s)和sem_post(s) pthread_mutex_lock(mutex)和pthread_mutex_unlock(mutex) fork系统调用 pid=fork() 创建一个子进程,子进程是父进程的完整复制,正常返回值为非负整数,对于父进程来说该数大于0,是子进程的编号(pid);对于子进程来说该数为0。正是利用反回值的差别可以决定二者不同的后继动作。 clone系统调用 int clone (int ( *fn ) (void *arg) , void *stack , int flag , void *arg) ; 其中,fn是轻进程所执行的函数;stack是轻进程所使用的栈;flag是CLONE_VM, CLONE_FS, CLONE_FILES, CLONE_SIGNAND, CLONE_PID的组合;arg是调用过程的对应参数。Clone()的关键是flag的设定,CLONE_VM表示子进程共享父进程内存,CLONE_FS表示子进程共享父进程的文件系统,CLONE_SIGNAND表示子进程共享父进程的消息处理机制,CLONE_PID是指子进程继承父进程的id号。 pipe系统调用 ret_val=pipe(fd); 参数定义为int fd[2]。创建一个管道文件,返回两个文件描述符fd[0]和fd[1]分别用于管道文件的读和写操作。管道文件创建后,可以被fork创建的子进程共享。 sem_wait(s)和sem_post(s) sem_wait(s)和sem_post(s)分别相当于信号灯的P操作和V操作。其中s是说明为说明为sem_t类型的信号灯。初始化函数sem_init(s,0,8)。 pthread_mutex_lock(mutex)和pthread_mutex_unlock(mutex) pthread_mutex_lock(mutex)和pthread_mutex_unlock(mutex)分别用于加锁和解锁。参数为pthread_mutex_t mutex定义的互斥锁。初始化tthread_mutex_init(mutex,NULL)。 实验设计 用pipe()创建

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档