- 1、本文档共89页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第二讲多进程程序设计课程网站:CourseGrading/http/:///主讲教师: 赵长海办公室: 新主楼G910Email: zch@Spring2013本章内容2.1进程的基本概念和特点2.2进程的控制2.3信号(signal)2.4进程间通信(进程协作的桥梁)2.1进程的概念和特点一、进程相关的概念演示进程:执行中的程序。系统中的每一个进程都运行在上下文(context)中。上下文:由程序正确运行所需要的状态组成,包括:存放在内存中的代码和数据堆栈、寄存器内容、程序计数器、环境变量、文件描述符I/Orequest:ProcessisplacedonI/OqueueforadeviceSpawnandwait:Sometimeswhenaprocesscreatesanewprocess,itmustwaituntilthechildcompletes上下文切换:就是从一个可执行进程切换到另一个可执行进程。引发上下文切换的原因:TimesliceexpirationSleeprequest系统调用:由/view/880.htm操作系统提供的应用程序编程接口(API)。用户空间内核进程地址空间:虚拟地址0~2n-1,每个进程都有自己私有的地址空间,一个进程不可以直接访问另外一个进程的地址空间。二、进程与线程区别独享地址空间(1)一个进程可以包括多个线程;(2)线程间共享地址空间,因此,一个线程修改一个变量(全局或静态),其它线程都能获知;(3)线程间通信直接通过共享变量,而进程间通信则需要通过管道、消息队列等;共享地址空间三、进程间通信模型STACKSTACKSharedmemorysegments,pipes,openfilesormmap’dfilesDATADATATEXTTEXTSharedMemorymaintainedbykernelprocessesprocesses2.2进程控制获取进程ID每一个进程都有唯一的非零正数ID(PID)一、进程ID#includesys/types.h#includeunistd.hpid_tgetpid(void);pid_tgetppid(void);调用者父进程进程ID调用者进程IDexit函数进程终止的三种方式:二、进程终止#includestdlib.hvoidexit(intstatus);调用exit函数,主动退出运行(1)收到一个信号,信号的默认行为是终止运行;(2)从主程序返回;(3)调用exit函数;创建子进程三、进程创建#includesys/types.h#includeunistd.hpid_tfork(void);“fork”:把当前进程复制出一个新的进程,当前的进程就是新进程的父进程,新进程称为子进程。 例示intglob=6;intmain(){ pid_tpid; intx=1; pid=fork(); if(pid==0){ glob++; printf(“child:glob=%d,x=%d\n”, glob,++x); exit(0); } printf(“parent:glob=%d,x=%d\n”, glob,--x);}如果没有exit演示父进程子进程例2示intglob=6;intmain(){ pid_tpid; intx=1; pid=fork(); if(pid0){ printf(“%s\n”,strerror(errno)); }elseif(pid==0){ glob++; printf(“child:glob=%d,x=%d\n”, glob,++x); }else{ printf(“parent:glob=%d,x=%d\n”, glob,--x); }}父进程子进程fork调用一次,返回两次(1)返回到父进程;(2)返回到新创建的子进程;并发执行(1)宏观上,父子进程并发执行;(2)微观上(多核系统),可能是交替执行或者并行执行;fork相同但是独立的地址空间(1)复制:相同的用户栈、相同的本地变量、相同的堆、相同的全局变量……;(2)独立:父子进程都有独立的私有地址空间,对变量的任何更改不会影响另外一个进程对应的变量;文件共享父进程打开的文件描述符,子进程可以继续使用;次1intmain(){ fork(); printf(“hello\n”); exit(0);}演示多次调用fork?hellohellofork
文档评论(0)