iis服务器助手广告
返回顶部
首页 > 资讯 > 操作系统 >Linux中如何共享存储
  • 330
分享到

Linux中如何共享存储

2023-06-16 08:06:12 330人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“linux中如何共享存储”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中如何共享存储”这篇文章吧。核心概念进程是运行着的程序,每个进程都有着它自己的地址空间,

这篇文章主要为大家展示了“linux中如何共享存储”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中如何共享存储”这篇文章吧。

核心概念

进程是运行着的程序,每个进程都有着它自己的地址空间,这些空间由进程被允许访问的内存地址组成。进程有一个或多个执行线程,而线程是一系列执行指令的集合单线程进程就只有一个线程,而多线程的进程则有多个线程。一个进程中的线程共享各种资源,特别是地址空间。另外,一个进程中的线程可以直接通过共享内存来进行通信,尽管某些现代语言(例如 Go)鼓励一种更有序的方式,例如使用线程安全的通道。当然对于不同的进程,默认情况下,它们能共享内存。

有多种方法启动之后要进行通信的进程,下面所举的例子中主要使用了下面的两种方法:

  • 一个终端被用来启动一个进程,另外一个不同的终端被用来启动另一个。

  • 在一个进程(父进程)中调用系统函数 fork,以此生发另一个进程(子进程)。

***个例子采用了上面使用终端的方法。这些代码示例的 ZIP 压缩包可以从我的网站下载到。

共享文件

程序员对文件访问应该都已经很熟识了,包括许多坑(不存在的文件、文件权限损坏等等),这些问题困扰着程序对文件的使用。尽管如此,共享文件可能是最为基础的 IPC 机制了。考虑一下下面这样一个相对简单的例子,其中一个进程(生产者 producer)创建和写入一个文件,然后另一个进程(消费者 consumer)从这个相同的文件中进行读取:

          writes +-----------+ readsproducer-------->| disk file |<-------consumer                 +-----------+

在使用这个 IPC 机制时最明显的挑战是竞争条件可能会发生:生产者和消费者可能恰好在同一时间访问该文件,从而使得输出结果不确定。为了避免竞争条件的发生,该文件在处于状态时必须以某种方式处于被状态,从而阻止在操作执行时和其他操作的冲突。在标准系统库中与锁相关的 api 可以被总结如下:

  • 生产者应该在写入文件时获得一个文件的排斥锁。一个排斥锁最多被一个进程所拥有。这样就可以排除掉竞争条件的发生,因为在锁被释放之前没有其他的进程可以访问这个文件。

  • 消费者应该在从文件中读取内容时得到至少一个共享锁。多个读取者可以同时保有一个共享锁,但是没有写入者可以获取到文件内容,甚至在当只有一个读取者保有一个共享锁时。

共享锁可以提升效率。假如一个进程只是读入一个文件的内容,而不去改变它的内容,就没有什么原因阻止其他进程来做同样的事。但如果需要写入内容,则很显然需要文件有排斥锁。

标准的 I/O 库中包含一个名为 fcntl 的实用函数,它可以被用来检查或者操作一个文件上的排斥锁和共享锁。该函数通过一个文件描述符(一个在进程中的非负整数值)来标记一个文件(在不同的进程中不同的文件描述符可能标记同一个物理文件)。对于文件的锁定, Linux 提供了名为 flock 的库函数,它是 fcntl 的一个精简包装。***个例子中使用 fcntl 函数来暴露这些 API 细节。

示例 1. 生产者程序
#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h> #define FileName "data.dat" void report_and_exit(const char* msg) {  [perror][4](msg);  [exit][5](-1); } int main() {  struct flock lock;  lock.l_type = F_WRLCK;      lock.l_whence = SEEK_SET;   lock.l_start = 0;           lock.l_len = 0;             lock.l_pid = getpid();       int fd;   if ((fd = open(FileName, O_RDONLY)) < 0)      report_and_exit("open to read failed...");     fcntl(fd, F_GETLK, &lock);   if (lock.l_type != F_UNLCK)    report_and_exit("file is still write locked...");   lock.l_type = F_RDLCK;   if (fcntl(fd, F_SETLK, &lock) < 0)    report_and_exit("can't get a read-only lock...");     int c;   while (read(fd, &c, 1) > 0)        write(STDOUT_FILENO, &c, 1);      lock.l_type = F_UNLCK;  if (fcntl(fd, F_SETLK, &lock) < 0)    report_and_exit("explicit unlocking failed...");   close(fd);  return 0;}

