Динамические структуры данных

Ответы к экзамену Операционные Системы 2012

1. Операционные системы, основные понятия и определения. История развития операционных систем.

2. Операционные системы, определение и функции. Классификация операционных систем.

           Операционная система (ОС) – комплекс программ, основной функцией которых является контроль за использованием и разделением ресурсов.

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

           ОС – комплекс программных средств, обеспечивающих интерфейс пользователя; программный и аппаратно-программный интерфейсы.

               

Оболочка – часть ОС, обеспечивающая интерфейс пользователя; Ядро – часть ОС, обеспечивающая аппаратный и программно-аппаратный интерфейсы. В современных ОС интерфейс пользователя – графический.

 

Операционная система как виртуальная машина

· Интерфейс между пользователем и компьютером.

· Скрывает особенности устройств внешней памяти

· Скрываются детали обработки прерываний, управления памятью и т.д.

· Создается иллюзия неограниченного размера оперативной памяти и числа процессоров

Операционная система как менеджер ресурсов

· Буферизация на диске данных, предназначенных для печати, и организации очереди на печать.

· Управление ресурсами и их защита для многопользовательских компьютеров

· Упорядоченное и контролируемое распределение процессоров, памяти и других ресурсов между различными программами.

Операционная система как защитник пользователей и программ

Проблема обеспечения безопасной совместной работы нескольких пользователей

· Никто не должен удалять или повреждать чужие файлы

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

· Должны пересекаться попытки несанкционированного использования вычислительной системы

Операционная система как постоянно функционирующее ядро

· ОС – это программа, постоянно работающая на компьютере и взаимодействующая со всеми прикладными программами

· Во многих операционных системах постоянно работает на компьютере лишь ее часть – ядро ОС

 

 

3. Язык Си-средство разработки ОС. Базовые конструкции. Массивы и указатели.

Основная программа всегда называется именем main (Си различает большие и маленькие буквы).

Целочисленные переменные int x = 0; С десятичной точкой float x = 0.0; символ char x = ‘ c’;

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

Описание одномерного массива: <тип> <имя> [<кол-во>] [инициализатор]

Примеры: char a[15] /*15 символов*/ int MAS[3][2]={{1,2},{3,4},{5,6}};

Строка символов в Си – массив символов, заканчивающийся нулевым байтом «\0».

Указателем является переменная, значение которой есть адрес некоторой области памяти. Объявление указателя: <тип >* <имя >

Например: char * q, c, * p; - где с – переменная символьного типа, а q и p – указатели на символ.

Унарная операция & - это операция взятия адреса, а унарная операция * - это операция косвенной адресации (раскрытие ссылки).

В языке Си можно также определить указатель на неопределенный тип: void * vp;

Такому указателю может быть присвоен адрес объекта любого типа или значение любого указателя. Обратное неверно.

Указатели используются чаще всего при работе с массивами. Имя массива есть константный указатель, содержащий адрес нулевого элемента: double m[10], * dp;

Присвоить указателю dp адрес начала массива m, можно следующим образом: dp= m; или dp=& m[0];

4. Язык Си-средство разработки ОС. Структура программы. Препроцессор.

Программа состоит из функций, описаний и директив препроцессора.

Пример структуры программного файла:

Директивы препроцессора Описания Функция main { операторы } Функция1 { операторы } ФункцияN {операторы } Препроцессор. Стандартная схема трансляции Си-программы, состоит из двух этапов: препроцессирование и собственно компиляция. Препроцессор выполняет макроподстановку, условную компиляцию, подключение файлов, и тем самым формирует текст программы, поступающий на вход компилятору. Программный файл может содержать директивы препроцессору, обозначаются #.

Включение файлов: На место директивы # include файл препроцессор подставляет содержимое указанного в ней файла.

Макроподстановка: # define имя подставляемый_текст . От места появляения #define и до конца файла, вместо имени подставляется заданный текст.

