Шпаргалка по ОС. 1. Понятие операционной системы, ее отношение к аппаратуре и программному обеспечению
Скачать 123.67 Kb.
|
P(S2) P(S1) ... – ждет S2 ... – ждет открытия S1 V(S2) V(S1) V(S1) V(S2) Такую ситуацию также называют deadlock | 45. Средства реализации виртуальной памяти, страничная переадресация. Память является важнейшим после процессора ресурсом компьютера. Поэтому ее распределению – в простейших случаях, и управлению – в современных ОС уделяется пристальнейшее внимание.Оперативная память по своей сущности – физический объект и поэтому существенно зависит от организации работы процессора с памятью. Иначе говоря, непосредственно зависит от особенностей архитектуры процессора. Виртуальная память требует глубоко встроенных в аппаратуру процессора внутренних средств, которые в совокупности со служебными структурами данных, создаваемыми и поддерживаемыми программно, создают видимость для отдельной программы полного владения ею всей совокупностью Так вот, адресная переадресация в виртуальной памяти аналогична некоторому развешиванию адресных табличек, где функцию развешивания адресных табличек берет на себя операционная система. Причем для каждого вычислительного процесса используется своя подсистема развешивания адресов на аналоги домов, и адресные таблички одного процесса совершенно не видны другому процессу. Каждому процессу для такой переадресации необходима своя система замены видимых для него адресных табличек на действительные физические места расположения, причем система – незаметная самому процессу. В качестве такой системы не придумано ничего проще, чем таблицы страниц. Страницей в данной переадресации называют аналог дома в нашей вымышленной модели. Номера внутри страницы обеспечивают нумерацию ячеек, находящихся в пределах одной страницы, аналогично номерам квартир внутри дома. Таблица страниц для процесса в общем случае содержит информацию для перехода от номеров страниц, видимых процессу, к номерам реального размещения этих страниц в оперативной памяти. В простейшем, точнее упрощенном случае, строка такой таблицы с номером k содержит всего лишь номер реального размещения этой страницы в оперативной памяти. Когда для нашего примера видимый процессу обобщенный номер квартиры записывается десятичными цифрами как 007345804, то это обозначает квартиру номер 804 в доме с табличкой для процесса, обозначенной 007345. Если в таблице переадресации для данного процесса в строке с номером 007345 стоит число 017421, то в действительности за указанным обобщенным номером стоит квартира 804 в доме с физическим номером расположения 017421, т.е. физический адрес 017421804. | 46. Средства реализации виртуальной памяти; стратегия подкачки страниц. Виртуальная память требует глубоко встроенных в аппаратуру процессора внутренних средств, которые в совокупности со служебными структурами данных, создаваемыми и поддерживаемыми программно, создают видимость для отдельной программы полного владения ею всей совокупностью имеющихся ячеек физической памяти. Эта видимость называется также страничной переадресацией. Кроме страничной переадресации, обеспечиваемой архитектурными средствами в совокупности с ОС, для функционирования виртуальной памяти используют так называемую подкачку страниц. Существо подкачки страниц в том, что часть внешней памяти используется ОС как средство временного хранения менее нужных страниц оперативной памяти, причем такое временное сохранение и восстановление информации из внешней памяти в оперативную организуется совершенно незаметно для вычислительных процессов. Практически единственное, что в этом методе (временной подмене части оперативной памяти внешней) становится заметным, так это замедление действий процесса, который ОС вынужденно приостанавливает для такого восстановления информации. Если же в анализируемой строке таблицы страниц соответствующим битом указано, что страница не находится в физической памяти, то в ней присутствует информация, где же во внешней памяти находится содержимое этой страницы. Такая ситуация вызывает прерывание, называемое страничным прерыванием. Обрабатывая его, операционная система находит место в последовательности физических страниц, содержимое которых по ее алгоритмам можно временно вытеснить во внешнюю память. Система производит это перемещение, делает изменение в той строке таблицы страниц, которая ранее описывала вытесненное содержимое (возможно в таблице страниц другого процесса). Затем она переносит нужное содержимое страницы из внешней памяти в выбранную страницу и корректирует исходную строку таблицы страниц. По завершении прерывания вычислительный процесс возвращается к началу выполнения той исходной команды, которую начали рассматривать. Со второй попытки выполнения той же команды уже обнаруживается конкретное значение физической страницы, куда требуется доступ, и обращение осуществляется, как описано выше.Виртуальная память позволяет выполнять программы, размер которых значительно больше размера имеющейся физической памяти. Это достигается за счет того, что из исходного файла в оперативную память переносятся только те страницы, которые действительно необходимы на текущий момент. Остальная часть исходного файла используется путем подкачки страниц по действительному запросу на них, причем часть ранее используемых страниц обычным образом вытесняется в свопинг-файл или отмечается как неизменно присутствующая в области хранимого исполняемого файла. | 47. Системные функции распределения памяти в Unix. Кроме незаметного для выполняемой программы использования виртуальной памяти, современные ОС содержат средства явного получения заказываемых объемов памяти. Операционные системы содержат системные средства, которые позволяют запрашивать для работы программы дополнительные области данных, причем для последующего доступа к этим областям системная функция возвращает значение указателя, которое может быть запомнено в именованном указателе.Проще всего такие средства организованы в Unix. Здесь имеются всего четыре системные функции, связанные с выделением и распределением оперативной памяти, называемые malloc, free, calloc и realloc. void* malloc(size_t nbytes)Единственным аргументом этой функции служит число байтов в запрашиваемой области данных, а возвращается указатель на не детализированный тип данных. При невозможности выделить операционной системой заданный объем памяти, эта функция возвращает нулевой указатель (NULL).Как только запрошенная функцией malloc() область памяти становится ненужной программе, настоятельно рекомендуется отдать приказ об ее освобождении. Для этого освобождения предназначена функция с именем free. void free(void* ptr) void* calloc(size_t nelem, size_t nbytes) и позволяет выделять область данных для размещения массива из nelem элементов, каждый из которых занимает nbytes байтов. Наконец последняя из перечисленных функций имеет прототип void* realloc(void* oldptr, size_t newsize) Она используется для изменения размера дополнительной области памяти, ранее запрошенной у ОС и выделенной ею. При выполнении этой функции исходная область памяти может быть перемещена операционной системой в новое положение, и возвращаемое значение уже не будет совпадать со старым значением oldptr. 50. Совместное использование оперативной памяти в Unix. В ОС Unix разделяемая память находится под непосредственным управлением ядра, которое содержит таблицу описания областей разделяемой памяти. Каждая из областей обозначается в этой таблице целочисленным идентификатором (а не текстовым именем, как в других ОС). Кроме того, каждая такая область описывается в этой таблице атрибутами доступа и размером. Области разделяемой памяти относятся к адресному пространству ядра ОС. Доступ к разделяемой памяти со стороны процесса осуществляется в два этапа. На первом из них получается хэндл области памяти, причем на этом этапе либо открывается доступ к уже имеющейся в ОС области памяти, либо такая область создается операционной системой. На втором этапе процесс подключается к разделяемой области (to attach), используя ранее полученный хэндл. Для получения разделяемой памяти предназначена функция с прототипом int shmget(key_t key, int size, int flag), возвращающая при удачном выполнении целочисленное значение требуемого идентификатора. Для подключения процесса к запрошенной ранее области разделяемой памяти служит функция с прототипом void* shmat(int shmid, void* addr, int flag) Для отсоединения разделяемой памяти должна использоваться функция с прототипом int shmdt(void* addr) аргументом которой является адрес, ранее полученный от функции shmat. При успешном выполнении она возвращает 0, а при неудаче -1. Кроме рассмотренных базовых функций для разделяемой памяти, в Unix имеется функция расширенного управления разделяемой памятью с прототипом int shmctl(int shmid, int cmd, struct shmid_ds *buf) При использовании разделяемой памяти в Linux программисту предоставляется очень удобное системное средство – команда ipcs. Для получения информации о разделяемой памяти эту команду следует вызвать с опцией m, так что весь вызов имеет вид ipcs -m Эта команда выводит информацию о присвоенном ключе-идентификаторе, идентификаторе области памяти, владельце, размере и правах доступа к ней. | 48. Системные функции распределения памяти в Windows. В соврем-х архитектурах доступ к страницам памяти ограничивается правами доступа как минимум: чтение и/или запись, доступ для выполнения.Выделение ОП в Windows включает 2 этапа: 1. to reserve построение таблиц страниц для заданного диапазона адресов; 2. to commit задействовать память, ввести в использование. Происходит действительное выделение памяти с отметками (занесением слов) в табл. страниц. Для обоих действий общая ф-ия, она возвращает адрес: VirtualAlloc(void *adr, DWORD size, DWORD type, DWORD protect); adr – желаемый адрес начала блока или NULL, size – размер, type – тип операции(MEM_RESERVE,MEM_COMMIT),protect-PAGE_READONLY, PAGE_READWRITE.Обратная ф-ия: VirtualFree(void *adr, DWORD size, DWORD type); type – MEM_DECOMMIT, MEM_RELEASE. 49. Совместное использование оперативной памяти в Windows.В состав всех современных ОС включены средства использования памяти для взаимодействия независимых процессов. Основой этих средств является разделяемая память, сами средства представляют набор системных функций использования этой памяти, а на более детальном уровне – и информационные средства описания этой памяти.В операционной системах Windows для организации обмена через разделяемую память применяются функции, имеющие более универсальное назначение и относящиеся к отображению файлов на виртуальное адресное пространство. Основная из этих функций создает именованный или неименованный объект отображения в памяти и имеет прототип HANDLE CreateFileMapping (HANDLE hFile, SECURITY_ATTRIBUTES *pFileMappingAttributes, DWORD protect, DWORD MaxSizeHigh, DWORD MaxSizeLow, CTSTR *pName) Базовый адрес разделяемой памяти получается для использования с помощью функции, имеющий прототип void* MapViewOfFile(HANDLE hFileMappingObject, DWORD DesiredAccess, DWORD OffsetHigh, DWORD OffsetLow, DWORD size) которая и возвращает требуемый базовый адрес памяти или NULL при невозможности выполнения. Здесь первый параметр должен быть взят от предыдущего вызова функции CreateFileMapping, предоставляющего хэндл объекта отображения. Третий и четвертый аргументы этой функции совместно задают 64-битное смещение внутри виртуальной области памяти, созданной вызовом функции CreateFileMapping. После завершения использования разделяемой памяти для освобождения уже ненужных ресурсов следует вызывать функцию UnmapViewOfFile, имеющую прототип BOOL UnmapViewOfFile( void* pBaseAddress), передав ей в качестве аргумента базовый адрес разделяемой памяти. Кроме того, в общем случае следует закрыть хэндл объекта отображаемой памяти с помощью функции CloseHandle. 51. Структуры файловых систем для пользователя. ФС подразделяются на использующие и на не использующие обозначения логических дисков. FAT, NTFS и HPFS используют логические диски, а ФС для Unix логических дисков не используют. Применение логических дисков заметно упрощает для пользователя обозначения файлов: можно указать нахождение файла на логическом диске, где этот файл находится. В ФС с логическими дисками внешняя структура ФС описывается в виде дерева. В ОС, использующих логические диски принято обозначать их одной латинской буквой, за которой символ двоеточие. Последовательность каталогов от корневого узла к данному файлу называется путь (path). В FAT, NTFS и HPFS разделителем в такой последовательности каталогов служит символ \. Все файлы имеют атрибуты доступа. В системах FAT, HPFS и NTFS для обслуживания таких атрибутов служит команда ATTRIB. Аргументом команды может быть имя отдельного файла и задание совокупности файлов. В простейшей форме эта команды выводит атрибуты, обозначаемые символами S, H, R, A (System, Hidden, ReadOnly, Archive). В UNIX все файлы собраны в одно дерево, включает три разновидности объектов: обычные файлы, каталоги и специальные файлы. Специальные файлы соответствуют устройствам компьютера: реальным или виртуальным. Дерево внешней структуры ФС Unix имеет единственный корень, обозначаемый /. Этот корень является корневым каталогом, перечисляющим каталоги следующего уровня. Любой каталог, отличный от корневого, может содержать любое число обычных файлов и каталогов следующего уровня. | 52. Отображение файлов в оперативную память в Unix. Отображение файла в память (на память) — это способ работы с файлами в некоторых операционных системах, при которых всему файлу или некоторой непрерывной его части ставится в соответствие определённый участок памяти (диапазон адресов оперативной памяти). При этом чтение данных из этих адресов фактически приводит к чтению данных из отображенного файла, а запись данных по этим адресам приводит к записи этих данных в файл. Примечательно то, что отображать на память часто можно не только обычные файлы, но и файлы устройств.Отображение файлов в оперативную память впервые появилось в BSD Unix. Идея такого отображения появилась как результат осмысливания избыточности действий при файловом вводе и выводе в операционной системе, использующей виртуальную память. Действительно, при вводе и выводе происходит пересылка данных между внешней памятью, хранящей файл, и служебными областями ОС (буферами ввода-вывода внутри адресного пространства ОС), и тут же неизбежная пересылка данных между буферами ОС и буферами данных прикладного процесса. Заметим, что использование системой ввода-вывода непосредственно пользовательских буферов оказалось бы нарушением правил защиты памяти с вытекающими отсюда неприятностями для функционирования системы. А двукратная пересылка данных заметно снижает быстродействие системы при работе с файлами. Для использования рассматриваемого отображения в Unix служит системная функция с прототипом void* mmap(void* addr виртуального адреса процесса, с которого предполагается отображение, size_t size размер отображаемой области файла, int prot, int flag, int fd хэндл уже открытого файла, off_t pos начальную позицию в файле, с которой начинается отображение, что дает возможность отображать не только весь файл, но и любой его последовательный участок), Аргумент prot задает права доступа к отображаемой памяти и может представляться одной из следующих символьных констант: PROT_READ, PROT_WRITE и PROT_EXEC. Аргумент флагов flag задает опции отображения и может представляться одной из констант MAP_SHARED, MAP_PRIVATE, MAP_FIXED. Константы MAP_SHARED и MAP_PRIVATE задают соответственно разделяемое несколькими процессами и сугубо индивидуальное использование области отображения файла в виртуальную память После завершения процесса все отображения файлов в память автоматически отменяются. Чтобы отменить отображение файла ранее завершения процесса, следует использовать вызов функции munmap, которая имеет прототип int munmap(void* addr, size_t size). функция munmap только отменяет отображение файла, но не закрывает файл, который требуется закрыть обычным вызовом close(). | 53. Отображение файлов в оперативную память в Windows. В операционной системе Windows для отображения в память файлов используются функции CreateFileMapping, MapViewOfFile и UnmapViewOfFile. Для отображения собственно файлов первый аргумент функции CreateFileMapping должен задаваться хэндлом предварительно открытого файла, третий аргумент этой функции protect по своим значениям должен соответствовать режиму использования файла, заданному при открытии последнего. (Если используется константа PAGE_READONLY, то файл должен быть открыт с доступом GENERIC_READ, а если используется константа PAGE_READWRITE, то при открытии файла должен был быть указан доступ константами GENERIC_READ и GENERIC_WRITE.) Напомним еще раз, что в Windows функция CreateFileMapping практически создает только область виртуальных адресов, подготовленную для последующего отображения. (Кроме того, ею создается объект ядра, который и служит информационной структурой дальнейшего управления и контроля за отображаемым объектом.) Собственно отображение (в отличие от Unix) здесь выполняется вызовом системной функции MapViewOfFile. Эта последняя функция для файла должна задавать тот же режим доступа, что и указывалось на предыдущем этапе (присутствует заметная избыточность, не характерная для большинства профессиональных решений в области системного программирования, но характерная для продукции Microsoft). Практически две последние функции Windows выполняют в совокупности ту же работу, что делает в Unix единственная функция mmap. Единственным существенным отличием является возможность явного задания размера области отображения предпоследними параметрами функции CreateFileMapping. (Напомним, что эта же функция в Windows системах применяется и для побочных целей – первого этапа построения разделяемой памяти.) После завершения работы в Windows с отображаемым в память файлом следует выполнить вызов функции UnmapViewOfFile для базового адреса области отображения и закрыть хэндл, полученный от функции CreateFileMapping. Кроме того, не следует забывать и закрывать файл, открытый для отображения | 54. Программный опрос содержимого каталогов файловой системы Windows. В операционных системах типа Windows разработчики включили проверку условия для имени файла в действия соответствующей системной функции. В этой ОС основных функций, работающих с содержимым каталогов, – две: функция поиска первого файла по задаваемому условию и функция поиска следующего файла по тому же условию. Само условие задается как метанотация, т.е. записью совокупности файлов с помощью метасимволов * и ? в соответствующем аргументе имени файла. Использование этих метасимволов полностью совпадает с традиционным их применением в командах операционной системы, восходящим к правилам командного интерпретатора Unix.В Windows для поиска первого файла в каталоге служит функция с прототипом HANDLE FindFirstFile(char *metaname, WIN32_FIND_DATA *FindFileData), Для поиска следующих файлов, удовлетворяющих той же метанотации, что была задана при выполнении функции FindFirstFile, в Windows служит функция с прототипом BOOL FindNextFile(HANDLE hFindFile, WIN32_FIND_DATA *FindFileData),Последняя функция возвращает значение TRUE, если находит очередной файл в текущем каталоге, удовлетворяющий метанотации, в противном случае она возвращает значение FALSE.В завершение работы с каталогом должна вызываться функция с прототипом BOOL FindClose(HANDLE hFindFile), которая закрывает хэндл, ранее полученный от функции FindFirstFile. Для вспомогательных действий по переустановке текущего каталога предназначена в Windows функция с прототипом BOOL SetCurrentDirectory(char *PathName)) а также функция с прототипом DWORD GetCurrentDirectory(DWORD BufferSize, char *Buffer) которая позволяет запомнить в символьном массиве полное имя текущего каталога. | 55. Программный опрос содержимого каталогов файловой системы Unix. В ОС Unix операции с каталогом строятся подобно операциям с типизированными файлами, используемыми в Паскале, а именно, вводится указатель на структуру данных, описывающую каталог. Эта структура описана в заголовочном файле dirent.h и имеет имя DIR. Указатель на эту структуру данных используется для получения значения от функции opendir, имеющей прототип DIR* opendir(char *dirname). Дальнейшие действия выполняются системной функцией с прототипом struct dirent *readdir(DIR* dirptr) с аргументом, полученным от предыдущей функции. Каждое выполнение вызова readdir() возвращает указатель на содержимое структуры типа dirent, содержащей информацию об очередном элементе каталога. Эта структура данных описана также в заголовочном файле dirent.h. В последней структуре два основных поля, которые заданы в ней как ino_t d_ino; /* Номер индексного дескриптора */ char d_name[ ]; /* Имя файла, заканчивающегося нулевым байтом*/ При использовании этих полей каталога следует иметь в виду, что нулевое значение поля d_ino вполне возможно у используемого каталога и обозначает неиспользуемую запись в каталоге (обычно по причине удаления информации о файле из данного каталога).После окончания использования указателя на каталог, полученный от функции opendir(), следует выполнить закрытие доступа к каталогу и освобождение ресурсов вызовом функции с прототипом int closedir(DIR* dirptr), Вспомогательной функцией работы с каталогами служит функция, описываемая прототипом void rewinddir(DIR* dirptr), которая позволяет вернуться к началу каталога с целью чтения его опять с самого начала. | 56. Получение информации об ошибках выполнения системной функции Windows. Для получения кода ошибки в MS Windows программисту приходится принимать немалые дополнительные усилия. Если по возвращаемому значению системной функции определяется, что ошибка есть, следует немедленно вызывать специальную функцию GetLastError(), которая возвращает послед¬нюю ошибку, возникшую в ходе выполнения программы (точнее нити програм¬мы). Собственно коды ошибок, общие для всех системных функций, содержатся в заголовочном файле WinError.h. Отличительной и не очень приятной особенностью MS Windows является от¬сутствие информации о возможных кодах ошибки для конкретных функций. Если требуется распознавание вида ошибки при автоматическом выполнении программы, то раз¬работчики этой ОС предлагают для использования специальную функцию FormatMesssage, в конечном счете эта функция делает почти то же самое, что и функция strerror в Unix, но сложность использования функции FormatMessage неизмеримо больше. Прежде всего она имеет прототип len=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, k, // k - номер ошибки, возвращенный функцией GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), txtmess, sizeof(txtmess), NULL); Главным по значению является третий её аргумент dwMessageld, который и задает распознаваемый код ошибки, адрес буфера для текста задается в аргументе IpBuffer, а его размер в аргументе nSize. Важным в применении является и первый аргумент, который дает возмож¬ность использовать не только системные, но и пользовательские коды ошибок. Для системных ошибок в аргументе dwFlags должно присутствовать логическое слагаемое FORMAT_MESSAGE_FROM_SYSTEM. dwLanguageld обеспечивает Много-языковую поддержку сообщений. | 57. Получение информации об ошибках выполнения системной функции Unix. Наиболее традиционно эта проблема решается в Unix. Большинство системных функций Unix имеют вид int имяфункции(список_аргументов),возвращая в качестве основного значения целое число. Это число может нести значение, определяющее результат действия функции, но одно из значений (обычно -1), зарезервировано за условным кодом ошибки. Другой формой контроля ошибок в Unix является специальная переменная errno. Для основных функций операционной системы Unix код ошибки неявно заносится в эту специальную глобальную переменную, описанную в заголовочном файле errno.h. Такой прием дает принципиальную возможность анализировать значение этой переменной после обращения к системной функции. Но делать это следует сразу же после системного вызова, так как следующий системный вызов, в свою очередь, изменяет эту переменную.Практическое использование значений переменной ошибок errno достигается с помощью вспомогательных функций perror() и strerror(). Первая из них имеет прототип void perror(const char *s) char *strerror(int errnum) Вторая функция возвращает указатель на текст, описывающий ошибку, а первая непосредственно отображает в стандартном потоке ошибок этот текст, причем предваряемый любой пользовательской текстовой информацией, которая содержится в аргументе s. | 58. Групповое выполнение и фоновый запуск команд в командных оболочках ОС. Групповое выполнение: В командной строке Windows NT/2000/XP можно использовать специальные символы, которые позволяют вводить несколько команд одновременно и управлять работой команд в зависимости от результатов их выполнения. С помощью таких символов условной обработки можно содержание небольшого пакетного файла записать в одной строке и выполнить полученную составную команду. Используя символ амперсанда &, можно разделить несколько утилит в одной командной строке, при этом они будут выполняться друг за другом. Например, если набрать команду DIR & PAUSE & COPY /? и нажать клавишу Для запуска программ в фоновом режиме в конец командной строки добавляется символ амперсанда (&). Например, для запуска еще одной программы с терминала Х11 вам может потребоваться запустить эту программу в фоновом режиме, чтобы ваш текущий терминал оставался свободным для вывода: # rxvt & Эта команда запускает терминал rxvt, и приглашение вашей командной строки вновь становится свободным для ввода. | 59. Использование стандартного ввода-вывода и конвейеров в командных оболочках. Эти средства основаны на переадресации стандартного ввода-вывода. Большая часть команд операционной системы в их внутренней программной реализации построена таким образом, что для ввода и вывода данных используется исключительно стандартный ввод и вывод. В результате переадресация этого ввода или вывода в командной строке позволяет вместо экрана и клавиатуры использовать желаемые пользователю файлы.Так, при использовании команды отображения информации о файлах, можно ее задать в видеdir >имя_файла (или соответственно ls >имя_файла ) и желаемая информация для будущего употребления запомнится в указанном файле.Конвейер представляет заданное в команде связывание стандартного вывода одной команды с стандартным вводом другой – следующей в строке – команды. В качестве символа связывания команд в конвейер используется символ | (одинарная вертикальная черта). Конвейер по внешнему виду представляет запись команда1 | команда2. Здесь стандартный вывод команды команда1 автоматически связывается со стандартным вводом команды команда2. Поэтому данные результата первой команды не появляются на экране, а полностью передаются на вход второй команды, которая и использует их в качестве обрабатываемой ее информации. В одной составной команде может быть построен конвейер не только из двух, но и из любого числа команд. Единственное требование при этом заключается в том, что для соединяемых таким путем команд первая из них должна использовать стандартный вывод, а вторая – стандартный ввод.Часто в конвейерах используется команда more, которая оказывается заключительной в конвейере, поскольку выводит на экран, а не в стандартный вывод.В Unix для использования конвейеров существует дополнительная команда tee, которая в качестве единственного аргумента требует указания имени файла и передавая данные со своего стандартного ввода на стандартный вывод одновременно запоминает передаваемые данные в заданном для нее файле. Она как бы кроме простой передачи с входа на выход еще и протоколирует все данные в файле.При использовании стандартного ввода-вывода иногда возникает проблема запоминания сообщений об ошибках. Для вывода информации об ошибках предназначен стандартный поток ошибок, имеющий константное значение хэндла в Unix и OS/2, равное 2, причем этот вывод об ошибках по умолчанию поступает на экран.Для переадресации стандартного ввода и стандартного вывода, как уже описывалось в гл. 2, в командной строке используются вспомогательные символы '<' и '>' соответственно. Для переадресации стандартного потока ошибок используется запись вида команда 2>имя_файла Предоставляется также возможность направлять данные об ошибках в стандартный поток обычного вывода. Для этого предназначена запись вида команда 2>&1Наконец, существует возможность при необходимости перенаправить стандартный вывод в стандартный поток ошибок, что задается записьюкоманда 1>&2 При использовании переназначений с помощью символов обозначений >имя_файла предыдущее содержимое файла с именем имя_файла теряется (внутренними процедурами файл открывается для записи с усХчением Фо нуля предыдущеУо содержимоУо). В ряде случаХв, особенно при протоколированШи ошШбок, может представлять интерес сохранение предыдущего содержимого указанного таким образом файла и приписывание в его конец новых данных. Для решений этой задачи предлагается использовать вместо одного символа '>' два таких символа подряд и без разрыва между ними. Загрузка...В частности команда команда <файл1 >файл2 2>>файл3 указывает – брать исходные данные в файле файл1, помещать данные стандартного вывода в файл файл2 и дописывать в конец файла файл3 сообщения стандартного потока ошибок текущей команды команда. | 60. Использование переменных в командных оболочках ОС. Среда командной оболочки Cmd.exe определяется переменными, задающими поведение командной оболочки и операционной системы. Имеется возможность определить поведение среды командной оболочки или среды всей операционной системы с помощью двух типов переменных среды: системных и локальных. Системные переменные среды определяют поведение глобальной среды операционной системы. Локальные переменные среды определяют поведение среды в данном экземпляре Cmd.exe. Системные переменные среды заданы заранее в операционной системе и доступны для всех процессов Windows XP. Только пользователи с привилегиями администратора могут изменять эти переменные. Эти переменные наиболее часто используются в сценариях входа в систему. Локальные переменные среды доступны, только когда пользователь, для которого они были созданы, вошел в систему. Локальные переменные из куста HKEY_CURRENT_USER подходят только для текущего пользователя, но определяют поведение глобальной среды операционной системы. В следующем списке представлены различные типы переменных в порядке убывания приоритета. - Встроенные системные переменные - Системные переменные куста HKEY_LOCAL_MACHINE - Локальные переменные куста HKEY_CURRENT_USER - Все переменные среды и пути указаны в файле Autoexec.bat. - Все переменные среды и пути указаны в сценарии входа в систему (если он имеется).- Переменные, используемые интерактивно в сценарии или пакетном файле | 61. Ввод и вывод данных в командных сценариях. Чтобы работать в Linux с командами, вовсе не обязательно быть программистом. После знакомства с различными программами, когда вы освоите работу с командной строкой и обнаружите, что постоянно вводите в командную строку одни и те же выражения, сохраните эти командные строки в виде текстовых файлов и превратите их в сценарии (scripts) оболочки. В своей простейшей форме сценарий оболочки представляет собой одну или несколько наиболее часто используемых командных строк. Рассмотрим следующий пример: # rxvt -geometry 80*11+803+375 -bg write -fg black -e pico & # rxvt -geometry 80*24+806+2 -bg write -fg black -e pine & Эти две командные строки запускают редактор pico и почтовую программу pine в двух окнах терминала rxvt на втором рабочем столе экрана с разрешением 800*600. Можно с уверенностью сказать, что ввод подобных команд всякий раз, когда у вас возникает необходимость запустить эти программы - удовольствие небольшое. Хотя вам ничто не мешает после перехода к другому рабочему столу вручную запустить окна терминала, все же на установку правильных размеров окон и запуск программ потребуется определенное время. Вы можете, однако, преобразовать эти команды в исполняемые файлы, сначала сохранив их в виде файлов с помощью редактора, а затем применив к ним команду chmod: # chmod +x d2.Теперь, когда у вас возникнет необходимость запустить эти программы, все что вам нужно сделать - ввести в командную строку выражение, проще которого вряд ли можно придумать: # d2 Вы можете обеспечить этой новой команде большую гибкость за счет использования переменных оболочки $1 и $2, которые представляют первый и второй аргументы командной строки в команде оболочки. Отредактируйте созданный вами файл и замените имена программ этими переменными: # rxvt -geometry 80*11+803+375 -bg write -fg black -e $2 & # rxvt -geometry 80*24+806+2 -bg write -fg black -e $1 & Результат этой команды точно такой, как и предыдущей, с той разницей, что теперь вы имеете возможность запускать в терминальных окнах практически любые программы. С помощью оболочки можно быстро построить простые программы для решения насущных задач. | 62. Управляющие структуры разветвления в командной оболочке bash. BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. К управляющим структурам относятся: 1. Конструкция if-fi 2. Конструкция case-esac. Конструкция if-fi работает так же, как и в других языках программирования.Если список1 (условие) истинный, выполняется список2, иначе выполняется список3 и проверяется его истинность и т.д. Допускается неограниченная вложенность операторов if. Список - это список команд. Разделителем команд служит символ <;>. Список обязательно должен заканчиваться точкой с запятой. Пример списка: ls; dir; cat file; При программировании на bash есть один подводный камень, относящийся к логическим выражениям. В других языках программирования выражение <истина> обозначается как Сравнение строк: 1.= - равно 2.!= - не равно Символ "!" является символом логической операции NOT (отрицание). | 63. Управляющие структуры циклов в командной оболочке bash. Интерпретатор bash поддерживает циклы for, while, until, select, а интерпретатор sh только for и while. В этой статье я рассмотрю только первые два цикла - for и while. Синтаксис цикла for: for имя_переменной in список1 do список2 done Простой пример: for i in 1 2 3 4 5; do echo $i; done На экране вы увидите 1 2 3 4 5 Еще раз напомню, что любой список в bash должен заканчивать точкой с запятой. Построчно вывести содержимое файла file.txt мы можем с помощью такого цикла for str in `cat ./file.txt` do echo "$str"; done Цикл for закончит свою работу, когда будет обработан последний элемент списка, в данном случае, когда на экран будет выведена последняя строка файла file.txt Синтаксис цикла while: while список1 do список2 done Цикл while будет выполняться, пока условие, заданное в списке список1, будет истинным. Поэтому цикл while иногда называют циклом с истинным условием. Например, a = 1 while [$a –lt 10] do echo $a a = $(( $a + 1 )) done На экране вы увидите: 1 2 3 4 5 6 7 8 9 Когда переменная a примет значение 10, цикл завершит свою работу, так как программа test вернет значение false (a уже не меньше, а равен 10). 64. Основные элементы управления доступом к ресурсам в Windows. Управление доступом заключается в предоставлении пользователям, группам и компьютерам определенных разрешений на доступ к объектам ОС. Для каждого объекта или ресурса ОС, поддерживается контрольный список доступа (Access Control List - ACL). Он определяет перечень пользователей, которым разрешен доступ к данному объекту, а также тех, кому запрещен. Каждый список контроля доступа (ACL) представляет собой набор элементов контроля доступа (Access Control Entries, или ACE). | 65. Организация и использование идентификаторов безопасности. Идентификаторы безопасности (SID) — это числовые коды, обозначающие пользователей и группы. Для каждой записи таблицы управления доступом (ACE) существует идентификатор безопасности (SID), указывающий пользователя или группу, для которых доступ разрешен, запрещен или подлежит аудиту. Идентификатор безопасности (SID) представляет собой уникальное значение переменной длины, используемое в операционных системах Windows для идентификации участника безопасности или группы безопасности. Под хорошо известными идентификаторами SID понимаются группы SID, идентифицирующие общих пользователей или общие группы. Их значения остаются постоянными во всех операционных системах. Эта информация полезна при устранении неполадок, связанных с безопасностью. Кроме того, она полезна в случае возможных неполадок отображения, которые можно увидеть в редакторе ACL. В редакторе ACL вместо имени пользователя или группы может отображаться идентификатор SID. Ниже перечислены известные идентификаторы SID. SID: S-1-0 Название: Пустой администратор Описание: Администратор идентификатора. •SID: S-1-0-0 .Описание: Группа, в которую входят все пользователи, даже анонимные пользователи и гости. Принадлежность контролируется операционной системой. SID представляет собой числовое значение переменной длины, формируемое из номера версии структуры SID, 48-битного кода агента идентификатора и переменного количества 32-битных кодов субагентов и/ или относительных идентификаторов (relative identifiers, RID). Код агента идентификатора (identifier authority value) определяет агент, выдавший SID. Таким агентом обычно является локальная система или домен под управлением Windows. Коды субагентов идентифицируют попечителей, уполномоченных агентом, который выдал SID, a RID — не болше чем средство создания уникальных SID на основе общего базового SID (common-based SID). | 66. Списки DACL управления доступом в Windows. Список DACL содержит записи, предоставляющие права или отказывающие в предоставлении прав определенным пользователям и группам. Запись списка называется элементом управления доступом. Каждый элемент управления доступом состоит из следующих компонентов: идентификатор (ИД) безопасности, используемый для идентификации определенного пользователя или группы; список доступа, определяющий разрешения, которые запрещены или предоставлены для пользователя или группы. Ниже приведен пример списка DACL: DACL: Пользователь1 Full Control (All) Gruppa1:Read(RX) Everyone:Read (RX) В этом примере DACL Пользователь1 имеет доступ на чтение, запись и выполнение файла. Члены группы Gruppa1 имеют доступ на чтение и выполнение. Члены группы Everyone («Все») имеют доступ на чтение и выполнение. Доступ к файлу определяют перечисляемые ниже правила. Если список DACL не существует, всем предоставляется полный доступ. Если список DACL существует, но не содержит записей, доступ для всех запрещен. Владелец файла всегда имеет возможность изменить список DACL. В свою очередь к списку DACL применимы перечисляемые ниже правила. Записи списка DACL просматриваются последовательно. Все разрешения неявно запрещаются. Если разрешение было запрещено, его невозможно предоставить. Если разрешение предоставлено, его невозможно запретить. | 67.(1) Маркеры доступа и учетные записи в системе безопасности. Маркер доступа -программный объект операционных систем класса Microsoft Windows, содержит информацию по безопасности сеанса и идентифицирует пользователя, группу пользователей и пользовательские привилегии. Маркер доступа — это объект, инкапсулирующий дескриптор безопасности процесса. Прилагаемый к процессу, дескриптор безопасности идентифицирует собственника объекта. Пока маркер используется для представления только информации по безопасности, он технически свободен по своему содержанию и может содержать любые данные. Маркер доступа используется Windows, когда процесс пытается взаимодействовать с объектами, дескрипторы безопасности которых требуют контроль доступа.Типы: Первичные маркеры доступа могут быть ассоциированы только с процессом и представляют собой субъект безопасности процесса. Имперсонализация — это концепт безопасности присущий только Windows NT, что позволяет серверному приложению временно «быть» клиентом для доступа к охраняемому объекту. В операционной системe NT существует понятие «защищенный объект» (securable object). Это объект, доступ к которому контролируется и ограничивается операционной системой. В семействе операционных систем производства Microsoft лишь NT и Windows 2000 обеспечивают подобный сервис. К таким объектам относятся: файлы и каталоги файловой системы NTFS; каналы (pipes); процессы и потоки (Process and threads); | 67.(2) Маркеры доступа и учетные записи в системе безопасности. В модели ограничения доступа Win32 существует два базовых понятия: Access tokens - маркеры доступа (МД), содержащие информацию о пользователе; Security descriptors - описатели защиты, содержащие информацию о правах тех или иных учетных записей на доступ к объекту. При регистрации пользователя в системе после успешной проверки имени и пароля создается маркер доступа. Для каждого процесса, выполняемого далее в контексте этого пользователя, создается копия МД. Маркер доступа содержит множество идентификаторов защиты. При создании защищенного объекта ОС присваивает ему описатель защиты (security descriptor, SD) - той защиты, которая имеется у пользователя, создающего объект, или же той, что задана по умолчанию. Приложения Win32 могут использовать функции API как для получения, так и для изменения информации о доступе к объектам. Security descriptor содержит информацию о владельце объекта, а также может включать следующие списки контроля доступа Access-Contol List (ACL): Discretionary access-control list (DACL) - разграничительные списки контроля доступа, в которых содержатся пользователи и группы с соответствующими правами на доступ к объекту; System access-control list (SACL) - системные списки контроля доступа, которые определяют, как осуществляется аудит попыток доступа к объекту. Список контроля доступа содержит список записей контроля доступа (access-control entries, ACEs). Каждая запись содержит набор битовых флагов и идентификатор SID попечителя (trustee) - пользователя или группы, к которой эти права применены. | 68. Дескрипторы безопасности в Windows и их применение. Каждый пользователь, зарегистрированный в системе, имеет собственную учетную запись, После прохождения процедуры аутентификации пользователю присваивается маркер доступа, идентифицирующий пользователя, его группу, а также определяющий доступные пользователю привилегии в системе для доступа к ресурсам. При этом каждому объекту системы, включая файлы, принтеры, сетевые службы, контейнеры Active Directory и другие, присваиваетсядескриптор безопасности. Дескриптор безопасности объекта определяет права доступа к объекту и содержит список контроля доступа (ACL – Access Control List), в котором явно определяется, каким пользователям разрешено выполнять те или иные действия с этим объектом. Каждый дескриптор безопасности может содержать списки двух типов. Системный список управления доступом (SACL – System Access Control List) позволяет отслеживать права и ограничения, установленные для объекта на системном уровне. В этот список могут вносить изменения только те пользователи, которые обладают правами доступа на уровне системы. Сервер для NFS использует дескриптор безопасности Windows при реализации разрешений на доступ к системе Network File System (NFS). Дескриптор безопасности — это структура, которая управляет назначениями системы безопасности для Windows. Дескриптор безопасности содержит следующие компоненты: •владелец файла; •группа файла; •избирательная таблица управления доступом (DACL); •системная таблица управления доступом (SACL). В дескрипторе безопасности владелец файла и группа файла относятся к идентификаторам безопасности (SID). Основная причина применения SID заключается в разграничении учетных записей в разных доменах, которые совместно используют одно и то же имя учетной записи. Даже если имена одинаковы, они представляют разные учетные записи, и им могут назначаться разные разрешения на доступ к одному и тому же файлу. | 69. Основы системы безопасности в Linux, идентификаторы пользователей, права доступа. В операционной системе UNIX используется достаточно простая модель доступа, основанная на субъект-субъектной модели. В современных версиях UNIX помимо общей схемы можно использовать списки доступа. При этом реализуется статическая авторизация множественного доступа к объекту. Пользователи и группы В UNIX роль номинального субъекта безопасности играет пользователь. Каждому пользователю выдается (обычно – одно) входное имя (login). Каждому входному имени соответствует единственное число, идентификатор пользователя (User IDentifier, UID). Это число и есть ярлык субъекта, которым система пользуется для определения прав доступа. Каждый пользователь входит в одну или более групп. Группа – это образование, которое имеет собственный идентификатор группы (Group IDentifier, GID), объединяет нескольких пользователей системы, а стало быть, соответствует понятию множественный субъект. Значит, GID – это ярлык множественного субъекта, каковых у действительного субъекта может быть более одного. Таким образом, одному UID соответствует список GID.Роль субъекта играет процесс. Каждый процесс снабжен единственным UID: это идентификатор запустившего процесс пользователя. Любой процесс, порожденный некоторым процессом, наследует его UID. Таким образом, все процессы, запускаемые по желанию пользователя, будут иметь его идентификатор. UID учитываются, например, когда один процесс посылает другому сигнал. В общем случае разрешается посылать сигналы «своим» процессам (тем, что имеют такой же UID). Права доступа Роль объекта в UNIX играют многие реальные объекты, в частности представленные в файловой системе: файлы, каталоги, устройства, каналы и т. п.. Каждый файл снабжён UID – идентификатором пользователя-владельца. Вдобавок у файла есть единственный GID, определяющий группу, которой он принадлежит.На уровне файловой системы в UNIX определяется три вида доступа: чтение (read, r), запись (write, w) и использование (execution, x). Право на чтение из файла дает доступ к содержащейся в нем информации, а право записи – возможность ее изменять. При каждом файле имеется список того, что с ним может делать владелец (если совпадает UID процесса и файла), член группы владельцев (если совпадает GID) и кто угодно (если ничего не совпадает) (см. Рисунок 3.2, «Базовые права доступа в UNIX»). Такой список для каждого объекта системы занимает всего несколько байт. | 70.(1) Структуры файловых систем для пользователя, пути к файлам и их использование. Файловая система с точки зрения пользователя — это «пространство», в котором размещаются файлы, наличие файловой системы позволяет определить не только «как называется файл», но и «где он находится». файловая система имеет иерархическую структуру, в которой файл однозначно определяется полным путём к нему. Путь (англ. path) — набор символов, показывающий расположение файла в файловой системе, адрес каталога.В операционных системах UNIX разделительным знаком при записи пути является «/». В Windows — «\». В других операционных системах таким знаком может быть «:» или другой знак. Эти знаки служат для разделения названия каталогов, составляющих путь к файлу. Например, в следующей записи адресации /home/user_kolia/foo/bar.txt часть bar.txt — это имя файла, а /home/user_kolia/foo/ — путь к нему. Полный или абсолютный путь — это путь, который указывает на одно и то же место в файловой системе, вне зависимости от текущей рабочей директории или других обстоятельств. Полный путь всегда начинается с корневого каталога. Относительный путь представляет собой путь по отношению к текущему рабочему каталогу пользователя или активных приложений.Для эффективного поиска файлов UNIX-подобные операционные системы, как правило, имеют системную переменную $PATH в командной оболочке (например, sh), которая задает перенаправления к важнейшим исполняемым файлам. Узнать значение этой переменной можно с помощью команды echo $PATH или аналогичной. ФС подразделяются на использующие и на не использующие обозначения логических дисков. FAT, NTFS и HPFS используют логические диски, а ФС для Unix логических дисков не используют. Применение логических дисков заметно упрощает для пользователя обозначения файлов: можно указать нахождение файла на логическом диске, где этот файл находится. | 70.(2) Структуры файловых систем для пользователя, пути к файлам и их использование. В ФС с логическими дисками внешняя структура ФС описывается в виде дерева. В ОС, использующих логические диски принято обозначать их одной латинской буквой, за которой символ двоеточие. Последовательность каталогов от корневого узла к данному файлу называется путь (path). В FAT, NTFS и HPFS разделителем в такой последовательности каталогов служит символ \. Все файлы имеют атрибуты доступа. В системах FAT, HPFS и NTFS для обслуживания таких атрибутов служит команда ATTRIB. Аргументом команды может быть имя отдельного файла и задание совокупности файлов. В простейшей форме эта команды выводит атрибуты, обозначаемые символами S, H, R, A (System, Hidden, ReadOnly, Archive). В UNIX все файлы собраны в одно дерево, включает три разновидности объектов: обычные файлы, каталоги и специальные файлы. Специальные файлы соответствуют устройствам компьютера: реальным или виртуальным. Дерево внешней структуры ФС Unix имеет единственный корень, обозначаемый /. Этот корень является корневым каталогом, перечисляющим каталоги следующего уровня. Любой каталог, отличный от корневого, может содержать любое число обычных файлов и каталогов следующего уровня. В ФС Unix символом разделения в обозначении последовательности каталогов является прямая разделительная черта /. В Unix вместо атрибутов используются характеристики доступа для трех категорий пользователей: самого владельца (u), для членов его группы (g) и всех остальных, обозначаемых символом o (others). Для каждой категории можно задать три типа доступа: по чтению (r), по записи (w) и по выполнению (x). | 71.(1) Полные и относительные имена файлов. И́мя фа́йла — строка символов, однозначно определяющая файл в некотором пространстве имён файловой системы (ФС), обычно называемом каталогом, директорией или папкой. Имя файла является частью полного имени файла, также называемого полным или абсолютным путём к файлу. Полное имя может включать следующие компоненты: протокол или способ доступа (http, ftp, file и т. п.); имя или адрес компьютера, узла сети (wikipedia.org, 207.142.131.206, \\MYCOMPUTER, SYS: и т. п.); устройство хранения, диск (C:, /, SYSLIB и т. п.); путь к каталогу (/usr/bin, \TEMP, [USR.LIB.SRC] и т. п.); Имя файла обычно состоит из двух частей, разделенных точкой: Название и Расширение. Полное имя файла в Windows-системах состоит из буквы диска, после которого ставится двоеточие и обратная наклонная черта (обратный слеш) C:\Windows\System32\calc.exe. Полным, или абсолютным, называется имя файла, содержащее все директории до корня файловой системы. Относительные имена файлов не содержат полного пути и обычно привязываются к текущему каталогу. • В UNIX и UNIX-подобных системах полный путь состоит из слеша (/), обозначающего корневой каталог, после которого через слеши перечисляются подкаталоги, в конце пишется имя файла. Пример: •/usr/local/bin/gcc •Пути, начинающиеся не с косой черты, считаются относительными и отсчитываются относительно рабочего каталога. Пример: •../mc при нахождении в каталоге /etc/apache2 эквивалентно /etc/mc. •Особое значение у путей, которые начинаются с тильды (). Тильда обозначает домашнюю директорию текущего или указанного пользователя. Пример:/Desktop | 71.(2) Полные и относительные имена файлов. |