Шпоры (1087922), страница 3
Текст из файла (страница 3)
17. Функции fork, exec, exit, kill, signal, wait.
Функция fork выполняет создание нового процесса, который является копией текущего процесса.
Функция exec позволяет заменять тело процесса, т.е. при обращении к этой функции, в случае успешного выполнения ее, тело процесса меняется на новое содержимое, которое указано в виде аргументов, точнее в виде имени некоторого файла.
Функция exit или kill – завершение процесса. kill (pid, SIGKILL).
Функция wait – останавливает выполнение текущего процесса до завершения какого-либо из его процессов-потомков.
Функция signal – обработка сигнала. Возможности системного вызова singal позволяют обрабатывать сигналы след. способами:
1) реакция по умолчанию; 2) замаскировать сигнал (игнориров.);
3) перехватить посланный процессу сигнал и написать свою ф-ю для обработки прерывания.
Пример:
#include <stdio.h> #include <unistd.h> #include <sys/types.h>
#include <signal.h>
void catch_int(int sig_num) // обработчик
{signal(SIGINT, catch_int); printf("Don't do that"); fflush(stdout);}
….
/* set the INT (Ctrl-C) signal handler to 'catch_int' */
signal(SIGINT, catch_int);
18. Взаимодействие процессов IPC.
Программные каналы (pipe)
Используются для взаимодействия между процессами путем передачи данных от одного процесса к другому. Каналом можно связывать только родственные процессы.
Пример:
main(){
int fd[2];
pipe(fd); // в отцовском процессе образуем 2 дескриптора канала
if (fork()) // образуем процесс-сын, у которого будут те же дескр.
{ /* эта часть программы происходит в процессе-отце */
dup2(fd[1],1); /* заменяем станд. вывод выводом в канал */
close(fd[1]); /* закрываем дескрипторы канала */
close(fd[0]); /* теперь весь вывод будет происходить в канал */
execl(“/bin/ls”,“ls”,(char*)0); /* заменяем тело отца на ls */
} /* отсюда начинает работать процесс-сын */
dup2(fd[0],0); /* в процессе сыне все делаем аналогично */
close(fd[0]); close(fd[1]);
execl(“/bin/wc”,“wc”,(char*)0);
}
Этот пример связывает конвейером две команды — ls и wc. Команда ls выводит содержимое каталога, а команда wc подсчитывает количество строк. Результатом выполнения нашей программы будет подсчет строк, выведен. командой ls.
Разделяемая память
Используется для того, чтобы повысить скорость прохождения данных между процессами. Обмен происходит через ядро: выделяется некая часть вирт. адр. пр-ва, куда помещаются и откуда считываются данные. После создания разделяемого сегмента памяти любой из процессов пользователей может подсоединить его к своему вирт. адр. пр-ву и работать с ним.
Недостаток – отсутствие средства синхронизации. Для решения этой проблемы необходимо использовать технику семафоров.
int shmget (key_t key, int size, int shmemflg) - создание общей памяти
char *shmat(int shmid, char *shmaddr, int shmflg) - доступ к разделяемой памяти
int shmdt(char *shmaddr) - открепление разделяемой памяти
Семафоры (Дейкстра)
Семафоры – это некие средства для задержки процессов.
Семафор - это некоторый объект, который имеет целочисл. значение s, и две операции — P(s) и V(s). P — уменьшает значение семафора на 1 и, если s>=0 после уменьшения процесс продолжает работать, если s<0, то процесс будет приостановлен и встанет в очередь ожидания, связанную с семафором s. Операция V увеличивает семафор на 1. Если s>0 после увел-я, то процесс продолжает свое выполнение, если s<=0, то разблокируется один из процессов в очереди ожидания. Считается, что операции P и V неделимы, то есть их выполнение не может прерываться.
int semget(key_t key, int n, int flags) – создание семафора
Очереди сообщения
В очереди сообщений, в которой каждое сообщение представляет из себя структуру данных, с которой ассоциирован буфер, содержащий тело и тип сообщения. При форм-нии очереди не используется потоковая модель данных. Каждое сообщение имеет строго определ. стр-ру., тип и данные. Допустимы любые данные.
Длина данных выбирается польз-м и м.б. произвольной. Ядро не интерпретир сообщение, а только обесп. размещение и выборку.
7. Виртуальная память.
ВП нужна для борьбы с фрагментацией. Суть работы ВП заключается в следующем. Пусть имеется некоторое адресное пространство программы и имеется адресное пространство физическое, которое зависит от времени. Оно характеризует реальное состояние физической оперативной памяти. В машинах, поддерживающих виртуальную память, существует механизм преобразования адресов из адресного пространства программы в физическое адресное пространство, то есть при загрузке задачи в память машины ОС размещает реальную задачу в той ОП, которая является свободной, вне зависимости от того, является ли этот фрагмент непрерывным, либо он фрагментирован. Это первое действие выполняет ОС. Она знает о состоянии своих физических ресурсов: какие свободны, какие заняты. Второе: ОС заполняет некоторые аппаратные таблицы, которые обеспечивают соответствие размещения программы в реальной оперативной памяти с адресным пространством, используемым программой. То есть можно определить, где в физической памяти размещена какая часть программы, и какая часть адресного пространства программы поставлена ей в соответствие. После этого запускается программа, и начинает действовать механизм виртуальной памяти. УУ выбирает очередную команду. Из этой команды оно выбирает операнды, то есть адреса и те индексные регистры, которые участвуют в формировании адреса. УУ вычисляет исполнительный адрес того значения, с которым надо работать в памяти. После этого автоматически (аппаратно) происходит преобразование адреса исполнительного программного (или виртуального) в адрес исполнительный физический с помощью тех самых таблиц, которые были сформированы ОС при загрузке данной программы в память. И продолжается выполнение команды. Аналогично выполняется и, например, команда безусловного перехода на какой-то адрес. Точно так же УУ вычисляет сначала адрес исполнительный, после чего он преобразуется в адрес физический, а потом значение этого физического адреса помещается в счетчик команд. Это и есть механизм виртуальной памяти.
8. Способы организации виртуальной памяти.
-
страничный (Linux, Win NT)
-
сегментный (OS/2)
-
сегментно-страничный
Страничная организация
ВП разделена на страницы фиксированной длины, а реальная память на страничные кадры той же длины кратной степени 2.
Для управления этой страничной памятью, процессор содержит таблицу приписки (ТП). Это аппаратное средство машины, реализованное с помощью регистровой памяти. При загрузке и запуске программы ОС размещает виртуальные страницы в некоторых физических страницах оперативной памяти, а их соответствие устанавливается в ТП. Для каждой программы нужна своя таблица приписки. При переходе от одной программы к другой содержимое ТП сохраняется операционной системой в некоторой своей программной таблице (массиве) и затем изменяются значения в ТП.
Достоинство: низкая фрагментация.
Недостатки: необходимо таблицы страниц размещать в памяти, необходимо обрабатывать таблицы (т.к. с ними непосредственно работает диспетчер памяти). Кроме того, программы разбиваются на страницы случайно без учета логических связей программы, => межстраничные переходы осуществляются чаще, чем межсегментные.
Сегментный способ организации
Сегмент – группа информации, рассматриваемая как единое целое. Программа делиться на сегменты неравной длины. Логическое обращение к модулям программы будет представлять собой имя сегмента и смещение внутри сегмента. Физически имя сегмента соответствует некоторому адресу в памяти, и смещение должно прибавляться к этому адресу. Преобразование имени сегмента в его порядковый номер осуществляет система программирования. ОС будет размещать сегменты в памяти и для каждого сегмента получит информацию о его начале. Виртуальный адрес: V=(b, d), где b – номер блока, в котором размещен сегмент; d – смещение относительно адреса начала блока. Сегмент в отличии от страницы может иметь различный размер, что позволяет хранить в нем логически законченные блоки (процедуры, массив и т. д.). Это дает увеличивается быстродействие за счет локальности ссылок и облегчается организация динамической загрузки.
Недостатки:
1) Этот способ сложнее страничного т. к. необходимо обрабатывать и хранить много дополнительной информации.
2) Т. к. физическая память любого сегмента должна быть непрерывной, тут возникает фрагментация памяти.
3) Максимальный размер сегмента ограничен размером ОЗУ.
Сегментно-страничная организация
В этом случае вся память делится на сегменты (произвольной длины), каждый из которых делится на страницы (фиксированной длины).
Vадр. = (S, p, d), где S – номер сегмента, p – номер страницы,
d – смещение внутри страницы.
Поиск адреса осуществляется следующим образом. Сначала вычисляется адрес начала искомого сегмента, затем вычисляется адрес элемента таблицы страниц. И только после этого к номеру физ. страницы необходимо приписать смещение внутри страницы для того, чтобы получить номер ячейки внутри страницы.
Способ сегментно-страничной организации памяти лишен недостатков предыдущих способов. Однако он имеет свои минусы: требует значительных затрат вычислительной системы, поэтому он используется редко.
12. История создания Unix. Особенности функцион-я Unix. Системные вызовы.
В середине 60х годов в Bell лаборатории фирмы AT&T проводились исследования и разработка одной из первых ОС в современном ее понимании — ОС Multics. Это ОС разделения времени, многопользовательская, а также в этой системе была предложена иерархическая древообразная файловая система. От этой разработки через некоторое время получила начало ОС Unix. Ее разработчики - Томпсон и Ритчи. Особенностью этой системой являлось то, что она являлась первой системной программой написанной на языке, отличном от языка ассемблера. Для написания программы использовался сначала язык BCPL, из него был образован язык B, который оперировал с машинными словами, далее язык BN и, наконец, язык “C”. И после 1973 года ОС Unix была переписана окончательно на язык “С”. В результате появилась ОС, 90% кода которой было написано на языке высокого уровня, а 10% - ассемблер.
Свойства: 1) Основным объектом, которым оперирует ОС — это файл. Файл — это набор данных, файл с точки зрения Unix — это внешнее устройство, файл — это каталог, который содержит информацию о принадлежащих ему файлах и т.д.
2) В отличии от предыдущих ОС, где каждая команда была зашита внутрь, и эту команду нельзя было модифицировать, убрать из системы, в Unix’е все команды реализованы в виде файлов, это означает, что можно свободно добавлять новые команды в систему, которые будут доступны либо мне, либо группе пользователей, либо всем, а можно удалять команды.
Особенности функционирования:
Каждому пользователю предоставляется свой виртуальный компьютер, в котором есть все необходимые ресурсы. Время ЦП выделяется осн. карусельной диспетчеризации (время делится на квант). Используется система приоритетов. Текущее состояние такого виртуального компьютера предоставляемый пользователю, называется образом.
Образ состоит из образа памяти, значение РОН, состояние открытых файлов, текущего каталога файла. Образ процесса размещается в основной памяти.
ОС Unix предусматривает 2 режима:
-
пользовательский
-
режим ядра
Процессы пользователей работают в пользовательском режиме. В нем нельзя получить доступ к структурам данных ядра (нельзя выполнить некоторые привилегированные машинные команды). А в режиме ядра можно выполнять любые машинные команды. Единственный способ пользовательского процесса войти в режим ядра – выполнить системный вызов.
Системный вызов представляет собой функциональный интерфейс программиста к ядру, т.е. фактически это процедуры или функции, которые находятся внутри ядра Unix и поддерживают основные функции системы. По назначению системные вызовы делятся на:
-
ввод/вывод
-
управление процессами
-
взаимодействие процессов
Процедуры системных вызовов отличаются от обычных функций, т.к. они могут непосредственно управлять структурами данных ядра.
13. Процессы в Unix. Нулевый и первый процесс. Демоны.
С точки зрения Unix, процесс является объектом, создаваемым в результате выполнения системной операции fork. У каждого процесса есть некоторый код, данные, стек и PID. Каждый процесс, за исключением нулевого, порождается в результате запуска другим процессом командой fork. Процесс, запустивший операцию fork, называется родительским, а вновь созданный процесс - порожденным. Каждый процесс имеет одного родителя, но может породить много процессов. Ядро системы идентифицирует каждый процесс по его номеру, который называется идентификатором процесса (PID). Нулевой процесс является особенным процессом, который создается "вручную" в результате загрузки системы; после порождения нового процесса (процесс 1) нулевой процесс становится процессом подкачки. Процесс 1, известный под именем init, является предком любого другого процесса в системе и связан с каждым процессом. Любой процесс состоит из тела и контекста процесса. Телом процесса называется набор команд и данных, которыми оперирует процесс. Контекст процесса состоит из области пользователя и таблицы страниц. Область пользователя создается внутри области данных ядра и доступна только ядру. Пользовательские процессы не могут получать доступ к своим пользовательским областям.
Контекст содержит:
-
номера пользователя и группы
-
указатель на ИД текущего каталога
-
специфические условия работы процесса:
-
обработка сигналов
-
информация об открытых в процессе файлах
-
инф-я о тек. сост. процесса на случай его приостановки
Состояния процесса
- Процесс выполняется в режиме задачи.
- Процесс выполняется в режиме ядра.
- Процесс не выполняется, но готов к выполн-ю и ждет очереди.
- Процесс приостановлен ("спит").
Демоны – постоянно находятся в режиме ядра. Они отличаются от обычных процессов тем, что демоны выполняют некоторые спец. функции, например, администрирование и управление в сетях. Процессом-демоном является обработчик входящих вызовов на Unix-сервере.
19. Система программирования. Трансляторы. Компил-ры.
Это комплекс программ, обеспечивающий жизненный цикл программы в системе. Жизненный цикл создаваемого программного обеспечения содержит следующие этапы:
проектирование, кодирование, тестирование и отладка.
Транслятор — это программа, которая переводит программу в нотации одного языка в нотацию другого языка. Компилятор — это транслятор, который переводит программу из нотации одного языка в нотацию машинного языка. Машинным языком может быть либо код конкретной машины, либо объектный код. Трансляторы могут быть интерпретаторами, т.е. совмещать анализ исходной программы с ее выполнением. Результатом работы интерпретатора является не машинный код, а последовательность обращений к библиотеке функций интерпретатора. Интерпретатор, в отличие от транслятора, может выбирать одну за одной инструкции и сразу их выполнять. Кросс-трансляторы – это вид трансляторов, который переводит программу, записанную в нотации одного языка програм-я и выполняющуюся в одной инструментал. среде на конкретную ЭВМ др. среды.
Трансляторы и компиляторы
Они имеют модульную структуру и разделяются на 2 этапа: анализ и синтез. Этап анализа. Анализ бывает лексический, синтаксический и семантический. Лексический анализатор производит анализ исходного текста на предмет правильности записи лексических единиц входного языка. Затем он переводит программу из нотации исходного текста в нотацию лексем. Лексические единицы — это минимальные конструкции, которые могут быть продекларированы языком. К лексическим единицам относятся: идентификаторы, ключевые слова, код операции, разделители,
константы. После этого исходная программа переводится в вид лексем. Лексема — это некоторая конструкция, содержащая два значения — тип лексемы и номер лексемы. Тип лексемы — это код, который говорит о том, что данная лексема принадлежит одной из обозначенных нами групп. к примеру лексема может быть ключевым словом, тогда в поле типа будет стоять соответствующий номер. Номер лексемы уточняет конкретное значение этой лексемы. После лексического анализатора мы получаем компактную программу.
На стадии синтаксического анализа определяется общая структура программы. Здесь имеет значение порядок следования символов и слов в программе. Результат работы – представление программы в древовидной форме (синт. дерево). Синтаксический анализатор считывает символы слева направо и умеет определять начало программы.
На стадии семантического анализа исходная программа проверяется на предмет соответствия семантических правил языка, а также идет проверка типов.
Этап синтеза: 1) генерация машинонезавис. кода; 2) оптимизация машинонезавис кода; 3) распределение памяти (ключевой); 4) генерация машинного кода; 5) оптим. маш. кода.
Некоторые из этих стадий могут отсутствовать.
20. Понятие прохода. Одно-, многопроходные компиляторы.
Проход — это полный просмотр некоторого представления исходного текста программы. Однопроходный транслятор просматривает исходный текст от начала и до конца, и к концу просмотра (в случае правильности программы) он получает объектный модуль. Примером многопроходного компилятора является Си-компилятор. Первый проход — это работа препроцессора. После первого прохода появляется чистая Си-программа без всяких препроцессорных команд. На Втором проходе происходит лексический, синтаксический и семантический анализ, и в итоге вы получаете объектную программу в виде ассемблера.
1. | Понятие СПО. Структура ВС. Ресурсы ОС. |
2. | Функции и устройство ЦП. Регистры ЦП. |
3. | Система прерываний. |
4. | Кэш. Регистры буферной памяти. |
5. | Организация ОЗУ. Стратегии управления. |
6. | Мультипрограммирование, его условия. Разделы. |
7. | Виртуальная память. |
8. | Способы организации виртуальной памяти. |
9. | Операционная система. Структура, функции. Классификация ОС. |
10. | Внешние устройства. |
11. | Понятие вычислительного процесса и задачи. Управление процессами. Смена состояний. Дескриптор. |
12. | История создания Unix. Особенности функцион-я Unix. Системные вызовы. |
13. | Процессы в Unix. Нулевый и первый процесс. Демоны. |
14. | Планирование процессов в UNIX. Правила план-я. |
15. | Swapping. Paging. |
16. | Файловая система OC Unix. Концептуальная схема. |
17. | Функции fork, exec, exit, kill, signal, wait. |
18. | Взаимодействие процессов IPC. |
19. | Система програм-ния. Трансляторы. Компиляторы. |
20. | Понятие прохода. Одно-, многопроходные компиляторы. |