Примеры: # include < stdio. h> /*подключение файла*/ # define n 100 /*макроподстановка */

5. Язык Си-средство разработки ОС. Организация ввода-вывода в Си, форматированный ввод-вывод.

Ввод-вывод в Си реализован с помощью библиотечных функций.

Функции ввода-вывода делятся на два класса:

· Функции системного ввода-вывода,

· Функции стандартного (файлового) ввода-вывода.

Функции системного ввода-вывода: fopen, fclose, fread, fwrite.

Функции стандартного ввода-вывода:

Посимвольный (getchar, putchar, getc, putc, ungetc, fgetc, fputc);

Построчный ( gets, puts, fgets, fputs);

Форматированный (printf, scanf, frpintf, fscanf, sscanf).

Функции ввода-вывода объявлены в файле stdio.h

Ввод-вывод из стандартных файлов: При запуске Си-программы ОС всегда открывает 3 стандартных файла:

· Входной (stdin) – связан с клавиатурой

· Выходной (stdout) – связан с монитором

· Файл ошибок (stderr) – связан с монитором

EOF – End Of File (конец файла).

Спецификации функций ввода-вывода:

1) Чтение символа: а) из stdin int getchar(void) б) из потока f: int getc (FILE *f); int fgetc (FILE *f) – возращают прочитанный символ в форме int. Если невозможно – знач. EOF.

2) Чтение строки: а) из stdin char *gets(char *s); - читает символы из stdin до \n (не включается)

Б) из потока f char *fgets(char *s, int n, FILE *f) – читает не более n-1 из f в строку s. Чтение прекращается при появлении \n или EOF.

3) Вывод символа: а) на stdout int putchar (int ch); б) в поток f int putc(int ch, FILE *f); int fputc (int ch, FILE *f); - выводят символ ch, возвращают выеденный символ, при ошибке – EOF.

4) Вывод строки: а) на stdout: int puts(char *s); б) в поток f: int fputs (char *s, FILE *f).

Форматированный ввод-вывод:

1) Чтение: a) из stdin: int scanf(const char *format, p1,p2,…); б) из потока f: int fscanf(FILE *f, const char *format, p1,p2,….); - функции читают текстовые данные из потока, преобразуют их в соответствии со спецификациями, содержащимися в строке format, и присваивают по порядку аргументам, каждый из которых должен быть указателем.

2) Вывод: а) в stdout: int printf(const char *format, p1,p2,…); б) в поток f: int fprintf(FILE *f, const char *format, p1,p2,…) – Функции преобразуют аргументы p1,p2,… в текстовый вид в соответствии с форматом и выводят в поток.

Основные преобразования printf:

Литера Тип аргумента; вид печати
d,i int; десятичное целое
o int; беззнаковое восьмеричное целое
X,x int; беззнаковое шестнадцатиричное целое
u int; беззнаковое десятичное целое
c int; символ
s char *; печатает строку символов
f double; число в форме с фикс. Точкой
E,e double; число в форме с плавающей точкой
G,g double; использует %e (%E) или %f.
p void *; указатель (представление зависит от реализации)
% аргумент не преобразуется; печатается знак %

Основные преобразования scanf аналогичны преобразованиям printf

3) ввод-вывод из внешних файлов

Любой файл предварительно нужно открыть: FILE* fopen(char* name, char* mode);

Закрыть файл int fclose (FILE*);

6. Язык Си-средство разработки ОС. Функции. Передача параметров. Аргументы командной строки.

Два способа описания и определения функций, «новая» и «старая» нотации:

Новая:

[<тип результата>]<имя функции>([список параметров])

{[декларации]

[операторы]

}

Старая:

[<тип результата>]<имя функции>([список имен парам.])

[описание параметров]

{ [декларации]

[операторы]

}

Функция может возвращать одно значение, тип которого указывается в заголовке, а само значение задается выражением в операторе возврата return <выражение>;

