- •Ос в общей структуре компьютера.
- •История операционных систем.
- •Классификация современных ос. Задачи современных ос.
- •6. Понятие процесса – ключевое понятие ос.
- •8. Трансляторы: компиляторы и интерпретаторы.
- •9. Иерархия зу (запоминающих устройств).
- •10. Управление оперативной памятью (оп). Менеджер памяти; swapping; виртуальная память.
- •11. Модели организации виртуальной памяти.
- •12. История ос unix.
- •13. Общая архитектура unix. Основные подсистемы ядра.
- •14. Пользовательская среда unix.
- •Командный интерпретатор shell.
- •16. Система каталогов в oс unix. Управление с помощью команд языка Bourn shell.
- •17. Управление файлами с помощью команд языка Bourn shell. Перенаправление ввода/вывода.
- •19. Обработка аргументов командной строки. Переменные окружения.
- •20. Пользователь и группа. Права доступа к файлу.
- •21. Системные вызовы и функции стандартных библиотек. Обработка ошибок.
- •22.Структура программы на языке с. Параметры главной функции (пример).
- •23. Файловая система ос unix: монтирование, индексные дескрипторы, жесткие и символические ссылки, файлы устройств.
- •24.Системные вызовы для работы с файлами
- •25. Понятие «процесс» в ос unix. Контекст процесса; свойства процесса; состояние процесса.
- •26.Создание процессов и упр-е ими.
- •27. Запуск внешней программы
- •29.Общая классификация средств взаимодействия процессов в ос unix.
- •30.Иерархия процессов в ос unix. Понятие сеанса. Фоновые процессы.
- •31.Каналы – средства взаимодействия процессов. Неименованные каналы. Организация конвейера (пример программы).
- •33.Сигналы как средство взаимодействия процессов в ос unix. Диспозиция сигналов.
- •34.Ограничения для процесса в ос unix (по ресурсам). Связь со свойствами процесса.
- •36.Отображение файлов в виртуальное адресное пространство. Разделяемая память.
- •37. Взаимодействие процессов через псевдотерминал.
- •38. Недостатки потокового взаимодействия процессов. Средства System vipc. Пространство имен. Общие принципы работы со средствами System vipc.
- •39. Организация очереди сообщений в ос unix. Структура сообщения. Отправка и принятие сообщений.
- •40.Семафоры, как средство взаимодействия процессов System vipc. Понятие атомарной операции. Массив семафоров.
- •41.Разделяемая память, как средство взаимодействия процессов System vipc.
- •42.Взаимодействие по сети. Понятие протокола. Семейства адресации и типы взаимодействия. Создание сокета в ос unix.
- •45. Потоковые сокеты. Клиент – серверная модель.
- •46. Проблема очередности действий и ее решение.
- •47. Процессы-демоны. Система журнализации.
- •48. Загрузка и жизненный цикл в ос unix.
- •49. Взаимоисключения. Понятие критической секции. Устаревшие подходы к организации взаимного исключения.
- •50.Поддержка взаимоисключения на уровне ос. Мьютексы и семафоры (Дейкстры). Команда ассемблера tsl.
- •51.Проблема тупиков. Граф ожидания
- •52. Нити исполнения (pthreads) в ос unix. Мьютексы pthreads.
- •53.Графический интерфейс в ос unix. Базовые принципы построения x_window.
- •54.Файловая подсистема. Общая структура. Методы выделения дискового пространства. Управление дисковым пространством.
- •55.Файловая подсистема. Структура файловой системы на диске. Реализация директорий. Поиск в директории (хеширование).
- •56.Подсистема ввода/вывода. Схема взаимодействия подсистем ос. Понятие драйвера. Типы драйверов.
36.Отображение файлов в виртуальное адресное пространство. Разделяемая память.
В OC Unix процесс имеет возможность отобразить участки файла в собственное адресное пространство. Далее с данными в файле можно работать как с обычными переменными. Фактически этот механизм является альтернативой механизму read/write. Отображение осуществляется с помощью mmap:
#include <sys/types.h>
#include <sys/mman.h>
Caddr_t //соответствует void* - безтиповый указатель.
Caddr_t mmap(caddr_t addr,int len,int prot,int flags,int fd,int offset);
Этот вызов задает отображение len байт в файл с дискриптором fd начиная с позиции offset со стартовым адресом addr. Параметр prot определяет права доступа к области памяти, которые должны соответствовать правам доступа к файлу. Права доступа к fd указываются предварительно в open. До использования mmap файл fd должен быть открыт.
Prot_READ – только для чтения
Prot_WRITE – только для записи
Prot_EXEC – доступен для исполнения
Prot_NONE – область недоступна
С помощью логического ИЛИ (|) можно объединять условия. Наличие EXEC говорит о возможности передачи управления в область отражения. Такой подход ипользуется при загрузки динамических библиотек, когда библиотека отображается в адресное пространство процесса. Параметр flags задает дополнительные механизмы отображения:
MAP_SHARED – область памяти может совместно использоваться несколькими процессами
MAP_PRIVATE – используется только вызывающим процессом
MAP_FIXED – требует выделения памяти точно начиная с addr.
Можно через логическое ИЛИ добавлять к флагам опции. Например MAP_ANONYMOUS. Эта опция позволяет создать просто область памяти, без файла fd, и offset игнорируется в этом случае. Если память выделена, то mmap с параметром ANONYMOUS отличается от обычной тем, что при копировании процесса вызовом fork(), эта память не копируется, а становится доступной для обоих процессов. Значение параметра addr обычно задается равным NULL. Тогда ОС сама выбирает свободную область виртуального адресного пространства. В случае ошибки mmap возвращает значение (-1), преобразованное в void*, т.е. будет иметь вид MAP_FAILED.
Отображение автоматически снимается при завершении процесса. Процесс может явно снять отображение с помощью системного вызова int munmap(void* addr,int len);
Закрытие файла не приведет к снятию отображения. Снятие отображения не влияет немедленно на файл. Обновление файла производится ядром согласно механизму управления виртуальной памятью. msync() – позволяет синхронизировать обновление страниц в памяти с вторичной памятью. При выполнении mmap OC округляет len до следующей страницы виртуальной памяти. Например размер файла 96 байт, а размер страницы 4096 байт, то 96 байт займут данные файла, а 4к байт будет заполнено нулями, но процесс сможет модифицировать эти 4кб. На содержимом файла это не отбразится. Процесс не может изменить размер файла.
Пример 1: #include <sys/types.h>
#include <sys/mman.h>
main()
{int fd; char*ptr;
fd=Open(“f1.at”,O_RDWR);
if (fd==-1){perror(“ошибка open”);exit(1);}
ptr=(char*) mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if (ptr==MAP_FAILED){perror(“ошибка mmap”);exit(2);}
……….
После успешного вызова mmap выражение ptr[25], будет равно значению 26ого байта из файла. Операция ptr[26]=”a” занесет в 26ой байт символ “a”.
Пример 2: #include <sys/types.h>
#include <sys/mman.h>
main()
{int* ptr;
ptr=(char*)mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,0,0);
if (ptr== FAILED){perror(“ошибка mmap”);exit(1);}
if fork()==0) then {//дочерний процесс//}
else {//родительский процесс//}
В примере родительский и дочерний процессы имеют доступ к массиву целых чисел размером по 4 байта. Массив доступен через ptr.
Пример 3: Упрощенная версия копирования файлов – cp.
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
main(int argC,char* argV[])
{int fd1,fd2;caddr_t addr1(исходный),addr2(целевой);
struct stat filestat;//тип stat для структуры filestat содержит метаданные из файлового дискриптора.
fd1=open(argV[1],O_RDONLY);
fd2=open(argV[2],O_WRONLY);
fstat(fd1,&filestat);//определяем размер исходного файла
lseek(fd2,filestat.st_size-1,SEEK_SET);//делаем размер целевого файла равным исходному
write(fd2,””,1);
addr1=mmap(NULL,filestat.st_size,PROT_READ|PROT_WRITE,fd1,0);
addr2=mmap(NULL,filestat.st_size,PROT_READ|PROT_WRITE,fd2,0);
memcpy(addr2,addr1,filestat.st_size);
exit(0);}