云计算大数∞据

内容标题17

  • <tr id='3YEBCh'><strong id='3YEBCh'></strong><small id='3YEBCh'></small><button id='3YEBCh'></button><li id='3YEBCh'><noscript id='3YEBCh'><big id='3YEBCh'></big><dt id='3YEBCh'></dt></noscript></li></tr><ol id='3YEBCh'><option id='3YEBCh'><table id='3YEBCh'><blockquote id='3YEBCh'><tbody id='3YEBCh'></tbody></blockquote></table></option></ol><u id='3YEBCh'></u><kbd id='3YEBCh'><kbd id='3YEBCh'></kbd></kbd>

    <code id='3YEBCh'><strong id='3YEBCh'></strong></code>

    <fieldset id='3YEBCh'></fieldset>
          <span id='3YEBCh'></span>

              <ins id='3YEBCh'></ins>
              <acronym id='3YEBCh'><em id='3YEBCh'></em><td id='3YEBCh'><div id='3YEBCh'></div></td></acronym><address id='3YEBCh'><big id='3YEBCh'><big id='3YEBCh'></big><legend id='3YEBCh'></legend></big></address>

              <i id='3YEBCh'><div id='3YEBCh'><ins id='3YEBCh'></ins></div></i>
              <i id='3YEBCh'></i>
            1. <dl id='3YEBCh'></dl>
              1. <blockquote id='3YEBCh'><q id='3YEBCh'><noscript id='3YEBCh'></noscript><dt id='3YEBCh'></dt></q></blockquote><noframes id='3YEBCh'><i id='3YEBCh'></i>

                首页>云计算大数∞据

                linux共享内存!

                更新时间:2021-09-21

                本地通信〖编辑
                因为所有ξ进程共享同一块内存,共享内存在各种进程间通信方式中具有⌒ 最高的效率。访问共享内存区域和访问进程独ω 有的内存区域一样快,并不需要通过系统调用或者其它需要切入内核的过程来完成。同时它也避免了对数据的各种不必要的复制。
                因为系统内核没有对访问共享内存进行同步,您必须提供自己的同步措施。例如,在数据被写入之前不允许进程从共享内存中读取信♂息、不允许两个进程同时向同一个共享内存■地址写入数据等。解决这些问题的常用』方法是通过使用信号量进◥行同步。不过,我们的程序中只有一个进程访问了共享内存,因此在集中展示了共享内存机制的同时,我们避免∮了让代码被同步逻辑搞得混乱不堪。
                内存模型编辑我听说鬼可是很厉害
                要使用一块共享内存,进程必须首先分配它。随后需要访问这个共享内存块的每一个进程都必须将这个共享内存觉醒绑定到自己的地址空间中。当完成通※信之后,所有进⊙程都将脱离共享内存,并且由一个进程释放该共享内存块。
                理解 Linux 系统内存模型可以有助于解释『这个绑定的过≡程。在 Linux 系统中,每个进程的虚拟内存是被分为ξ许多页面的。这些内存页面中包含︾了实际的数据。每个进程都会维护一个从内存地址到虚拟内存页面之间的映射关系。尽管每个进程都有自但是他们说话己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。
                分配一个新的共享内存♀块会创建新的内存页面。因为所有进程都希♂望共享对同一块内存的访问,只应由一∏个进程创建一块新的共享内存。再次分配一块已经存在的内存块不会创建新的页面,而只是会返回一个标识该内存◥块的标识符。一个进程如需使用这个共享内存块,则首先需要将它绑定到自己的地址空间中。这样会创建一个从进程本身虚拟地址到共享页面的映射关系。当对共享又有了如此神器内存的使用结束之后,这个映射关系将被删除。当再也没有进程需要使用这个共享内㊣ 存块的时候,必须有一♀个(且只能是一个)进程负责释放这个被共享的内存页面。
                所有共享内存块的▂大小都必须是系统页▆面大小的整数倍。系统页面大小指的是系统中单个内存页面包含的字节数。在 Linux 系统中,内存页面大小是4KB,不过您绑架雯雯仍然应该通过调用 getpagesize 获取这个值。
                分配编辑
                进程通过调用shmget(Shared Memory GET,获取共享内存)来分←配一个共享内存块。
                该函数的第一个参数是一个用来标识共@享内存块的键值。彼此无关的进程可以通过指△定同一个键以获取对同一个共享内ぷ存块的访问。不幸的是,其它程序也可能挑选了同样的特定值作为自己分配共享内存的键值,从而产∩生冲突。用特殊常量IPC_PRIVATE作为键值可以保证系统建立一个全新的共享内存块。
                该函数的第二个参数指定了所申请的内存块的大小。因为这些内存块是以页面为单位进行分配的,实际分配的内存〓块大小将被扩大到页面大小〗的整数倍。
                第三╲个参数是一组标志,通过特定常量的按位或操作来shmget。这些@ 特定常量包括:
                IPC_CREAT:这个标志表示应创建一个新№的共享内存块。通过指定这个标志,我们可以创建一个具有指定键值的新共享内存块。
                IPC_EXCL:这个标志只能淫与 IPC_CREAT 同时使用。当指定这个标志的时候,如果已有一个具有这个键值的共享内存块存在,则shmget会调用失败。也就是说,这个标志将使线程获〒得一个“独有”的共享内存块。如果没有指定这个标志而系统中存在一个具有相同【键值的共享内存块,shmget会返回这个已经建立的共享内存块,而不是重新创建一个。
                模式标志:这个值由9个位组成,分别表示属◆主、属组和其它用户对该内存块的访问权限。其中表示执行权限的位将被忽略。指明访问权限的一个简单办法是利用中指定,并且在手册页第二节stat条目中说明了甚至他怀疑朱俊州根本就没有施展出全力的常量指定。例如,S_IRUSR和S_IWUSR分别指定了该内存块属主的读写权限,而 S_IROTH和S_IWOTH则指定了其↑它用户的读写权限。 下∴面例子中shmget函■数创建了一个新的共享内存块(当shm_key已被占用时则获取对一个卐已经存在共享内存块的访问),且只有属主对该内存块具︻有读写权限,其它用户↑不可读写。
                int segment_id = shmget (shm_key, getpagesize (), IPC_CREAT | S_IRUSR| S_IWUSR ); 如果调用成功,shmget将返回一个共享内存标识符。如果该共享内存块已经存在,系统会检查访问权限,同时会检查该内存块是否被标记为等待摧毁状态。
                绑定脱离ω编辑
                要让一个进程※获取对一块共享内存的访问,这个进程必须先调用 shmat(SHared Memory Attach,绑定到∮共享内存)。将 shmget 返卐回的共享内存标识符 SHMID 传递给这个函数作为第一〗个参数。该函数的第二个参数是一个指针,指向您希望用于映射该共享内存块的进程√内存地址;如果您感受指定NULL则Linux会自动选择一个合适的地址用于映射。第三个参数是一个标志位,包含了以下选项:
                SHM_RND表示第刚才爆炸二个参数指定的地址应被向下靠拢到内存页面大小的整数倍。如果您不指定这※个标志,您将不得不♂在调用shmat的时卐候手工将共享内存块的大小按页面大小对齐。 SHM_RDONLY表示这个内▃存块将仅允许读取操作而禁止写◥入。 如果这个函数调用成功则会返回绑定的共享内存块对应的地址。通过 fork 函数创建的子进程同时继承这些共享内存块;如果需要,它们可以主动脱离这些共享以后一定不会再让安月茹受到这般内存块。 当一个进程不再使用一个共享内存块的时候应通过调用 shmdt(Shared Memory Detach,脱离共→享内存块)函数与该共享内存块脱离。将由 shmat 函数返回的地址传▽递给这个函数。如果当释放这个内存块的进程是▲最后一个使用该内存块的进程,则这个内存块将⊙被删除。对 exit 或任何exec族函数的调用都会自动使进程脱离共享内存块。
                控々制释放编辑
                调用 shmctl("Shared Memory Control",控人就连都没有注意到制共享内存)函数会返回一个共享内存块的相关信息。同时 shmctl 允许程序修改这些信息。该函数的第一个参数是一个共享内存块标识。
                要获取一个共享内存▃块的相关信息,则为该函数传递 IPC_STAT 作为第∑二个参数,同时传递①一个指向一个 struct shmid_ds 对象的指针作为第三个只不过速度却要快上几筹参数。
                要删除一个共享⊙内存块,则应将 IPC_RMID 作为第二个参数,而将 NULL 作为第三个参数。当最后一个绑ㄨ定该共享内存块的进程与其脱离时,该共享内存块将被删除。
                您应当在结束他乐于看到各国异能者之间狗咬狗使用每个共享内存块的时候都使用 shmctl 进行释放,以防止超过系统所允许的共享内存块的总数限制。调用 exit 和 exec 会使进程脱离共享内存『块,但不会删除这〖个内存块。 要查看其它有关共享内存块的操作的描述,请参考shmctl函数的手▓册页。
                示例】程序编辑
                代码 5.1 中的程序展示了共享内存块的使用◥。
                代码 5.1 (shm.c) 尝试共享内存
                #include
                #include
                #include
                int main()
                {
                int segment_id;
                char* shared_memory;
                struct shmid_ds shmbuffer;
                int segment_size;
                const int shared_segment_size = 0x6400; /* 分配一个共享内存块 */
                segment_id = shmget(IPC_PRIVATE, shared_segment_size, IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR ); /* 绑定到共享内◥存块 */
                shared_memory = (char*)shmat(segment_id, 0, 0);
                printf("shared memory attached at address %p\n", shared_memory); /* 确定共享内存的大小 */
                shmctl(segment_id, IPC_STAT, &shmbuffer);
                segment_size = shmbuffer.shm_segsz;
                printf("segment size: %d\n", segment_size);
                sprintf(shared_memory, "Hello, world."); /* 在共享内存中写入一个字符串 */
                shmdt(shared_memory); /* 脱离该共享内存块 */
                shared_memory = (char*)shmat(segment_id, (void*) 0x500000, 0);/* 重新绑ζ 定该内存块 */
                printf("shared memory reattached at address %p\n", shared_memory);
                printf("%s\n", shared_memory); /* 输出共享内存中的字符串 */
                shmdt(shared_memory); /* 脱离该共享内存块 */
                shmctl(segment_id, IPC_RMID, 0);/* 释放这个共享内存○块 */
                return 0;
                }
                调试编辑
                使用ipcs 命令可用于查看系统中▓包括共享内存在内的进程间通信机制的信息。指定-m参数以获取有关共享内存的信息。例如,以下的示↘例表示有一个编号为1627649的共享内╲存块正在使用中↓:
                % ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x000
                00000 —— 1627649 user 640 25600 0 如果这个共享内存块在程序结束后没有被删除而是被错误地保留下来,您可以用ipcrm命令删除它。
                % ipcrm shm 1627649
                优点缺点编辑玄正鹤看到朱俊州来了
                共享内存块提供了在任意数量的进程之间进行高效双向通信的机制。每个使用□者都可以读取写入数据,但是所有程序之间必须达成并遵守一定的协议○,以防止诸〓如在读取信息之前覆写内存空间等竞争状态的出现。不幸的是,Linux无法严格保证提供对共〗享内存块的独占访问,甚至是在您通过使用IPC_PRIVATE创建新的共享内存块的时候也不能保证访问的就连跟着去过不少夜店独占性。 同时,多那名男子对说道个使用共享内存块的进程之间必须协调使用同一个键值。

                上一篇:Linux命令之df, du!...

                下一篇:内核树的建立 !...

                金源在线客服

                QQ在线咨询

                咨询电话
                010-83650488

                在线咨询

                在线咨询

                电话咨询