- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章
进程及进程管理
;进程的引入
进程概念
进程控制
进程的相互制约关系
进程同步机构
进程互斥与同步的实现;
进程引入
;2;3;4;5;6;7;8;9;10;
进程概念
;11;12;13;14;15;16;17;18;19;20;(3) 进程控制块的主要内容 ;22;
进程控制
;23;24;25;26;27;28;29;30;31;
进程之间的相互制约关系
;32;33;34;35;36;37;
进程同步机构
;38;39;40;41;42;43;
进程互斥与同步的实现
;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;
进程通信
;62;63;
线程概念及特点
;64;65;运 行 ;
操作系统的并发机制实例
;进程及进程管理——操作系统的并发机制实例;(2) 系统调用 fork 完成的操作
UNIX/Linux系统的核心为系统调用fork 完成下列操作:
① 为新进程分配一个新的pcb结构;
② 为子进程赋一个唯一的进程标识号 (PID);
③ 做一个父进程上下文的逻辑副本。由于进程的正文区 (代码段) 可被几个进程所共享,所以核心只要增加某个正文区的引用数即可,而不是真的将该区拷贝到一个新的内存物理区。这就意味着父子进程将执行相同的代码。数据段和堆栈段属于进程的私有数据,需要拷贝到新的内存区中。
④ 增加与该进程相关联的文件表和索引节点表的引用数。这就意味着父进程打开的文件子进程可以继续使用。
⑤ 对父进程返回子进程的进程号,对子进程返回零。; ① 从子进程返回
打印: “这是子进程的执行程序。”
“这是父、子进程的共有执行程序”
② 从父进程返回
打印:“这是父进程执行程序。”
“这是父、子进程的共有执行程序”;;main()
{ int child, i=2;
if((child=fork()) == –1)
{printf(fork error. );exit();}
if(child==0)
{i=i+3;
printf(“i=%d\n”,i);
}
i=i+5;
printf(“i=%d\n”,i);
};父; ① 更换进程执行代码,更换正文段,数据段
② 调用格式:exec (文件名,参数表,环境变量表)
③ 例 execlp(“max”,15,18,10,0);
execvp(“max”,argp);2. 创建线程及应用实例; (2) 程序范例
#include stdio.h
#include stdlib.h
#include pthread.h
void thread(void)
{
int i;
for(i=0;i3;i++)
printf(This is a
pthread.\n);
} ;3. 等待进程、线程的终止及其应用;② waitpid() 语法格式
pid=wait(stat_addr);
waitpid(pid_t pid,int * status,int options)
用来等待子进程的结束,但它用于等待某个特定进程结束。
参数pid指明要等待的子进程的PID,参数status的含义与
wait()函数中的status相同。; main( )
{ int n;
….
if(fork()==0)
{printf(“a”);
exit(0);
}
wait(n);
printf(“b”);
};main()
{ int p1,p2,p3,p4,p5,pp1,pp2;
printf(“程序开始执行”);
if ((p1=fork( )== 0) {
printf(“进程proc1执行”);
exit(1);
} else
if ((p2=fork() )== 0) {
printf(“进程proc2执行”);
exit(1);
}
pp1=wait(pp1); /* 等待,
文档评论(0)