Процессы в операционной системе
Программы ОС можно разделить на программы, расширяющие функции аппаратуры, и программы, по сути являющиеся обслуживающими. Для того чтобы установить, к какому классу относится программа, необходимо знать, каким образом ей передается управление. На основании этой предпосылки традиционно все программы разделяются на процессы и примитивы. В операционных системах не существует взаимно-однозначного соответствия между процессами и программами. Для работы определенных программ может создаваться более одного процесса или один процесс может быть исполнен последовательно несколькими различными программами. Примитивы. Можно разделить программы на две категории: программы, для исполнения которых нет необходимости изменять состояние объектов ОС, и программы, для исполнения которых необходимо изменять состояние объектов ОС. Первые программы относятся к программам-примитивам. Как правило, это программы, которые выполняют функции самой ОС (ядра), а именно: - функции обработки прерываний; - некоторые программы, выполняющие функции диспетчера; - программы синхронизации; - программы управления памятью. Эти программы не требуют внесения изменений в записи, соответствующие высокоуровневым программам в очереди диспетчера, поскольку остальные программы могут продолжать свое выполнение только тогда, когда закончится выполнение примитива. Процессы. В то же время существует большая категория программ, для которых специально выделяются ресурсы ОС, резервируется память, делаются записи в специальных структурах, отводится место в очереди диспетчера. Каждая такая программа выполняется независимо от других в своем собственном пространстве и своей программной среде.
Не следует смешивать понятия процесс и программа. Программа — это план действий, а процесс — это само действие, поэтому понятие процесса включает: - программный код; - данные; - содержимое стека; - содержимое адресного и других регистров процессора. Таким образом, для одной программы могут быть созданы несколько процессов в том случае, если с помощью одной программы в CPU выполняется несколько несовпадающих последовательностей команд. За время существования процесс многократно изменяет свое состояние. Различают следующие состояния процесса: - новый (процесс только что создан); - выполняемый (команды программы выполняются в CPU); - ожидающий (процесс ожидает завершения некоторого события, чаще всего операции ввода-вывода); - готовый (процесс ожидает освобождения CPU); - завершенный (процесс завершил свою работу). Переход из одного состояния в другое не может выполняться произвольным образом. Необходимо заметить, что процессы имеются во всех ОС, однако их обслуживание в разных системах может происходить на основе различных механизмов. Кроме того, поскольку процессы могут создавать (порождать) другие процессы, то часто используют термин дерево процессов аналогично соответствующей структуре данных. Процессы характеризуются следующей информацией: - контрольным блоком процесса; - текущим статусом процесса (состоянием); - приоритетом выполнения процесса; - ресурсами, которые использует процесс; - маской обработки и владельцем. Процессы в ОС могут быть запущены в различных случаях: - диспетчер вызывает некоторый глобальный процесс по истечении некоторого промежутка времени или при возникновении некоторого события; - для получения оценки состояния ОС; - при запуске программы переформирования очереди диспетчера, с целью повышения производительности системы;
- при вызове из программы пользователя другого клиентского приложения. В этом случае может потребоваться еще и синхронизация процессов; - запуск программы пользователя.
Характерные отличия процессов и примитивов приведены в таблице 1.
Распределение процессов между имеющимися ресурсами носит название планирование процессов. Одним из методов планирования процессов, ориентированных на эффективную загрузку ресурсов, является метод очередей ресурсов. Новые процессы находятся во входной очереди, часто называемой очередью работ (заданий). Входная очередь располагается во внешней памяти, во входной очереди процессы ожидают освобождения ресурса — адресного пространства основной памяти. Готовые к выполнению процессы располагаются в основной памяти и связаны очередью готовых процессов. Процессы в этой очереди ожидают освобождения ресурса процессорное время. Процесс в состоянии ожидания завершения операции ввода-вывода находится в одной из очередей к оборудованию ввода-вывода. При прохождении через компьютер процесс мигрирует между различными очередями под управлением программы, которая называется планировщик. Нити. Классический подход представляет собой выполнение процесса как единственный поток команд процессора. Однако в современных ОС возможно одновременное параллельное исполнение в одном процессе нескольких потоков команд, называемых нитями, или потоками. Как показано на рис. 1, возможны следующие варианты: нескольких потоков в разных процессах и нескольких процессов с множеством потоков в каждом.
Большой объем информации, занимаемый процессом, делает дорогими (в смысле ресурсов) операции по их созданию и управлению. Однако часто возникает необходимость в выполнении нескольких параллельных потоков внутри одного процесса, например выполнение одной задачи в многопроцессорной системе на нескольких процессорах. Создание для каждого потока такой программы собственного процесса приведет к большим расходам памяти и времени на переключения между ними. Поэтому в настоящее время практически во всех ОС реализован механизм параллельного выполнения отдельных ветвей задачи внутри одного процесса. Многопоточность позволяет ОС поддерживать выполнение нескольких параллельно исполняемых частей программы. Внутри процесса может быть запущено множество потоков, каждый из которых: - имеет свое состояние (исполнения, готовности,... ); - сохраняет свой контекст во время ожидания; - имеет свои стек и статическую память для локальных переменных; - имеет доступ к памяти и другим ресурсам всего процесса, разделяя их с другими потоками. Итак, поток — это некая совокупность кодов внутри процесса, получающая процессорное время для выполнения. В каждом процессе всегда существует минимум один поток. Этот первичный поток формируется системой автоматически при создании процесса. Далее этот поток может породить другие потоки, те в свою очередь — новые и т. д. Таким образом, один процесс может владеть несколькими потоками, и тогда они одновременно исполняют код в адресном пространстве процесса. Каждый поток имеет: - уникальный идентификатор потока; - содержимое набора регистров процессора, отражающих состояние процессора; - два стека, один из которых используется потоком при выполнении в режиме ядра, а другой — в пользовательском режиме;
- доступ к отделам памяти и ресурсам процесса, которым этот поток принадлежит; - закрытую область памяти, называемую локальной памятью потока (TLS — thread local storage) и используемую подсистемами ядра, run-time библиотеками и DLL (Dynamic Link Library — «библиотека динамической компоновки»). Эти атрибуты предотвращают конкуренцию отдельных процессов между собой, позволяют экономить память и другие ресурсы, обеспечивают повышенную скорость переключения программы между такими нитями, не требуют специальных механизмов синхронизации и обмена информации. Использование потоков имеет свои преимущества: - поток завершается значительно быстрее, чем процесс, поскольку не нужно освобождать ресурсы системы; - переключение потоков в одном процессе происходит намного быстрее; - при использовании потоков повышается эффективность обмена информацией между двумя выполняющимися частями программами, поскольку этот обмен происходит без участия ядра системы и механизмов защиты информации. - применение потоков в мультипроцессорных системах служит для равномерной нагрузки всех ресурсов системы. Однако при использовании нитей возникает и ряд проблем: - появление в программе отдельных нитей существенно ослабляет защиту программы, так как при их переключении возможны прерывания извне, а, следовательно, внедрение вирусов; - возникает необходимость написания алгоритма с параллельными ветвями вычислений. Если при этом некоторые переменные доступны из всех нитей, то он должен контролировать и синхронизировать их значения при параллельном выполнении ветвей; - запущенный поток не отдает управление процессором, пока не выполнится полностью. Это объясняется тем, что планировщик системы ничего не знает о том, какие нити выполняются внутри задачи. Пользователь в этом случае должен применять внутренние прерывания по таймеру, чтобы равномерно распределить время между потоками.
Воспользуйтесь поиском по сайту: ![]() ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|