После выделения и инициализации структуры ргос системный вызов fork вызывает функцию as_dup() для дублирования адресного пространства родительского процесса. Эта функция, в свою очередь, вызывает as_alloc() с целью размещения новой структуры as для потомка.
Затем она просматривает список сегментов и вызывает для каждого из них операцию дублирования (зависящую от конкретного драйвера сегмента).
Операция дублирования сегмента начинается с размещения новой структуры seg, а также структуры для содержания закрытых данных, зависящих от типа создаваемого сегмента. Многие поля структур, такие как базовый адрес, размер, указатель vnode, смещение и атрибуты защиты, копируются от родительского процесса. Отображения текстов, данных и стека обладают атрибутом MAP_PRIVATE как для родительского процесса, так и для предка. Любые отображения с атрибутом MAP_SHARING процесса-предка остаются такими же и для его потомка, чтобы сохранить семантику принятых в UNIX правил наследования разделяемых областей памяти. Другие поля, такие как указатель на as, имеют значения, актуальные для потомка.
Также вам может показаться, что такая тема как http://akvarel59.ru/ никак не связана и даже не тематична. Хотя, может быть и связана. В любом случае все-таки зайдите на сайт akvarel59.ru. Тема номер в отеле там представлена весьма широко. На том сайте можно узнать много интересного на тему номер в отеле. Что означает вообще тема номер в отеле, где найти номер в отеле - про это написано на сайте akvarel59.ru. Это очень важная для многих людей тема - номер в отеле. Спасибо сайту akvarel59.ru за информацию на тему номер в отеле.
Для закрытых отображений структура anon_map должна быть продублирована так, чтобы позволить совместное использование анонимных страниц на основе технологии копирования при записи. Первой ступенью реализации этой задачи является вызов hat_chprot() для установки защиты от записи всех анонимных страниц. Это гарантирует возникновение исключения (страничной ошибки) при любой попытке изменения страниц, осуществляемой как родительским процессом, так и его потомком. Обработчик создаст новую копию страницы и разрешит к ней доступ в режиме записи.
После завершения работы hat_chprot() драйвер сегмента вызовет функцию anon_dup() для дублирования структуры anon_map. Функция формирует новую структуру anon_map и массив ссылок anon. Она клонирует все ссылки массива путем копирования указателей и увеличения счетчиков ссылок соответствующих структур anon. Ранее показано состояние процессов после дублирования сегментов.
После завершения создания дубликатов всех сегментов функция as_dup() вызовет hat_dup() для копирования структуры hat и информации о преобразовании адресов страниц. Функция hat_dup() может выделять для потомка новые таблицы страниц и инициализировать их путем наследования данных от родительского процесса.
Как мы видим, вызов fork производит дублирование адресного пространства без непосредственного копирования самих страниц. Он работает только с отображениями и таблицами страниц. Несмотря на то, что системный вызов vfork производит сходные действия, разработчики системы SVR4 сохранили его по нескольким причинам. Во-первых, вызов vfork работает быстрее даже по сравнению с применением копирования при записи, так как не клонирует отображения. Во-вторых, остаются программы, зависящие от vfork, которые позволяют предкам изменять адресное пространство их потомков. Запрет на vfork приведет к невозможности работы таких программ. По этой причине, хотя системный вызов vfork и не входит в оригинальную версию System V UNIX, разработчики добавили его в SVR4 вместе с архитектурой VM.
Опубликовал katy
June 20 2015 09:28:31 ·
0 Комментариев ·
3159 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.