进程管理(三)——进程间通信和多线程问题 前言 不同的进程之间的地址空间是相互隔离的,所以相互通信需要操作系统的支持。 多个进程进行通信和多个线程共享资源时,都需要考虑共享资源的同步问题。 进程间通信 IPC,Inter Process Communication,每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核(除共享内存外)。 管道 所谓的管道,就是内核里面的一串缓存(在内核空间中维护的缓冲器)。管道有两个端(描述符),分别是写端和读端,从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据。管道传输的数据是无格式的字节流且大小有限。 管道传输数据是单向的(半双工),如果想相互通信,我们需要创建两个管道才行。 管道通信数据遵循先入先出原则。匿名管道(pipe):「」表示的管道称为匿名管道,没有文件实体,只存在于内核空间中。只能用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。命名管道(FIFO):命名管道是以特殊文件形式(p 类型文件)存在于文件系统中的,可以按照操作文件的方式对命名管道进行操作。在使用命名管道前,先需要通过 命令来创建,并且指定管道名字。可以在不相关的进程间相互通信。 从匿名管道读写数据是一次性操作,数据一旦被读走,它就从匿名管道中被抛弃,释放空间以便写更多的数据。 在管道中没有数据的情况下,对管道的读操作会阻塞,直到管道内有数据为止。大于管道长度的写操作会阻塞,直到当前管道中的数据被读取为止。 管道通信效率低,不适合进程间频繁地交换数据。 管道是进程的一种资源。 为什么匿名管道只能用于具有亲缘关系的父子进程间或者兄弟进程之间的通信? 因为管道是匿名的,只能由父进程通过 创建子进程,使子进程复制父进程的文件描述符,从而创建出两个匿名管道分别用于收发数据。 在 shell 里面执行 命令的时候,A 进程和 B 进程都是 shell 创建出来的子进程。


2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/20398.html