Главная страница
Навигация по странице:

  • Процессы реального времени и их планирование в Unix

  • 29. Файловая система в UNIX

  • ос и с. ОСиС. 1. Классификация программного обеспечения


    Скачать 2.7 Mb.
    Название1. Классификация программного обеспечения
    Анкорос и с
    Дата11.12.2022
    Размер2.7 Mb.
    Формат файлаdoc
    Имя файлаОСиС.doc
    ТипДокументы
    #839260
    страница13 из 29
    1   ...   9   10   11   12   13   14   15   16   ...   29

    Особенности планировщиков некоторых версий Unix

    Как уже было показано, различные реализации Unix имеют свои особенности в работе с командой nice. Многие реализации отличаются существенными модификациями схемы работы с приоритетами. В качестве примера можно указать планировщик ОС AIX, в котором величины динамических приоритетов колеблются в диапазоне от 0 до 127. В AIX имеется специальная утилита schedtune, которая позволяет изменять некоторые параметры планировщика, в том числе и величину кванта времени. В последней, четвертой версии AIX, в schedtune появились и иные параметры [5].

    В качестве другого примера можно подробнее рассмотреть некоторые возможности OC IRIX 6.1 и 6.2. Следующая команда IRIX 6.1/6.2 позволяет изменять некоторые параметры планировщика:

    (10)#npri [-h ndpri] [-n nice] [-t slice] [-d период, объем] [-D only ] процесс any


    Рисунок 1. Зависимость dprty от времени (чем выше dprty, тем ниже приоритетность). С - счетчик использования процессора.


    где процесс задается своим идентификатором или явно указывает, какую команду нужно выполнить с этими параметрами планировщика:

    процесс ::= команда аргументы_команды

    -p pid

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

    -h npri задает неизменный приоритет - приоритетность, не уменьшающуюся во времени. Аргумент npri лежит в диапазоне от 30 до 255, включая границы. Диапазон от 40 до 127 включительно относится к обычным интерактивным процессам разделения времени. Группа более приоритетных процессов имеет более низкое значение приоритета - от 30 до 39. С ними надо работать очень осторожно: обычный интерактивный процесс разделения времени не может их прервать. Диапазон от 127 до 255 относится к процессам низкой приоритетности - они могут использовать процессор, только если в системе нет "обычных", готовых к выполнению процессов.

    • -n nice задает значение nice в диапазоне от 0 до 39 включительно.

    • -t slice задает квант времени в единицах "тиков" часов (обычно 10 мсек)

    • -d период, объем устанавливает режим периодического планирования типа deadline. В этом режиме процессу гарантируется выделение определенного объема времени процессора (мсек) в каждый период времени, задаваемый аргументом период (мсек).

    • -D only(any) "уточняет" режим планирования типа deadline.

    Если задано only, то после исчерпания объема гарантированного процессорного времени процесс не сможет в заданный период претендовать на дополнительное время процессора. Если указано any (по умолчанию), то и после исчерпания гарантированного объема времени процесс будет еще пытаться конкурировать за процессорные ресурсы с другими процессами, но уже на основании обычного режима планирования.В качестве приложений, для которых целесообразно указать гарантированное обслуживание процессором, можно упомянуть задачи визуализационного моделирования, работу с "непрерывными средами" на DAT или CD-ROM и др. Для работы с процессами реального времени в файловой системе xfs в ОС IRIX также имеется возможность поддержания гарантированной обработки подсистемой ввода/вывода. В ОС IRIX 6.х есть системный вызов schedctl, который использует команда npri.

    Процессы реального времени и их планирование в Unix

    В некоторых более ранних реализациях System V предусмотрена поддержка процессов реального времени через nice. Для этого суперпользователю приходилось запускать необходимые для работы в реальном времени задания с очень низкими значениями nice (-20 или ниже) [4]. Однако можно сказать, что полная поддержка процессов реального времени появилась только в Unix SVR4. Включение поддержки процессов реального времени в планировщик Unix SVR4 следует считать одним из самых кардинальных изменений в этом компоненте ядра Unix. POSIX 1003.1b описывает стандарт на средства реального времени.

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

    В Unix SVR4 все процессы делятся на три основных класса в соответствии с их глобальным приоритетом: класс процессов реального времени (RT), класс системных процессов и класс процессов разделения времени (рис. 2). В Руководстве по ОС Solaris говорится о наличии еще и класса интерактивных процессов (IA), для которых целью планировщика является обеспечение хорошего времени ответа, в то время как для класса процессов разделения времени (TS) задача состоит в обеспечении хорошей пропускной способности вычислительной установки, но так, чтобы "не мешать" достижению хорошего времени ответа для процессов класса IA. Доступ к классу IA имеет только суперпользователь. Классы TS и IA разделяют общие параметры планировщика и не различаются между собой с точки зрения механизма планирования. В связи с этим здесь не имеет смысла выделять IA в отдельный класс - будем просто говорить об (общем) классе TS.

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

    (11)%priocntl -l

    Для запуска команды на выполнение в реальном времени суперпользователь может ввести

    (12)#priocntl -e -c RT -p приоритет команда

    где -с RT задает класс (Real Time). Приоритет задает значение приоритета внутри класса процессов реального времени (от 0 до 59, рис. 2); умалчиваемое значение равно 0. Аналогичным образом можно запускать процесс в класс TS.

    Следующая команда позволяет суперпользователю перевести существующий процесс в класс реального времени и установить ему приоритет:

    (13)#priocntl -s -c RT -p приоритет -i pid n

    -s означает "установить" (set) приоритет; -i pid n задает идентификацию процесса, чей pid равен n.

    Аналогичным образом можно работать с процессами класса TS. В ключе -i указывается тип идентификации процессов, который может принимать значения pid, ppid, pgid, sid (session id), class, uid, gid, all. Эти обозначения говорят сами за себя. Последний аргумент в команде (13) может задаваться в виде списка разделенных пробелами значений, указывающих на конкретный процесс (или конкретные процессы).

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

    (14)#priocntl -s -c RT -p приоритет -i uid n

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

    (15)#priocntl -s -c TS -p приоритет -i pid n

    Здесь приоритет, естественно, задает значение приоритета внутри класса процессов разделения времени - величину nice (0 по умолчанию). Команда priocntl является универсальным средством; с ее помощью можно изменять и приоритеты процессов разделения времени:

    (16)%priocntl -s -c TS -p приоритет -i pid n

    В качестве другого примера применения priocntl можно взять установку максимального уровня приоритета для определенного процесса из класса TS:

    (17)#priocntl -s -m приоритет pid

    Данная команда устанавливает (-s) максимальный (-m) приоритет для процесса с идентификатором pid. Это может быть полезно для ограничения возможности роста приоритета низкоприоритетных процессов, чтобы они не мешали распределению процессорного времени более высокоприоритетным интерактивным процессам. Вообще priocntl с ключом -s имеет опции, подобно -m, которые являются специфическими для каждого класса.

    #scheduler table for RT RES=1000 100 # 0 100 # 1 ......... 100 # 5 90 # 6 90 # 7 ......... 10 # 58 10 # 59 #end of table

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

    Другая голубая мечта некоторых "крутых" системных администраторов - поменять какие-нибудь "хитрые" параметры, дабы добиться увеличения пропускной способности или уменьшения времени реакции интерактивных процессов. Поскольку современные версии Unix предоставляют в распоряжение системного администратора весьма гибкий и "утонченный" аппарат, не нужно забывать второй принцип: KISS (Keep It Simple, Stupid) - "будь попроще, дурачок". Это золотое правило всех программистов особенно важно при тонкой настройке параметров

    29. Файловая система в UNIX
    Как мы отмечали в разделе 2.1, понятие файла является одним из наиболее важных для ОС UNIX. Все файлы, с которыми могут манипулировать пользователи, располагаются в файловой системе, представляющей собой дерево, промежуточные вершины которого соответствуют каталогам, и листья - файлам и пустым каталогам. Примерная структура файловой системы ОС UNIX показана на рисунке 2.1. Реально на каждом логическом диске (разделе физического дискового пакета) располагается отдельная иерархия каталогов и файлов. Для получения общего дерева в динамике используется "монтирование" отдельных иерархий к фиксированной корневой файловой системе.

    Замечание: в мире ОС UNIX по историческим причинам термин "файловая система" является перегруженным, обозначая одновременно иерархию каталогов и файлов и часть ядра, которая управляет каталогами и файлами. Видимо, было бы правильнее называть иерархию каталогов и файлов архивом файлов, а термин "файловая система" использовать только во втором смысле. Однако, следуя традиции ОС UNIX, мы будем использовать этот термин в двух смыслах, различая значения по контексту.

    Каждый каталог и файл файловой системы имеет уникальное полное имя (в ОС UNIX это имя принято называть full pathname - имя, задающее полный путь, поскольку оно действительно задает полный путь от корня файловой системы через цепочку каталогов к соответствующему каталогу или файлу; мы будем использовать термин "полное имя", поскольку для pathname отсутствует благозвучный русский аналог). Каталог, являющийся корнем файловой системы (корневой каталог), в любой файловой системе имеет предопределенное имя "/" (слэш). Полное имя файла, например, /bin/sh означает, что в корневом каталоге должно содержаться имя каталога bin, а в каталоге bin должно содержаться имя файла sh. Коротким или относительным именем файла (relative pathname) называется имя (возможно, составное), задающее путь к файлу от текущего рабочего каталога (существует команда и соответствующий системный вызов, позволяющие установить текущий рабочий каталог).


    Рис. 2.1. Структура каталогов файловой системы
    В каждом каталоге содержатся два специальных имени, имя ".", именующее сам этот каталог, и имя "..", именующее "родительский" каталог данного каталога, т.е. каталог, непосредственно предшествующий данному в иерархии каталогов.

    UNIX поддерживает многочисленные утилиты, позволяющие работать с файловой системой и доступные как команды командного интерпретатора. Вот некоторые из них (наиболее употребительные):


    cp имя1 имя2

    копирование файла имя1 в файл имя2

    rm имя1

    уничтожение файла имя1

    mv имя1 имя2

    переименование файла имя1 в файл имя2

    mkdir имя

    создание нового каталога имя

    rmdir имя

    уничтожение каталога имя

    ls имя

    выдача содержимого каталога имя

    cat имя

    выдача на экран содержимого файла имя

    chown имя режим

    изменение режима доступа к файлу


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

    В мире UNIX существует несколько разных видов файловых систем со своей структурой внешней памяти. Наиболее известны традиционная файловая система UNIX System V (s5) и файловая система семейства UNIX BSD (ufs). Файловая система s5 состоит из четырех секций (рисунок 2.2,a). В файловой системе ufs на логическом диске (разделе реального диска) находится последовательность секций файловой системы (рисунок 2.2,b).



    Рис. 2.2. Структура внешней памяти файловых систем s5 и ufs
    Кратко опишем суть и назначение каждой области диска.


    • Boot-блок содержит программу раскрутки, которая служит для первоначального запуска ОС UNIX. В файловых системах s5 реально используется boot-блок только корневой файловой системы. В дополнительных файловых системах эта область присутствует, но не используется.

    • Суперблок - это наиболее ответственная область файловой системы, содержащая информацию, которая необходима для работы с файловой системой в целом. Суперблок содержит список свободных блоков и свободные i-узлы (information nodes - информационные узлы). В файловых системах ufs для повышения устойчивости поддерживается несколько копий суперблока (как видно из рисунка 2.2,b, по одной копии на группу цилиндров). Каждая копия суперблока имеет размер 8196 байт, и только одна копия суперблока используется при монтировании файловой системы (см. ниже). Однако, если при монтировании устанавливается, что первичная копия суперблока повреждена или не удовлетворяет критериям целостности информации, используется резервная копия.

    • Блок группы цилиндров содержит число i-узлов, специфицированных в списке i-узлов для данной группы цилиндров, и число блоков данных, которые связаны с этими i-узлами. Размер блока группы цилиндров зависит от размера файловой системы. Для повышения эффективности файловая система ufs старается размещать i-узлы и блоки данных в одной и той же группе цилиндров.

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

    • Блоки данных - в этой части файловой системы хранятся реальные данные файлов. В случае файловой системы ufs все блоки данных одного файла пытаются разместить в одной группе цилиндров. Размер блока данных определяется при форматировании файловой системы командой mkfs и может быть установлен в 512, 1024, 2048, 4096 или 8192 байтов.


    Файлы любой файловой системы становятся доступными только после "монтирования" этой файловой системы. Файлы "не смонтированной" файловой системы не являются видимыми операционной системой.

    Для монтирования файловой системы используется системный вызов mount. Монтирование файловой системы означает следующее. В имеющемся к моменту монтирования дереве каталогов и файлов должен иметься листовой узел - пустой каталог (в терминологии UNIX такой каталог, используемый для монтирования файловой системы, называется directory mount point - точка монтирования). В любой файловой системе имеется корневой каталог. Во время выполнения системного вызова mount корневой каталог монтируемой файловой системы совмещается с каталогом - точкой монтирования, в результате чего образуется новая иерархия с полными именами каталогов и файлов.

    Смонтированная файловая система впоследствии может быть отсоединена от общей иерархии с использованием системного вызова umount. Для успешного выполнения этого системного вызова требуется, чтобы отсоединяемая файловая система к этому моменту не находилась в использовании (т.е. ни один файл из этой файловой системы не был открыт). Корневая файловая система всегда является смонтированной, и к ней не применим системный вызов umount.

    Как мы отмечали выше, отдельная файловая система обычно располагается на логическом диске, т.е. на разделе физического диска. Для инициализации файловой системы не поддерживаются какие-либо специальные системные вызовы. Новая файловая система образуется на отформатированном диске с использованием утилиты (команды) mkfs. Вновь созданная файловая система инициализируется в состояние, соответствующее наличию всего лишь одного пустого корневого каталога. Команда mkfs выполняет инициализацию путем прямой записи соответствующих данных на диск.

    Ядро ОС UNIX поддерживает для работы с файлами несколько системных вызовов. Среди них наиболее важными являются open, creat, read, write, lseek и close.

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

    Файл в системных вызовах, обеспечивающих реальный доступ к данным, идентифицируется своим дескриптором (целым значением). Дескриптор файла выдается системными вызовами open (открыть файл) и creat (создать файл). Основным параметром операций открытия и создания файла является полное или относительное имя файла. Кроме того, при открытии файла указывается также режим открытия (только чтение, только запись, запись и чтение и т.д.) и характеристика, определяющая возможности доступа к файлу:
    open(pathname, oflag [,mode])
    Одним из признаков, которые могут участвовать в параметре oflag, является признак O_CREAT, наличие которого указывает на необходимость создания файла, если при выполнении системного вызова open файл с указанным именем не существует (параметр mode имеет смысл только при наличии этого признака). Тем не менее по историческим причинам и для обеспечения совместимости с предыдущими версиями ОС UNIX отдельно поддерживается системный вызов creat, выполняющий практически те же функции.

    Открытый файл может использоваться для чтения и записи последовательностей байтов. Для этого поддерживаются два системных вызова:
    read(fd, buffer, count) и write(fd, buffer, count)
    Здесь fd - дескриптор файла (полученный при ранее выполненном системном вызове open или creat), buffer - указатель символьного массива и count - число байтов, которые должны быть прочитаны из файла или в него записаны. Значение функции read или write - целое число, которое совпадает со значением count, если операция заканчивается успешно, равно нулю при достижении конца файла и отрицательно при возникновении ошибок.

    В каждом открытом файле существует текущая позиция. Сразу после открытия файл позиционируется на первый байт. Другими словами, если сразу после открытия файла выполняется системный вызов read (или write), то будут прочитаны (или записаны) первые count байтов содержимого файла (конечно, они будут успешно прочитаны только в том случае, если файл реально содержит по крайней мере count байтов). После выполнения системного вызова read (или write) указатель чтения/записи файла будет установлен в позицию count+1 и т.д.

    Такой, чисто последовательный стиль работы, оказывается во многих случаях достаточным, но часто бывает необходимо читать или изменять файл с произвольной позиции (например, как без такой возможности хранить в файле прямо индексируемые массивы данных?). Для явного позиционирования файла служит системный вызов
    lseek(fd, offset, origin)
    Как и раньше, здесь fd - дескриптор ранее открытого файла. Параметр offset задает значение относительного смещения указателя чтения/записи, а параметр origin указывает, относительно какой позиции должно применяться смещение. Возможны три значения параметра origin. Значение 0 указывает, что значение offset должно рассматриваться как смещение относительно начала файла. Значение 1 означает, что значение offset является смещением относительно текущей позиции файла. Наконец, значение 2 говорит о том, что задается смещение относительно конца файла. Заметим, что типом данных параметра offset является long int. Это значит, что, во-первых, могут задаваться достаточно длинные смещения и, во-вторых, смещения могут быть положительными и отрицательными.

    Например, после выполнения системного вызова
    lseek(fd, 0, 0)
    указатель чтения/записи соответствующего файла будет установлен на начало (на первый байт) файла. Системный вызов
    lseek(fd, 0, 2)
    установит указатель на конец файла. Наконец, выполнение системного вызова
    lseek(fd, 10, 1)
    приведет к увеличению текущего значения указателя на 10.

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

    1   ...   9   10   11   12   13   14   15   16   ...   29


    написать администратору сайта