Linux上的mlock()和shmctl(SHM_LOCK)有什么区别?

5
调用mlock()和在相同的内存上调用shmctl(SHM_LOCK)有什么区别呢?
这些是我所能确定的唯一区别:
- mlock()保证所有锁定的页面在其返回时已被加载。而shmctl(SHM_LOCK)防止交换,但不主动加载非驻留页面。 - shmctl(SHM_LOCK)只能用于共享内存段。 - shmctl(SHM_LOCK)在共享内存段的权限中设置了一个额外的标志(SHM_LOCKED)。
还有其他的区别吗?特别是,在共享内存段上使用mlock()是否有任何不良影响?

我不确定,但似乎mlockshmctl更严格。因此,它可能会施加限制,降低效率。 - Shahbaz
1个回答

2

首先,mlock()是用于锁定进程内存的系统调用,而shmctl(X,SHM_LOCK,Y)用于进行共享(IPC)内存操作,这需要所有生产者和消费者都更多地控制,因此,这就是为什么mlock()系统调用要简单得多的原因:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接