Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
osnovy_vt / процессы1.ppt
Скачиваний:
47
Добавлен:
21.03.2016
Размер:
300 Кб
Скачать
☆

На построение ОС безопасных по отношению к взаимоблокировкам идут лишь в некоторых случаях, в которых возникновение блокировок может привести к катастрофическим последствиям. Например: на ЭВМ управляющих системами стратегических ракет и противоракетной обороны.

Игнорирование угрозы взаимоблокировок приводит к тому, что ОС плохо контролирует последовательность выделения ресурсов отдельным процессам, поэтому с течением времени неизбежно возникновение блокировки.

Почти все ОС построены по такому принципу. На майнфреймах, при проектировании, такая структура ОС была принята , что при среднем количестве запросов на ЭВМ и большом объеме ее ресурсов возникновение блокировок было маловероятным. Затраты на написание сложной безопасной ОС представлялись проектировщиками гораздо больше чем экономические потери возникающие из-за редких возникновении взаимоблокировок. Однако с появлением вирусов и хакерских атак вероятность перегрузки ЭВМ и возникновение блокировок очень сильно возросла.

Системные и пользовательские вызовы в ОС

Практически все ОС (кроме DOS) не позволяют пользователю выполнять привилегированные команды: изменить содержимое системных регистров ЭВМ, расширить и освободить физическую память, распределить и освободить физические ресурсы ЭВМ, напрямую через команды ассемблера выдать операции управления устройствами. Поэтому в ОС введены так называемые системные вызовы. С помощью такого пользователя программа пользователя может просить ЭВМ выполнить необходимые действия. Системные вызовы кроме того удобны, поскольку позволяют в виде одного оператора на языке высокого уровня выполнить сложную последовательность действий, например записать что-нибудь в файл. Поэтому при программировании вызов системной функции производится подобно вызову подпрограммы.

Все вызовы подпрограмм могут быть разделены на 2 различных класса: пользовательские и системные вызовы.

Пользовательские вызовы выполняются в адресном пространстве пользователя, а именно используют коды, данные и управляющие структуры пользовательской программы.

Системные вызовы отличаются от пользовательских тем, что они выполняются в пространстве ОС, поэтому исполнимый код являются частью ОС. От пользователя поступаю на вход лишь данные и пользователю возвращаются в результате обработанные, измененные данные. При этом ОС должна производить так называемое шлюзование данного пользователя.

Шлюзование необходимо для обеспечения безопасности работы ОС.

В классических ОС (UNIX подобных ОС ) все вызовы четко разделены на пользовательские и системные. Это позволяет построить безопасные ОС.

Windows один и тот же вызов может выполнить как в пользовательском пространстве так и в системном пространстве. Система плохо следит за тем чтобы коды пользователя не выполнялись в режиме ОС (нулевой уровень защиты в режиме PSW).

Различные программы Windows часто утроены таким образом, что данные одновременно содержат программные коды. Например макрорасширения в doc (док) документах, Power Point файлах и т.д. Это приводит к тому, что коды применяемые вместе с программными могут выполнятся на нулевом уровне защиты. В этом случи, этот код если он представляет собой вирус имеет полные права на управление машины без возникновений прерываний защиты.

Некоторые системные вызовы UNIX

Системные вызовы:

Классическая архитектура

Для создания нового процесса в Unix системах вызов fork pid=fork( ) создать новый процесс

Если значение pid= -1 не был создан процесс