Функция может не возвращать значение, тогда тип результата void.

В начале программного файла, для всех функций, кроме main, задаются прототипы. Синтаксически прототип повторяет заголовок функции.

В программах переменные обладают следующими качествами:

· Видимость переменной (область видимости);

· Существование переменной (область существования).

Область видимости переменной – определяет текстовое пространство программы, из любой точки которого доступна данная переменная ( с данным именем).

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

           С точки зрения видимости выделим следующие группы переменных:

· Видимые в пределах блоков

· Видимые в пределах файла

· Видимые в пределах программы

Указание static, примененное к переменной или функции, ограничивает область их видимости концом файла.

Если переменная определена в другом программном файле, она должны быть описана со спецификатором extern.

С точки зрения существования выделим две группы переменных:

· Статические переменные;

· Автоматические переменные

Статические переменные существуют на всем протяжении работы программы, по умолчанию инициализируются нулем. Все переменные, определенные вне функций, являются статическими.

Автоматическими переменными являются все переменные определенные внутри блока и не являющиеся статическими. Автоматические переменные существуют на протяжении работы блока, в котором они определены.

Аргументы командной строки

Запускаемой программе, можно передать аргументы: main(int argc, char *argv[])

Где, argc – кол-во аргументов командной строки, argv – адрес массива указателей на строки-аргументы.

7. Язык Си-средство разработки ОС. Динамическое выделение памяти. Структуры и объединения.

Структура – это тип данных, позволяющий сгруппировать несколько переменных под одним именем. struct [<тег структуры>]{<список деклараций полей>};

Используя typedef при декларации структуры, задают ее новое имя:

typedef struct point {int x; int y;} sp;

Теперь тип sp – синоним типа struct point, и следующие определения эквивалентны:

struct point z;                                              sp z;

Доступ к полям структуры осуществляется с помощью операции «точка»: z.x, z.y, если же определен указатель на структуру p, то используется операция «стрелка» ->. Например:

p=&z;

p->x=2; /* (*p).x – эквивалентно */

Структуры могут быть вложенными. Разрешается присваивать и копировать структуры, но структуры нельзя сравнивать.

Объединение (union) – это тип данных, позволяющий хранить разнородные данные в одной и той же области памяти.

Фактически, объединение – это структура, все поля которой имеют нулевое смещение относительно ее базового адреса, а размер выделяемой области памяти определяется самым большим полем.

Динамические структуры данных

Эл. однонаправленного списка Эл. двунаправленного списка Эл. бинарного дерева
struct Node1 { double data; struct Node1 *next;}; struct Node2 { int num; struct Node2 *next; struct Node2 *prev;}; struct NodeTree {char name[10]; struct Node2 *llink; struct Node2 *rlink;};

 Библиотечные функции для динамического выделения и освобождения памяти:

#include <stdlib.h>

void *malloc (size_t size); - Выделяет указанное аргументом size число байтов

void *calloc(size_t nelem, size_t elsize); - выделяет память для указанного аргументом nelem числа объектов, размер которых elsize.

void free(void *ptr); - освобождает ранее выделенную память, указатель на которую передается через аргумент ptr.

 

8. Принципы построения ОС. Архитектура ОС.

ОС – это комплекс программ, обеспечивающий контроль за существованием, распределением и использованием ресурсов ВС.

Основные принципы построения ОС:

1) модульность

2) особого режима работы

3) виртуализации

4) мобильности (переносимости)

5) совместимости

6) генерируемости

7) открытости (расширяемости)

8) обеспечения безопасности вычислений

 

Архитектура ОС

Ядро – модули, выполняющие основные внутрисистемные функции ОС и постоянно находящиеся в ОП. Эти функции недоступны для приложений. Другой класс функций ядра служит для поддержки приложений, создавая для них прикладную программную среду (API).

Вспомогательные модули – модули, выполняющие вспомогательные функции ОС: утилиты, системные обрабатывающие программы, программы предоставления пользователю дополнительных услуг, библиотеки различного назначения.