上面生产者程序的主要步骤可以总结如下:

  • 这个程序首先声明了一个类型为 struct flock 的变量,它代表一个锁,并对它的 5 个域做了初始化。***个初始化


    使得这个锁为排斥锁(read-write)而不是一个共享锁(read-only)。假如生产者获得了这个锁,则其他的进程将不能够对文件做读或者写操作,直到生产者释放了这个锁,或者显式地调用 fcntl,又或者隐式地关闭这个文件。(当进程终止时,所有被它打开的文件都会被自动关闭,从而释放了锁)

    1. lock.l_type = F_WRLCK;

  • 上面的程序接着初始化其他的域。主要的效果是整个文件都将被锁上。但是,有关锁的 API 允许特别指定的字节被上锁。例如,假如文件包含多个文本记录,则单个记录(或者甚至一个记录的一部分)可以被锁,而其余部分不被锁。

  • ***次调用 fcntl


    尝试排斥性地将文件锁住,并检查调用是否成功。一般来说, fcntl 函数返回 -1 (因此小于 0)意味着失败。第二个参数 F_SETLK 意味着 fcntl 的调用不是堵塞的;函数立即做返回,要么获得锁,要么显示失败了。假如替换地使用 F_SETLKW(末尾的 W 代指等待),那么对 fcntl 的调用将是阻塞的,直到有可能获得锁的时候。在调用 fcntl 函数时,它的***个参数 fd 指的是文件描述符,第二个参数指定了将要采取的动作(在这个例子中,F_SETLK 指代设置锁),第三个参数为锁结构的地址(在本例中,指的是 &lock)。

    1. if (fcntl(fd, F_SETLK, &lock) < 0)

  • 假如生产者获得了锁,这个程序将向文件写入两个文本记录。

  • 在向文件写入内容后,生产者改变锁结构中的 l_type 域为 unlock 值:


    并调用 fcntl 来执行解锁操作。***程序关闭了文件并退出。

    1. lock.l_type = F_UNLCK;

示例 2. 消费者程序
#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h> #define FileName "data.dat" void report_and_exit(const char* msg) {  [perror][4](msg);  [exit][5](-1); } int main() {  struct flock lock;  lock.l_type = F_WRLCK;      lock.l_whence = SEEK_SET;   lock.l_start = 0;           lock.l_len = 0;             lock.l_pid = getpid();       int fd;   if ((fd = open(FileName, O_RDONLY)) < 0)      report_and_exit("open to read failed...");     fcntl(fd, F_GETLK, &lock);   if (lock.l_type != F_UNLCK)    report_and_exit("file is still write locked...");   lock.l_type = F_RDLCK;   if (fcntl(fd, F_SETLK, &lock) < 0)    report_and_exit("can't get a read-only lock...");     int c;   while (read(fd, &c, 1) > 0)        write(STDOUT_FILENO, &c, 1);      lock.l_type = F_UNLCK;  if (fcntl(fd, F_SETLK, &lock) < 0)    report_and_exit("explicit unlocking failed...");   close(fd);  return 0;}

相比于锁的 API,消费者程序会相对复杂一点儿。特别的,消费者程序首先检查文件是否被排斥性的被锁,然后才尝试去获得一个共享锁。相关的代码为:

lock.l_type = F_WRLCK;...fcntl(fd, F_GETLK, &lock); if (lock.l_type != F_UNLCK)  report_and_exit("file is still write locked...");

