клиент-
серверная модель является абстракцией, которая может быть использована как для
отдельно взятой машины, так и для машин, объединенных в сеть.
операционные системы живут так долго, — их очень трудно создавать, и, написав одну такую систему, владелец не испытывает желания ее выбросить и приступить к созданию новой
При создании нового процесса в системе со страничной организацией памяти операционная система должна определить, каким будет (первоначально) объем программы и данных, и создать для них таблицу страниц. Для таблицы страниц нужно выделить пространство в памяти, а затем ее нужно инициализировать. При выгрузке процесса таблица страниц не должна быть резидентной, но она должна находиться в памяти при запуске процесса. Кроме того, в области подкачки на диске должно быть выделено пространство, чтобы при выгрузке страницы ее было куда поместить. Область подкачки также должна быть инициализирована, туда должны быть помещены текст программы и данные, чтобы после запуска нового процесса в случае возникновения ошибки отсутствия страницы оттуда могли быть извлечены недостающие страницы. Некоторые системы подкачивают текст программы непосредственно из исполняемого файла, экономя дисковое пространство и время на инициализацию. И наконец, информация о таблице страниц и области подкачки на диске должна быть записана в таблице процесса.
Если два или более процесса одновременно отображаются на один и тот же файл, они могут связываться посредством совместно используемой памяти. Запись, произведенная одним процессом в общую память, становится тут же видна, если другой процесс считывает данные из части своего виртуального адресного пространства, отображенного на файл. Таким образом, данный механизм предоставляет канал между двумя процессами, обладающий высокой пропускной способностью, и он довольно часто используется именно в этом качестве
овместно используемые библиотеки являются частным случаем более общих объектов, называемых отображаемыми на память файлами. Идея состоит в том, что процесс может выдать системный вызов для отображения файла на какую-то часть его виртуального адресного пространства.
Лучшее решение заключается в компиляции совместно используемых библиотек со специальным флажком для компилятора, указывающим этому компилятору не создавать никаких команд, использующих абсолютную адресацию. Вместо этого применяются лишь те команды, которые используют относительную адресацию. Например, почти всегда есть команда, предписывающая переход вперед (или назад) на n байтов (в качестве альтернативы той команде, которая дает для перехода конкретный адрес). Эта команда работает правильно независимо от размещения совместно используемой библиотеки в виртуальном адресном пространстве. Проблема может быть решена за счет исключения абсолютной адресации. Код, использующий только относительные смещения, называется позиционно независимым кодом.
Следует заметить, что при загрузке или использовании общей библиотеки вся библиотека разом в память не считывается. Она загружается постранично, по мере надобности, поэтому функции, которые не были вызваны, в оперативную память не переносятся.
Текстовые страницы всегда используются в режиме только для чтения, поэтому проблем не возникает. В зависимости от операционной системы каждый процесс может получить собственную частную копию страниц с данными или же они могут совместно использоваться и иметь пометку «Только для чтения». Если какой-нибудь процесс изменяет страницу данных, для него будет создана частная копия, то есть будет использована копия, пригодная для записи.
загрузочного устройства в память считывается первый сектор, а затем выполняется записанная в нем программа. Обычно эта программа проверяет таблицу разделов, которая находится в конце загрузочного сектора, чтобы определить, какой из разделов имеет статус активного. Затем из этого раздела считывается вторичный загрузчик, который в свою очередь считывает из активного раздела и запускает операционную систему.
В частности, в UNIX после системного вызова fork родительский и дочерний процессы вынуждены совместно использовать как текст программы, так и данные. В системах со страничной организацией памяти часто практикуется предоставление каждому из таких процессов собственной таблицы страниц и наличие у них обоих указателя на один и тот же набор страниц. Таким образом, при выполнении системного вызова fork копирования страниц не происходит. Тем не менее все страницы с данными отображаются для каждого процесса как страницы только для чтения — READ ONLY.
Пока оба процесса только читают свои данные, не внося в них изменений, эта ситуация может продолжаться. Как только какой-нибудь из процессов обновит слово памяти, нарушение защиты режима только для чтения приведет к системному прерыванию операционной системы. После чего делается копия вызвавшей эту ситуацию страницы, чтобы у каждого процесса имелся собственный экземпляр. Теперь для обеих копий устанавливается режим чтения-записи — READ-WRITE, поэтому следующие записи в каждую копию происходят без системного прерывания. Эта стратегия означает, что те страницы, которые никогда не изменяются (включая все страницы программы), не нуждаются в копировании. Копирование требуется только для тех страниц, которые на самом деле подвергаются изменениям. Этот подход, названный копированием при записи (copy on write), повышает про