см. Лекцию №7 «Основные структуры ОС»

9. Управление процессами. Понятие процесса. Типы процессов. Жизненный цикл процесса.

10. Управление процессами. Понятие процесса. Контекст процесса.

«Программа» - упорядоченная последовательность действий в виде машинных команд.

«Задание» - совокупность программы, набора команд языка управления заданиями, необходимых для ее выполнения, и входных данных.

Процесс (или по-другому, задача) – абстракция, описывающая выполняющуюся программу.

           В общем случае процесс можно определить как совокупность данных и машинных команд, исполняющуюся в рамках ВС и обладающую правами на владение некоторым набором ресурсов.

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

Выводы:

1) все, что выполняется в ВС (даже определенные части ОС), организовано как набор процессов;

2) на однопроцессорной компьютерной системе в каждый момент времени может исполняться только один процесс;

3) во всех современных ВС поддерживается режим мультипрограммирования, при котором на одном процессоре попеременно выполняется сразу несколько программ ( пока один процесс выполняется, остальные ждут своей очереди на получение процессора);

4) в МВС псевдопараллельная обработка нескольких процессоров достигается с помощью переключения процессора с одного процесса на другой.

           Для каждого процесса определена структура данных, фиксирующая текущее состояние процесса. Такую структуру называют контекстом процесса. Она существует с момента создания процесса и до момента завершения его работы.

Контекст процесса

Контекст процесса делиться на 3 части: 1) пользовательский контекст; 2) Регистровый контекст; 3)Контекст системного уровня.

1) – это содержимое пользовательского адресного пространства (т.е. содержимое сегментов программного кода, данных, стека, разделяемых сегментов и файлов, отображаемых в виртуальную память).

2) – это содержимое аппаратных регистров (таких, как регистр счетчика команд, регистр состояния процессора, регистр указателя стека и регистров общего назначения).

3) – это структуры данных ядра ОС, связанные с этим процессом.

В общем случае данная информация может дополняться или меняться по ходу исполнения процесса в зависимости от того, чем в данный момент процесс занимается.

Цель создания и поддержания такой структуры: возможность продолжения корректной работы процесса после приостановки его функционирования на процессоре.

 

Некоторые типы процессов.

«Полновесные процессы» (процессы) - это процессы, выполняющиеся внутри защищенных участков памяти операционной системы, то есть имеющие собственные виртуальные адресные пространства для статических и динамических данных.

«Легковесные процессы» (нити или потоки – thread). Нити существуют в рамках одного процесса и выполняются в квазиапараллельном режиме. Все нити одного процесса всегда решают общую задачу одного пользователя. Таким образом, аппарат нитей используется для более быстрого решения задачи путем ее распараллеливания.

Обобщая сказанное, отметим, что понятие процесса в любой ОС включает в себя:

· исполняемый код

· собственное виртуальное адресное пространство

· совокупность ресурсов, выделенных данному процессу

· хотя бы одну исполняемую нить

Жизненный цикл процесса

ЖЦП в ВС – время с момента создания до момента завершения выполнения процесса.

Основные состояния процесса:

1. Рождение – состояние процесса, когда он уже создан, но не готов к запуску, при этом создаются контекст и дескриптор; загружается кодовый сегмент процесса в оперативную память или в область свопинга, процесс помещается в очередь готовых пр.

2. Исполнение – активное состояние процесса, во время которого процесс обладает всеми необходимыми ресурсами и непосредственно выполняется процессором;

3. Ожидание – пассивное состояние процесса, процесс заблокирован, он не может выполняться по своим внутренним причинам, т.е. он ждет осуществления некоторого события, например, завершения операции ввода-вывода, получения сообщения от другого процесса, освобождения какого-либо необходимого ему ресурса;

