- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)