В современных операционных системах управление памятью играет решающую роль в эффективном использовании системных ресурсов. Одной из важных концепций управления памятью являются общие страницы, которые позволяют нескольким процессам совместно использовать одни и те же страницы физической памяти. Этот метод позволяет значительно снизить потребление памяти и повысить производительность системы. В этой статье блога мы рассмотрим различные методы реализации общих страниц в операционных системах, сопровождаемые примерами кода.
Метод 1: копирование при записи (COW)
Копирование при записи — это метод, используемый для совместного использования страниц памяти между процессами до тех пор, пока один из процессов не попытается изменить общую страницу. Когда процесс хочет изменить общую страницу, создается копия страницы, и изменение применяется к новой копии, оставляя исходную общую страницу нетронутой. Вот упрощенный пример кода на C:
#include <unistd.h>
#include <sys/mman.h>
int main() {
// Create a shared memory region
void* shared_memory = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
// Fork a child process
pid_t pid = fork();
if (pid == 0) {
// Child process
// Perform read operations on the shared memory
// ...
// Modify the shared memory
*(int*)shared_memory = 42;
// The page is copied, and the modification is applied to the copy
// ...
// Detach the shared memory
munmap(shared_memory, PAGE_SIZE);
} else {
// Parent process
// Perform read operations on the shared memory
// ...
// Detach the shared memory
munmap(shared_memory, PAGE_SIZE);
}
return 0;
}
Метод 2: Объекты общей памяти
Объекты общей памяти предоставляют именованную область общей памяти, к которой могут получить доступ несколько процессов. Вот пример использования общей памяти POSIX в C:
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
int main() {
// Create or open a shared memory object
int shm_fd = shm_open("/my_shared_memory", O_CREAT | O_RDWR, 0666);
// Set the size of the shared memory object
ftruncate(shm_fd, PAGE_SIZE);
// Map the shared memory object into the process's address space
void* shared_memory = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
// Access and modify the shared memory
// ...
// Detach the shared memory
munmap(shared_memory, PAGE_SIZE);
// Close and unlink the shared memory object
close(shm_fd);
shm_unlink("/my_shared_memory");
return 0;
}
.
Метод 3: файлы, отображаемые в памяти.
Файлы, отображаемые в памяти, позволяют совместно использовать память между процессами и файловой системой. Область памяти поддерживается файлом, и изменения, внесенные в память, автоматически распространяются на файл. Вот пример на Python:
import mmap
# Open a file in write mode
file = open("shared_file.txt", "wb")
# Write some data to the file
file.write(b"Hello, World!")
# Map the file into memory
mapped_file = mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ)
# Access and modify the memory-mapped file
# ...
# Close the memory-mapped file and the file
mapped_file.close()
file.close()
Общие страницы — это мощный метод управления памятью, позволяющий нескольким процессам эффективно совместно использовать области памяти. В этой статье мы рассмотрели три популярных метода: копирование при записи, объекты общей памяти и файлы, отображаемые в памяти, с соответствующими примерами кода. Используя общие страницы, операционные системы могут оптимизировать использование ресурсов и повысить производительность системы.