4. Готовность – также пассивное состояние процесса: процесс имеет все требуемые для него ресурсы, он готов выполняться, однако процессор занят выполнением другого процесса;

5. Завершение – конечное состояние в ЖЦП, процесс выгружается из памяти и разрушаются все структуры данных, связанные с ним.

11. Взаимодействующие процессы. Методы реализации взаимного исключения.

12. Планирование процессов. Цели и задачи. Классификация алгоритмов.

Планирование процессов:

Основные задачи:

· определение момента времени для смены выполняемого процесса

· выбор процесса на выполнение из очереди готовых процессов

· переключение контекстов «старого» и «нового» процессов

Цели планирования:

1) Справедливость

2) Эффективность

3) Сокращение времени выполнения

4) Сокращение времени ожидания

5) Сокращение времени пребывания

Часть ОС, которая занимается планированием процессов – планировщик, а используемые алгоритмы – алгоритмы планирования.

Алгоритмы планирования зависят от типа ВС

Категории ВС:

в пакетных системах

в интерактивных системах

в системах реального времени

Свойства:

1. предсказуемость: одно и то же задание должно выполняться приблизительно за одно и то же время

2. минимальные накладные расходы

3. сбалансированная загрузка ресурсов ВС

4. масштабируемость: алгоритмы должны сохранять работоспособность при увеличении нагрузки

Классификация алгоритмов:

1) Вытесняющие

2) Не вытесняющие

В не вытесняющих АП переключение происходит по инициативе самой задачи, в вытесняющих – по прошествии выделенного кванта времени по инициативе ОС.

Бес приоритетные АП: запускается процесс и выполняется до тех пор, пока не заблокируется либо добровольно не освободит ЦП

Приоритетные АП: запускается процесс и выполняется до истечения заданного времени.

 

13. Планирование процессов. Планирование в пакетных системах

1) Первым пришел-первым обслужен

2) Сначала самое короткое задание

3) Приоритет наименьшему времени выполнения

 

Первым пришел-первым обслужен или First Come First Served (FCFS):

Не вытесняющее планирование, задачи обслуживаются «в порядке очереди», в порядке их появления. Те задачи, которые были заблокированы, после перехода в состояние готовности ставятся в очередь.

Здесь 2 варианта:

1) ставить разблокированную задачу в конец очереди готовых задач

2) использовать две очереди: очередь новых задач, очередь разблокированных задач.

Преимущество: простота реализации

Недостатки: среднее время ожидания и среднее полное время выполнения зависят от порядка расположения процессов в очереди. Короткие задания вынуждены ожидать столько же, сколько трудоемкие задания.

Сначала самое короткое задание или Shortest-Job-First (SJF)

Предполагается, что время выполнения каждого задания известно заранее

Недостаток: Задания, которым требовалось немного времени для своего завершения, вынуждены ожидать процессор наравне с длительными работами.

Приоритет наименьшему времени выполнения или Shortes Remainin Time (SRT)

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

Дисциплины FCFS, SJN, SRT относятся к не вытесняющим.

 

13. Планирование процессов. Планирование в интерактивных системах.

Цель: обеспечить приемлемое время реакции системы и равенство в обслуживании

1) Циклическое планирование

2) Приоритетное планирование

3) Выбор следующим самого короткого процесса

4) Гарантированное планирование

5) Лотерейное планирование

6) Справедливое планирование

Циклическое планирование или Round Robin (RR)

Каждая задача получает процессорное время порциями или квантами времени (time slice) q. По истечении кванта задача снимается с процессора и ставится в конец очереди задач, готовых к выполнению.

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

Приоритетное планирование

Каждому процессу присваивается приоритет. Запускается тот процесс, который находится в состоянии готовности и имеет самый высокий приоритет.

Реализация приоритетного обслуживания делается за счет организации нескольких очередей.

 

Выбор следующим самого короткого процесса.

Подход – аналог подхода SJF в пакетных системах. Но в интерактивных системах проблема: как определить какое задание самое короткое? Используется не само значение времени выполнения, а его оценка.

