Когда взаимодействуют 2 или более процессов, они могут попадать в ситуации, которая не дает выполнятся далее без посторонней помощи, такая ситуация называется взаимоблокировка.
Пример. Пусть к ПК подключены стример и пишущий DVD привод. Требуется записать данные со стримера на DVD. Процесс_1 запрашивает и получает в пользование стример. Создается Процесс_2, который запрашивает и получает в свое распоряжение DVD. После этого Процесс_1 запрашивает DVD, который занят Процессом_2. Поэтому процесс_1 приостанавливает свою работу и ждет, пока Процесс_2 не освободит DVD. Аналогично с процессом_2 по отношению к стримеру. И ждут оба). Вот это и есть взаимоблокировка.
Управление памятью
Проблемы:
1. защищенность
2. недостаточно адресного пространства, чтобы вся программа поместилась в ОЗУ. Тогда создается на жестком диске область памяти под виртуальную память. Либо файл подкачки - программа будет загружаться в ОЗУ по частям.
Файлы
Файл нужно открыть(создать) и закрыть. Файл можно читать и писать только тогда, когда он открыт. Файлы нужно хранить. За это отвечает файловая система: как и где?
|
|
Место для хранения файлов называется каталог(директория, папка). Есть корневой каталог, есть дочерние. Используется принцип дерева.
Сравнение иерархии файлов и процессов. (таблица)
Иера | рхия |
Процессы | Файлы |
не глубокая | глубокая |
короткое время жизни | очень большое время жизни |
доступ к процессу может быть осуществлен только из родительского процесса | произвольный доступ |
Путь - это полное имя файла от корневого каталога.
Файловые системы Юникс систем:
- bin
- sbin
- usr
-
Системные вызовы
Механизм системных вызовов
Системные вызовы это интерфейс между программами пользователя и устройствами.
Выполнение системного вызова похоже на выполнение процедуры.
ПРИМЕР:
системный вызов чтения данных из файлов
в с++ этот системный вызов запускается функцией с таким же именем
count read(fd, buffer, nbyte);
fd - file descripter. идентификатор
буфер - куда считавыются данные
nbyte - кол. байт которые нужно прочесть
count - количество байт которое необходимо прочесть
Если системный вызов не может быть выполнен count = -1, а в глобальной переменной errno = сохраняет номер ошибки. Каждый системный вызов выполняется в несколько этапов: