2010-06-28 2 views
2

Предположим, что мы проводим два процесса спина к спине сказать: -код обмена сегмент между двумя процессами

$ grep abc abc.txt ==> pid 100 
$ grep def def.txt ==> pid 101 

Я прочитал в книге «Начало программирования Linux» главы № 11 о том, что раздел кода процессов будут совместно , поскольку он только для чтения. Это так? Я думаю, что если grep будет скомпилирован как разделяемая библиотека, тогда раздел кода будет разделяться.

Еще один вопрос, в случае общих библиотек, как ОС знает, что библиотека уже загружена или нет? Предположим, если два процесса одновременно вызывают функцию общей библиотеки, то как виртуальный адрес двух процессов преобразуется в физический адрес, указывающий одно и то же местоположение в ОЗУ?

ответ

4

ОС больше не загружает файлы в память. Вместо этого файлы: memory mapped. Это означает, что inode и смещение файла на диске будут подключены к странице в памяти. Это делает довольно простым выяснить, была ли какая-либо часть файла уже загружена. Кроме того, вы можете хранить только часть файла в ОЗУ (после настройки вам больше не нужен код настройки, поэтому вы можете «забыть» об этом и повторно использовать эти страницы для чего-то более полезного).

2

Библиотеки и исполняемые файлы не загружаются, а отображаются в память с помощью mmap(2). В основном, когда вы mmap() что-то с флагом MAP_SHARED, другие, которые отображают один и тот же файл, получат одинаковые страницы памяти.