Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Завершение процесса



Четыре события, приводящие к остановке процесса (вызов exit или ExitProcess):

· Плановое завершение (окончание выполнения)

· Плановый выход по известной ошибке (например, отсутствие файла)

· Выход по неисправимой ошибке (ошибка в программе)

· Уничтожение другим процессом

Таким образом, приостановленный процесс состоит из собственного адресного пространства, обычно называемого образом памяти (core image), и компонентов таблицы процессов (в числе компонентов и его регистры).

Процесс-предок может ожидать завершения процесса-потомка (или процессов-потомков) при помощи системных вызовов wait или waitpid. Если процесс-потомок еще не завершился, процесс-предок переводится таким системным вызовом в состояние ожидания до завершения процесса-потомка (впрочем, процесс может и не ожидать завершения потомка, а только проверить, завершился ли он). Эти системные вызовы позволяют также процессу предку узнать код завершения потомка. Если процесс-потомок завершает свою работу прежде процесса-предка, и процесс-предок явно не указал, что он не заинтересован в получении информации о статусе завершения процесса-потомка, то завершившийся процесс-потомок не исчезает из системы окончательно, а остается в состоянии закончил исполнение (зомби-процесс) либо до завершения процесса-предка, либо до того момента, когда предок проверит завершение потомка. Каждый процесс-потомок при завершении работы посылает своему процессу-предку специальный сигнал SIGCHLD, на который у всех процессов по умолчанию установлена реакция "игнорировать сигнал". Наличие такого сигнала совместно с системным вызовом waitpid() позволяет организовать асинхронный сбор информации о статусе завершившихся порожденных процессов процессом-предком.

Билет 17.

1)Последовательность загрузки для LINUX

[Disclaimer: Данная статья была переведена в рамках "Конкурса на лучший перевод статьи" на сервисе Quizful. Ссылка на оригинал находится внизу страницы.]Последовательность загрузки Linux системы состоит из следующих этапов:

1. BIOS

2. MBR

3. Загрузчик операционной системы

4. Ядро

5. init

6. Уровни запуска (runlevel)

BIOS (Basic Input-Output System - базовая система ввода вывода)BIOS - это интерфейс самого низкого уровня между компьютером и периферией, который ищет и исполняет загрузочный сектор на каком-либо устройстве хранения данных подключённых к компьютеру.Как правило это:

· Привод CD-ROM

· Жёсткий диск

· Дисковод (используются всё реже)

Список зависит от возможностей конкретного BIOS'а, а также вашего оборудования.Приоритет загрузки может быть изменён в BIOS'е. Войти в меню настройки BIOS'а, как правило, можно нажав Del, F1, F2 или F10 во время загрузки компьютера

MBR (Master Boot Record - главная загрузочная запись)Первый сектор загружаемого устройства хранения данных зарезервирован под главную загрузочную запись. Когда происходит загрузка с устройства, BIOS загружает и исполняет загрузчик операционной системы (boot loader), находящийся в MBR.В большинстве случаев загрузчик достаточно сложен и не может вместиться в 512 байт отведённые MBR. В этом случае в MBR находится так называемый stage1, программа которая просто загружает программу второго этапа загрузки операционной системы - stage2 (иногда в качестве stage2 загружается загрузочный сектор активного раздела, boot manager или программа авторизации и защиты доступа).В частности, stage2 загрузчика GRUB считывает данные из файла /boot/grub/grub.conf (или /boot/grub/menu.lst, в зависимости от версии), который содержит список всех доступных операционных систем и их параметры загрузки. После этого на экран выводится список операционных систем из которого пользователь выбирает ОС для загрузки.

Загрузчик операционной системы

В некоторых случаях stage1 загрузчика GRUB (GRand Unified Bootloader) производит загрузку stage1.5 код которого находится в первых тридцати килобайтах устройства хранения данных следующих сразу за MBR, и уже stage1.5 производит загрузку stage2.Когда stage2 получает управление, на экран выводится (псевдо)графическое меню для выбора пользователем ОС для загрузки. Стоит отметить, что параметры загрузки могут быть изменены из этого же меню, что позволяет восстановить систему после того как menu.lst или grub.conf были случайно испорчены.Как только параметры загрузки были выбраны, GRUB загружает выбранное ядро в память и передаёт управление ядру, которое уже само продолжает загрузку системы. Также GRUB может передать управление не ядру, а другому загрузчику, используя так называемую цепную загрузку (chain loading), например загрузчику ОС не поддерживающей стандарт Multiboot.

ЯдроВ свою очередь, ядро проверяет конфигурацию оборудования, инициализирует устройства и запускает initrd (опционально), после чего монтирует с устройство указанное в параметрах загрузки как "root" как корневую файловую систему.Файловая система устройства определяется автоматически. Если по каким либо причинам монтирование не удаётся, система выдаёт kernel panic и загрузка останавливается.

После успешного монтирования файловой системы, ядро запускает демон init, которая получает идентификатор процесса равный единице и запускает оставшуюся часть системы.

initinit - это последний шаг в последовательности загрузки системы. init является родителем (или же более далёким предком) для всех процессов исполняемых в системе. Этот процесс запускается первым в системе и его запуск производится непосредственно ядром. Он же запускает все системные процессы так как это указано в /etc/inittab.Покуда система работает, init не будет завершён. Стоит отметить что init - пользовательский процесс, а не системный, не смотря на то что он запущен от root'а.