Гарантированное планирование

Если в системе имеется n процессов, каждому из них гарантируется 1/n часть времени ЦП.

Лотерейное планирование

Процессам раздаются «лотерейные билеты» на доступ к ресурсу. Планировщик случайным образом выбирает лотерейный билет, и ресурс предоставляется тому процессу, который владеет этим билетом. Некоторые процессы могут иметь несколько билетов. Процессы могут обмениваться билетами.

Справедливое планирование:

Понятие справедливости. К примеру, ресурс предоставляется не процессу, а пользователю. Каждый из n пользователей должен получить 1/n часть времени ресурса независимо от количества процессов.

15. Планирование процессов. Планирование в системах реального времени.

16. Понятие процесса в ОС UNIX. Типы процессов. Контекст процесса.

В ОС UNIX процесс можно определить, с одной стороны, как единицу управления и потребления ресурсов, с другой стороны – как объект, зарегистрированный в таблице процессов ядра UNIX.

Типы процессов: а) системные процессы; б) демоны; в) прикладные процессы.

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

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

К прикладным процессам относятся все остальные процессы, выполняющиеся в системе.

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

Каждому процессу в UNIX сопоставлено целое число – идентификатор процесса (PID), число в диапазоне от 0 до N, характеризующего максимально возможное количество одновременно существующих процессов. PID = 0 ассоциируется я ядром ОС, PID = 1 – процесс init.

Контекст процесса

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

С точки зрения логической структуры контекст процесса в UNIX состоит из:

· пользовательской составляющей или тела процесса (пользовательский контекст)

· аппаратной составляющей (аппаратный контекст)

· системной составляющей (системный контекст)

Объединение аппаратной составляющей и системной составляющей – общесистемная составляющая контекста.

17. Аппарат системных вызовов в ОС UNIX. Порождение новых процессов.

Для порождения новых процессов в UNIX существует единая схема, с помощью которой создаются все процессы, кроме процессов с PID=0 и PID=1.

Для создания нового процесса в ОС UNIX используется системный вызов fork().

#include <sys/types.h>

#include <unistd.h>

pid_t fork(void);

При этом в таблицу процессов заносится новая запись, и порожденный процесс получает свой PID.

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

Не наследуется порожденным процессом:

· PID

· PPID

· сигналы, ждущие доставки в родительский процесс и некоторые др.

Каждый из процессов – родительский и порожденный – получив управление, продолжат выполнение с одной и той же инструкции одной и той же программы, а именно с той точки, где происходит возврат из системного вызова fork().

Вызов fork() в случае удачного завершения возращает сыновнему процессу значение 0, а родительскому PID порожденного процесса.

18. Аппарат системных вызовов в ОС UNIX. Механизм замены тела процесса.

Семейство системных вызовов exec() производит замену тела вызывающего процесса, после чего данный процесс начинает выполнять другую программу, передавая управление на точку ее входа.

Возврат к первоначальной программе происходит только в случае ошибки при обращении к exec(), т.е. если фактической замены тела процесса не произошло.

19. Аппарат системных вызовов в ОС UNIX. Использование схемы fork()-exec().

механизм fork-and-exec переключает старые команды на новые, пока окружение, в котором выполняется новая программа остается таким же, в том числе конфигурация устройств ввода/вывода, переменные окружения и приоритет. Этот механизм используется для создания всех процессов UNIX. Даже первый процесс, init, с процессорным ID 1, порождается во время загрузки в так называемой процедуре bootstrapping (начальной загрузки).

Эта схема иллюстрирует механизм fork-and-exec. ID процесса изменяется после процедуры порождения:

20.Аппарат системных вызовов в OC UNIX. Завершение процесса.