fcntl 调用中的 F_GETLK 操作指定检查一个锁,在本例中,上面代码的声明中给了一个 F_WRLCK 的排斥锁。假如特指的锁不存在,那么 fcntl 调用将会自动地改变锁类型域为 F_UNLCK 以此来显示当前的状态。假如文件是排斥性地被锁,那么消费者将会终止。(一个更健壮的程序版本或许应该让消费者会儿,然后再尝试几次。)

假如当前文件没有被锁,那么消费者将尝试获取一个共享(read-only)锁(F_RDLCK)。为了缩短程序,fcntl 中的 F_GETLK 调用可以丢弃,因为假如其他进程已经保有一个读写锁,F_RDLCK   的调用就可能会失败。重新调用一个只读锁能够阻止其他进程向文件进行写的操作,但可以允许其他进程对文件进行读取。简而言之,共享锁可以被多个进程所保有。在获取了一个共享锁后,消费者程序将立即从文件中读取字节数据,然后在标准输出中打印这些字节的内容,接着释放锁,关闭文件并终止。

下面的 % 为命令行提示符,下面展示的是从相同终端开启这两个程序的输出:

% ./producerProcess 29255 has written to data file... % ./consumerNow is the winter of our discontentMade glorious summer by this sun of York

在本次的代码示例中,通过 IPC  传输的数据是文本:它们来自莎士比亚的戏剧《理查三世》中的两行台词。然而,共享文件的内容还可以是纷繁复杂的,任意的字节数据(例如一个电影)都可以,这使得文件共享变成了一个非常灵活的  IPC 机制。但它的缺点是文件获取速度较慢,因为文件的获取涉及到读或者写。同往常一样,编程总是伴随着折中。下面的例子将通过共享内存来做  IPC,而不是通过共享文件,在性能上相应的有极大的提升。

共享内存

对于共享内存,Linux 系统提供了两类不同的 API:传统的 System V API 和更新一点的 POSIX  API。在单个应用中,这些 API 不能混用。但是,POSIX  方式的一个坏处是它的特性仍在发展中,并且依赖于安装的内核版本,这非常影响代码的可移植性。例如,默认情况下,POSIX API 用内存映射文件来实现共享内存:对于一个共享的内存段,系统为相应的内容维护一个备份文件。在 POSIX 规范下共享内存可以被配置为不需要备份文件,但这可能会影响可移植性。我的例子中使用的是带有备份文件的 POSIX API,这既结合了内存获取的速度优势,又获得了文件存储的持久性。

下面的共享内存例子中包含两个程序,分别名为 memwritermemreader,并使用信号量来调整它们对共享内存的获取。在任何时候当共享内存进入一个写入者场景时,无论是多进程还是多线程,都有遇到基于内存的竞争条件的风险,所以,需要引入信号量来协调(同步)对共享内存的获取。

memwriter 程序应当在它自己所处的终端首先启动,然后 memreader 程序才可以在它自己所处的终端启动(在接着的十几秒内)。memreader 的输出如下:

This is the way the world ends...

在每个源程序的最上方注释部分都解释了在编译它们时需要添加的链接参数。

首先让我们复习一下信号量是如何作为一个同步机制工作的。一般的信号量也被叫做一个计数信号量,因为带有一个可以增加的值(通常初始化为  0)。考虑一家租用自行车的商店,在它的库存中有 100 辆自行车,还有一个供职员用于租赁的程序。每当一辆自行车被租出去,信号量就增加  1;当一辆自行车被还回来,信号量就减 1。在信号量的值为 100 之前都还可以进行租赁业务,但如果等于 100  时,就必须停止业务,直到至少有一辆自行车被还回来,从而信号量减为 99。

二元信号量是一个特例,它只有两个值:0 和 1。在这种情况下,信号量的表现为互斥量(一个互斥的构造)。下面的共享内存示例将把信号量用作互斥量。当信号量的值为 0 时,只有 memwriter 可以获取共享内存,在写操作完成后,这个进程将增加信号量的值,从而允许 memreader 来读取共享内存。

