Архитектура операционной системы UNIX   ::   Бах Морис Дж.

Страница: 462 из 715

Однако, учитывая наличие ситуаций, в которых создание физической копии не является обязательным, в системе BSD существует также функция vfork, которая используется в том случае, если процесс сразу по завершении функции fork собирается запустить функцию exec. Функция vfork не копирует таблицы страниц, поэтому она работает быстрее, чем функция fork в версии V системы UNIX. Однако процесс-потомок при этом исполняется в тех же самых физических адресах, что и его родитель, и может поэтому затереть данные и стек родительского процесса. Если программист использует функцию vfork неверно, может возникнуть опасная ситуация, поэтому вся ответственность за ее использование возлагается на программиста. Различие в подходах к рассматриваемому вопросу в системах UNIX и BSD имеет философский характер, они дают разный ответ на один и тот же вопрос: следует ли ядру скрывать особенности реализации своих функций, превращая их в тайну для пользователей, или же стоит дать опытным пользователям возможность повысить эффективность выполнения системных операций?

int global;

main() {

 int local;

 local = 1;

 if (vfork() == 0) {  /* потомок */

  global = 2; /* запись в область данных родителя */

  local = 3; /* запись в стек родителя */

  _exit();

 }

 printf("global %d local %d\n",global,local);

}

Рисунок 9.16. Функция vfork и искажение информации процесса

В качестве примера рассмотрим программу, приведенную на Рисунке 9.16.

|< Пред. 460 461 462 463 464 След. >|

Java книги

Контакты: [email protected]