簡體   English   中英

為什么在任何知道其名稱的進程中,線程都可以使用命名信號量?

[英]Why are named semaphores usable by threads in any processes that know their names?

從APUE

POSIX信號燈有兩種樣式:已命名和未命名。 它們的創建和銷毀方式不同,但其他方面卻相同。 未命名的信號量僅存在於內存中,並且要求進程有權訪問內存才能使用這些信號量。 這意味着它們只能由相同進程中的線程或將相同內存范圍映射到其地址空間中的不同進程中的線程使用。 相反, 命名信號量是通過名稱訪問的,並且可以在任何知道其名稱的進程中由線程使用。

未命名信號量“只能由同一進程中的線程或已將相同內存范圍映射到其地址空間的不同進程中的線程使用”,因為“未命名信號量僅存在於內存中”。

已知信號量在任何知道其名稱的進程中可被線程使用的原因是什么?

謝謝。

sem_overview的手冊頁中:

在Linux上,命名信號量是在虛擬文件系統中創建的,通常安裝在/ dev / shm下,其名稱格式為sem.somename。

因此,可以用與普通文件類似的方式訪問“任何進程中的線程”。

然后,pthread庫可以將那些文件映射到內存。

您正在考慮這個倒退。 問題是:“如果我需要在不相關的進程之間同步使用共享資源,我該怎么辦?” 答案是“您可以給一個信號燈起一個名字,然后它就不限於在共享內存的進程中使用。”

為什么這樣有用? 好吧,用例可能並不常見-也許您從未遇到過-但它們確實存在。 在不相關的進程之間共享許多資源:數據庫,配置文件,串行端口,打印機隊列等等。 您可以在帶有鎖定文件的這些資源的共享使用之間進行調解,但是這很笨拙,最終您需要在每個項目上重新設計輪子。 另一方面,信號量易於使用,並且具有定義明確的文檔化語義。

但是,信號量的大多數使用確實是在共享內存的相關進程之間進行的。 而且您也不需要不必要地支付在文件系統中維護名稱的開銷。

因此,我們最終得到兩種信號量:便宜的低開銷的信號量最大的用例,以及較重的較高開銷的量信號,可以更廣泛地使用。 令人高興的是,語義和API非常相似,因此在開始使用命名信號量時,您無需學習全新的概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM