飞哥大英雄-亚搏美女直播-亚搏美女直播app

同享内存是进程间通讯中最简略的方法之一。同享内存答应两个或更多进程拜访同一块内存,就好像malloc()函数向不同进程回来了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时分,其它进程都会察觉到这个更改。

本地通讯

由于一切进程同享同一块内存,同享内存在各种进程间通讯方法中具有最高的功率。拜访同享内存区域和拜访进程独有的内存区域相同快,并不需求经过体系调用或许其它需求切入内核的进程来完结。一起它也避免了对数据的各种不必要的仿制。

由于体系内核没有对拜访同享内存进行同步,您有必要供给自己的同步方法。例如,在数据被写入之前不答应进程从同享内存中读取信息、不答应两个进程一起向同一个同享内存地址写入数据等。处理这些问题的常用方法是经过运用信号量进行同步。不过,咱们的程序中只要一个进程拜访了同享内存,因此在会集展现了同享内存机制的一起,咱们避免了让代码被同步逻辑搞得紊乱不胜。

内存模型

要运用一块同享内存,进程有必要首要分配它。随后需求拜访这个同享内存块的每一个进程都有必要将这个同享内存绑定到自己的地址空间中。当完结通讯之后,一切进程都将脱离同享内存,而且由一个进程开释该同享内存块。

了解 Linux 体系内存模型能够有助于解说这个绑定的进程。在 Linux 体系中,每个进程的虚拟内存是被分为许多页面的。这些内存页面中包含了实践的数据。每个进程都会保护一个从内存地址到虚拟内存页面之间的映射联系。虽然每个进程都有自己的内存地址,不同的进程能够一起将同一个内存页面映射到自己的地址空间中,然后到达同享内存的意图。

分配一个新的同享内存块会创立新的内存页面。由于一切进程都期望同享对同一块内存的拜访,只应由一个进程创立一块新的同享内存。再飞哥大英雄-亚搏美人直播-亚搏美人直播app次分配一块现已存在的内存块飞哥大英雄-亚搏美人直播-亚搏美人直播app不会创立新的页面,而仅仅会回来一个标识该内存块标签19的标识符。一个进程如需使标签10用这个同享内存块,则首要需求将它绑定到自己的地址空间中。这样会创立一个从进程自身虚拟地址到同享页面的映射联系。当对同享内存的运用完毕之后,这个映射联系将被删去。当再也没有进程需求运用这个同享内存块的时分,有必要有一个(且只能是一个)进程担任开释这个被同享的内存页面。

一切同享内存块的巨细都有必要是体系页面巨细的整数倍。体系页面巨细指的是体系中单个内存页面包含的字节数。在 Linux 体系中,内存页面巨细是4KB,不过您依然应该经过调用 getpagesize 获取这个值。

分配

进程经过调用shmget(Shared Memory GET,获取同享内标签11存)来分配一个同享内存块。

该函数的第一个参数是一个用来标识同享内存块的键值。互相无关的进程能够经过指定同一个键以获取对同一个同享内存块的拜访。不幸的是,其它程序也或许挑选了相同的特定标签1值作为自己分配同享内存的键值,然后发生抵触。用特别常量IPC_PRIVATE作为键值能够确保体系树立一个全新的同享内存块。

该函数的第二个参数指定了所请求的内存块的巨细。飞哥大英雄-亚搏美人直播-亚搏美人直播app由于这些内存块是以页面为单位进行分配的,实践分配的内存块巨细将被扩大到页面巨细的整数倍。

第三个参数是一组标志,经过特定常量的按位或操作来shmget。这些特定常量包含:

IPC_CREAT:这个标志表明应创立一个新的同享内存块。经过指定这个标志,咱们能够创立一个具有指定键值的新同享内存块。

IPC_EXCL:这个标志只能与 IPC_CREAT 一起运用。当指定这个标志的时分,假如已有一个具有这个键值的同享内存块存在,则shmget会调用失利。也就是说,这个标志将使线程取得一个“独有”的同享内存块。假如没有指定这个标志而体系中存在一个具有相同键值的同享内存块,shmget会回来这个现已树立的同享内存块,而不是从头创立一个。

