为什么管道中没有临界截面?

为什么管道中没有临界截面?

为什么管道中没有临界截面?例如,在共享内存中。管道中有通用数据,在联合进程中常用,而共享内存中也有通用数据,在联合进程中通用。

答案1

我不完全确定你在问什么,我想你在问为什么如果你使用共享内存,你还必须使用锁定来确保你的编写者和读者不会冲突,但你可以从没有任何锁定的管道。当然,所需锁定的程度取决于所使用的数据结构;例如,有些环形缓冲区大多是无锁的。

如果是这样,答案就相当简单:管道是一种抽象。管道的锁定(在管道数据结构需要的范围内)隐藏在内核中。

答案2

低于 PIPE_BUF 大小(通常与内存页面大小相同)的管道写入和读取保证是原子的,因此不需要用户态同步机制来保护它 - 内核已经在这样做了。大于 PIPE_BUF 的写入/读取将需要同步机制。实际上,您通常不会看到大量数据一口气被推入管道,因此您不会看到互斥体等被大量使用,但当出现超出 PIPE_BUF 的情况时,就需要它们了。

相关内容