Уровни запуска (runlevel)Каждая запись в /etc/inittab содержит так называемый "уровень запуска" для процесса, т.е. информацию о том на каком уровне запуска системы данный процесс должен быть запущен.В Linux системах существует семь возможных значений для уровня запуска: от 0 до 6 включительно:

1. Останов системы

2. Однопользовательский режим

3. Определяется пользователем, как правило это многопользовательский режим без поддержки сети и графической оболочки

4. Многопользовательский режим без графической оболочки

5. Определяется пользователем, как правило, не используется

6. Многопользовательский режим с графической оболочкой

7. Перезагрузка

Основываясь на текущем уровне запуска, init запускает скрипты находящиеся в поддиректориях /etc/rc.d/, для каждого уровня запуска существует своя поддиректория, от /etc/rc.d/rc0.d до /etc/rc.d/rc6.d.В действительности же запуск скриптов каждого уровня запуска выполняется скриптом /etc/rc который вызывается на каждом уровне запуска с параметром равным текущему уровню. Вызов же /etc/rc параметром прописан в /etc/inittab, для каждого из возможных уровней запуска.Уровень запуска по умолчанию определяется записью в /etc/inittab:id:3:initdefault:Текущий уровень запуска может быть изменён путём вызова:/sbin/telinit #Где # - желаемый уровень запуска. Т.е. вызов "/sbin/telinit 6" приведёт к перезагрузке системы.

2)Алгоритм работы INIT процесса

алгоритм init /* процесс init, в системе именуемый "процесс 1" */ входная информация: отсутствует выходная информация: отсутствует { fd = open("/etc/inittab",O_RDONLY); while (line_read(fd,buffer)) { /* читать каждую строку файлу */ if (invoked state!= buffer state) continue; /* остаться в цикле while */ /* найден идентификатор соответствующего состояния */ if (fork() == 0) { execl("процесс указан в буфере"); exit(); } /* процесс init не дожидается завершения потомка */ /* возврат в цикл while */ } while ((id = wait((int*) 0))!= -1) { /* проверка существования потомка; * если потомок прекратил существование, рассматри- * вается возможность его перезапуска */ /* в противном случае, основной процесс просто про- * должает работу */

Билет 18.

1)Алгоритм работы SHELL

Shell обрабатывает команды трех типов. Во-первых, в качестве имени команды может быть указано имя исполняемого файла в объектном коде, полученного в результате компиляции исходного текста программы (например, программы на языке Си). Во-вторых, именем команды может быть имя командного файла, содержащего набор командных строк, обрабатываемых shell'ом. Наконец, команда может быть внутренней командой языка shell (в отличие от исполняемого файла). Наличие внутренних команд делает shell языком программирования в дополнение к функциям командного процессора; командный язык shell включает команды организации циклов (for-in-do-done и while-do-done), команды выполнения по условиям (if-then-else-fi), оператор выбора, команду изменения текущего для процесса каталога (cd) и некоторые другие. Синтаксис shell'а допускает сравнение с образцом и обработку параметров. Пользователям, запускающим команды, нет необходимости знать, какого типа эти команды.
Командный процессор shell ищет имена команд в указанном наборе каталогов, который можно изменить по желанию пользователя, вызвав shell. Shell обычно исполняет команду синхронно, с ожиданием завершения выполнения команды прежде, чем считать следующую командную строку. Тем не менее, допускается и асинхронное исполнение, когда очередная командная строка считывается и исполняется, не дожидаясь завершения выполнения предыдущей команды. О командах, выполняемых асинхронно, говорят, что они выполняются на фоне других команд. Например, ввод команды


function shellSort ( $arr )
{
$inc = round(count( $arr ) / 2);
while( $inc > 0)
{
for( $i = $inc; $i < count( $arr );$i++ ){
$temp = $arr [ $i ];
$j = $i;
while( $j >= $inc && $arr [ $j-$inc ] > $temp )
{
$arr [ $j ] = $arr [ $j - $inc ];
$j -= $inc;
}
$arr [ $j ] = $temp;
}
$inc = round( $inc/2.2 );
}
return $arr;

2)способы взаимодействия процессов в UNIX

Аббревиатура IPC расшифровывается как interprocess communication, то есть взаимодействие процессов. Обычно под этим понимается передача сообщений различных видов между процессами в какой-либо операционной системе. При этом могут использоваться различные формы синхронизации, требуемой современными видами взаимодействия, осуществляемыми, например, через разделяемую память.

В процессе развития операционных систем семейства Unix за последние 30 лет методы передачи сообщений эволюционировали следующим образом:

■ Каналы (pipes — глава 4) были первой широко используемой формой взаимодействия процессов, доступной программам и пользователю (из интерпретатора команд). Основным недостатком каналов является невозможность их использования между процессами, не имеющими общего родителя (ancestor), но этот недостаток был устранен с появлением именованных каналов (named pipes), или каналов FIFO (глава 4).

■ Очереди сообщений стандарта System V (System V message queues — глава 4) были добавлены к ядрам System V в начале 80-х. Они могут использоваться для передачи сообщений между процессами на одном узле вне зависимости от того, являются ли эти процессы родственными. Несмотря на сохранившийся префикс «System V», большинство современных версий Unix, включая и те, которые не произошли от System V, поддерживают эти очереди.





Дата публикования: 2015-01-24; Прочитано: 591 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...