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

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

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

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

    最佳答案

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

         int mlock(const void *addr, size_t len);
    

    尽管shmctl的操作要复杂得多,但是:
       int shmctl(int shmid, SHM_LOCK, struct shmid_ds *buf);
    

    哪里:
    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 */
               ...
           };
    

    关于linux - Linux上的mlock()vs shmctl(SHM_LOCK)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11066976/

    10-09 03:47