Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОперационныеСистемы, общие понятия.docx
Скачиваний:
151
Добавлен:
08.02.2015
Размер:
366.4 Кб
Скачать

Интерактивный режим работы в ос unix. (24-2)

  1. Входим в систему и набираем ls имя команды + enter

  2. Далее управление передается интерпретатору shell, который анализирует введенный текст. Если в этот момент будет зафиксирована ошибка, то интерпретатор проинформирует об этом пользователя, выдав соответствующее сообщение, и снова вернет приглашение для ввода командной строки.

  3. Если команда была задана корректно, то shell по средствам системного вызова fork порождает новый процесс.

  4. Ядром системы выполняются стандартные действия, в том числе в таблицу процессов заносится запись о новом процессе.

  5. Затем из shell выполняется системный вызов exec. В каталоге /bin/ отыскивается файл с именем ls и загружается в основную память. Сразу после порождения нового процесса (4) оба они: и процесс-отец (shell) и процесс-сын (ls) – начинают конкурентную борьбу за ресурсы системы. Но shell, будучи особым процессом, порождает другие процессы с меньшим приоритетом. Поэтому после порождения процесса управление вернется в shell, и он сможет выполнить системный вызов exec.

  6. После его выполнения уже нельзя с определенностью сказать, какой процесс shell или ls получит управление.

  7. Если окажется, что shell, то его необходимо приостановить, чтобы дать возможность выполниться процессу ls. Приостановка shell достигается с помощью системного вызова wait. В этой точке выполнение процесса shell прекратится, и он будет ожидать завершения работы процесса ls. После остановки shell начинает работу ядро ОС. Диспетчер процессов определяет процесс, который надо активизировать следующим.

  8. Т.к. в нашем случае других готовых к выполнению процессов кроме ls нет, ему и будет передано управление.

  9. Процесс ls начинает работу по выполнению своих функций.

  10. В то время процесс shell будет находиться в состоянии ожидания. При выполнении процесса ls ему надо будет вводить результаты свой работы на экран терминала.

  11. Т.к. в ОС UNIX все программы выполняются последовательно, для их параллельного выполнения требуется создание новых процессов. Для вывода данных lsна терминал порождается новый процесс.

  12. Выполнение процесса ls завершается системным вызовом exit.

  13. Ядро системы по взаимодействию пары системных вызовов wait, exit переводит процесс shell в состояние готовности. Ввиду отсутствия других готовых процессов активизирует его.

  14. Интерпретатор shell выполняет завершающее действие по обработке ls и выдает на экран терминала приглашение для ввода следующей команды.

Понятие системного вызова. Системные вызовы system и execl. (23-2)

(Здесь явно указать отличия этих двух системных вызовов)

Когда во время выполнения программы необходимо выполнить другую программу или предоставить пользовательскому процессу системные функции, используется аппарат системных вызовов.

Синтаксически, применение системного вызова похоже на вызов подпрограммы, однако исполняемый код системного вызова находиться в ядре ОС, а не в загрузочном модуле.

Системный вызовsystem

Простейшим способом вызвать другую программу из уже выполняющейся является системный вызов system:

int system(“Командная строка”);

Системный вызов execl

Вызывает новую программу, вместо уже выполняющейся без возврата в вызывающую программу:

int execl(“полное_имя_файла”, arg0, arg1,…,null);

Системные вызовы fork, wait, pipe. (22-2)

Системный вызов fork

Для того чтобы запустить параллельно новую программу, необходимо запускать параллельные процессы.

Для этого используется системный вызов fork:

int fork();

После выполнения системного вызова fork() программа делиться на две идентичные копии. Одна из копий получает код ответа 0 (процесс потомок). Другая копия (процесс отец) получает идентификатор процесса сына.

if(fork()==0)

{ процесс сын }

else

{ процесс родитель }

Системный вызов wait и _exit

После системного вызоваfork() процесс родитель может посредством системного вызова wait() приостановить свое выполнение до завершения процесса сына или продолжить выполнение независимо от процесса сына.

int wait(int* s);

Системный вызов wait() возвращает идентификатор завершаемого процесса сына, а в свой единственный аргумент записывает код завершения процесса сына.

Код завершения можно представить в виде следующей битовой маски:

  • 7 младших битов (с 0 по 6) содержат нули, если процесс сын был завершен с помощью системного вызова _exit, или номер сигнала, завершившего процесс.

  • 7-й бит равен 1, если из-за прерывания процесса сына был создан дамп образа процесса (core файл).

  • Если процесс был завершен с помощью системного вызова _exit, то биты с 8 по 15й содержат аргумент системного вызова _exit.

Системный вызов _exit:

void _exit(int status);

В случае параллельной работы, с помощью системного вызова signal процесс отец может выявить или игнорировать завершение процесса сына:

int signal(sigaction);