What is the difference between calling mlock()
on some memory and calling shmctl(SHM_LOCK)
on that same memory?
These are the only differences I can ascertain:
mlock()
guarantees that all locked pages are loaded when it returns. shmctl(SHM_LOCK)
prevents swapping, but doesn't proactively load non-resident pages.shmctl(SHM_LOCK)
can only be used on shared memory segments.shmctl(SHM_LOCK)
sets an extra flag (SHM_LOCKED
) on the permissions of the shared memory segment.Are there other differences? In particular, is there any reason not to use mlock()
on a shared memory segment?
First of all, mlock() is the syscall to lock process memory in the RAM, and shmctl(X,SHM_LOCK,Y) is used to do shared (IPC) memory, which requires more control from all the producers and consumers, so, that is why mlock() syscall is much easier as:
int mlock(const void *addr, size_t len);
While shmctl is much more complex to operate, as:
int shmctl(int shmid, SHM_LOCK, struct shmid_ds *buf);
Where: The buf argument is a pointer to a shmid_ds structure, defined in as follows:
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 */
...
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With