mlock()
调用某些内存和调用shmctl(SHM_LOCK)
同一内存有什么区别?
这些是我能确定的唯一区别:
mlock()
保证在返回时加载所有锁定的页面。shmctl(SHM_LOCK)
防止交换,但不会主动加载非常驻页面。shmctl(SHM_LOCK)
只能用于共享内存段。shmctl(SHM_LOCK)
SHM_LOCKED
在共享内存段的权限上设置一个额外的标志 ( )。
还有其他区别吗?特别是,有什么理由不在mlock()
共享内存段上使用吗?
首先,mlock() 是用于将进程内存锁定在 RAM 中的 syscall,而 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 */
...
};