В связи с эпидемией коранвируса очные занятия 23, 30 марта и 6 апреля
Здесь будет выкладываться информация на материалы для самостоятельного изучения и ссылки на записи лекций в youtube.
2020.03.23
Работа с файлами
Литература: Робачевский. ОС Unix. Глава 2. "Работа с файлами"
Чтение и запись файлов вызовами read и write. Возвращаемые значения. Признак конца файла при чтении и при записи (запись в закрытый канал связи).
lseek Перемещение головки ввода/вывода вызовом lseek. Получение текущей позиции вызовом lseek.
Понятие блокировки файлов . Вызовы locf и fcntl (эквивалентны в Linux). Кооперативная работа с блокировками (отсутствие обязательных блокировок, как в Windows).
Чтение каталога библиотечными функциями opendir(3), readdir(3) и т.д.
Самостоятельно отследить цепочку структур в ядре Linux, которые используются для выделения файлового дескриптора при открытии файла; хранения позиции головки ввода/вывода; хранения блокировок и счётчиков количества "открытий" файла при совместном использовании файла. Выдержки из кода ядра.
Тестовые вопросы (ответы мне на почту):
- Один из процессов установил блокировку целого файла на чтение вызовом fcntl (locf). Удастся ли другому процессу открыть файл на чтение вызовом open()? Удастся ли прочитать из файла вызовом read()?
- Какое значение вернет вызов read(fd, buf, 1024) если в файле, на который ссылается fd всего 2 байта? Какое значение вернёт тот же вызов если его сразу же выполнить повторно?
2020.03.30
Наследование открытых файлов. Перенаправление ввода/вывода. Каналы.
Литература: Робачевский. ОС Unix. Глава 2. "Работа с файлами"; Глава 3. "Создание процесса" (первые две страницы)
Создание нового процесса и загрузка в процесс новой программы (описание fork()
и exec()
)
Наследование открытых файлов при порождении дочерних процессов.
Дублирование файловых дескрипторов вызовами dup и dup2. Связь наследования файловых дескрипторов с перенаправлением стандартного ввода вывода в командной строке.
Неименованный канал pipe и использование его для связи с дочерним процессом.
Правила ввода/вывода для неименованных (pipe) и именованных (FIFO) каналов.
Контрольные вопросы (мне на почту):
- В чем преимущество последовательности
fd=open("file"...); dup2(fd,0); close(fd);
перед close(0); open("file"...);
, что между ними общего?
- Можно ли файловые дескрипторы fd1 и fd2, созданные командами
fd1=dup(fd); fd2=dup(fd)
, использовать для независимого доступа к файлу в разных потоках?
- Что произойдёт, если единственный процесс откроет объект FIFO (например /tmp/myfifo) на чтение и попробует прочитать один байт?
3.1 ...откроет на запись и попробует записать один байт?
3.2. ...откроет на чтение и на запись и попробует записать один байт?
3.2.1 ...после чего попробует прочитать один байт?
3.2.2...после чего попробует прочитать ещё один байт?
2020.04.06
Виртуальная файловая система
Литература:
- Робачевский. ОС Unix. Глава 4. "Файловая подсистема. Архитектура виртуальной файловой системы"
- Д.Бовет, М. Чезатти Ядро Linux Глава 12. "Виртуальная файловая система"
Видео: Виртуальная файловая система, Разбор имени файла в VFS
Виртуальная файловая система как абстрактный класс
Разбор имени файла в VFS. Монтирование. Символические ссылки.
Структуры данных VFS
Контрольные вопросы (мне на почту):
- Может ли Unix быть запущен без монтирования хотя бы одной файловой системы?
- Что должен делать драйвер файловой системы, если какая-то возможность в ФС не может быть реализована?
Пример: вызов
chown()
(смена владельца) – неприменим к FAT.
- Обобщённый inode содержит поле i_no - уникальный номер inode в данной ФС. Предложите алгоритм
генерации значения этого поля в FAT (компактное описание FAT начиная с раздела "Так зачем нужна таблица FAT?").
- Опишите механизм, который при разборе имени файла будет защищать от циклических символических ссылок.
2020.04.13
Процессы. Основные понятия, виртуальная память, планировщик процессов
Литература:
- Робачевский. ОС Unix. Глава 3. "Подсистема управления процессами" Разделы: "Основы управления процессом", "Структуры данных процесса", "Состояния процесса"
- Д.Бовет, М. Чезатти Ядро Linux Глава 7. "Планирование процессов"
Видео: Основные понятия, виртуальная память, многозадачность,
Основы планирования процессов
Общие сведения о процессах. Особый процесс init..
Для ознакомления: Начальная загрузка Linux
Основы планирования процессов
Контрольные вопросы (мне на почту):
- Какие существуют варианты (причины) завершения процесса?
- Сформулируйте две основные функции процесса init (pid=1) по отношению к остальным процессам.
- Предположим, что в системе запущен всего один процесс (вопрос: чему равен его PID?), который выполни код:
fork();
fork();
3.1. Сколько процессов теперь запущено в сиcтеме?
3.2. Сколько дочерних процессов образовалось у первоначального процесса?
2020.04.20
Сигналы
Литература:
- Робачевский. ОС Unix. Глава 2. "Среда программирования Unix" Раздел: "Процессы - Сигналы"
- Д.Бовет, М. Чезатти Ядро Linux Глава 11. "Сигналы"
Дополнительно для желающих вникнуть в тонкости: Правила использования сигналов в Unix
Видео: Сигналы в Unix
Методичка: Страница "Сигналы" с подразделами, кроме "Управляющий терминал, сеанс, группы".
- Вы пишете процедуру в большой программе и хотите для отладки послать собственному процессу сигнал ABRT (завершение+дамп памяти). Что надо предпринять, чтобы сигнал был доставлен даже в том случае, когда программисты, пишущие другие части программы что-то настроили в доставке сигналов?
- Вызов alarm(nsec) заводит в ядре таймер, который вызовет посылку сигнала SIGALRM через nsec секунд. Можно ли рассчитывать, что ровно через nsec секунд будет вызван обработчик сигнала?
- Вызов pause() приводит к приостановке процесса до прихода какого-либо сигнала. Напишите функцию mysleep(nsec), которая приостановит процесс, но не более чем на nsec секунд.
- Напишите программу, которая в цикле читает строку и завершается по строке "quit". Сделайте так, чтобы по нажатию Ctrl-C выдавалась подсказка: "Для завершения введите quit". Рекомендация: не печатайте этот текст в обработчике сигнала, а используйте глобальную переменную для оповещения основного цикла.
2020.04.27
Память процесса. Страничная организация. Области памяти.
- Робачевский ОС Unix. Глава 3. "Управления процессами" Разделы: "Принципы управления памятью-Адресное пространство процесса", "Управление памятью процесса"
- Д.Бовет, М. Чезатти Ядро Linux Глава 9. "Адресное пространство процесса", Раздел "Адресное пространство процесса"
- Роберт Лав Ядро Linux: описание процесса разработки. Глава 12. "Управление памятью". Раздел "Страничная организация памяти"; Глава 15 "Адресное пространство процесса" Разделы "Адресные пространства" и "Области виртуальной памяти"
Видео: Unix. Память процесса
Методички:
Вопросы:
- Через просмотр файлов карт памяти процессов /proc/XXX/maps (где XXX - это числовой идентификатор процесса) проверьте, отображается ли стандартная библиотека языка C (libc-NN.N.so) всегда на одни и те же виртуальные адреса или адреса варьируются.
- Объясните, почему исполняемый файл программы присутствует в карте памяти трижды.
- На основе изучения карт памяти выскажите предположение, используется ли при доступе всех процессов к стандартной библиотеке языка C одна копия отображения файла в физическую память или каждый процесс держит свою собственную копию в физической памяти.
- Скомпилируйте в своём Linux тестовую программу, нарисуйте в виде таблички (или от руки на бумаге) карту адресов подобную схеме с указанием начала каждой области.
2020.05.04
Память процесса. Управление распределением памяти.
- Робачевский ОС Unix. Глава 2. "Среда программирования Unix" Разделы: "Файлы отображаемые в память", "Ограничения", "Выделение памяти"
- Д.Бовет, М. Чезатти Ядро Linux Глава 9. "Адресное пространство процесса", Разделы "Обработчик исключения
"ошибка обращения к странице" и "Управление кучей"; Глава 19. "Взаимодействие процессов", Раздел "Совместно используемая память IPC"
Видео: Unix. Память процесса
Методичка:
Вопросы:
- Как в программе на Си узнать в какую сторону растёт стек? (псевдокод 3-4 строки)
- Что в файле с исполняемой программой находится в секции .text?
- Каков будет результат операции
char *ptr=(char *)sbrk(0)-1;
*ptr=1;
ptr+=2;
*ptr=1;
2020.05.11
Межпроцессное взаимодействие System V IPC
Робачевский ОС Unix. Глава 3. "Управления процессами" Раздел: "Взаимодействие процессов".
Д.Бовет, М. Чезатти Ядро Linux Глава 19. "Взаимодействие процессов", Раздел "Схема межпроцессного взаимодействия System V IPC"
Видео: System V IPC
Методичка:
Вопросы:
- Можно ли использовать вызовы read и write для чтения/записи очереди сообщений System V IPC?
- Исчезнут ли данные в общей памяти System V IPC после завершения процесса?
- Исчезнут ли семафоры System V IPC после завершения создавшего их процесса? Изменятся ли их значения?
- И ключ IPC и идентификатор IPC - это 32-битные числа. В чём между ними разница?
- Команда ipcs показывает несколько объектов с одинаковыми ключами 0x00000000 и разными идентификаторами. Что такое ключ 0x00000000?
2020.05.18
Межпроцессное взаимодействие - сокеты
- Робачевский ОС Unix. Глава 3. "Управления процессами" Раздел: "Межпроцессное взаимодействие в BSD UNIX. Сокеты".
Для расширения кругозора можно взглянуть на альтернативу сокетам в классическом Unix - Робачевский ОС Unix. Глава 5 "Подсистема ввода/вывода" Раздел "Архитектура STREAMS"
Видео: Сокеты в Unix
Методичка:
Вопросы:
- Краткая характеристика двух основных типов сокетов
- Есть ли разница между сокетами клиента и сервера для сокета датаграмм? (предполагаем, что оба вызвали bind())
- Есть ли разница между сокетами клиента и сервера для сокета потока?
- Напишите псевдокод на основе select(), который ожидает ввода данных с stdin и печатает их на stdout. а если входных данных нет, то раз в полсекунды печатает в stderr - "нет данных".