- •20 Билет
- •1)Установление связи
- •2) Передача данных
- •2.Системные вызовы
- •3.Примеры
- •2 Билет.
- •1.Управление процессами
- •2. Сигналы.
- •3 Билет
- •1.Обработка Сигнала
- •2) Группы процессов
- •3)Примеры
- •4 Билет
- •1)Посылка сигналов процессами
- •2)Межпроцессные комуникации
- •3)Примеры в качестве примера можно привести программу ,которая принимает сигналы о прерывании (sigint) и сама посылает их (в результате выполнения функции kill
- •5 Билет.
- •6 Билет.
- •7 Билет
- •1)Атомарные (неделимые) операции с каналами
- •2)Примечания к полудуплексным каналам
- •8 Билет
- •1)Именованные каналы (fifo: First In First Out): основные понятия
- •2)Операции с fifo
- •3) Примеры
- •9 Билет
- •1) Базовые понятия System V ipc
- •2) Идентификаторы ipc
- •10 Билет
- •11 Билет
- •1)Буфер сообщения
- •13 Билет
- •1)Системный вызов msgctl
- •2)Семафоры. Основные понятия
- •1)Системный вызов semget.
- •2) Системный вызов semop.
- •15 Билет
- •1) Системный вызов semctl
- •2) Разделяемая память. Основные понятия.
- •3) Примеры
- •16 Билет
- •1) Системный вызов shmget
- •2) Системный вызов shmctl
- •3) Примеры
- •17 Билет
- •Системный вызов shmat
- •Системный вызов shmdt
- •18 Билет
- •Системный вызов mmap
- •19 Билет
- •1) Создание сокета
- •2) Привязка к локальным именам
- •3) Примеры:
- •20 Билет
- •1)Установление связи
- •2) Передача данных
- •3) Примеры Установление связи
- •Передача данных
- •21 Билет
- •1. Закрытие сокетов.
- •22 Билет.
- •1) Алгоритмы
- •2) Оценки эффективности алгоритмов.
- •3) Примеры
- •23 Билет
- •1.Ядро операционной системы
- •2.Системные вызовы
- •3.Примеры
- •24 Билет.
- •25 Билет
- •1) Системный вызов semctl
- •2) Разделяемая память. Основные понятия.
- •3) Примеры
- •26 Билет
- •1) Группы процессов
- •2)Обработка Сигнала
- •3)Примеры
- •27 Билет
- •1) Создание сокета
- •2) Привязка к локальным именам
- •3) Примеры:
- •28 Билет.
- •29 Билет
- •1. Закрытие сокетов.
- •30 Билет
- •1)Установление связи
- •2) Передача данных
- •3) Примеры Установление связи
- •Передача данных
2) Разделяемая память. Основные понятия.
Разделяемая память может быть наилучшим образом описана как отображение участка (сегмента) памяти, которая будет разделена между несколькими процессами. Это гораздо более быстрая форма IPC, потому что здесь нет никакого посредничества (т.е. каналов, очередной сообщений и т.п.). Вместо этого информация отображается непосредственно из сегмента памяти в адресное пространство вызывающего процесса. Сегмент может быть создан одним процессом и впоследствии использован для чтения и записи любым количеством процессов.
3) Примеры
Алгоритм обмена двух переменных а и b в общем случае реализуется за три шага независимо от того, к какому типу простых переменных он применяется:
temp ← a
a ← b
b ← temp
С точки зрения количества машинных операций, две разных ситуации — обмена содержимым между переменными, занимающими одно машинное слово или занимающими два машинных слова, - неравноценны. Но оценка алгоритмической трудоемкости это не учитывает.
16 Билет
1) Системный вызов shmget
Чтобы создать новый разделяемый сегмент памяти или получить доступ к уже существующему сегменту, используется системный вызов shmget.
int shmget ( key_t key, int size, int shmflg );
Этот новый вызов похож на соответствующие вызовы get для очередей сообщений и множеств семафоров.
Первый аргумент для shmget – это значение ключа, полученное посредством вызова ftok, которое затем сравнивается с существующими значениями, находящимися внутри ядра для других разделяемых сегментов памяти. В этом отношении операция открытия или получения доступа зависит от содержания аргумента shmflg.
Как только процесс получает действующий идентификатор IPC для выделяемого сегмента, следующим шагом является привязка или размещение сегмента в адресном пространстве процесса.
2) Системный вызов shmctl
int shmvtl ( int shmqid, int cmd, struct shmid_ds *buf );
Вызов очень похож на msgctl, выполняющий подобные задачи для очередей сообщений.
IPC_RMID в действительности не удаляет сегмент из ядра, а только помечает для удаления. Настоящее же удаление не происходит пока последний процесс, привязанный к сегменту, не «отвяжется» от него. Конечно, если ни один процесс не привязан к сегменту на данный момент, удаление осуществляется немедленно.
Снятие привязки производит системный вызов shmdt.
3) Примеры
Задача состоит в том, чтобы найти сумму натуральных чисел от 1 до заданного n. Если воспользоваться известной формулой для суммы арифметической прогрессии, то вычисления также потребуют лишь 3 шага: сложение, умножение и деление. Если же реализовать вычислительный процесс как циклический: цикл с параметром, управляющая переменная «пробежит» значения от 1 до n, то придется выполнить n шагов алгоритма. Сомнений, какой из алгоритмов более эффективен, кажется, не возникает. Однако вспомните о «худших случаях» при небольших значениях n (скажем, от 2 до 4), «медленный» алгоритм, вероятно, предпочтительнее.
Для алгоритмов, подобных только что рассмотренному, (n шагов для обработки n входных значений), очевидно, что количество шагов является функцией от числа обрабатываемых элементов. Можно считать, что количество шагов является функцией от количества элементов - f(n). В математике существует специальный механизм оценки скорости роста интересующей исследователя величины: ее сравнивают с какой-нибудь функцией, чье поведение хорошо исследовано. При этом используется обозначение g(n)=O(f(n)) (читается O-большое), которое мы будем относить к интересующим нас дискретным функциям f(n) натурального n и ко всем функциям g(n), растущим не быстрее f(n). Формулировка "растущим не быстрее" означает, что существует такая пара положительных значений M и n0, что |g(n)|≤M|f(n0)| для n≥n0. Еще говорят, что функция g(n) - "порядка f(n) для больших n".
Такая O-нотация дает нам верхнюю оценку временнОй трудоемкости алгоритма, его асимптотическую сложность. Обратите внимание, что использование констант M и n0, фигурирующих в определении, фактически связано с "большими" значениями аргумента n и мало что дает при его малых значениях.
Укажем несколько важных свойств O-операций:
а) f(n)=O(f(n))
b) c·O(f(n))=O(f(n)), где c - некоторая константа
c) O(f(n))+O(f(n))=O(f(n))
d) O(O(f(n)))=O(f(n))
e) O(f(n))·O(g(n))=O(f(n)·g(n))
Кроме введенной терминологии, полезна и другая, так называемая o-нотация ("о-малое"). Обозначение o(f(n)) относится к функциям, которые растут быстрее f(n).
Вновь обращаясь к примеру с суммой арифметической прогрессии, можем сказать, что асимптотическая эффективность алгоритма непосредственного суммирования n элементов соответствует линейной сложности, поскольку его быстродействие, то есть число шагов, согласно свойству (a), есть O(n).
Вообще говоря, если алгоритм связан с обработкой n входных элементов, и аналитического выражения - формулы - для быстрого вычисления результата в нашем распоряжении нет, то достижение лучшей эффективности, чем O(n) (если это вообще возможно), следует рассматривать как большой успех.
Заметим, что при том же объеме входного набора существуют более трудоемкие алгоритмы, ускорить вычислительный процесс которых удается далеко не всегда.