示例 3. memwriter 进程的源程序
#include <stdio.h>#include <stdlib.h>#include <sys/mman.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <semaphore.h>#include <string.h>#include "shmem.h" void report_and_exit(const char* msg) {  [perror][4](msg);  [exit][5](-1);} int main() {  int fd = shm_open(BackingFile,                  O_RDWR | O_CREAT,             AccessPerms);       if (fd < 0) report_and_exit("Can't open shared mem segment...");   ftruncate(fd, ByteSize);    caddr_t memptr = mmap(NULL,                   ByteSize,               PROT_READ | PROT_WRITE,             MAP_SHARED,             fd,                     0);           if ((caddr_t) -1  == memptr) report_and_exit("Can't get segment...");   [fprintf][7](stderr, "shared mem address: %p [0..%d]\n", memptr, ByteSize - 1);  [fprintf][7](stderr, "backing file:       /dev/shm%s\n", BackingFile );     sem_t* semptr = sem_open(SemaphoreName,                O_CREAT,                      AccessPerms,                  0);              if (semptr == (void*) -1) report_and_exit("sem_open");   [strcpy][8](memptr, MemContents);      if (sem_post(semptr) < 0) report_and_exit("sem_post");   sleep(12);      munmap(memptr, ByteSize);   close(fd);  sem_close(semptr);  shm_unlink(BackingFile);   return 0;}