Когда процесс завершается нормально (его не завершили или иным способом неожиданно не прервали), программа возвращает его exit status (статус выхода) родителю. Этот exit status является числом, возвращаемым программой, предоставившей результаты своего выполнения. Система передачи информации об исполненной работе берет свое начало с языка программирования Си, на котором был написан UNIX.

Коды возврата могут быть интерпретированы родителем или скриптами. Значения кодов возврата специфичны для программ. Эту информацию обычно можно найти в man-страницах указанной программы, например команда grepвозвращает -1, если не найдено совпадений, при этом в строке может быть выведено сообщение: "Нет найденных файлов". Другим примером является встроенная команда Bash true, которая не делает ничего, кроме возвращения статуса выхода 0, что означает успех.

21. Управление процессами. Жизненный цикл процесса в OС UNIX.

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

После выполнения системного вызова fork новый процесс обычно запускает новую программу с помощью одного из системных вызовов семейства exec. Все вызовы семействаexec производят приблизительно одинаковые действия: они замещают сегмент кода процесса и устанавливают сегменты данных и стека в исходное состояние. Формы вызовов exec отличаются только способами указания аргументов командной строки и переменных среды, передаваемых новой программе.

Программа init играет и другую важную роль в управлении процессами. Когда процесс завершается, он вызывает функцию _exit(), чтобы уведомить ядро о своей готовности прекратить работу. В качестве параметра функции _exit() передается код завершения — целое число, указывающее на причину останова процесса. По соглашению нулевой код завершения означает, что процесс окончился успешно.

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

22. Взаимодействие процессов в ОС UNIX. Классификация методов.

Сигналы – асинхронное уведомление процесса о каком-либо событии. Когда сигнал послан процессу, ОС прерывает выполнение процесса. Если процесс установил собственный обработчик сигнала, ОС запускает этот обработчик, передав ему информацию о сигнале. Если процесс не установил обработчик, то выполняется обработчик по умолчанию.

Каналы – псевдофайл, в который один процесс пишет, а другой читает

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

Сокеты – поддерживаемый ядром механизм, скрывающий особенности среды и позволяющий единообразно взаимодействовать процессам, как на одном компьютере, так и в сети.

Разделяемая память – В обычной ситуации обмен информацией между процессами проходит через ядро. Техника разделяемой памяти позволяет осуществить обмен информацией не через ядро, а используя некоторую часть виртуального адресного пространства, куда помещаются и откуда считываются данные. После создания разделяемого сегмента памяти любой из пользовательских процессов может подсоединить его к своему собственному виртуальному пространству и работать с ним, как с обычным сегментом памяти. Недостатком такого обмена является отсутствие каких бы то ни было средств синхронизации.

Семафоры – переменные для подсчета сигналов запуска, сохраняемых на будущее.

23. Взаимодействие процессов в ОС UNIX. Неименованные каналы.

24. Взаимодействие процессов в ОС UNIX. Именованные каналы.

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

Например, можно создать канал и настроить gzip на сжатие того, что туда попадает:

mkfile pipe

gzip -9 –c <pipe >out

Параллельно, в другом процессе можно выполнить:
cat file > pipe

Что приведет к сжатию передаваемых данных gzip-ом.

25. Взаимодействие процессов в ОС UNIX. Сигналы, надежные сигналы.

Сигнал - асинхронное уведомление процесса о каком-либо событии. Когда сигнал послан процессу, операционная система прерывает выполнение процесса. Если процесс установил собственный обработчик сигнала, операционная система запускает этот обработчик, передав ему информацию о сигнале. Если процесс не установил обработчик, то выполняется обработчик по умолчанию.

Названия сигналов «SIG…» являются числовыми константами (макроопределениями Си) со значениями, определяемыми в заголовочном файле signal.h. Числовые значения сигналов могут меняться от системы к системе, хотя основная их часть имеет в разных системах одни и те же значения. Утилита kill позволяет задавать сигнал как числом, так и символьным обозначением.

Сигналы посылаются:

§ с терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, а Ctrl-Z SIGTSTP);