Если значение pid` 0 -процесс был создан, к родительскому процессу вернулся идентификатор созданного процесса.

Если значение pid= 0 - возвращается для созданного процесса.

if ( (pid=fork( ) )= = 0)

{ код нового процесса } else { код старого процесса } waitpid (pid, M) //где М-маска

if ( (pid=fork( ) ) = =0) { код нового процесса exit( ); } waitpid (pid, M) exit( )// завершение нового процесса. Если новый процесс завершится, продолжить старый процесс.

exeeve( ) запуск программы

if ( (pid=fork( ) )= = 0) { execve( ); // код нового процесса; exit ( ); } waitpid (pid, M) kill (pid) //убить процесс. Отслеживает действия «потомков» и убивает.

pipe ( ) создает файл в файле, можно списать и набивать значениями.

pipe( pid ) организует файл от дочернего к родительскому, значения пишутся в файл. Creat_Thread (имя подпрограммы) создает виток, нити Exit_Thread ( ) завершает виток

Get_pid ( ) получить pid mypid=Get_pid( ) statpid( pid ) получить состояние процесса с заданным pid.

Вызовы для работы с файлами

open ( ) открыть файл close( ) закрыть файл

read( ) читать из файла (номер файла, по какому адресу, сколько) write ( ) писать в файл

lseek ( ) указать в позицию в файле stat ( ) получить состояние файла rm ( ) удалить файл

Для работы с каталогами: mkdir ( ) создать каталог rmdir ( ) убить каталог

link ( ) создать ссылку на каталог (Linux) wnlink ( ) удалить элемент каталога

mount ( ) подключение устройства к каталогу umount ( ) демонтировать устройство

chdir ( ) изменить работающий каталог chmod ( ) изменить атрибут

time ( ) получить время ( в мс от 1 января 2012г. )

КЭШ

Классическая архитектура

КЭШи применяются для ускорения доступа к какому-нибудь устройству. Например, при записи на диск данные сначала пишутся в кэш, а уж потом, независимо от работы ЭВМ переносятся на диск. Это называется

кэширование записи. То же самое и с чтением: когда процессор просит считать какие- нибудь данные с диска, то диск читает в кэш и те данные, что следуют за необходимыми процессору. Это называется упреждающим чтением. Так как в процессе работы программы данные обычно читаются последовательно, то такое чтение оказывается очень эффективным.

Для работы с КЭШами используется страничная адресация. Применительно к дисковому КЭШу это означает, что каждая «страница» КЭШа символизирует какой-то сектор на диске. И если диску требуется что-то записать в кэш, то он проверяет - если в нем свободные страницы, а если нет, то выбирает какую-нибудь используемую, скидывает хранящуюся в ней информацию на диск, и только потом выводит в нее то, что ему было нужно. Таким образом говорят, что часть диска отображена в кэш.

Кэш на диске представляет из себя микросхему памяти... мегабайт на 8.

Кэш на процессоре. Так как процессор работает на частоте большей, чем частота оперативки, то ему приходится долго ждать, пока данные из памяти по его запросу будут доставлены в регистр. Поэтому какая-то часть памяти (с которой работает процессор) отображается в процессорный кэш (чтобы ускорить работу процессора).

КЭШа у процессора два: L1 и L2. Они оба работают на частоте одинаковой с процессором. L2 - кэш работает также как и дисковый кэш (с помощью страничной адресации) Каждая страница КЭШа соответствует какой-либо странице памяти. Процессор работает только с КЭШем. Когда ему требуются данные, которых в КЭШе нет - они записываются в кэш менеджером памяти (а если в КЭШе места нет, то часть данных из КЭШа скидывается в оперативку). Кыш ускоряет работу, когда процессор производит множество операций, требующих обмена с памятью. А если он производит вычисления (то есть память не пользуется), то кэш на скорость соответственно не влияет.

Кэш L1 - это то, с чем процессор работает в данный момент времени. Этот кэш намного проще (он использует линейную адресацию - то есть просто длинный кусок памяти), но он разбит на две части - в одной хранятся коды исполняемой сейчас программы (и те команды, которые будут исполняться следующими) а в другой данные, необходимые этой программе. Но размер КЭШа L1 -очень мал... поэтому используются весьма хитрые алгоритмы предсказания того, как будет далее выполняться программа, чтобы заполнить этот кэш лучшим образом.

Данные в кэш L1 поступают из КЭШа L2. А в L2 они поступают из оперативки. Все эти кэш работают на аппаратном уровне - то есть независимо от ОС.

Но ОС может создавать и собственные КЭШи в оперативке. Например (так в Linux), при чтении с диска она записывает все, что читается в оперативку. Поэтому при последующем обращении к данным на диске, эти данные получаются мгновенно

Организация памяти

При рассмотрении организацииКлассическаяпамяти следуетархитектураиметь в виду, что рассматривается два отдельных вопроса:

логическая организация памяти внутри выполняющегося процесса. Физическая организация памяти , методы отображения памяти процесса на физическую память ЭВМ.

Логическая организация памяти:

Логическая память может быть организована 2 различными видами: Непрерывная единая память Сегментная организация памяти.

Физическая организация памяти:

Классическая архитектура

Физическая память организуется двумя различными способами: Непрерывная организация.

Статическая организация памяти.

1) При непрерывной организации физической памяти, к любому ее месту можно обратится непосредственно минуя дополнительные операции.

При линейной организации физической памяти, она разбивается ОС на ряд разделов, при этом размеченных разделах хранятся данные для различных программ.

2) Статическая организация памяти:

При статической организации памяти, логическая и физическая память разбиваются на отдельные страницы фиксированной длины. При такой организации памяти, компьютер может и должен производить отображение логической памяти на физическую.

Особенности этого отображения состоит в том, что размещения страниц физической памяти не соответствует размещению страниц в логической памяти является случайным, зависящим от истории протекания вычислительного процесса на ЭВМ.