Я использую 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
Общая память Linux отображается не так, как ожидалось ⇐ Linux
-
Anonymous
1732609964
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79225870/linux-shared-memory-doesnt-showed-as-expect[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия