Алгоритмы планирования процессов
Управление процессами как часть операционной системы. Средства синхронизации и взаимодействия процессов. Вытесняющие и невытесняющие алгоритмы планирования. Контекст и дескриптор процесса. Алгоритмы планирования процессов. Особенности управления памятью.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 10.01.2014 |
Размер файла | 979,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
МЕЖДУНАРОДНЫЙ ИНСТИТУТ ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
Контрольная работа
по дисциплине: «Операционные системы и системное программирование»
Вариант 20
Выполнил: ст.гр. 417220/20
Серафимович А.М.
Проверил:
Рыковский И.М.
Минск 2012
1. Управление процессами
Важнейшей частью операционной системы, непосредственно влияющей на функционирование вычислительной машины, является подсистема управления процессами. Процесс (или по-другому, задача) - абстракция, описывающая выполняющуюся программу. Для операционной системы процесс представляет собой единицу работы, заявку на потребление системных ресурсов. Подсистема управления процессами планирует выполнение процессов, то есть распределяет процессорное время между несколькими одновременно существующими в системе процессами, а также занимается созданием и уничтожением процессов, обеспечивает процессы необходимыми системными ресурсами, поддерживает взаимодействие между процессами.
В многозадачной (многопроцессной) системе процесс может находиться в одном из трех основных состояний:
ВЫПОЛНЕНИЕ - активное состояние процесса, во время которого процесс обладает всеми необходимыми ресурсами и непосредственно выполняется процессором;
ОЖИДАНИЕ - пассивное состояние процесса, процесс заблокирован, он не может выполняться по своим внутренним причинам, он ждет осуществления некоторого события, например, завершения операции ввода-вывода, получения сообщения от другого процесса, освобождения какого-либо необходимого ему ресурса;
ГОТОВНОСТЬ - также пассивное состояние процесса, но в этом случае процесс заблокирован в связи с внешними по отношению к нему обстоятельствами: процесс имеет все требуемые для него ресурсы, он готов выполняться, однако процессор занят выполнением другого процесса.
В ходе жизненного цикла каждый процесс переходит из одного состояния в другое в соответствии с алгоритмом планирования процессов, реализуемым в данной операционной системе.
В состоянии ВЫПОЛНЕНИЕ в однопроцессорной системе может находиться только один процесс, а в каждом из состояний ОЖИДАНИЕ и ГОТОВНОСТЬ - несколько процессов, эти процессы образуют очереди соответственно ожидающих и готовых процессов. Жизненный цикл процесса начинается с состояния ГОТОВНОСТЬ, когда процесс готов к выполнению и ждет своей очереди. При активизации процесс переходит в состояние ВЫПОЛНЕНИЕ и находится в нем до тех пор, пока либо он сам освободит процессор, перейдя в состояние ОЖИДАНИЯ какого-нибудь события, либо будет насильно "вытеснен" из процессора, например, вследствие исчерпания отведенного данному процессу кванта процессорного времени. В последнем случае процесс возвращается в состояние ГОТОВНОСТЬ. В это же состояние процесс переходит из состояния ОЖИДАНИЕ, после того, как ожидаемое событие произойдет.
2. Контекст и дескриптор процесса
На протяжении существования процесса его выполнение может быть многократно прервано и продолжено. Для того, чтобы возобновить выполнение процесса, необходимо восстановить состояние его операционной среды. Состояние операционной среды отображается состоянием регистров и программного счетчика, режимом работы процессора, указателями на открытые файлы, информацией о незавершенных операциях ввода-вывода, кодами ошибок выполняемых данным процессом системных вызовов и т.д. Эта информация называется контекстом процесса.
Кроме этого, операционной системе для реализации планирования процессов требуется дополнительная информация: идентификатор процесса, состояние процесса, данные о степени привилегированности процесса, место нахождения кодового сегмента и другая информация. В некоторых ОС (например, в ОС UNIX) информацию такого рода, используемую ОС для планирования процессов, называют дескриптором процесса.
Дескриптор процесса по сравнению с контекстом содержит более оперативную информацию, которая должна быть легко доступна подсистеме планирования процессов. Контекст процесса содержит менее актуальную информацию и используется операционной системой только после того, как принято решение о возобновлении прерванного процесса.
Очереди процессов представляют собой дескрипторы отдельных процессов, объединенные в списки. Таким образом, каждый дескриптор, кроме всего прочего, содержит по крайней мере один указатель на другой дескриптор, соседствующий с ним в очереди. Такая организация очередей позволяет легко их переупорядочивать, включать и исключать процессы, переводить процессы из одного состояния в другое.
Программный код только тогда начнет выполняться, когда для него операционной системой будет создан процесс. Создать процесс - это значит:
1. создать информационные структуры, описывающие данный процесс, то есть его дескриптор и контекст;
2. включить дескриптор нового процесса в очередь готовых процессов;
3. загрузить кодовый сегмент процесса в оперативную память или в область свопинга.
3. Алгоритмы планирования процессов
Планирование процессов включает в себя решение следующих задач:
- определение момента времени для смены выполняемого процесса;
- выбор процесса на выполнение из очереди готовых процессов;
- переключение контекстов "старого" и "нового" процессов.
Существует множество различных алгоритмов планирования процессов, по разному решающих вышеперечисленные задачи, преследующих различные цели и обеспечивающих различное качество мультипрограммирования. Среди этого множества алгоритмов рассмотрим подробнее две группы наиболее часто встречающихся алгоритмов: алгоритмы, основанные на квантовании, и алгоритмы, основанные на приоритетах.
В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если:
- процесс завершился и покинул систему,
- произошла ошибка,
- процесс перешел в состояние ОЖИДАНИЕ,
- исчерпан квант процессорного времени, отведенный данному процессу.
Процесс, который исчерпал свой квант, переводится в состояние ГОТОВНОСТЬ и ожидает, когда ему будет предоставлен новый квант процессорного времени, а на выполнение в соответствии с определенным правилом выбирается новый процесс из очереди готовых. Таким образом, ни один процесс не занимает процессор надолго, поэтому квантование широко используется в системах разделения времени.
Кванты, выделяемые процессам, могут быть одинаковыми для всех процессов или различными. Кванты, выделяемые одному процессу, могут быть фиксированной величины или изменяться в разные периоды жизни процесса. Процессы, которые не полностью использовали выделенный им квант (например, из-за ухода на выполнение операций ввода-вывода), могут получить или не получить компенсацию в виде привилегий при последующем обслуживании. По разному может быть организована очередь готовых процессов: циклически, по правилу "первый пришел - первый обслужился" (FIFO) или по правилу "последний пришел - первый обслужился" (LIFO).
Другая группа алгоритмов использует понятие "приоритет" процесса. Приоритет - это число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной машины, в частности, процессорного времени: чем выше приоритет, тем выше привилегии.
Приоритет может выражаться целыми или дробными, положительным или отрицательным значением. Чем выше привилегии процесса, тем меньше времени он будет проводить в очередях. Приоритет может назначаться директивно администратором системы в зависимости от важности работы или внесенной платы, либо вычисляться самой ОС по определенным правилам, он может оставаться фиксированным на протяжении всей жизни процесса либо изменяться во времени в соответствии с некоторым законом. В последнем случае приоритеты называются динамическими.
Существует две разновидности приоритетных алгоритмов: алгоритмы, использующие относительные приоритеты, и алгоритмы, использующие абсолютные приоритеты. В обоих случаях выбор процесса на выполнение из очереди готовых осуществляется одинаково: выбирается процесс, имеющий наивысший приоритет. По-разному решается проблема определения момента смены активного процесса. В системах с относительными приоритетами активный процесс выполняется до тех пор, пока он сам не покинет процессор, перейдя в состояние ОЖИДАНИЕ (или же произойдет ошибка, или процесс завершится). В системах с абсолютными приоритетами выполнение активного процесса прерывается еще при одном условии: если в очереди готовых процессов появился процесс, приоритет которого выше приоритета активного процесса. В этом случае прерванный процесс переходит в состояние готовности. Во многих операционных системах алгоритмы планирования построены с использованием, как квантования, так и приоритетов. Например, в основе планирования лежит квантование, но величина кванта и/или порядок выбора процесса из очереди готовых определяется приоритетами процессов.
4. Вытесняющие и невытесняющие алгоритмы планирования
Существует два основных типа процедур планирования процессов - вытесняющие (preemptive) и невытесняющие (non-preemptive).
Non-preemptive multitasking - невытесняющая многозадачность - это способ планирования процессов, при котором активный процесс выполняется до тех пор, пока он сам, по собственной инициативе, не отдаст управление планировщику операционной системы для того, чтобы тот выбрал из очереди другой, готовый к выполнению процесс.
Preemptive multitasking - вытесняющая многозадачность - это такой способ, при котором решение о переключении процессора с выполнения одного процесса на выполнение другого процесса принимается планировщиком операционной системы, а не самой активной задачей.
Основным различием между preemptive и non-preemptive вариантами многозадачности является степень централизации механизма планирования задач. При вытесняющей многозадачности механизм планирования задач целиком сосредоточен в операционной системе, и программист пишет свое приложение, не заботясь о том, что оно будет выполняться параллельно с другими задачами. При этом операционная система выполняет следующие функции: определяет момент снятия с выполнения активной задачи, запоминает ее контекст, выбирает из очереди готовых задач следующую и запускает ее на выполнение, загружая ее контекст.
При невытесняющей многозадачности механизм планирования распределен между системой и прикладными программами. Прикладная программа, получив управление от операционной системы, сама определяет момент завершения своей очередной итерации и передает управление ОС с помощью какого-либо системного вызова, а ОС формирует очереди задач и выбирает в соответствии с некоторым алгоритмом (например, с учетом приоритетов) следующую задачу на выполнение.
5. Средства синхронизации и взаимодействия процессов
Процессам часто нужно взаимодействовать друг с другом, например, один процесс может передавать данные другому процессу, или несколько процессов могут обрабатывать данные из общего файла. Во всех этих случаях возникает проблема синхронизации процессов, которая может решаться приостановкой и активизацией процессов, организацией очередей, блокированием и освобождением ресурсов. Пренебрежение вопросами синхронизации процессов, выполняющихся в режиме мультипрограммирования, может привести к их неправильной работе или даже к краху системы. Сложность проблемы синхронизации состоит в нерегулярности возникающих ситуаций. Поэтому отладка взаимодействующих процессов является сложной задачей.
Важным понятием синхронизации процессов является понятие "критическая секция" программы. Критическая секция - это часть программы, в которой осуществляется доступ к разделяемым данным. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо обеспечить, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением.
Простейший способ обеспечить взаимное исключение - позволить процессу, находящемуся в критической секции, запрещать все прерывания. Однако этот способ непригоден, так как опасно доверять управление системой пользовательскому процессу; он может надолго занять процессор, а при крахе процесса в критической области крах потерпит вся система, потому, что прерывания никогда не будут разрешены.
Другим способом является использование блокирующих переменных. С каждым разделяемым ресурсом связывается двоичная переменная, которая принимает значение 1, если ресурс свободен (то есть ни один процесс не находится в данный момент в критической секции, связанной с данным процессом), и значение 0, если ресурс занят. Перед входом в критическую секцию процесс проверяет, свободен ли ресурс. Если он занят, то проверка циклически повторяется, если свободен, то значение переменной устанавливается в 0, и процесс входит в критическую секцию. После того, как процесс выполнит все действия с разделяемым ресурсом, значение переменной снова устанавливается равным 1.
Одна из серьёзных проблем синхронизации - взаимные блокировки, называемые также дедлоками (deadlocks), клинчами (clinch) или тупиками. Привер ситуации : пусть двум процессам, выполняющимся в режиме мультипрограммирования, для выполнения их работы нужно два ресурса, например, принтер и диск. И пусть после того, как процесс А занял принтер (установил блокирующую переменную), он был прерван. Управление получил процесс В, который сначала занял диск, но при выполнении следующей команды был заблокирован, так как принтер оказался уже занятым процессом А. Управление снова получил процесс А, который в соответствии со своей программой сделал попытку занять диск и был заблокирован: диск уже распределен процессу В. В таком положении процессы А и В могут находиться сколь угодно долго.
Тупиковые ситуации надо отличать от простых очередей, хотя и те и другие возникают при совместном использовании ресурсов и внешне выглядят похоже: процесс приостанавливается и ждет освобождения ресурса. Однако очередь - это нормальное явление, неотъемлемый признак высокого коэффициента использования ресурсов при случайном поступлении запросов. Она возникает тогда, когда ресурс недоступен в данный момент, но через некоторое время он освобождается, и процесс продолжает свое выполнение. Тупик же, что видно из его названия, является в некотором роде неразрешимой ситуацией.
В некоторых случаях, когда тупиковая ситуация образована многими процессами, использующими много ресурсов, распознавание тупика является нетривиальной задачей. Существуют формальные, программно-реализованные методы распознавания тупиков, основанные на ведении таблиц распределения ресурсов и таблиц запросов к занятым ресурсам. Анализ этих таблиц позволяет обнаружить взаимные блокировки.
Если же тупиковая ситуация возникла, то не обязательно снимать с выполнения все заблокированные процессы. Можно снять только часть из них, при этом освобождаются ресурсы, ожидаемые остальными процессами, можно вернуть некоторые процессы в область свопинга, можно совершить "откат" некоторых процессов до так называемой контрольной точки, в которой запоминается вся информация, необходимая для восстановления выполнения программы с данного места. Контрольные точки расставляются в программе в местах, после которых возможно возникновение тупика.
6. Управление памятью: типы адресов
Для идентификации переменных и команд на разных этапах жизненного цикла программы используются символьные имена (метки), виртуальные адреса и физические адреса.
- Символьные имена присваивает пользователь при написании программы на алгоритмическом языке или ассемблере.
- Виртуальные адреса, называемые иногда математическими, или логическими адресами, вырабатывает транслятор, переводящий программу на машинный язык. Поскольку во время трансляции в общем случае не известно, в какое место оперативной памяти будет загружена программа, то транслятор присваивает переменным и командам виртуальные (условные) адреса, обычно считая по умолчанию, что начальным адресом программы будет нулевой адрес.
- Физические адреса соответствуют номерам ячеек оперативной памяти, где в действительности расположены' или будут расположены переменные и команды.
Совокупность виртуальных адресов процесса называется виртуальным адресным пространством. Диапазон возможных адресов виртуального пространства у всех процессов является одним и тем же. Например, при использовании 32-разрядных виртуальных адресов этот диапазон задается границами 0000000016 и FFFFFFFF16. Тем не менее, каждый процесс имеет собственное виртуальное адресное пространство -- транслятор присваивает виртуальные адреса переменным и кодам каждой программе независимо.
В разных операционных системах используются разные способы структуризации виртуального адресного пространства. В одних ОС виртуальное адресное пространство процесса подобно физической памяти представлено в виде непрерывной линейной последовательности виртуальных адресов. Такую структуру адресного пространства называют также плоской (flat). При этом виртуальным адресом является единственное число, представляющее собой смещение относительно начала виртуального адресного пространства. Адрес такого типа называют линейным виртуальным адресом.
В других ОС виртуальное адресное пространство делится на части, называемые сегментами (или секциями, или областями, или другими терминами). В этом случае помимо линейного адреса может быть использован виртуальный адрес, представляющий собой пару чисел(a:b), где “a” определяет сегмент, а “b” -- смещение внутри сегмента.
Существуют и более сложные способы структуризации виртуального адресного пространства, когда виртуальный адрес образуется тремя или даже более числами.
Задачей операционной системы является отображение индивидуальных виртуальных адресных пространств всех одновременно выполняющихся процессов на общую физическую память. При этом ОС отображает либо все виртуальное адресное пространство, либо только определенную его часть. Процедура преобразования виртуальных адресов в физические должна быть максимально прозрачна для пользователя и программиста.
Существуют два принципиально отличающихся подхода к преобразованию виртуальных адресов в физические.
В первом случае замена виртуальных адресов на физические выполняется один раз для каждого процесса во время начальной загрузки программы в память. Специальная системная программа -- перемещающий загрузчик -- на основании имеющихся у нее исходных данных о начальном адресе физической памяти, в которую предстоит загружать программу, а также информации, предоставленной транслятором об адресно-зависимых элементах программы, выполняет загрузку программы, совмещая ее с заменой виртуальных адресов физическими.
Второй способ заключается в том, что программа загружается в память в неизмененном виде в виртуальных адресах, то есть операнды инструкций и адреса переходов имеют те значения, которые выработал транслятор. В наиболее простом случае, когда виртуальная и физическая память процесса представляют собой единые непрерывные области адресов, операционная система выполняет преобразование виртуальных адресов в физические по следующей схеме. При загрузке операционная система фиксирует смещение действительного расположения программного кода относительно виртуального адресного пространства. Во время выполнения программы при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический. Пусть, например, операционная система использует линейно-структурированное виртуальное адресное пространство и пусть некоторая программа, работающая под управлением этой ОС, загружена в физическую память начиная с физического адреса S. ОС запоминает значение начального смещения S и во время выполнения программы помещает его в специальный регистр процессора. При обращении к памяти виртуальные адреса данной программы преобразуются в физические путем прибавления к ним смещения S. Например, при выполнении инструкции MOV пересылки данных, находящихся по адресу VA, виртуальный адрес VA заменяется физическим адресом VA+S.
Последний способ является более гибким: в то время как перемещающий загрузчик жестко привязывает программу к первоначально выделенному ей участку памяти, динамическое преобразование виртуальных адресов позволяет перемещать программный код процесса в течение всего периода его выполнения. Но использование перемещающего загрузчика более экономично, так как в этом случае преобразование каждого виртуального адреса происходит только один раз во время загрузки, а при динамическом преобразовании -- при каждом обращении по данному адресу.
В некоторых случаях (обычно в специализированных системах), когда заранее точно известно, в какой области оперативной памяти будет выполняться программа, транслятор выдает исполняемый код сразу в физических адресах.
Необходимо различать максимально возможное виртуальное адресное пространство процесса и назначенное (выделенное) процессу виртуальное адресное пространство. В первом случае речь идет о максимальном размере виртуального адресного пространства, определяемом архитектурой компьютера, на котором работает ОС, и, в частности, разрядностью его схем адресации (32-битная, 64-битная и т. п.). Например, при работе на компьютерах с 32-разрядными процессорами Intel Pentium операционная система может предоставить каждому процессу виртуальное адресное пространство до 4 Гбайт (232). Однако это значение представляет собой только потенциально возможный размер виртуального адресного пространства, который редко на практике бывает необходим процессу. Процесс использует только часть доступного ему виртуального адресного пространства.
Назначенное виртуальное адресное пространство представляет собой набор виртуальных адресов, действительно нужных процессу для работы. Эти адреса первоначально назначает программе транслятор на основании текста программы, когда создает кодовый (текстовый) сегмент, а также сегмент или сегменты данных, с которыми программа работает. Затем при создании процесса ОС фиксирует назначенное виртуальное адресное пространство в своих системных таблицах. В ходе своего выполнения процесс может увеличить размер первоначального назначенного ему виртуального адресного пространства, запросив у ОС создания дополнительных сегментов или увеличения размера существующих. В любом случае операционная система обычно следит за корректностью использования процессом виртуальных адресов -- процессу не разрешается оперировать с виртуальным адресом, выходящим за пределы назначенных ему сегментов. Максимальный размер виртуального адресного пространства ограничивается только разрядностью адреса, присущей данной архитектуре компьютера, и, как правило, не совпадает с объемом физической памяти, имеющимся в компьютере.
Сегодня для машин универсального назначения типична ситуация, когда объем виртуального адресного пространства превышает доступный объем оперативной памяти. В таком случае операционная система для хранения данных виртуального адресного пространства процесса, не помещающихся в оперативную память, использует внешнюю память, которая в современных компьютерах представлена жесткими дисками. Именно на этом принципе основана виртуальная память -- наиболее совершенный механизм, используемый в операционных системах для управления памятью.
Обычно виртуальное адресное пространство процесса делится на две непрерывные части: системную и пользовательскую. В некоторых ОС (например, Windows NT, OS/2) эти части имеют одинаковый размер -- по 2 Гбайт, хотя в принципе деление может быть и другим, например 1 Гбайт -- для ОС, и 2 Гбайт -- для прикладных программ1. Часть виртуального адресного пространства каждого процесса, отводимая под сегменты ОС, является идентичной для всех процессов. Поэтому при смене активного процесса заменяется только вторая часть виртуального адресного пространства, содержащая его индивидуальные сегменты, как правило, -- коды и данные прикладной программы. Архитектура современных процессоров отражает эту особенность структуры виртуального адресного пространства, например, в процессорах Intel Pentium существует два типа системных таблиц: одна -- для описания сегментов, общих для всех процессов, а другая -- для описания индивидуальных сегментов данного процесса.
При смене процесса первая таблица остается неизменной, а вторая заменяется новой. операционный система алгоритм планирование
В некоторых ОС существуют системные процессы, порожденные для решения внутренних задач ОС. В этих процессах отсутствуют сегменты прикладной программы, по они могут расположить некоторые свои сегменты (сегменты ОС) в общей части виртуального адресного пространства, а некоторые -- в индивидуальной части, обычно предназначенной для прикладных сегментов. И наоборот, в общей, системной части виртуального адресного пространства размещаются сегменты прикладного кода, предназначенные для совместного использования несколькими прикладными процессами.
Механизм страничной памяти в большинстве универсальных операционных систем применяется ко всем сегментам пользовательской части виртуального адресного пространства процесса. Исключения могут составлять специализированные ОС, например ОС реального времени, в которых некоторые сегменты жестко фиксируются в оперативной памяти и соответственно никогда не выгружаются на диск -- это обеспечивает быструю реакцию определенных приложений на внешние события.
Системная часть виртуальной памяти в ОС любого типа включает область, подвергаемую страничному вытеснению (paged), и область, на которую страничное вытеснение не распространяется (non-paged). В не вытесняемой области размещаются модули ОС, требующие быстрой реакции и/или постоянного присутствия в памяти, например диспетчер потоков или код, который управляет заменой страниц памяти. Остальные модули ОС подвергаются страничному вытеснению, как и пользовательские сегменты.
Обычно аппаратура накладывает свои ограничения на порядок использования виртуального адресного пространства. Некоторые процессоры (например, MIPS) предусматривают для определенной области системной части адресного пространства особые правила отображения на физическую память. При этом виртуальный адрес прямо отображается на физический адрес (последний либо полностью соответствует виртуальному адресу, либо равен его части). Такая особая область памяти не подвергается страничному вытеснению, и поскольку достаточно трудоемкая процедура преобразования адресов исключается, то доступ к располагаемым здесь кодам и данным осуществляется очень быстро.
Задание 4
Выдать дамп таблицы векторов прерываний
Таблицу векторов прерываний можно посмотреть через стандартный дебагер - debug. Таблица прерываний располагается начиная с адреса 0000:0000 и занимает первый килобайт.
Пример того, что можно увидеть, введя в debug'е команду -d 0000:0000:
0000:0000 68 10 A7 00 8B 01 70 00-16 00 96 03 8B 01 70 00 h.....p.......p.
0000:0010 8B 01 70 00 B9 06 0C 02-40 07 0C 02 FF 03 0C 02 ..p.....@.......
0000:0020 46 07 0C 02 0A 04 0C 02-3A 00 96 03 54 00 96 03 F.......:...T...
0000:0030 6E 00 96 03 88 00 96 03-A2 00 96 03 FF 03 0C 02 n...............
0000:0040 A9 08 0C 02 A4 09 0C 02-AA 09 0C 02 5D 04 0C 02 ............]...
0000:0050 B0 09 0C 02 0D 02 DB 02-C4 09 0C 02 8B 05 0C 02 ................
0000:0060 0E 0C 0C 02 14 0C 0C 02-1F 0C 0C 02 AD 06 0C 02 ................
0000:0070 AD 06 0C 02 A4 F0 00 F0-37 05 0C 02 9B C4 00 C0 ........7.......
0000:0080 72 10 A7 00 7C 10 A7 00-4F 03 2F 0E 8A 03 2F 0E r...|...O./.../.
0000:0090 17 03 2F 0E 86 10 A7 00-90 10 A7 00 9A 10 A7 00 ../.............
0000:00A0 B8 10 A7 00 54 02 70 00-F2 04 A0 D2 B8 10 A7 00 ....T.p.........
0000:00B0 B8 10 A7 00 B8 10 A7 00-40 01 15 04 50 09 E0 0C ........@...P...
0000:00C0 EA AE 10 A7 00 EE 00 F0-B8 10 A7 00 C4 23 02 CF .............#..
0000:00D0 B8 10 A7 00 B8 10 A7 00-B8 10 A7 00 B8 10 A7 00 ................
0000:00E0 B8 10 A7 00 B8 10 A7 00-B8 10 A7 00 B8 10 A7 00 ................
0000:00F0 B8 10 A7 00 B8 10 A7 00-B8 10 A7 00 B8 10 A7 00 ................
Каждый адрес состоит из 4х байт(сегмент:смещение), получается, что таблица прерываний состоит из 1024/4=256 прерываний. В debug'e адреса записаны как воспринимает их компьютер, т.е. младший байт слева. Т.о. первый адрес (68 10 А7 00) будет выглядеть как 00А7:1068, второй(8В 01 70 00) - 0070:018В и т.д.
Выдать дамп PSP программы.
Для программы, вызванной на выполнение, DOS выделяет блок памяти, называемый программным сегментом. Программный сегмент всегда начинается на границе параграфа. В начале программного сегмента DOS строит PSP (Program Segment Prefix - Префикс Программного Сегмента), который занимает 256 байт.
Пример вывода своего PSP:
Код программы приведён в приложении А.
Выдать дамп заголовка ЕХЕ программы.
Известно, что программные файлы в MS DOS бывают двух видов - файлы с расширениями COM и EXE. COM-файл - это обязательно программа размером не более 64 Кбайт. Все логические сегменты этой программы (код, данные, стек) помещаются в одном физическом сегменте памяти. COM-файл содержит двоичный код-образ программы, абсолютно идентичный тому образу, который программа будет иметь в оперативной памяти. При загрузке COM-программы система размещает ее сразу вслед за ее PSP (поэтому COM-программа должна начинаться директивой ORG 100h), во все сегментные регистры записывает адрес PSP, и содержимое этих регистров не меняется в ходе выполнения программы.
EXE-программа может иметь любой размер и состоять из нескольких сегментов. Содержимое сегментных регистров меняется в ходе выполнения - в них, как правило, заносятся адреса логических сегментов программы. Поскольку во время трансляции и компоновки не известно, какие абсолютные значения будут иметь эти адреса при размещении программы в памяти, в коде программы эти адреса представляются в виде смещений сегментов относительно начала программы с тем, чтобы при загрузке выполнить настройку обращений к началам сегментов на конкретные адреса памяти. Именно в связи с необходимостью настройки EXE-файл имеет более сложный формат. В начале файла расположен заголовок, который состоит из форматированной части и таблицы перемещений, далее следует сам образ программы.
Пример вывода заголовка EXE-программы:
Код программы приведён в приложении А.
Приложение А
Листинг программы вывода PSP:
#include <dos.h>
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define byte unsigned char
#define word unsigned int
void pr_file_tab();
struct psp {
byte ret_op[2]; /* команда INT 20h */
word end_of_mem; /* вершина доступной памяти */
byte reserved1;
byte old_call_dos[5]; /* старый вызов DOS */
void *term_ptr; /* адрес завершения */
void *ctrlbrk_ptr; /* адрес обработчика Ctrl+Break */
void *criterr_ptr; /* адрес обработчика крит.ошибок */
word father_psp; /* PID родителя */
byte JFT[20]; /* таблица файлов программы */
word env_seg; /* адрес окружения */
void *stack_ptr; /* адрес стека */
word JFT_size; /* размер таблицы файлов */
byte *JFT_ptr; /* адрес таблицы файлов */
byte reserved2[24];
byte new_call_dos[3]; /* новый вызов DOS */
} *mypsp;
word mypid; /* сегм.адрес PSP */
int dos, i, l;
char *s;
union REGS rr;
main() {
/* определение версии DOS */
rr.h.ah=0x30; intdos(&rr,&rr); dos=rr.h.al;
/* получение адреса своего PSP */
rr.h.ah=0x62; intdos(&rr,&rr); mypid=rr.x.bx;
/* распечатка PSP */
printf("***** PID=%04X *****\n",mypid);
mypsp=(struct psp *)MK_FP(mypid,0);
printf ("Команды: завершение - int 20h ---> %02X %02X\n",
mypsp->ret_op[0],mypsp->ret_op[1]);
printf (" старый вызов DOS -------> ");
for (i=0;i<3;printf("%02X ",mypsp->old_call_dos[i++]));
printf ("\n новый вызов DOS --------> ");
for(i=0;i<3;printf("%02X ",mypsp->new_call_dos[i++]));
printf
("\n\nАдреса: конец памяти -------------> %04X:0000\n",
mypsp->end_of_mem);
printf(" обработчик завершения ----> %Fp\n",
mypsp->term_ptr);
printf(" обработчик Ctrl+Break ----> %Fp\n",
mypsp->ctrlbrk_ptr);
printf(" обработчик критич.ошибки -> %Fp\n",
mypsp->criterr_ptr);
printf(" стек ---------------------> %Fp\n",
mypsp->stack_ptr);
printf("\nРодитель: ------------------------> %04X ",
mypsp->father_psp);
pr_file_tab(); /* таблица файлов */
printf("\nОкружение DOS --------------------> %04X\n",
mypsp->env_seg);
s=(char *)MK_FP(mypsp->env_seg,0);
while(l=strlen(s)) { printf(" %s\n",s); s+=l+1; }
if (dos>2) {
/* для DOS 3.0 и дальше можно получить строку вызова */
s++; l=*((int *)s);
printf("Строки вызова ----------------------> %d\n",l);
s+=2;
for(i=0; i<l; i++) { printf("%s\n",s); s+=strlen(s)+1; }
}
getch();
return 0;
}
/*==== распечатка таблицы файлов ====*/
void pr_file_tab() {
s=mypsp->JFT_ptr;
printf
("\n\nТаблица файлов: -------------------> %Fp (%d) ",
s,mypsp->JFT_size);
}
Листинг программы вывода заголовка EXE:
#include <dos.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#define byte unsigned char
#define word unsigned int
/* Форматированная часть заголовка EXE-файла */
struct EXEH {
byte ExeFlag[2]; /* 0x4D5a признак EXE-файла ('MZ') */
word LastPag; /* длина неполной последней страницы */
word PageCnt; /* длина образа в 512-байтовых стр. */
word ReloCnt; /* число элементов в табл.перемещения */
word HdrSize; /* длина заголовка в параграфах */
word MinMem; /* мин. памяти за концом прогр.*/
word MaxMem; /* макс.требуемой памяти */
word ReloSS; /* смещение сегмента стека */
word ExeSP; /* значение регистра SP при запуске */
word ChkSum; /* контрольная сумма */
word ExeIP; /* значение регистра IP при запуске */
word ReloCS; /* смещение кодового сегмента */
word TabOff; /* смещение 1-го эл-та перемещения */
word Overlay; /* номер оверлея */
} exeh;
word psp; /* сегм.адрес PSP */
char fname[80], *fn; /* имя EXE-файла */
int exef; /* дескриптор EXE-файла */
union REGS rr;
struct SREGS sr;
main() { strcpy(fname,"D:\\BORLANDC\\OWL\\NONAME01.EXE");
printf("Файл: %s\n",fname);
/* открытие файла */
rr.h.ah=0x3d; rr.h.al=0;
sr.ds=FP_SEG(fname); rr.x.dx=FP_OFF(fname);
intdosx(&rr,&rr,&sr);
if (rr.x.cflag) { printf("Невозможно открыть файл\n"); exit(0);}
else exef=rr.x.ax;
/* чтение заголовка */
rr.h.ah=0x3f; rr.x.bx=exef; rr.x.cx=sizeof(struct EXEH);
sr.ds=FP_SEG(&exeh); rr.x.dx=FP_OFF(&exeh);
intdosx(&rr,&rr,&sr);
if (rr.x.cflag) { printf("Ошибка чтения\n"); exit(0); }
printf("======= Заголовок файла %s =======\n",fname);
printf("Подпись файла .EXE = %02X%02X (%c%c)\n",
exeh.ExeFlag[0],exeh.ExeFlag[1],
exeh.ExeFlag[0],exeh.ExeFlag[1]);
printf("Длина последней страницы = %d\n",
exeh.LastPag);
printf("Длина модуля в страницах = %d\n",
exeh.PageCnt);
printf("Число эл-тов в табл.перемещ. = %d\n",
exeh.ReloCnt);
printf("Длина заголовка = %d\n",
exeh.HdrSize);
printf("Минимум памяти = %04Xh\n",
exeh.MinMem);
printf("Максимум памяти = %04Xh\n",
exeh.MaxMem);
printf("Смещение сегмента стека = %04Xh\n",
exeh.ReloSS);
printf("Значение регистра SP = %04Xh\n",
exeh.ExeSP);
printf("Контрольная сумма = %d\n",
exeh.ChkSum);
printf("Значение регистра IP = %04Xh\n",
exeh.ExeIP);
printf("Смещение кодового сегмента = %04Xh\n",
exeh.ReloCS);
printf("Смещение 1-го элемента таблицы = %04Xh\n",
exeh.TabOff);
printf("Номер оверлея = %d\n",
exeh.Overlay);
getch();
return 0;
}
Размещено на Allbest.ru
...Подобные документы
Управление процессами - часть операционной системы, влияющая на функционирование вычислительной машины. Контекст дескриптор процесса и алгоритм его планирования. Средства синхронизации и взаимодействия процессов. Критическая секция, тупики и нити.
лекция [166,6 K], добавлен 05.02.2009Взаимодействие процессов и потоков в операционной системе, основные алгоритмы и механизмы синхронизации. Разработка школьного курса по изучению процессов в операционной системе Windows для 10-11 классов. Методические рекомендации по курсу для учителей.
дипломная работа [3,2 M], добавлен 29.06.2012Подсистема управления процессами как часть операционной системы, непосредственно влияющая на функционирование вычислительной машины. Алгоритмы планирования процессов. Общие сведения о матричных принтерах, проектирование для них символов с помощью матриц.
курсовая работа [117,1 K], добавлен 22.06.2011Основные функции и процессы подсистемы управления процессами. Диспетчеризация процессов (потоков). Алгоритмы планирования выполнения потоков. Назначение и разновидности приоритетов в операционных системах. Функции подсистемы управления основной памятью.
презентация [117,7 K], добавлен 20.12.2013Уровни и главные параметры планирования. Алгоритмы first-come, first served, round robin, shoetest-job-first. Принципы назначения приоритетов. Многоуровневые очереди, мultilevel queue. Схема миграции процессов в очередях планирования с обратной связью.
курсовая работа [93,8 K], добавлен 05.07.2013Структура ядра операционной системы. Основные компоненты подсистемы управления процессами и памятью. Характеристика системных и прикладных процессов в Unix. Идентификация процесса Linux, его атрибуты и вызовы. Средства межпроцессного взаимодействия.
лекция [170,1 K], добавлен 29.07.2012Алгоритмы планирования мультипрограммных операционных систем. Оценка возможности выполнения двух процессов в реальном времени. Организация доступа к критической секции с использованием передачи сообщений. Обнаружение блокировок в вычислительной системе.
курсовая работа [858,7 K], добавлен 24.03.2015Понятие процесса и потока, характеристика их свойств и особенности создания. Требования к алгоритмам синхронизации, суть взаимного исключения на примере монитора и семафора. Методика изучения элективного курса "Процессы в операционной системе Windows".
дипломная работа [1,7 M], добавлен 03.06.2012Характеристика нормативного, ситуационного и аналитического типов поведения интеллектуальной системы. Особенности реализации и преимущества использования классического и минимаксного принципов планирования действий и альфа-бета алгоритма принятия решения.
реферат [133,6 K], добавлен 27.01.2011Изучение основных аспектов моделирования операционной системы. Исследование принципов организации псевдопараллельной работы процессов. Анализ алгоритмов диспетчеризации процессов. Проектирование подсистемы управления памятью и запоминающими устройствами.
курсовая работа [1,7 M], добавлен 12.01.2014Математические модели деформирования подкрепленных пологих оболочек при учете различных свойств материала. Традиционные алгоритмы решения задач устойчивости для подкрепленных пологих оболочек. Распараллеливание процесса вычисления: основы и принципы.
дипломная работа [2,5 M], добавлен 10.11.2010Алгоритмы, алфавит языка, структура программы, написанной на Турбо Паскале. Целые, вещественные, логические, символьные типы данных, их совместимость. Линейные алгоритмы, пустой и составной операторы, простейший ввод и вывод, разветвляющиеся алгоритмы.
курсовая работа [49,8 K], добавлен 03.11.2009Теоретические сведения. Основные понятия. Строка, её длина, подстрока. Понятие о сложности алгоритма. Алгоритмы основанные на методе последовательного поиска. Алгоритмы Рабина, Кнута - Морриса - Пратта, Бойера – Мура.
курсовая работа [138,3 K], добавлен 13.06.2007Сущность и содержание основных понятий операционных систем: процессы, память, файлы. Классификация по различным признакам и типы процессов, направления взаимосвязи. Принципы планирования работы процессора. Порядок управления невиртуальной памятью.
презентация [216,4 K], добавлен 24.07.2013Основные структуры процессов в операционной системе Unix. Возможные состояния процесса в Unix и способы перехода между ними. Планирование и выполнение процессов. Различия между родительским и дочерним процессом. Ожидание завершения и выполнения процесса.
курсовая работа [673,0 K], добавлен 24.02.2012Обзор и анализ систем интеллектуальной обработки данных. Разработка принципов и структуры информационно-моделирующей системы для процессов химической очистки теплоэнергетического оборудования. Требования, алгоритмы работы и основные этапы разработки ИМС.
дипломная работа [3,1 M], добавлен 27.10.2017Блокировка файла для защиты доступа к нему со стороны других процессов в многозадачной среде операционной системы. Управление периферийными устройствами, процессами (заданиями, задачами). Планирование процессов, понятие очереди. Общий буфер данных.
презентация [45,2 K], добавлен 23.10.2013Описание и схема информационного взаимодействия элементов системы, выходная и входная информация. Технологические процесс функционирования системы в автоматизированном режиме. Разработка информационного обеспечения системы, алгоритмы программного модуля.
дипломная работа [1,0 M], добавлен 30.08.2010Место систем углубленного планирования среди прочих информационных ресурсов, используемых для планирования производства. Применение систем оперативного планирования в процессе управления производством. Примеры APS-систем: Ortems, PSImetals APS/ALS.
курсовая работа [1,5 M], добавлен 25.04.2015Создание информационной системы управления базой данных "Кадровое агентство". Характеристика используемой ЭВМ, ОС, языка программирования. Требования предъявляемые к ПО. Алгоритмы и тексты форм ввода. Описание, алгоритмы формирования выходных документов.
курсовая работа [1,1 M], добавлен 07.01.2013