- •Занятие 1. Понятие операционной системы, ее назначения и функции
- •Занятие 2. Эволюция операционных систем
- •Занятие 3. Различные операционные системы
- •Занятие 4. Базовые понятия архитектуры операционных систем
- •Занятие 5. Особенности архитектуры Unix и Linux
- •Занятие 6. Введение в процессы, потоки и задания операционной системы.
- •Занятие 7. Управление процессами в Unix и Linux
- •Занятие 8. Планирование потоков и процессов в операционных системах
- •Занятие 9. Стратегия и алгоритмы планирования потоков и процессов
- •Занятие 10. Различные алгоритмы планирования
- •Занятие 11. Взаимодействие потоков
- •Занятие 12. Базовые механизмы синхронизации потоков
- •Занятие 13. Концепция монитора и взаимодействие потоков в Linux и Windows
- •Занятие 14. Работа с виртуальной памятью
- •Занятие 15. Реализация управления основной памятью в Linux и Windows
- •Занятие 16. Динамический участок памяти процесса и сборщик мусора
- •Занятие 17. Реализация динамического управления памятью в Linux и Windows
- •Занятие 18. Файлы, файловые системы, работа с файлами и каталогами
- •Занятие 19. Операции над файлами и каталогами. Строение жесткого диска
- •Занятие 20. Размещение информации в файловых системах
- •Занятие 21. Файловые системы ext и fat
Занятие 7. Управление процессами в Unix и Linux
План занятия:
Понятие процессов в UNIX
Процессы в Linux
Создание новых процессов в Unix
Управление процессами Unix
Работа с процессами в Linux
Процессы в Windows
Понятие процессов в UNIX
В UNIX (и большинстве современных операционных систем, таких как Microsoft Windows, Mac OS X, FreeBSD и Linux) каждая задача представляется как процесс. UNIX способен выполнять много задач одновременно, потому что процессы поочередно выполняются на центральном процессоре в течение очень непродолжительного промежутка времени.
Процесс - это нечто вроде контейнера, объединяющего выполняемое приложение, его переменные среды, состояние потоков ввода/вывода приложения и параметры процесса, включающие в себя его приоритет и степень использования ресурсов системы.
Каждый процесс имеет своего владельца. Задачи, инициализируемые пользователем, например, его shell и командами, обычно принадлежат этому пользователю. Системные процессы могут принадлежать пользователям с особыми правами или системному администратору root. Например, для повышения безопасности Apache HTTP Server обычно принадлежит выделенному пользователю с именем www, который предоставляет Web-серверу только доступ к файлам, которые ему необходимы для работы.
Процессы в Linux
Процесс в Linux (как и в UNIX) - это программа, которая выполняется в отдельном виртуальном адресном пространстве. Когда пользователь регистрируется в системе, автоматически создается процесс, в котором выполняется оболочка (shell), например, /bin/bash.
В Linux поддерживается классическая схема мультипрограммирования. Linux поддерживает параллельное (или квазипараллельного при наличии только одного процессора) выполнение процессов пользователя. Каждый процесс выполняется в собственном виртуальном адресном пространстве, т.е. процессы защищены друг от друга и крах одного процесса никак не повлияет на другие выполняющиеся процессы и на всю систему в целом. Один процесс не может прочитать что-либо из памяти (или записать в нее) другого процесса без "разрешения" на то другого процесса. Санкционированные взаимодействия между процессами допускаются системой.
Создание новых процессов в Unix
В UNIX некоторые процессы выполняются с момента загрузки компьютера до его выключения, но большинство процессов имеет короткий жизненный цикл, ограничивающийся началом и окончанием выполнения задачи. Иногда процесс может быть принудительно завершен. Каждый новый процесс в UNIX является перевоплощением существующего процесса. Или, по другому, каждый новый процесс - давайте называть его дочерним - является клоном своего процесса-родителя хотя бы на мгновенье, пока дочерний процесс не начнет выполняться самостоятельно.
Управление процессами Unix
Некоторые процессы работают с момента включения компьютера до его выключения (init, к примеру), а некоторые процессы перевоплощают себя в новую форму (оболочка, к примеру). Но большинство процессов заканчивают свое выполнение, как только выполнят соответствующую им задачу.
Кроме того, можно временно приостановить деятельность процесса или принудительно завершить процесс командой kill.
Работа с процессами в Linux
Ядро предоставляет системные вызовы для создания новых процессов и для управления порожденными процессами. Любая программа может начать выполняться только если другой процесс ее запустит или произойдет какое-то прерывание (например, прерывание внешнего устройства).
В связи с развитием SMP (Symmetric Multiprocessor Architectures) в ядро Linux был внедрен механизм нитей или потоков управления (threads). Нить - это процесс, который выполняется в виртуальной памяти, используемой вместе с другими нитями процесса, который обладает отдельной виртуальной памятью.
Если интерпретатору (shell) встречается команда, соответствующая выполняемому файлу, интерпретатор выполняет ее, начиная с точки входа (entry point). Для С-программ entry point - это функция main. Запущенная программа тоже может создать процесс, т.е. запустить какую-то программу и ее выполнение тоже начнется с функции main.
Для создания процессов используются два системных вызова: fork() и exec. fork() создает новое адресное пространство, которое полностью идентично адресному пространству основного процесса. После выполнения этого системного вызова мы получаем два абсолютно одинаковых процесса - основной и порожденный. Функция fork() возвращает 0 в порожденном процессе и PID (Process ID - идентификатор порожденного процесса) - в основном. PID - это целое число.
Теперь, когда мы уже создали процесс, мы можем запустить программу с помощью вызова exec. Параметрами функции exec является имя выполняемого файла и, если нужно, параметры, которые будут переданы этой программе. В адресное пространство порожденного с помощью fork() процесса будет загружена новая программа и ее выполнение начнется с точки входа (адрес функции main).
Процессы в Windows
В отличие от «полуторазадачной» MS-DOS, которая оставляет прикладному программисту всю работу (и весь риск) организации параллельного функционирования процессов, многозадачные ОС предоставляют программисту более или менее удобный и богатый набор системных функций, позволяющих запустить несколько параллельных процессов и организовать их взаимодействие (синхронизацию процессов, обмен данными, взаимное исключение и т.п.). При этом ОС обязана гарантировать корректную и эффективную организацию переключения процессов, разделения между ними процессорного времени, памяти и других ресурсов.
Сложность проблемы организации взаимодействия параллельных процессов существенно разная для систем, использующих вытесняющую и невытесняющую диспетчеризацию процессов. При вытесняющей диспетчеризации процесс может быть прерван диспетчером практически в любой момент. Помимо задачи сохранения и последующего восстановления контекста процесса, которая должна решаться самой ОС, возникают еще и задачи обеспечения взаимного исключения при выполнении критических секций в многозадачных приложениях. Только разработчик программы может решить, какие части текста его программы являются критическими секциями и должны быть защищены семафорами.
В системе с невытесняющей диспетчеризацией программисту достаточно проверить, что критические секции не содержат вызовов блокирующих и вытесняющих функций. При этом можно гарантировать, что в ходе выполнения критической секции не произойдет переключения процессов.
Все версии Windows от 1.0 до 3.11 представляли собой достаточно мощные многозадачные системы с невытесняющей диспетчеризацией. Версии, начиная с Windows NT и Windows 95, используют вытесняющую диспетчеризацию.