形式标志:这个值由9个位组成,别离表明属主、属组和其它用户对该内存块的拜访权限。其间表明履行权限的位将被疏忽。指明拜访权限的一个简略方法是运用中指定,而且在手册页第二节stat条目中说明晰的常量指定。例如,S_IRUSR和S飞哥大英雄-亚搏美人直播-亚搏美人直播app_IWUSR别离指定了该内存块属主的读写权限,而 S_IROTH和S_IWOTH则指定了其它用户的读写权限。 下面比如中shmget函数创立了一个新的同享内存块(当shm_key已被占用时则获取对一个现已存在同享内存块的拜访),且只要属主对该内存块具有读写权限,其它用户不行读写。

int segment_id = shmget (shm_key, getpagesize (), IPC_CREAT | S_IRUSR| S_IWUSR ); 假如调用成功,shmget将回来一个同享内存标识符。假如该同享内存块现已存在,体系会检查拜访权限,一起会检查该内存块是否被标记为等候炸毁状况。

绑定脱离

要让一个进程获取对一块同享内存的拜访,这个进程有必要先调用 shmat(SHared 飞哥大英雄-亚搏美人直播-亚搏美人直播appMemory Attach,绑定到同享内存)。将 shmget 回来的同享内存标识符 SHMID 传递给这个函数作为第一个参数。该函数的第二个参数是一个指针,指向您期望用于映射该同享内存块的进程内存地址;假如您指定NULL则Linux会主动挑选一个适宜的地址用于映射。第三个参数是一个标志位,包含了以下选项:

SHM_RND表明第二个参数指定的地址应被向下挨近到内存页面巨细的整数倍。假如您不指定这个标志,您将不得不在调用shmat的时分手艺将同享内存块的巨细按页面巨细对齐。 SHM_RDONLY表明这个内存块将仅答应读取操作而制止写入。 假如这个函数调用成功则会回来绑定的同享内存块对应的地址。经过 fork 函数创立的子进程一起承继这些同享内存块;假如需求,它们能够主动脱离这些同享内存块。 当一个进程不再运用一个同享内存块的时分应经过调用 shmdt(Share标签14d Memory De飞哥大英雄-亚搏美人直播-亚搏美人直播apptach,脱离同享内存块)函数与该同享内存块脱离。将由 shmat 函数回来的地址传递给这个函数。假如当开释这个内存块的进程是最终一个运用该内存块的进程,则这个内存块将被删去。对 exit 或任何exec族函数的调用都会主动使进程脱离同享内存块。

操控开释

调用 shmctl("Shared Memory Control",操控同享内存)函数会回来一个同享内存块的相关信息。一起 shmctl 答应程序修改这些信息。该函数的第一个参数是一个同享内存块标识。

要获取一个同享内存块的相关信息,则为该函数传递 IPC_STAT 作为第二个参数,一起传递一个指向一个 struct shmid_ds 目标的指针作为第三个参数。

要删去一个同享内存块,则飞哥大英雄-亚搏美人直播-亚搏美人直播app应将 IPC_RMID 作为第二个参数,而将 NULL 作为第三个参数。当最终一个绑定该同享内存块的进程与其脱离时,该同享内存块将被删去。

您应当在完毕运用每个同享内存块的时分都运用 shmctl 进行开释,以避免超越体系所答应的同享内存块的总数约束。调用 exit 和 exec 会使进程脱离同享内存块,但不会删去这个内存块。 要检查其它有关同享内存块的操作的描绘,请参阅shmctl函数的手册页。

长处缺陷

同享内存块供给了在恣意数量的进程之间进行高效双向通讯的机制。每个运用者都能够读取写入数据,可是一切程序之间有必要达到并恪守必定的协议,以避免比如在读取信息之前覆写内存空间等竞赛标签1状况的呈现。不幸的是,Linux无法严厉确保供给对同享内存块的独占拜访,乃至是在您经过运用IPC_PRIVATE创立新的同享内存块的时分也不能确保拜访的独占性。 一起,多个运用同享内存块的进程之间有必要和谐运用同一个键值。

Write a Comment

电子邮件地址不会被公开。 必填项已用 *标注