Linux 上的 mlock() 与 shmctl(SHM_LOCK)?

Jos*_*man 5 linux memory

调用mlock()某个内存和调用shmctl(SHM_LOCK)同一内存有什么区别?

这些是我能确定的唯一区别:

  • mlock()保证在返回时加载所有锁定的页面。 shmctl(SHM_LOCK)防止交换,但不会主动加载非驻留页面。
  • shmctl(SHM_LOCK) 只能用于共享内存段。
  • shmctl(SHM_LOCK)SHM_LOCKED在共享内存段的权限上设置一个额外的标志 ( )。

还有其他区别吗?特别是,是否有任何理由不在mlock()共享内存段上使用?

Bre*_*tão 2

首先,mlock()是在RAM中锁定进程内存的系统调用,shmctl(X,SHM_LOCK,Y)用于共享(IPC)内存,这需要所有生产者和消费者更多的控制,所以,这就是为什么 mlock() 系统调用更容易,因为:

     int mlock(const void *addr, size_t len);
Run Code Online (Sandbox Code Playgroud)

而 shmctl 操作起来要复杂得多,如下:

   int shmctl(int shmid, SHM_LOCK, struct shmid_ds *buf);
Run Code Online (Sandbox Code Playgroud)

其中: buf 参数是指向 shmid_ds 结构的指针,定义如下:

       struct shmid_ds {
           struct ipc_perm shm_perm;    /* Ownership and permissions */
           size_t          shm_segsz;   /* Size of segment (bytes) */
           time_t          shm_atime;   /* Last attach time */
           time_t          shm_dtime;   /* Last detach time */
           time_t          shm_ctime;   /* Last change time */
           pid_t           shm_cpid;    /* PID of creator */
           pid_t           shm_lpid;    /* PID of last shmat(2)/shmdt(2) */
           shmatt_t        shm_nattch;  /* No. of current attaches */
           ...
       };
Run Code Online (Sandbox Code Playgroud)