下面是 memwritermemreader 程序如何通过共享内存来通信的一个总结:

  • 上面展示的 memwriter 程序调用 shm_open 函数来得到作为系统协调共享内存的备份文件的文件描述符。此时,并没有内存被分配。接下来调用的是令人误解的名为 ftruncate 的函数


    它将分配 ByteSize 字节的内存,在该情况下,一般为大小适中的 512 字节。memwritermemreader 程序都只从共享内存中获取数据,而不是从备份文件。系统将负责共享内存和备份文件之间数据的同步。

    1. ftruncate(fd, ByteSize);

  • 接着 memwriter 调用 mmap 函数:


    来获得共享内存的指针。(memreader 也做一次类似的调用。) 指针类型 caddr_tc 开头,它代表 calloc,而这是动态初始化分配的内存为 0 的一个系统函数。memwriter 通过库函数 strcpy字符串复制)来获取后续操作的 memptr

    1. caddr_t memptr = mmap(NULL,

    2.                  ByteSize,

    3.                  PROT_READ | PROT_WRITE,

    4.                  MAP_SHARED,

    5.                  fd,

    6.                  0);

  • 到现在为止,memwriter 已经准备好进行写操作了,但首先它要创建一个信号量来确保共享内存的排斥性。假如 memwriter 正在执行写操作而同时 memreader 在执行读操作,则有可能出现竞争条件。假如调用 sem_open 成功了:


    那么,接着写操作便可以执行。上面的 SemaphoreName(任意一个唯一的非空名称)用来在 memwritermemreader 识别信号量。初始值 0 将会传递给信号量的创建者,在这个例子中指的是 memwriter 赋予它执行操作的权利。

    1. sem_t* semptr = sem_open(SemaphoreName,

    2.                     O_CREAT,

    3.                     AccessPerms,

    4.                     0);

  • 在写操作完成后,memwriter* 通过调用sem_post` 函数将信号量的值增加到 1:


    增加信号了将释放互斥锁,使得 memreader 可以执行它的操作。为了更好地测量,memwriter 也将从它自己的地址空间中取消映射,


    这将使得 memwriter 不能进一步地访问共享内存。

    1. munmap(memptr, ByteSize); #include <stdio.h>#include <stdlib.h>#include <sys/mman.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <semaphore.h>#include <string.h>#include "shmem.h" void report_and_exit(const char* msg) {  [perror][4](msg);  [exit][5](-1);} int main() {  int fd = shm_open(BackingFile, O_RDWR, AccessPerms);    if (fd < 0) report_and_exit("Can't get file descriptor...");     caddr_t memptr = mmap(NULL,                   ByteSize,               PROT_READ | PROT_WRITE,             MAP_SHARED,             fd,                     0);           if ((caddr_t) -1 == memptr) report_and_exit("Can't access segment...");     sem_t* semptr = sem_open(SemaphoreName,                O_CREAT,                      AccessPerms,                  0);              if (semptr == (void*) -1) report_and_exit("sem_open");     if (!sem_wait(semptr)) {     int i;    for (i = 0; i < [strlen][6](MemContents); i++)      write(STDOUT_FILENO, memptr + i, 1);     sem_post(semptr);  }     munmap(memptr, ByteSize);  close(fd);  sem_close(semptr);  unlink(BackingFile);  return 0;}

      memwritermemreader 程序中,共享内存的主要着重点都在 shm_openmmap 函数上:在成功时,***个调用返回一个备份文件的文件描述符,而第二个调用则使用这个文件描述符从共享内存段中获取一个指针。它们对 shm_open 的调用都很相似,除了 memwriter 程序创建共享内存,而 `memreader 只获取这个已经创建的内存:

      int fd = shm_open(BackingFile, O_RDWR | O_CREAT, AccessPerms); int fd = shm_open(BackingFile, O_RDWR, AccessPerms); 

      有了文件描述符,接着对 mmap 的调用就是类似的了:

      caddr_t memptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

      mmap 的***个参数为 NULL,这意味着让系统自己决定在虚拟内存地址的哪个地方分配内存,当然也可以指定一个地址(但很有技巧性)。MAP_SHARED 标志着被分配的内存在进程中是共享的,***一个参数(在这个例子中为 0 ) 意味着共享内存的偏移量应该为***个字节。size 参数特别指定了将要分配的字节数目(在这个例子中是 512);另外的保护参数(AccessPerms)暗示着共享内存是可读可写的。

      memwriter 程序执行成功后,系统将创建并维护备份文件,在我的系统中,该文件为 /dev/shm/shMemEx,其中的 shMemEx 是我为共享存储命名的(在头文件 shmem.h 中给定)。在当前版本的 memwritermemreader 程序中,下面的语句

      shm_unlink(BackingFile); 

      将会移除备份文件。假如没有 unlink 这个语句,则备份文件在程序终止后仍然持久地保存着。

      memreadermemwriter 一样,在调用 sem_open 函数时,通过信号量的名字来获取信号量。但 memreader 随后将进入等待状态,直到 memwriter 将初始值为 0 的信号量的值增加。

      if (!sem_wait(semptr)) { 

      一旦等待结束,memreader 将从共享内存中读取 ASCII 数据,然后做些清理工作并终止。

      共享内存 API 包括显式地同步共享内存段和备份文件。在这次的示例中,这些操作都被省略了,以免文章显得杂乱,好让我们专注于内存共享和信号量的代码。

      即便在信号量代码被移除的情况下,memwritermemreader 程序很大几率也能够正常执行而不会引入竞争条件:memwriter 创建了共享内存段,然后立即向它写入;memreader 不能访问共享内存,直到共享内存段被创建好。然而,当一个写操作处于混合状态时,***实践需要共享内存被同步。信号量 API 足够重要,值得在代码示例中着重强调。


      以上是“Linux中如何共享存储”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网操作系统频道!

--结束END--

本文标题: Linux中如何共享存储

本文链接: https://www.lsjlt.com/news/282873.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux中如何共享存储
    这篇文章主要为大家展示了“Linux中如何共享存储”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中如何共享存储”这篇文章吧。核心概念进程是运行着的程序,每个进程都有着它自己的地址空间,...
    99+
    2023-06-16
  • Linux下如何共享储存
    这篇文章主要介绍了Linux下如何共享储存,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。192.168.0.1 需要访问192.168.0.2的资源文件。1.检查192.16...
    99+
    2023-06-27
  • Linux下如何搭建iSCSI共享存储
    这篇文章给大家分享的是有关Linux下如何搭建iSCSI共享存储的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、简介      iSCSI(internet SCSI)技术由IBM...
    99+
    2023-06-04
  • Linux中如何共享内存
    这篇文章给大家分享的是有关Linux中如何共享内存的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 共享内存的概念及使用过程1)共享内存的概念共享内存是IPC机制中的一种。共享内存:即允许两个或多个进程共享一个给...
    99+
    2023-06-15
  • Kubernetes如何共享Ceph存储
    这篇文章主要介绍“Kubernetes如何共享Ceph存储”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Kubernetes如何共享Ceph存储”文章能帮助大家解决问题。Kubernetes pod...
    99+
    2023-06-27
  • Linux如何配置nfs共享存储服务
    这篇“Linux如何配置nfs共享存储服务”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux如何配置nfs共享存储服务...
    99+
    2023-06-28
  • linux怎么挂载共享存储
    可以通过以下步骤在Linux系统上挂载共享存储: 确保已安装必要的软件:通常情况下,挂载共享存储需要安装NFS或Samba等软件包...
    99+
    2024-04-09
    linux
  • NFS共享存储
    一、NFS共享存储服务概述 1、NFS的概念及优点 NFS是一种基于TCP/IP传输的网络文件系统协议。 通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源;对于大多数负载均衡群集来说,使用NFS协议来共享数据...
    99+
    2023-09-02
    网络 服务器 运维 linux
  • Redhat中如何搭建NFS共享存储服务
    这篇文章主要介绍“Redhat中如何搭建NFS共享存储服务”,在日常操作中,相信很多人在Redhat中如何搭建NFS共享存储服务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redhat中如何搭建NFS共享存...
    99+
    2023-06-27
  • vmware中怎么设置共享存储
    vmware中怎么设置共享存储,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。vmware设置共享存储(RAC) 之前一直使用O...
    99+
    2024-04-02
  • Fedora中如何配置网络存储和文件共享
    在Fedora中配置网络存储和文件共享可以通过Samba进行。以下是在Fedora中配置Samba的步骤: 安装Samba软件包:...
    99+
    2024-04-09
    Fedora
  • MySQL如何实现高可用+共享存储NFS
    小编给大家分享一下MySQL如何实现高可用+共享存储NFS,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!规划图1、首先进行资源的...
    99+
    2024-04-02
  • Linux中如何挂载windows共享
    这篇文章主要介绍“Linux中如何挂载windows共享”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux中如何挂载windows共享”文章能帮助大家解决问题。在我们开始之前要实现这个,你需要...
    99+
    2023-06-27
  • Linux如何实现进程间共享内存
    这篇文章主要介绍“Linux如何实现进程间共享内存”,在日常操作中,相信很多人在Linux如何实现进程间共享内存问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux如何实现进程间共享内存”的疑惑有所帮助!...
    99+
    2023-06-27
  • virtualbo中linux如何共享文件
    这篇文章主要介绍virtualbo中linux如何共享文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先要安装VirtualBox的增强版功能(VBoxGuestAdditions)  在 设备--->安装...
    99+
    2023-06-09
  • 【Linux】system V 共享内存
    文章目录 system V1. 共享内存原理第一阶段原理第二阶段原理 2. 直接写代码--编写代码进行原理介绍shmget函数ftok函数key值用法 1. 创建key值2. 创建共享内存 获取共享内存3. 将自己和共...
    99+
    2023-08-21
    linux 服务器 运维
  • Linux系统共享内存该如何理解
    这篇文章主要为大家分析了Linux系统共享内存该如何理解的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux系统共享内存该如何理解”的知识吧。共享内存在...
    99+
    2023-06-28
  • CentOS中如何使用共享内存
    CentOS中如何使用共享内存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效...
    99+
    2023-06-10
  • Linux中怎么实现共享内存
    Linux中怎么实现共享内存,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、概念共享内存是被多个进程共享的一部分物理内存,是进程间共享数据的最快的一种方法。&...
    99+
    2023-06-12
  • 配置Kubernetes共享使用Ceph存储
    目录...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作