- •Билет 1
- •1. Основы ос Unix, возможности, стандартизация (1) – 4
- •Отличительные черты ос unix
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 4 (1, 16, 18) – 146
- •3. Последовательность действий по преобразованию адреса в защищенном режиме
- •Билет 2
- •1. Понятие системного вызова в ос unix. Обработка ошибок (2) – 9
- •Обработка ошибок
- •Void perror (s)
- •Void perror (const char *s);
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 2 (2, 6, 15, 27) – 143
- •3. Особенности современных операционных систем (2, 28) – 122
- •Концепция ос на основе микроядра
- •Многопоточность
- •Cимметричная многопроцессорность.
- •Распределенные ос
- •Int chmod(const char *path, mode_t mode);
- •Int fcmod(int fd, mode_t mode);
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 3 (3, 28) – 144
- •3. Концепция слоистой операционной системы и системы на основе микроядра.
- •Билет 4
- •1. Владельцы файлов. Права доступа к файлам. Атрибуты файлов (4, 18) – 23
- •Атрибуты файла
- •Int chmod(const char *path, mode_t mode);
- •Int fcmod(int fd, mode_t mode);
- •Int chown (const char *path, uid_t owner, gid_t group);
- •Int lchown (const char *path, uid_t owner, gid_t group);
- •Int fchown (int fd, uid_t owner, gid_t group): ,
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 1 (4, 26) – 142
- •3. Функции микроядра (4, 12, 15, 27) – 126
- •Билет 5
- •1. Неименованные каналы в ос unix (5) – 77
- •Int pipe(int fd[2]);
- •2. Взаимодействие процессов. Задача взаимного исключения. Алгоритм Деккера (5) – 147
- •3. Понятие процесса, модели процессов (5) – 132
- •Билет 6
- •Метаданные файлов в ос unix (7) – 36
- •Int stat(const char *path, struct stat *buf);
- •Int fstаt(int fd, struct stat *buf);
- •Int lstat(const char *path, struct stat *buf);
- •2.Взаимодействие последовательных процессов. Задача взаимного исключения. Вариант2.
- •3. Описание процесса, таблица процесса (6) – 136
- •Билет 7
- •1. Процессы в ос unix. Типы процессов. (7, 23) – 56
- •2. Синхронизирующие примитивы. Решение задачи взаимного исключения с использованием семафоров (7, 8, 19, 20) - 152
- •3. Принципы построения ос (7, 19, 26) – 128
- •Билет 8
- •1. Атрибуты процессов в unix (8) – 66
- •2.Применение общего семафора для решения задачи "производитель-потребитель" с неограниченным буфером.
- •3. Концепция потока, как составной части процесса (8) – 139
- •Билет 9
- •1. Разработка программ в ос unix. Обработка ошибок, переменные окружения (9)
- •Int putenv(const char *string);
- •Int setenv(const char * name, const char * value, int ov );
- •Int unsetenv(const char * name);
- •Обработка ошибок
- •Void perror (const char *s);
- •2. Применение двоичных семафоров для решения задачи «производитель» - «потребитель» (буфер неограниченный) (9, 21)
- •3. Концепция виртуализации (9, 17) –
- •Билет 10
- •1. Файлы, отображаемые в память (10) – 33
- •Void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
- •2. Применение семафоров для решения задачи «производитель» - «потребитель» с неограниченным буфером. Решение «спящий парикмахер». (10, 22) – 155
- •3. Подсистема управления памятью, требования, предъявляемые к ней (10)
- •1. Процессы в ос unix. Порождение процесса (11, 25) – 57
- •2. Применение общих семафоров для решения задачи «производитель-потребитель» с ограниченным буфером (11, 23) – 157
- •3. Виртуальная память. Задачи управления виртуальной памятью (11, 25)
- •Билет 12
- •1. Сигналы в ос unix. Их назначение и обработка (12) – 70
- •Void (*sa_handler)(int);
- •Void (*sa_sigaction)(int, siginfo_t *, void *);
- •Int sa_flags;
- •Int pause (void);
- •2. Взаимодействие процессов через переменные состояния. Пример приоритетного правила (12) – 157
- •3. Функции микроядра (4, 12, 15, 27) – 126
- •Билет 13
- •1. Функции для работы с сигналами (13) – 70
- •Void (*sa_handler)(int);
- •Void (*sa_sigaction)(int, siginfo_t *, void *);
- •Int sa_flags;
- •Int pause (void);
- •Наборы сигналов
- •Блокировка сигналов
- •Int sigprocmask(int how, const sigset_t *set, sigset_t, *oldset);
- •Int sigaсtion(int signo, const struct sigactoin *act, struct sigaction *oldact);
- •Void my_handler(int signo)
- •Void my_handler(int signo, siginfo_t *si, void ucontext )
- •2. Проблема тупиков. Алгоритм банкира (13)
- •3. Задача замещения при управлении виртуальной памятью, часовой алгоритм.
- •Билет 14
- •Int chmod(const char *path, mode_t mode);
- •Int fcmod(int fd, mode_t mode);
- •2. Задача взаимного исключения. Алгоритм Петерсона (14, 25) – 148
- •3.Распределение памяти. Система двойников.
- •Система двойников при распределении памяти.
- •Билет 15
- •1. Файловая система в ос unix ext2 (15) – 51
- •Организация файловой системы ext2
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 2 (2, 6, 15, 27) – 143
- •3. Функции микроядра (4, 12, 15, 27) – 126
- •Билет 16
- •1.Каналы в ос unix (16) – 80
- •Int pipe(int fd[2]);
- •Int mkfifo(const char *pathname,mode_t mode);
- •Размер канала и взоимодействие процессов при передаче данных
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 4 (1, 16, 18) – 146
- •3. Организация защиты в процессорах ia32
- •Билет 17
- •1. Процессы в ос unix, системные вызовы wait, exit (17) – 60, 63
- •Void _exit(int exit_code);
- •Void exit(int status);
- •Int atexit(void(*func)(void));
- •2. Монитороподобные средства синхронизации для решения задачи взаимного исключения (17) – 160
- •Механизм типа «условная критическая область»
- •3. Концепция виртуализации
- •Билет 18
- •1. Владельцы файлов. Права доступа к файлам. Атрибуты файлов
- •Атрибуты файла
- •Int chmod(const char *path, mode_t mode);
- •Int fcmod(int fd, mode_t mode);
- •Int chown (const char *path, uid_t owner, gid_t group);
- •Int lchown (const char *path, uid_t owner, gid_t group);
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 4 (1, 16, 18) – 146
- •3. Схемы распределения памяти
- •Билет 19
- •1. Взаимодействие процессов в ос unix, очереди сообщений (19) – 83
- •Int msgget (key_t key, int permflags);
- •Int msgsnd(int mqid, const void *message, size_t size, int flags);
- •Int msgrcv(int mqid, void *message, size_t size, long msg_type, int flags);
- •Int msgctl(int mqid, int command, struct msqid_ds *msq_stat);
- •2. Синхронизирующие примитивы. Решение задачи взаимного исключения с использованием семафоров (7, 8, 19, 20) - 152
- •3. Принципы построения ос (7, 19, 26) – 128
- •Билет 20
- •1 Взаимодействие процессов в ос unix с применением семафоров (20) – 93
- •V(sem) или signal (sem)
- •Int semget(key_t key, int nsems, int permflags);
- •Int semctl (int semid, int sem_num, int command, union semun ctl_arg);
- •Int semop(int semid, struct sembuf *op_array, size_t num_ops);
- •2. Применение общего семафора для решения задачи "производитель-потребитель" с неограниченным буфером.
- •3. Механизмы поддержки многозадачности в процессорах ia32 (20)
- •Билет 21
- •1. Работа с файлами в ос unix. Системные вызовы (21) – 25
- •Int open(const char *name, int flags);
- •Int open(const char *name, int flags, mode_l mode);
- •2. Применение двоичных семафоров для решения задачи "производитель-потребитель" (буфер неограниченный).
- •3. Страничная организация памяти в процессоре ia32
- •Билет 22
- •1. Взаимодействие процессов в ос unix. Разделяемая память (22) – 100
- •Int shmget(key_t key, size_t size, int permflags);
- •Void *shmat(int shmid, const void *daddr, int shmflags);
- •Int shmctl(int shmid, int command, struct shmid ds *shm_stat);
- •2. Применение семафоров для решения задачи «производитель» - «потребитель» с неограниченным буфером. Решение «спящий парикмахер». (10, 22) – 155
- •3. Организация защиты в процессорах ia32
- •Билет 23
- •1. Процессы в ос unix. Типы процессов. (7, 23) – 56
- •2. Применение общих семафоров для решения задачи «производитель-потребитель» с ограниченным буфером (11, 23) – 157
- •3. Задача замещения при управлению виртуальной памятью, часовой алгоритм.
- •Билет 24
- •1. Понятие потока в ос unix. Создание потока, завершение потока (24) – 106
- •Int pthread_create(pthread_t *tid, const pthread_attr_t *tattr,
- •Void*(*start_routine)(void *), void *arg);
- •Функция для завершения нити (потока) исполнения
- •Int pthread_join(thread_t tid, void **status);
- •Int pthread_detach(thread_t tid);
- •Досрочное завершение потока
- •Int pthread_cancel(pthread_t thread);
- •2. Синхронизирующие примитивы. Решение задачи взаимного исключения с использованием семафоров (7, 8, 19, 20, 24) - 152
- •3. Схемы распределения памяти (18, 24)
- •1. Процессы в ос unix. Порождение процесса (11, 25) – 57
- •2. Задача взаимного исключения. Алгоритм Петерсона
- •3. Виртуальная память. Задачи управления виртуальной памятью (11, 25)
- •Билет 26
- •1. Поток в ос unix. Синхронизация потоков, получение информации о потоке.
- •Int pthread_key_create(pthread_key_t *key, void(*destructor)(void *));
- •Int pthread_setschedparam(pthread_t tid, int policy,
- •Int pthread_getschedparam(pthread_t tid, int policy, struct schedparam *param);
- •Int pthread_sigmask(int how, const sigset_t *new, sigset_t *old);
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 1 (4, 26) – 142
- •3. Принципы построения ос (7, 19, 26) – 128
- •Билет 27
- •1. Применение мьютексов при взаимодействии потоков в ос unix.
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 2 (2, 6, 15, 27) – 143
- •3. Функции микроядра (4, 12, 15, 27) – 126
- •1. Применение блокировок чтения-записи при взаимодействии потоков в ос unix.
- •2. Взаимодействие процессов. Задача взаимного исключения. Вариант 3 (3, 28) – 144
- •3. Особенности современных операционных систем (2, 28) – 122
- •Концепция ос на основе микроядра
- •Многопоточность
- •Cимметричная многопроцессорность.
- •Распределенные ос
2. Применение двоичных семафоров для решения задачи "производитель-потребитель" (буфер неограниченный).
Рассматриваются два процесса, которые называются производитель и потребитель. Оба процесса являются циклическими. Производитель при каждом циклическом повторении участка программы производит отдельную порцию информации, которая должна быть обработана потребителем. Потребитель при каждом повторении обрабатывает следующую порцию информации, выработанную производителем. Отношения производитель-потребитель подразумевают односторонний канал связи, по которому могут передаваться порции информации. С этой целью процессы связаны через буфер неограниченной емкости. То есть, произведенные порции не должны немедленно потребляться, а могут организовывать в буфере очередь. Буфер работает по принципу FIFO. При неограниченном буфере производитель никаких ограничений не имеет, а потребитель может читать данные из буфера только если они там есть. Операции добавления порции к буферу и взятия порции из буфера могут помешать друг другу, если не предусмотреть их взаимное исключение во время исполнения. Этого можно избежать с помощью двоичного семафора. При решении стремятся использовать только двоичные семафоры. В таком случае программа будет выглядеть так:
ЗП - задержка потребителя.
ЧПБ – число порций в буфере.
РБ – работа с буфером.
СЧПБ - счетчик порций в буфере.
begin integer ЧПБ, РБ, ЗП;
ЧПБ := 0; РБ := 1; ЗП := 0;
parbegin
производитель: begin
П1: производство новой порции;
p(РБ)
добавление новой порции в буфер;
ЧПБ := ЧПБ + 1;
If (ЧПБ = 1) then v(ЗП);
v(PБ);
goto П1;
end;
потребитель: begin integer СЧПБ;
ждать: p(ЗП);
продолжить: p(PБ);
взятие порции из буфера;
ЧПБ := ЧПБ - 1;
СЧПБ := ЧПБ;
v(PБ);
обработка взятой порции;
if (CЧПБ = 0) then goto ждать;
else goto продолжить;
end;
parend;
end;
Значение локальной переменной СЧПБ устанавливается при взятии порции из буфера и фиксируется, не была ли эта порция последней. Здесь двоичный семафор РБ решает задачу взаимного исключения при работе с буфером. Введен новый двоичный семафор – задержка потребителя (ЗП). Программа представляет интерес в течение времени, когда буфер пуст. В исходном состоянии семафор ЗП установлен в ноль и открывается производителем только в том случае, когда в пустой буфер записывается порция. Остановка потребителя на семафоре ЗП не блокирует работу с буфером, так как стоит выше операции р(РБ). Смысл ждать есть только в том случае, если буфер пуст.
3. Страничная организация памяти в процессоре ia32
Основной причиной применения страничного преобразования является возможность реализации виртуальной памяти, которая позволяет программисту использовать объем памяти больше чем размер физической ОП.
Страничное преобразование было реализовано и до процессоров INTEL, но здесь оно реализовано как внутреннее устройство. В связи с этим появился ряд преимуществ:
- сокращается загрузка внешней шины;
- гарантируется правильность взаимодействия процессора и страничного устройства управления памятью;
- стандартизируются средства поддержки ОС виртуальной памяти;
- допускается программное разрешение и запрещение страничного преобразования адреса;
- снижается общая стоимость системы.
При страничной организации базовым объектом памяти является блок с фиксированным размером 4 kb, который называется страницей.
Фиксированный размер всех страниц позволяет загрузить любую виртуальную страницу в любую физическую страницу. Это и объясняет применение страничного преобразования в случае виртуальной памяти.
Понятие виртуальной памяти с заменой страниц по требованию подчёркивает тот факт, что прикладная программа не касается процесса страничного преобразования памяти и может использовать всё доступное адресное пространство.
Процессор автоматически формирует особый случай не присутствия, если обращение идёт к странице, отсутствующей в физической памяти. При возникновении этого особого случая ОС автоматически загружает затребованную страницу из внешней памяти.
В общем случае сегменты не являются кратными размеру страницы. Но рекомендуется выравнивать небольшие сегменты так, чтобы они полностью находились внутри одной страницы.
В процессе страничного преобразования старшие 20 бит 32-битного линейного адреса замещаются другим 20-битным значением, задающим адрес физической страницы.
Для такого преобразования используются таблицы страниц. В процессорах реализуется двухэтапное преобразование линейного адреса в физический. Можно реализовать и одноэтапное преобразование, но тогда для одной таблицы страниц нужно 4 Мб. Поэтому целесообразнее использование двухэтапного преобразования. Основой страничного преобразования является регистр CR3, который содержит 20-битный физический адрес каталога страниц в текущей задаче, и называется регистром базового адреса каталога страниц (PDBR). Это единственный внутренний регистр процессора, который содержит физический адрес памяти. Младшие 12 бит считаются нулевыми, т.е. каталог выровнен на границу страницы.
Предполагается, что каталог страниц всегда находится в памяти и не участвует в свопинге.
Каталог страниц содержит 1024 32-битных дескриптора, называемых элементами каталога страниц. Каждый из этих элементов адресует подчинённую таблицу страниц второго уровня. В свою очередь, каждая из этих страниц содержит 1024 32-битных дескриптора элементов таблицы страниц, а каждый из этих элементов адресует страничный кадр в физической памяти.
Преобразование линейного адреса в физический состоит из следующих действий.
1. Старшие 10 бит линейного адреса дополняются двумя младшими нулями и служат индексом каталога страниц, выбирая один из элементов в каталоге. Выбранный элемент каталога страниц определяет 20-ти битный адрес таблицы страниц.
2. Средние 10 бит линейного адреса дополняются двумя младшими нулями и индексируют таблицу страниц, выбирая из нее PTE. Этот элемент содержит 20-ти битный базовый адрес страничного кадра в физической памяти.
3. Базовый адрес страничного кадра объединяется с младшими 12-ю битами линейного адреса. В результате получается 32-х битный физический адрес памяти, по которому и производится обращение.
При обращении к элементам каталога и таблицы страниц, производится проверка защиты и присутствия страниц в памяти.
Страничный дескриптор содержит следующую информацию:
Р – вид присутствия. Он показывает, находится ли данная страница в физической памяти. Если Р установлен в 0, то при попытке использовать данный элемент возникает особый случай страничного нарушения и операционная система, обрабатывая это страничное нарушение, должна выполнить действие по размещению физической операционной памяти выбранной страницы. После того, как страница загружена, в него загружается адрес, бит Р устанавливается в 1. После этого повторяется команда, приведшая к страничному нарушению.
r/w – чтения и записи. Показывает какие действия можно выполнить над страницей;
u/s – бит прав доступа. Если при сегментации используется и привилегии, то для страничного только или на системном уровне или на пользовательском.
D и A используются для определения использования страницы. А = 1, если было обращение к странице. D = 1, если осуществилась запись в станицу, т.е. в странице изменились данные.
Эти биты используются при организации виртуальной памяти. D показывает, что если страница не изменилась, то нет смысла ее перезаписывать.
Механизм сегментации не касается страничного преобразования адреса. В процессе сегментации участвуют только логические и линейные адреса и нет обращения к памяти по физическому адресу. Когда включено страничное преобразование, линейные и физические адреса обозначают совершенно различные объекты. Хотя в принципе можно так создать каталог страниц и таблицу страниц, когда линейные адреса будут отражаться точно в такие же адреса – такая ситуация называется тождественным отображением. Прикладные программы имеют дело только с логическими адресами. При разработке операционной системы, когда реализовываются функции создания дескрипторов сегментов, речь идет о линейных адресах. А при создании таблиц для страничного преобразования уже требуются знания физических адресов. Каталог страниц и таблицы страниц размещаются в удобном месте и требуют таких дескрипторов сегментов, которые имеют их как данные с разрешенными операциями чтения и записи.
Основным достоинством страничной организации памяти по сравнению с сегментацией является фиксированный размер страницы. Это позволяет:
– решить проблему организации памяти в общем (удобно организовывать виртуальную память);
– согласовать и обеспечить высокую скорость передачи данных между внешней памятью и ОП.
Страничная организация памяти не видна прикладному программисту.
Недостатки страничной организации памяти.
1. Имеет место эффект внутренней фрагментации, когда сегменты памяти имеют размеры, не кратные размеру страниц;
2. Увеличение времени преобразования адреса, т.к. обращение к каталогу страниц и таблиц страниц требуется для каждой операции обращения к памяти (хотя компенсируется аппаратной организацией).