§ ядром системы:

§ при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.);

§ ошибочных системных вызовах;

§ для информирования о событиях ввода-вывода;

§ одним процессом другому (или самому себе), с помощью системного вызоваkill(), в том числе:

§ из шелла, утилитой /bin/kill.

Сигналы не могут быть посланы завершившемуся процессу, находящемуся в состоянии «зомби».

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

26. Взаимодействие процессов в ОС UNIX. System V IPC.

- Разделяемая память

- Семафоры

- Очереди сообщений

get() – используется для создания средства IPC, возвращает идентификатор средства.

ctl() – Определяет состояние, устанавливает различные опции и права доступа или удаляет идентификатор IPC

op() – Выполняет операции над средством IPC

Общие свойства средств IPC:

- Средства могут быть созданы за любое время до их использования

- В момент создания для средства IPC устанавливаются собственность и права доступа, которые могут позднее быть изменены.

- Содержимое средства IPC может сохраняться после того, как все использовавшие его процессы завершились.

- Средства должны удаляться явным образом, командной или соответствующим системным вызовом.

- Средства IPC теряются при перезагрузке системы.

get() – основные сведения: Создатель задает IPC_CREAT и права доступа в параметре flg; можно дополнительно задать IPC_EXCL; IPC_PRIVATE предоставляет приватный ключ

ctl – основные сведения: IPC_STAT – информация о состоянии; IPC_SET – изменяет хозяина и права доступа; IPC_RMID – удаляет средство.

ipcs() – Состояние всех существующих в данный момент средств IPC.

ipcrm() – удаление средства IPC.

Очереди сообщений:

msgget – создать очередь или получить доступ к ней

msgctl – определить состояние очереди; изменить хозяина или права доступа; изменить максимальный размер очереди или удалить ее

msgop – послать (msgsnd) или получить (msgrcv) сообщение

Семафоры:

Разделяемое короткое без знаковое целое значение.

Используется для: блокировки; управление доступом к ресурсам; подсчета; разделения небольшого без знакового значения между процессами.

Разделяемая память

shmget – создать или получить доступ к сегменту памяти

shmctl – определить состояние сегмента; изменить хозяина/группу сегмента и права доступа; удалить сегмент

shmop – присоединить (shmat) сегмент к области данных процесса, или отсоединить его (shmdt)

 

27. Взаимодействие процессов в ОС UNIX. Сокеты, определение, основные типы. Системные вызовы.

Сокеты – одно из средств коммуникации между процессами. Главное отличие сокетов от других средств межпроцессного взаимодействия, таких как пайпы и очереди соообщений состоит в том, что обменивающимся информацией процессам не обязательно находится на одном компьютере.

socket() – создание сокета

connect() – его привязка к адресу и порту, установка соединения

write() – посылка запроса

read() – прием ответа

close() – закрытие сокета.

bind() – привязка сокета к адресу

listen() – перевод сокета в пассивный режим

accept() – прием полностью установленного соединения

int socket(int domain, int type, int protocol); domain – определяет семейство протоколов. type – тип сокета; protocol – протокол для данного типа сокета.

int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen); sockfd – дескриптор сокета; *serv_addr – указатель на структуру, содержащую инфу о сокете; addrlen – размер этой структуры.

Структура sockaddr:

struct sockaddr{

                                        unsigned short sa_family;

                                        char sa_data[14];

};

int close(int sockfd); - Закрывает дескриптор сокет, тем самым, завершая соединение.

28. Взаимодействие процессов в ОС UNIX. Сокеты. Общая схема работы с сокетами без предварительного установления соединения.

 

29. Взаимодействие процессов в ОС UNIX. Сокеты. Общая схема работы с сокетами c предварительным установлением соединения.

30. Взаимодействие процессов в ОС UNIX. Среда MPI, индивидуальные и коллективные коммуникации.

 


Дата добавления: 2021-03-18; просмотров: 85; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!