Общая память Linux отображается не так, как ожидалосьLinux

Ответить
Anonymous
 Общая память Linux отображается не так, как ожидалось

Сообщение Anonymous »

Я использую mmap для создания общей памяти, два процесса разделяют эту память. Я использую команду «top» для просмотра вывода общей памяти, он выглядит так:
1825191 root 20 0 10972 88 0 S 0.0 0.0 0:00.00 a.out
1825190 root 20 0 10972 964 876 S 0.0 0.0 0:00.00 a.out

Процесс 1825190 является родительским процессом, общая память для него равна 876К. 1825191 — это дочерний процесс, который является ответвлением родительского процесса (1825190). Общая память для него равна нулю.
Это сбивает с толку, насколько я понимаю, общая память в дочернем процессе также должна быть 876 КБ. Потому что родительский и дочерний процессы полностью одинаковы.
Еще одна странная вещь — это учетная запись памяти в системе процессов Linux. По пути
/proc/1825190/status

RssAnon: 88 kB
RssFile: 876 kB
RssShmem: 0 kB

Я думаю, что мой код напрямую отображается из памяти, почему RssShmem не отражает размер общей памяти?
Еще один запутанный момент, связанный с общей памятью Ниже приведена область памяти в процессе. Я думаю, что для процессов память должна быть одинаковой для родительского процесса и дочернего процесса, поскольку они представляют собой одну и ту же область памяти. Но иногда Shared_Dirty и Shared_Clean между родительским и дочерним процессами не совпадают. Кто-нибудь знает, в чем причина?
VmFlags: rd wr mr mw me ac
7f7bbe893000-7f7bbf093000 rw-s 00000000 00:01 5130 /dev/zero (deleted)
Size: 8192 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 4 kB
Pss: 2 kB
Shared_Clean: 0 kB
Shared_Dirty: 4 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 4 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
FilePmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
THPeligible: 0


Ниже приведен мой код. Есть ли в нем проблемы?
int main() {
// Size of the shared memory region
size_t mem_size = 1024 * 4096 * 2;

// Create an anonymous shared memory region
void *shared_mem = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (shared_mem == MAP_FAILED) {
perror("mmap failed");
exit(EXIT_FAILURE);
}

// Initialize shared memory with some data
strcpy((char *)shared_mem, "Hello from parent process!");

// Fork a child process
pid_t pid = fork();
if (pid < 0) {
perror("fork failed");
munmap(shared_mem, mem_size);
exit(EXIT_FAILURE);
}

if (pid == 0) {
// Child process
printf("Child: Shared memory contains: '%s'\n", (char *)shared_mem);

// Modify the shared memory
strcpy((char *)shared_mem, "Hello from child process!");
printf("Child: Modified shared memory.\n");

// Sleep for demonstration purposes
sleep(600);

// Exit child process
exit(EXIT_SUCCESS);
} else {
// Parent process
// Sleep for a while to let the child modify the memory
sleep(5);

// Read and print the modified content
printf("Parent: Shared memory contains: '%s'\n", (char *)shared_mem);

sleep(600);

// Wait for the child process to finish
wait(NULL);

// Unmap shared memory
munmap(shared_mem, mem_size);

printf("Parent: Finished.\n");
}

return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... -as-expect
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»