- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《操作系统》实验讲义二
《操作系统》实验讲义二
实验二 进程的控制
一.实验目的
1.熟悉和理解进程和进程树的概念,掌握有关进程的管理机制
2 .通过进程的创建、撤销和运行加深对进程并发执行的理解
3 .明确进程与程序、并行与串行执行的区别
4 .掌握用C 程序实现进程控制的方法
二.实验工具与设备
已安装Linux 操作系统的计算机。
三.实验预备内容
1.阅读Linux 的sched.h 源代码文件,加深对进程管理概念的理解
2 .阅读Linux 的fork.c 源代码文件,分析进程的创建过程
四.实验内容
1.了解系统调用fork( ), exec 系列函数,exit( ), wait( )的功能和实现过程
(1)进程的创建
用户在使用Linux 系统的时候,每次在终端下面输入一行命令,就由shell 进程接收这个命令并
创建一个新的进程,这个新的进程还可以通过fork()系统调用,继续创建自己的子进程。系统中的多
个进程构成一棵进程树。实际上,在Linux 系统启动时,最早产生的进程是idle 进程,其pid 号为0,
该进程会创建一个内核线程,该线程进行一系列初始化动作后最终会执行/sbin/init 文件,执行该文
件的结果是运行模式从核心态切换到用户态,该线程演变成了用户进程init,pid 为1。init 进程是一
个非常重要的进程,一切用户态进程都是它的后代进程。
a. 派生进程
#includeunistd.h
pid_t fork(void);
pid_t vfork(void);
调用fork 时,系统将创建一个与当前进程相同的新进程,其与原有进程具有相同的数据、连接
关系和在程序同一处执行的连续性。原进程称为父进程,新生进程称为子进程。子进程是父进程的
一个拷贝,子进程获得同父进程相同的数据,但是同父进程使用不同的数据段和堆栈段。子进程被
创建以后,处于可运行状态,与父进程以及系统中的其他进程平等地参与系统调度。
fork 调用将执行两次返回,即分别从父进程和子进程分别返回,即子进程一旦创建就绪,就与
父进程一样被平等地调度执行。因此,从fork 返回以后,不能确切知道执行哪一个进程。从父进程
返回时,返回值(0 )为子进程的进程标识号 PID ;而从子进程返回时,返回值为 0,并且返回都
将执行fork 之后的语句。调用出错时返回值为-1,并将errno 置为相应值。
调用vfork 的作用与fork 基本相同,但vfork 并不完全拷贝父进程的数据段,而是和父进程共享
数据段。调用执行vfork 函数返回之前,父进程被阻塞,子进程先运行,直到从vfork 调用返回。然
后,子进程继续执行,可以调用exec 执行新的进程,或调用exit 结束其运行。此后,父进程才被唤
醒,与子进程平等地被系统调度。因此,如果子进程在调用exec 之前等待父进程,由于父进程因为
执行vfork 被阻塞,会造成死锁。
《操作系统》实验讲义二 2
函数vfork 的主要用途是创建子进程以后,由子进程调用exec 函数启动其他进程,使新启动的
其他进程以该子进程的进程标识号身份执行,但拥有自己的程序段和数据区。
例2.1:
#includesys/types.h n=5;
#includestdio.h for(;n0;n--)
#includeunistd.h { puts(message); sleep(1);}
int main() break;
{ default:
pid_t pid; char *message; int n;
文档评论(0)