操作系统实验一进程与线程—Linux进程与线程通讯实验报告.docxVIP

操作系统实验一进程与线程—Linux进程与线程通讯实验报告.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统 课程设计任务书 实验题目: 实验一:进程与线程—Linux 进程与线程通讯 实验目的: 深刻理解线程与进程的概念,掌握进程与线程在组成成分上的差别以及 与其相适应的通讯方式和应用目标。 实验内容: 以 Linux 系统进程和线程机制为背景,掌握 fork()和 clone()系统调用 的形式和功能以及与其相适应的高级通讯方式。有 fork 派生的子进程 之间通过 pipe 通讯,由 clone 创建的线程之间通过共享内存通讯,对 于后者需要考虑互斥问题。 以生产者 – 消费者问题为例,通过实验理解 fork()和 clone() 两个系统调用的区别。程序要求能够创建 4 个进程或线程,其中包括两 个生产者和两个消费者,生产者和消费者之间能够传递数据。 设计准备: (理论技术) 1. 什么是进程?进程是具有一定独立功能的程序关于一个数据集合的 一次运行活动。 2. 什么是线程?线程是进程内的一个相对独立的执行流。 3. 线程是与其父进程具有相同地址空间的进程。 4. 进程与线程的差别通过与 fork 不同的另一个系统调用 clone 体现出 来。fork 为子进程创建一个具有全新上下文的独立的地址空间,而 clone 并不产生新的地址空间,子进程共享父进程的地址空间。 Clone 为应用程序提供了细粒度的共享成分控制。 5. Linux 中的进程包含 3 个段,数据段,代码段,堆栈段。 6. fork()函数用于从已存在的进程中创建一个新进程,新进程称为 子程,而原进程称为父进程。使用 fork()函数,子进程从父进程 处继承了整个进程的地址空间。而子进程独有的只有它的进程号, 资源使用和计时器等。 7. Fork()函数语法要点: ① 所需头文件:#includesys/types.h//提供类型 pid_t 的定义; #includeunistd.h ② 函数原型:pid_t fork(void) ③ 函数返回值:0:子程序; 子进程 ID(大于 0 的整数):父进程; -1:出错。 8. 1 实验步骤: 1. 安装虚拟机,并安装虚拟 Linux 系统,实现 Linux 联网 2. 在 上下载 OS 文件夹,保存在终端 3. 打开终端,运行一下代码 Cd os gcc test_fork.c –o fork ls ./fork (运行 fork()) gcc –lpthread test_clone.c –o clone ./clone (运行 clone()) 4. 分析实验代码,与实验代码对比,弄懂其中的原理 5. 实验结束,保存系统,退出 Linux 系统 实验结果: ./fork 输出结果: ./clone 输出结果: 2 3 实验 实验讨论: 由程序 1 结果可知,使用 fork()语句创建的子进程与其父进程 具有相对独立的地址空间,在此解决生产者-消费者问题里,可以采 用 pipe()进行通讯。子进程复制了父进程的打开文件表,所以 pipe()所建立的通信管道可被子进程继承,生产和消费进程可以通 过对同一通信管道文件的读书进行通讯。 由程序 2 结果可知:clone()语句在创建进程时,可通过参数设 定子进程与父进程是否共享存储空间,从而可以创建真正意义上的 程序。生产者和消费者进程共享内在,从而可以通过共享交换数据。 但多个进程共享共存需要互斥机制。 三.实验流程图 程序二流程图: 基于 clone()系统调用 父进程: 生产者子进程(Producer): 4 设置id进入循环(i=0i10)i++ 设置id 进入循环(i=0 i10) i++ Sleep(i+1) warehouse= 0 则进程阻塞 上互斥锁 “bbb\0”赋给 Bp++ Producer id produceBuffer[bp] in Bp-1 解锁 解除堵塞进程 Producer id is over! Producer 开始 Id=0?  Y N N buffer[bp]  “aaa\0”赋给 buffer[bp] 循环结束? Y Producer 结束 消费者子进程(Consumer): 5 设置id进入循环i=0...9进程等待product=1 设置id 进入循环 i=0...9 进程等待 product=1 堵塞进程 上互斥锁 Bp-- Producer id produce Buffer[bp] in Bp+1 zzz\0”赋给 buffer[bp] 解锁 解除堵塞 进程 Consumer id is over! N Y Consumer 开始 循环结束? Consumer 结束 基于 fork()系统调用的流程图: 主程序: 8 退出ExitArg=I,I++ //创建四个线程生产者 退出 Ex

文档评论(0)

damoyihao + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档