- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章-part2-进程互斥
管道 发送进程利用文件系统的系统调用write(fd[1],buf,size),把buf中的长度为size字符的消息送入管道入口fd[1],接收进程则使用系统调用read(fd[0],buf,size)从管道出口fd[0]读出size字符的消息置入buf中。 管道按FIFO方式传送消息,且只能单向传送消息。 图3.21管道通信 管道 无名管道的使用 例1:用C语言编写一个程序,建立一个pipe,同时父进程生成一个子进程,子进程向pipe中写入一个字符串,父进程从pipe中读出该字符串。 注意:为了使两个或更多的进程使用无名管道来进行进程间通信,进程的公共祖先必须在创建进程之前创建管道。因为UNIX fork()命令创建的子进程具有父进程打开文件表的一份拷贝(也就是说,子进程对父进程已经打开的所有文件具有访问权),每个子进程会继承父进程创建的管道。为了使用管道,仅需要读写合适的文件描述表。 背景:fork()函数简介 当进程被创建时,操作系统创建了一个称之为进程描述表的数据结构,用来管理进程的所有细节。进程也有一个唯一的进程标识符,简称为PID。它是对进程描述表数据结构的一个引用索引。在UNIX中,PID实际上是一个整数,由它可以在进程描述表列表中找到一个特定的进程描述表。当一个进程通过系统调用访问另一个进程时,它必须要提供目标进程的PID值。 在UNIX中,创建一个新进程的命令是fork()系统调用。 int fork(); 背景:fork()函数简介 当一个(父)进程调用fork()时,就创建了一个子进程,子进程拥有父进程的程序代码、数据和堆栈段的一份拷贝,以及对所有打开的文件描述符(在内核中)的访问权。 当操作系统创建一个新的进程时,它需要创建一个进程描述符和一些其它的内部数据结构,这些数据结构都可以通过子进程的PID进行引用。 fork()函数返回子进程的PID给父进程,返回0值给子进程。父进程然后使用PID值作为对子进程的引用。 背景:fork()函数简介 子进程和父进程各自在它们的地址空间中并发执行。这意味着当子进程被创建时,即使子进程和父进程要访问相同的信息,它们实质上是引用各自的信息拷贝。子进程和父进程的地址空间是相互独立的。特别要注意的是:子进程和父进程不能通过引用存储在相同地址上的变量来进行通信。 在UNIX中,两个进程唯一可以共享引用的是打开的文件(UNIX利用这种方式来作为进程间通信机制)。 在子进程被创建后,子进程和父进程都可以使用处理器。也就是说,它们有各自的虚拟机。在单处理器的计算机上,某一时刻只允许一个进程使用处理器。在fork()调用完成后,程序员不能确定处理器将运行子进程还是父进程,操作系统也可以选择其它的进程来运行。 背景:fork()函数简介 在UNIX中,子进程和父进程在相同的执行点上开始执行。 在下面的代码段中,父进程执行fork()调用,然后执行printf()语句。子进程执行的第一个语句也是printf()语句。在父进程中,theChild的值是新进程的PID。但在子进程中,theChild的值是0。父进程将打印一个非0值,而子进程将打印出0。 背景:fork()函数简介 如果我们想让子进程执行与父进程不同的代码,则可以通过使用条件测试来完成: 在代码段中,父进程和子进程都对变量childPID的值进行测试:父进程的childPID为一个非0值,而子进程的childPID为0,且它们在不同的地址空间。子进程将调用codeForTheChild()过程,而父进程将执行不同的代码。 无名管道的使用 无名管道的使用 例2:编写一个程序,建立一个管道。同时,父进程生成子进程P1,P2,这两个子进程分别向管道中写入各自的字符串,父进程读出它们。 图3.22 父进程和子进程P1,P2通信例子 无名管道的使用 无名管道的使用 无名管道的使用 例2程序流程图 Windows中的互斥量 Windows系统中,提供了一个CreateMutex()函数,用来创建一个互斥量。互斥也属于系统内核对象,创建成功后函数会返回一个句柄。同信号量一样,互斥不仅可以使用在多线程中,也可以在多进程中使用。函数声明如下: HANDLE WINAPI CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName); lpMutexAttributes:设定安全属
文档评论(0)