Шпаргалка по ОС. 1. Понятие операционной системы, ее отношение к аппаратуре и программному обеспечению
Скачать 123.67 Kb.
|
19.(1) Состояния процесса, диспетчеризация процессов. Состояния процесса: готов, выполняется , приостановлен. Диспетчеризация – управляет состояниями процесса Для технической организации переключения процессов очень важное значение имеет характеристика, которую называют состоянием процесса. Эта характеристика записывается как одно из важнейших полей в управляющий блок процесса или управляющий блок нити, в зависимости от того, используются нити в операционной системе или нет. Диаграмма состояний абстрактного процесса Д ля переключения процессов имеет важная характеристика как состояние процесса. Состояние процесса записывается в управляющий блок нити или блок процесса. Абстрактный процесс (нить) использует 3 раличных состояния: состояния готовности, выполнения, блокировки. В состоянии выполнения абстрактный процесс обладает всей аппаратурой процессора. В состоянии готовности а.п. обладает всем необходимым для обработки данных, кроме процесса. Состояние блокировки отвечает за необходимость дожидаться некотор. События. Примером блокировки является ожидание нажатия клавиши клавиатуры. Распределение неск. Процессов называют квантом времени. Величина квантов малые доли секунды. | 19.(2) Состояния процесса, диспетчеризация процессов. Если абстрактных процессов несколько, то они все организуются в несколько очередей (описываемые как списки). По истечением кванта и снятии процессора называют диспетчером или планировщиком. Сами действия этого диспетчера называют диспетчеризацией абстрактных процессов. Функционирование операционной системы, когда она обеспечивает выполнение параллельных процессов на основе использования квантов времени, называют режимом разделения времени. 20. Виды программных единиц в современных ОС.В соврем-х ОС абстрактный процесс «расщепили» на части: программный процесс и нить (поток, thread). Процесс – действия, выполняемые над конкретными данными под управлением программы. Процесс разворачивается во времени, это динамический объект, программа – это статический, неизменяемый объект. Одновременное выполнение нескольких программ в одном компьютере и составляет несколько процессов. Для большой ясности следует уточнить, что на основе одной программы в компьютере могут одновременно существовать (выполняться) несколько процессов! Элементарные составляющие процесса – нити (threads. В рамках процесса могут функционировать несколько нитей. Иное название этих составляющих на русском языке – потоки. | |
21. Программное порождение процессов в Unix. Процесс-действия над конкретными данными, под управлением программы.Процесс без программы функционировать не может. Поэтому при создании процесса, в частности путем заявки другого процесса на создание процесса, как минимум необходимо дать ОС информацию, какой программой воспользоваться при создании и запуске процесса.Для создания процесса в UNIX служит ф-я fork(), которая не имеет аргументов. Данная ф-я раздваивает процесс(fork-вилка).=> получается 2 процесса.Их отличие в том, что у них различные идентификаторы.1-й процесс получает как рез-т функции fork значение идентификтора нового-дочернего процесса, а дочерн. Процесс получает ноль. Особенностью фу-и в UNIX является то, что они не создают новый процесс, а просто позволяют процессу сменить управляющую им программу. После функ. Fork при нулевом значении вызыв. Ф-я замены программы execl(), где ее последний арг. Должен иметь значение=0, посл выполнения этой ф-и дочерний процесс управляется программой. Родительский процесс может выдать на экран сообщение об идентификаторе дочернего процесса. ForChildProcess PID=номер. После каждого их этих циклов производится приостановка выполнения ф-ей usleep() в микросекундах. | 22. Программное порождение процессов в Windows. Порождение процесса достигается в ОС ф-ей CreateProcess с 10 параметрами. 1-й- указатель на строку имени процесса. 2-й-указатель на текст командной строки запуска программы. Эти 2 параметра дублируют друг друга. Если 1 параметр=0, а второй !=NULL=>из текста программа извлекает первое слово до первого пробела.1-й параметр позволяет задавать полное имя запускаемой программы.2-й параметр дает>возможностей, а использ. 1-го проще. 5-й параметр обычно False и используется для задания наследования объектов дочерним процессом.8-й параметр относится к доп.возможностям и задается как NULL.7-й парам. Задает указатель на блок памяти, хранящий строки окружения=NULL.Окружение-специальная текстовая область, служ.для передачи данных создаваемому процессу.6-й-задает флаги создания и определяет класс приоритета. Обычно задается как NORMAL_PRIORITY _CLASS. Два последних арг. Задают адреса двух структур-Структура STARTPUTINFO соответ. Структ. Описания сессии и содержит 18 полей. Структура PROCESS_ INFORMATION содерж. 4 поля для возврата учетной информации. При неудачи создания процесса=0 выдается сообщение об ошибки запуска по ф-ей GetLastError и процесс завершается оператором return 0;. STRUCT { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThread; } Наиболее важные поля: hProcess, возвращает хэндл созданного процесса, и dwProcessId, возвращает идентификатор (условный номер) созданного процесса. Функция memset записывает столько значений, заданных своим вторым параметром в память, начало которой задано первым аргументом, сколько указано числом в третьем аргументе. Возвращаемое функцией CreateProcess значение типа BOOL позволяет вызывающей программе решить, как прошел запуск, удалось ли создать процесс. При создании возвращается TRUE, иначе FALSE. | |
23. Программное уничтожение процессов. Над процессами выполняются следующие операции: создание, уничтожение, ожидание. Процесс родитель может уничтожить процесс, который он создал, используя идентификатор. В Unix для уничтожения процессов предназначена ф-я kill(pid, SIGKILL), 1-й пар. – идентификатор процесса, полученный родительским процессом. 2- пар. – константа, определена в заголовочном файле. Данная ф-я на каком-то шаге приказывает уничтожить процесс. Для использования этой ф-и необходимо вкл. Заголов. Файла types.h и signal.h. Для уничтож. Процессов в Windows предназначена ф-я TERMINATEPROCESS(), кот. Имеет прототип: BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode) hProcess - какой процесс уничтожить, ExitCode - код завершения для принудительного завершения.Для не принудительного код завершения имеет ф-я VOID ExitProcess(UINT uExitCode). Ее следует ставить последней в действиях программы процесса. | 24. Ожидание завершения процессов. Операция ожидания завершения процессов выглядит след. образом: Ждать_завершения_процесса(какой_процесс_ждать). Кроме этого мб вкл. Возвращаемый параметр: Exit(код_возврата). В UNIX ф-я ожидания имеет прототип pid_t wait(int *status). Ф-я переводит в режим ожидания до тех пор, пока не завершится из его дочерних процессов. Если у нас запущено несколько доч. Процессов, то ф-ю необходимо записать неск. Раз. Сущ-ет еще 1 ф-я pid_t waitpid(pid_t pid, int *status, int option), где 1-й парамет. Обознач. завершение какого именно процесса будет ждать данный процесс. Ф-я требует подкл. Заголов файла | |
25. Иерархия процессов и ее использование с передачей параметров при создании процессов. Создающий процесс наз-ся родительским (parent), создаваемый – дочерним или процессом-сыном (child). Родительский процесс создаёт дочерний и приостанавливается до завершения этого дочернего процесса – это значит, что дочерний процесс запущен синхронно. При асинхронном запуске родительский и дочерний процессы функционируют параллельно, выполняются оба одновременно. После порождения некоторым процессом другого процесса, первый из них становится родительским (parent), а порожденный – дочерним (child). При порождении одним процессом многих дочерних возникают связи между процессами, отражающие эти отношения parent-child. Аналогично естественной иерархии родства, между процессами компьютера образуется при этом иерархия связей parent-child. Она используется для организации совместных работ многими процессами. При этом в простейшем случае процесс, становящийся родителем, порождает процесс для выполнения некоторых вычислительных работ, а сам при этом приостанавливается. Его дочерний процесс выполняет запланированную работу и завершает свои действия специальным обращением к операционной системе, информирующей последнюю об успешном или неуспешном завершении. В ответ на это об-ращение операционная система переводит приостановившийся родительский процесс опять в функционирующее состояние. При таком порядке выполнения родительского и дочернего процессов их называют последовательными процессами. (Широко исп-тся в OS/2: ф-я для создания нового процесса APIRET DosExecPrm(...,ULONG flag,...). Для синхронного запуска процесса аргумент flag задаётся равным 0. При асинхронн запуске flag=1. Процесс родитель может уничтожить дочерний: APIRET DosKillProcess(ск-ко потомков уничтожить (если один дочерний,знач-е 1,а если ещё и все потомки дочернего,знач-е 0), идентификатор дочернего процесса)). | 26. Понятие нити и связь ее с процессом. В современных ОС широко используются нити (thread), называемые также потоками. Это понятие возникло как результат развития понятия абстрактного процесса. Иногда целесообразно процесс – разбить на части, которые выполнялись бы параллельно, конкурируя за главный ресурс – процессор, но в остальном выполняли бы общую работу. Процесс в современных ОС – это владелец всех основных ресурсов кооперативно работающих нитей. У этих нитей – общее виртуальное адресное пространство, у них общие дескрипторы и соответствующие им хэндлы, причем дескрипторы и хэндлы всевозможных допустимых в ОС объектов: файлов, созданных дочерних процессов, графических окон, семафоров и т.п.. Практически нити одного процесса используют глобальные переменные, в которые каждая из нитей может записывать данные или брать их оттуда. Нити пользуются процессором компьютера по очереди, так что он не принадлежит ни одной из них, но и не принадлежит самому процессу.бычно нить своей работой реализует действия одной из процедур программы. Теоретически любой нити процесса доступны все части программы процесса, в частности, все его процедуры, но реально работа организуется так, чтобы нити отвечала отдельная процедура. Учитывая, что процедуре для нормальной работы необходимы локальные переменные, становится понятным закрепление области этих переменных за нитьюПроцессы делятся на конкурирующие и кооперативные. Конкурирующие мешают друг другу, а кооперат выполняют по частям общую работу совместно. Объединение нитей или кооперативных процессов составляет 1 процесс.У каждой коопер.нити имеются соотв. Хэндлы, у нить есть общие дескрипторы. Нити пользуются процессором поочередно. У каждой нити есть регистры(хранение инфо) и локальные переменные. Совокупность хранения ифно наз-ют контекстом задачи. Когда происходи переключение м-у нитями, запоминается контекст приостановленной задачи. Объектом хранения локальных переменных наз-ют стеком. Соотношение м/у нитью и процессом можно представить аналогией м/у собственником земли и его наемными рабочими.При использовании неск. Нитей следует указать спец.библиотеки подпрограмм. Н-р: при использовании компилятора EXE следует использовать опцию /MT. ! | |
27. Создание нитей (thread) в программах Windows. Главная нить процесса создается автом. При создании процесса. В Wind для создания нитей используются неск. Ф-й. Раньше использовалась ф-я CreateThread, но позже были обнаружены нек. проблемы, поэтому её заменили на _beginthread. В Visual исп. Ф-я _beginthreadex, а в Borland _beginthreadNT(). Эти ф-и имеют 6 параметров. unsigned long _beginthreadex(void* security_attrib, unsigned stack_size, unsigned (*proc)(void*), void *arglist, unsigned flag, unsigned *tid). Proc-задает адрес процедуры нити. stack_size-ф-я создания нити=около 4096. Arglist-указатель на строку нити =NULL. security_attrib-применяется в слож. Програм. =NULL. Flags- служит для режима приостан. Для создании нити. Tid- предназначен для возвращ значения идентиф. Нити. Процедура нити может использовать для завершения ф-и: _endthreadex() или _endthread. В ф-ю CreateThread можно исп. В тех программах, где процедуры нитей не содержат стандарт. Ф-й языка Си. Unix: int pthread_create(pthread_t* tid, const pthread_attr_t* att, void*(*fun)(void*), void* argp); int pthread_exit(void *status)- завершение нити. | 28. Создание POSIX нитей в программе. Главная нить процесса создается автоматически при создании процесса. В ОС Unix многопоточное программирование появилось достаточно поздно. К настоящему времени эта возможность входит в стандарт POSIX для Unix и поддерживается во всех современных ОС. Использование нитей при этом требует подключения заголовочного файла pthread.h. Системная функция создания нити в Unix по указанному стандарту имеет прототип int pthread_create(pthread_t* tid, const pthread_attr_t* att, void*(*fun)(void*), void* argp) //tid – возвращает идентификатор созданной нити, att – задание атрибутов отличных от умолчания, fun - адрес процедуры нити ,arg - для передачи конкретного аргумента при создании нити rc=pthread_create(&tid1, NULL, (void*)procthread1, (void*)2); 1-й пар. – возвращает идентификатор созданной нити (если NULL, то идент не возвращ). 3-й пар. – адрес процедуры нити. 4-й пар-предназнач для передачи конкретног аргумента при создании нити. 2-й пар – для создания атрибутов. (Если он нулевой, то атрибуты использ. По умолчанию). Если ф-я возвращ знач>0, то происход ошибка и нить не создается. Если значение нулевое, то это говорит об удачно. Выполнении програм., а пол. Значение выдает код ошибки. Действие процедуры нити завершается ф-й pthread_exit(void *status). Эту ф-ю исп. Только тогда, когда нить передает код завершения. Вызов ф-и можно отпускать. | |
29.(1) Уничтожение (отмена) нитей. Для самоуничтожения нити, служит ф-я с прототипом int pthread_exit(int code). Для прекращения работы нити по инициативе другой служит ф-я: pthread_cancle(), где в качеств параметр задается идентиф нити. Средства управления нитями лучше всего развиты в современных версиях Unix, в частности в Linux. Прекращение работы нити по явному приказу другой нити является довольно решительной мерой, учитывая, что нити процесса выполняют общую работу. Поэтому уничтожение нити в общем случае может иметь непредусмотренный побочный эффект на результаты работы всего процесса. В настоящее время такие средства состоят из двух вспомогательных функций pthread_setcanceltype() и pthread_setcancelstate() и состояний нити относительно возможности уничтожения.У нити сущ-ют состояния: синхронно отменяемые/неотменяемые и асинхронно отменяетмые. Асинхронно отменяемое сост. Отвечает за отсутствие ограничен на уничт. Нити-т.е. нить можно уничтожить в любой момент. Синхронно отменяемая нить мб уничтожена только тогда, когда она находится в нек точках своего выполнения.Переключение м/у отменяемым и неотменяемым состоянием производится с пом. Ф-и: pthread_setcancelstate(int state, int *oldstate). 1-й пар – мб PTHREAD_CANCEL_ DISABLE/ ENABLE. 2-й-=NULL, передает адрес переменной. Переключ. м/у асинхронно отменяемым и синхронно отменяемым задается ф-ей pthread_setcanceltype(int type, int *oldtype). 1-й пар.-мб синхронным/асинхронным. 2-й пар задается NULL. Точка отмены задается ф-ей pthread_testcancle(). В ОС WINDOWS для уничт. Процессов служит ф-я TerminateThread(HANDLE hThread, DWORD dwExitCode). | 29(2). Уничтожение (отмена) нитей. Код возврата из нити, завершившейся или принудительно прекращенной приказом TerminateThread, может быть получен в другой нити того же процесса путем вызова вспомогательной функции GetExitCodeThread. Ïîñëåäíÿÿ èмеет прототип: BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode); Если задача, указанная аргументом hThread, в момент запроса кода возврата еще работает, то функция возвращает значение STILL_ACTIVE в качестве значения второго аргумента. Код возврата из нормально завершающейся нити формирует функция завершения ExitThread, которая имеет прототип: void ExitThread(DWORD dwExitCode 30. Приостановка и повторный запуск нити. В Unix для приостановки отдельной нити нужно использовать функцию pthread_kill со вторым параметром, задаваемым символической константой SIGSTOP, а для возобновления работы нити - ту же функцию, но уже с параметром SIGCONT. Программные средства для приостановки и возобновления нитей в операционных системах типа Windows состоят из двух функций ResumeThread -и SuspendThread. Обе они имеют единственный аргумент – хэндл нити, на которую они должны подействовать – приостановить или возобновить ее работу. Прототипы этих функций описываются в виде: DWORD SuspendThread(HANDLE hthread) DWORD ResumeThread(HANDLE hthread) |