Читайте также: |
|
Операционная система -- это программа, которая управляет аппаратными и программными средствами компьютера, предназначенными для выполнения задач пользователя.
На первой стадии своего развития операционные системы (ОС) предназначались для выполнения базовых задач по управлению аппаратными средствами. Эти задачи касались в основном управления файлами, выполнения программ и приема команд от пользователя.
Взаимодействие пользователя с ОС осуществляется через пользовательский интерфейс. Этот интерфейс позволяет операционной системе принимать и интерпретировать инструкции, вводимые пользователем в компьютер. Пользовательский интерфейс ОС может быть как простым (командная строка), так и сложным (меню и пиктограммы).
ОС, кроме того, управляет прикладными программами (управление загрузкой и выполнением программ, а также приложений).
Управление файлами, управление программами и взаимодействие с пользователями – это стандартные функции, общие для всех ОС.
У ОС UNIX есть еще две особенности: она является многопользовательской и многозадачной.
Многозадачность означает, что систему можно "попросить" выполнить несколько задач одновременно.
Многопользовательский режим означает, что в системе могут быть одновременно зарегистрированы несколько пользователей, каждый из которых взаимодействует с нею через свой терминал.
1.1 История создания UNIX
В 1965 году фирма Bell Telephone Laboratories с компанией General Electric и проектом MAC Массачусетского технологического института, приступили к разработке новой операционной системы, получившей название Multics. Перед системой Multics были поставлены задачи:
- обеспечить одновременный доступ к ресурсам ЭВМ большого количества пользователей;
- обеспечить достаточную скорость вычислений и хранение данных;
- дать возможность пользователям в случае необходимости совместно использовать данные.
Многие разработчики, впоследствии принявшие участие в создании ранних редакций системы UNIX, участвовали в работе над системой Multics в фирме Bell Laboratories. В 1969 году Кен Томпсон, сотрудник фирмы Bell Laboratories концерна AT&T, разработал ОС UNIX, в которой использовались многие результаты проекта Multics. Система вобрала в себя также ряд новых разработок в области ОС. В принципе, ОС создавалась как операционная система для исследователей. С самого начала UNIX стала удобной для всех и эффективной многопользовательской и многозадачной ОС.
Несмотря на то, что эта ранняя версия системы UNIX уже была многообещающей, она не могла реализовать свой потенциал до тех пор, пока не получила применение в реальном проекте. Так, для того, чтобы обеспечить функционирование системы обработки текстов для патентного отдела фирмы Bell Laboratories, в 1971 году система UNIX была перенесена на ЭВМ PDP-11. Система отличалась небольшим объемом: 16 Кбайт для системы, 8 Кбайт для программ пользователей, обслуживала диск объемом 512 Кбайт и отводила под каждый файл
не более 64 Кбайт. После своего первого успеха Томпсон собрался было написать для новой системы транслятор с Фортрана, но вместо этого занялся языком Би (B), предшественником которого явился язык BCPL. Би был интерпретируемым языком со всеми недостатками, присущими подобным языкам, поэтому его переделали в новую разновидность, получившую название Си © и разрешающую генерировать машинный код, объявлять типы данных и определять структуру данных.
В 1973 году сама система UNIX была написана заново на Си, это был шаг, неслыханный для того времени, но имевший огромный резонанс среди сторонних пользователей. Количество машин фирмы Bell Laboratories, на которых была инсталлирована система, возросло до 25, в результате чего была создана группа по системному сопровождению UNIX внутри фирмы.
Постепенно UNIX выросла из персонального творения одного человека в стандартный программный продукт, распространяемый многими фирмами, включая Novell и IBM. Сначала эту ОС считали исследовательским продуктом, поэтому первые версии распространялись бесплатно по факультетам вычислительной техники многих известных университетов.
Позже Bell Labs начала выпускать официальные версии UNIX и продавать на нее лицензии. Одним из пользователей был факультет вычислительной техники Калифорнийского университета в Беркли. Его специалисты ввели в систему много новых особенностей, впоследствии ставших стандартом.
В 1975 году в Беркли была выпущена собственная версия UNIX, известная как Berkeley Software Distribution (BSD). Эта версия стала основным соперником версии AT&T Bell Labs. В конце 70-х годов BSD UNIX стала основой исследовательского проекта, выполняемого в Агентстве перспективных исследований и разработок (DARPA) Министерства обороны США. В 1983 году Калифорнийский университет выпускает мощную версию UNIX под названием BSD 4.2. Она включала в себя достаточно совершенную систему управления файлами и сетевые средства, основанные на использовании протоколов TCP/IP – тех, которые сейчас применяются в Internet.
Распространение разных версий UNIX привело к необходимости выработки стандарта на эту ОС. В середине 80-х годов было выработано два стандарта на основе версий AT&T и BSD.
Компания AT&T передала работу по UNIX новой организации, Unix System Laboratories, которая сосредоточила свои усилия на разработке стандартной системы, объединяющей основные версии UNIX. В 1991 году фирма Unix System Laboratories разработала System V версии 4, в которой были реализованы практически все возможности вариантов System V версии 3, BSD версии 4.3, SunOS и Xenix
На протяжении почти всего своего развития UNIX оставалась большой и требовательной по отношению к аппаратным средствам операционной системой, для эффективной работы которой необходимо было иметь рабочую станцию или мини ЭВМ. По мере наращивания мощностей персональных компьютеров, стали появляться сообщения о разработке версии UNIX для ПК. В частности Xenix и System V/386 для IBM-совместимых ПК и AUX – на ПК Macintosh. То, что UNIX устанавливается на компьютерах практически всех типов (рабочих станциях, мини ЭВМ и суперЭВМ), – лишнее свидетельство присущей ей мобильности, которая обеспечила возможность создания эффективной версии UNIX для ПК.
В начале 90-х годов появилась новая разновидность ОС UNIX под названием Linux. Система Linux предназначена специально для персональных компьютеров с элементной базой Intel. Начиналась ее разработка как проект Линуса Торвальда, студента факультета вычислительной техники Хельсинского университета. В 1991 году Линус Торвальд выпустил версию 0.11. Linux широко распространилась в Internet, и в последующие годы подверглась доработкам со стороны других программистов. На данный момент Linux является наиболее распространенной UNIX-системой для ПК.
Несмотря на то, что Linux развивается в свободной и открытой среде Internet, она соответствует официальным стандартам UNIX. Институт инженеров по электротехнике и радиоэлектронике США (IEEE) разработал независимый стандарт UNIX для Американского национального института стандартов (ANSI). Этот стандарт UNIX имеет название: Portable Operation System Interface for Computer Environments (POSIX, интерфейс переносимых операционных систем для вычислительных сред). Данный стандарт определяет порядок работы UNIX-подобной системы и описывает некоторые детали, например, системные вызовы и интерфейсы. POSIX – это универсальный стандарт, которому должны соответствовать все версии ОС UNIX. Большинство наиболее популярных версий UNIX уже совместимы с ними. Linux с самого начала разрабатывалась в соответствии с нормами POSIX.
Популярность и успех системы UNIX объясняются несколькими причинами:
- система написана на языке высокого уровня, благодаря чему ее легко читать, понимать, изменять и переносить на другие машины. По оценкам специалистов, первый вариант системы на Си имел на 20-40 % больший объем и работал медленнее по сравнению с вариантом на ассемблере, однако преимущества использования языка высокого уровня намного перевешивают недостатки;
- наличие довольно простого пользовательского интерфейса, в котором имеется возможность предоставлять все необходимые пользователю услуги;
- наличие элементарных средств, позволяющих создавать сложные программы из более простых;
- наличие иерархической файловой системы, легкой в сопровождении и эффективной в работе;
- обеспечение согласования форматов в файлах, работа с последовательным потоком байтов, благодаря чему облегчается чтение прикладных программ;
- наличие простого, последовательного интерфейса с периферийными устройствами;
- система является многопользовательской, многозадачной; каждый пользователь может одновременно выполнять несколько процессов;
- архитектура машины скрыта от пользователя, благодаря этому облегчен процесс написания программ, работающих на различных конфигурациях аппаратных средств;
- простота и последовательность вообще отличают систему UNIX и объясняют большинство из вышеприведенных доводов в ее пользу.
Хотя операционная система и большинство команд написаны на Си, система UNIX поддерживает ряд других языков, таких как Фортран, Бейсик, Паскаль, Ада, Кобол, Лисп и Пролог. Система UNIX может поддерживать любой язык программирования, для которого имеется компилятор или интерпретатор, и обеспечивать системный интерфейс, устанавливающий соответствие между пользовательскими запросами к операционной системе и набором запросов, принятых в UNIX.
1.2 Основные определения
Операционная система – это программа, которая управляет аппаратными и программными средствами компьютера, предназначенными для выполнения задач пользователя.
Процесс – это выполняющийся набор инструкций со всеми необходимыми входными данными и выводом результатов. Все действия ОС UNIX оформлены как процессы. Все процессы существуют независимо и могут запускать (или порождать) другие процессы. Так, в каждый конкретный момент может выполняться несколько процессов, некоторые из которых могут быть "потомками" по отношению к другим процессам.
Ядро является сердцем операционной системы. Ядро управляет процессами и руководит выполняемой работой. Оно также является своего рода мостом между аппаратурой и внешним миром. На ядре лежит ответственность за инструкции, посылаемые процессору системы, а также за все операции ввода-вывода. В операционной системе может существовать только одно ядро.
Интерпретатор команд (shell, оболочка) обеспечивает интерфейс пользователь-ядро при введении пользователем команд терминала (командный интерфейс). Shell интерпретирует также команды, вводимые из командного файла.
Файловая система – это раздел операционной системы, состоящий из файлов, каталогов и информации, необходимой для их поиска и доступа к ним. Файловую систему можно представить как структуру, на основе которой строятся каталоги и файлы. В каждой системе UNIX существует по крайней мере одна файловая система – на первичном жестком диске. Эта файловая система называется корневой и обозначается символом "/".
1.3 Структура системы
На Рис. 1 изображена архитектура верхнего уровня системы UNIX. Технические средства, показанные в центре диаграммы, взаимодействуют непосредственно с ядром, обеспечивая функционирование операционной системы. Тем самым операционная система взаимодействует с аппаратурой непосредственно, обеспечивая обслуживание программ и их независимость от деталей аппаратной конфигурации. (На рисунке понятие ядро объединяет само ядро, файловую систему и систему управления процессами.)
Поскольку программы не зависят от аппаратуры, их легко переносить из одной системы UNIX в другую, функционирующую на другом комплексе технических средств, если только в этих программах не подразумевается работа с конкретным оборудованием. Например, программы, рассчитанные на определенный размер машинного слова, гораздо труднее переводить на другие машины по сравнению с программами, не требующими подобных установлений.
Программы (cpp, comp, as, ld, vi, ed, grep, wc, date, a.out, who, sh, nroff) показаны на внешнем по отношению к ядру слое. Они взаимодействуют с ядром при помощи хорошо определенного набора обращений к операционной системе, так называемых стандартных библиотек. Обращения к операционной системе понуждают ядро к выполнению различных операций, которых требует вызывающая программа. Эти обращения обеспечивают обмен данными между ядром и программой. Хотя на рисунке приведена двухуровневая иерархия прикладных программ, пользователь может расширить иерархическую структуру на столько уровней, сколько необходимо. В самом деле, стиль программирования, принятый в системе UNIX, допускает разработку комбинации программ, выполняющих одну и ту же, общую задачу. Так, интегрированный компилятор языка Си использует препроцессор (cpp), непосредственно компилятор исхдных Си-программ, прошедших препроцессор (comp), компилятор ассемблерных вставок или модулей (as), и линкер объектных модулей (ld).
Многие прикладные подсистемы и программы, составляющие верхний уровень системы, такие как командный процессор shell, редакторы, SCCS (Sourse Code Control System – система обработки исходных текстов программ) и пакеты программ подготовки документации, постепенно становятся синонимом понятия «система UNIX». Однако все они пользуются услугами программ нижних уровней и, в конечном счете, ядра с помощью набора обращений к операционной системе. Набор обращений к операционной системе вместе с реализующими их внутренними алгоритмами составляют «тело» ядра. Короче говоря, ядро реализует функции, на которых основывается выполнение всех прикладных программ в системе UNIX, и им же определяются эти функции. Часто употребляются термины «система UNIX», «ядро» или «система», однако при этом имеется в виду ядро операционной системы UNIX.
1.4 Функции операционной системы
Среди функций ядра можно отметить:
· Управление выполнением процессов посредством их создания, завершения или приостановки и организации взаимодействия между ними.
· Планирование очередности предоставления выполняющимся процессам времени центрального процессора (диспетчеризация). Процессы работают с центральным процессором в режиме разделения времени: центральный процессор выполняет процесс, по завершении отсчитываемого ядром кванта времени процесс приостанавливается, и ядро активизирует выполнение другого процесса. Позднее ядро заново запускает приостановленный процесс.
· Выделение выполняемому процессу оперативной памяти. Ядро операционной системы дает процессам возможность совместно использовать участки адресного пространства на определенных условиях, защищая при этом адресное пространство, выделенное процессу, от вмешательства извне. Если системе требуется свободная память, ядро освобождает память, временно выгружая процесс на внешние запоминающие устройства, которые называют устройствами выгрузки. Если ядро выгружает процессы на устройства выгрузки целиком, такая реализация системы UNIX называется системой со свопингом (подкачкой); если же на устройство выгрузки выводятся страницы памяти, такая система называется системой с замещением страниц.
· Выделение внешней памяти с целью обеспечения эффективного хранения информации и выборка данных пользователя. Именно в процессе реализации этой функции создается файловая система. Ядро выделяет внешнюю память под пользовательские файлы, мобилизует неиспользуемую память, структурирует файловую систему в форме, доступной для понимания, и защищает пользовательские файлы от несанкционированного доступа.
· Управление доступом процессов к периферийным устройствам, таким как терминалы, ленточные устройства, дисководы и сетевое оборудование.
Выполнение ядром своих функций довольно очевидно. Например, оно узнает, что данный файл является обычным файлом или устройством, но скрывает это различие от пользовательских процессов. Также оно, форматируя информацию файла для внутреннего хранения, защищает внутренний формат от пользовательских процессов, возвращая им неотформатированный поток байтов. Наконец, ядро реализует ряд необходимых функций по обеспечению выполнения процессов пользовательского уровня, за исключением функций, которые могут быть реализованы на самом пользовательском уровне. Например, ядро выполняет действия, необходимые интерпретатору команд: оно позволяет процессору shell читать вводимые с терминала данные, динамически порождать процессы, синхронизировать выполнение процессов, открывать каналы и переадресовывать ввод-вывод. Пользователи могут разрабатывать свои версии командного процессора shell с тем, чтобы привести рабочую среду в соответствие со своими требованиями, не затрагивая других пользователей. Такие программы пользуются теми же услугами ядра, что и стандартный процессор shell.
1.5 Элементы конструкционных блоков
Концепц разработки системы UNIX заключалась в построении операционной системы из элементов, которые позволили бы пользователю создавать небольшие программные модули, выступающие в качестве конструкционных блоков при создании более сложных программ. В стандартной поставке UNIX-системы уже имеется набор элементарных программ, на основе которых можно создавать более усовершенствованные комплексы. Как правило, эти программы работают по принципу фильтров, т.е. принимают входной поток информации, обрабатывают его тем или иным образом, и выводят в выходной файл результат.
Другим конструкционным элементом, с которым часто сталкиваются пользователи при работе с командным процессором shell, является переназначение ввода-вывода. Говоря условно, процессы имеют доступ к трем файлам или потокам: они читают из файла стандартного ввода (stdin), записывают в файл стандартного вывода (stdout) и выводят сообщения об ошибках в стандартный файл ошибок (stderr). Процессы, запускаемые с терминала, обычно используют терминал вместо всех этих трех файлов, однако каждый из этих файлов-потоков независимо от других может быть «переназначен».
Пример
Команда ls выводит список всех файлов текущего каталога на устройство (в файл) стандартного вывода. Команда
ls > output
переназначает выводной поток со стандартного вывода в файл «output» в текущем каталоге.
Команда wc подсчитывает количество символов, слов и строк во входном потоке. Команда
wc < file1 > file2
подсчитывает количество символов, слов и строк в файле file1, а результат выводит в файл file2.
Еще одним конструкционным элементом является канал – механизм, обеспечивающий информационный обмен между процессами, выполнение которых связано с операциями чтения и записи. Процессы могут переназначать выводной поток со стандартного вывода на канал для чтения с него другими процессами, переназначившими на канал свой стандартный ввод. Данные, посылаемые в канал первыми процессами, являются входными для вторых процессов. Вторые процессы также могут переназначить свой выводной поток, и так далее, в зависимости от пожеланий программиста. И снова, процессам нет необходимости знать, какого типа файл используется в качестве файла стандартного вывода; их выполнение не зависит от того, будет ли файлом стандартного вывода обычный файл, канал или устройство. В процессе построения больших и сложных программ программисты часто используют каналы и переназначение ввода-вывода при сборке и соединении отдельных частей. И действительно, такой стиль программирования находит поддержку в системе, благодаря чему новые программы могут работать вместе с существующими программами.
Пример
Программа grep производит поиск контекста в наборе файлов (являющихся параметрами программы) по следующему образцу:
grep main a.c b.c c.c
где «main» – подстрока, поиск которой производится в файлах a.c, b.c и c.c. В файл стандартного вывода печатаются те строки, в которых содержится подстрока «main». Содержимое выводного файла может быть следующим:
a.c: main(argc,argv)
c.c: /* here is the main loop in the program */
c.c: main()
Команда
grep main a.c b.c c.c | wc –l
переназначит поток вывода команды grep на поток ввода команды wc –l. Тем самым будет произведен поиск строки «main» в трех файлах (a.c, b.c, c.c), а затем будет подсчитано количество строк выходного потока. Другими словами, такая команда позволяет подсчитать, сколько раз слово «main» употребляется в заданных файлах.
Использование каналов зачастую делает ненужным создание временных файлов.
1.6 Ядро
На Рис.2 представлена блок-схема ядра системы, отражающая состав модулей, из которых состоит ядро, и их взаимосвязи друг с другом. В частности, на ней слева изображена файловая подсистема, а справа подсистема управления процессами, две главные компоненты ядра. Эта схема дает логическое представление о ядре, хотя в действительности в структуре ядра имеются отклонения от модели, поскольку отдельные модули испытывают внутреннее воздействие со стороны других модулей.
Схема на Рис.2 имеет три уровня:
- уровень пользователя;
- уровень ядра;
- уровень аппаратуры.
Обращения к операционной системе и библиотеки составляют границу между пользовательскими программами и ядром, проведенную на Рис.1. Обращения к операционной системе выглядят так же, как обычные вызовы функций в программах на языке Си, и библиотеки устанавливают соответствие между этими вызовами функций и элементарными системными операциями. При этом программы на ассемблере могут обращаться к операционной системе непосредственно, без использования библиотеки системных вызовов. Программы часто обращаются к другим библиотекам, таким как библиотека стандартных подпрограмм ввода-вывода, достигая тем самым более полного использования системных услуг. Для этого во время компиляции библиотеки связываются с программами и частично включаются в программу пользователя.
На рисунке совокупность обращений к операционной системе разделена на те обращения, которые взаимодействуют с подсистемой управления файлами, и те, которые взаимодействуют с подсистемой управления процессами. Файловая подсистема управляет файлами, размещает записи файлов, управляет свободным пространством, доступом к файлам и поиском данных для пользователей.
Процессы взаимодействуют с подсистемой управления файлами, используя при этом совокупность специальных обращений к операционной системе, таких как open (для того, чтобы открыть файл на чтение или запись), close, read, write, stat (запросить атрибуты файла), chown (изменить запись с информацией о владельце файла) и chmod (изменить права доступа к файлу).
Подсистема управления файлами обращается к данным, которые хранятся в файле, используя буферный механизм, управляющий потоком данных между ядром и устройствами внешней памяти. Буферный механизм, взаимодействуя с драйверами устройств ввода-вывода блоками, инициирует передачу данных к ядру и обратно. Драйверы устройств являются такими модулями в составе ядра, которые управляют работой периферийных устройств. Устройства ввода-вывода блоками относятся к типу запоминающих устройств с произвольной выборкой; их драйверы построены таким образом, что все остальные компоненты системы воспринимают эти устройства как запоминающие устройства с произвольной выборкой. Например, драйвер запоминающего устройства на магнитной ленте позволяет ядру системы воспринимать это устройство как запоминающее устройство с произвольной выборкой. Подсистема управления файлами также непосредственно взаимодействует с драйверами устройств «неструктурированного» ввода-вывода, без вмешательства буферного механизма. К устройствам неструктурированного ввода-вывода, иногда именуемым устройствами посимвольного ввода-вывода (текстовыми), относятся устройства, отличные от устройств ввода-вывода блоками.
Подсистема управления процессами отвечает за синхронизацию процессов, взаимодействие процессов, распределение памяти и планирование выполнения процессов. Подсистема управления файлами и подсистема управления процессами взаимодействуют между собой, когда файл загружается в память на выполнение. Подсистема управления процессами читает в память исполняемые файлы перед тем, как их выполнить.
Примерами обращений к операционной системе, используемых при управлении процессами, могут служить fork (создание нового процесса), exec (наложение образа программы на выполняемый процесс), exit (завершение выполнения процесса), wait (синхронизация продолжения выполнения основного процесса с моментом выхода из порожденного процесса), brk (управление размером памяти, выделенной процессу) и signal (управление реакцией процесса на возникновение экстраординарных событий).
Модуль распределения памяти контролирует выделение памяти процессам. Если в какой-то момент система испытывает недостаток в физической памяти для запуска всех процессов, ядро пересылает процессы между основной и внешней памятью с тем, чтобы все процессы имели возможность выполняться. Программу подкачки иногда называют планировщиком, т.к. она «планирует» выделение памяти процессам и оказывает влияние на работу планировщика центрального процессора. Однако в дальнейшем мы будем стараться ссылаться на нее как на «программу подкачки», чтобы избежать путаницы с планировщиком центрального процессора.
Модуль «планировщик» распределяет между процессами время центрального процессора. Он планирует очередность выполнения процессов до тех пор, пока они добровольно не освободят центральный процессор, дождавшись выделения какого-либо ресурса, или до тех пор, пока ядро системы не выгрузит их после того, как их время выполнения превысит заранее определенный квант времени. Планировщик выбирает на выполнение готовый к запуску процесс с наивысшим приоритетом; выполнение предыдущего процесса (приостановленного) будет продолжено тогда, когда его приоритет будет наивысшим среди приоритетов всех готовых к запуску процессов. Существует несколько форм взаимодействия процессов между собой, от асинхронного обмена сигналами о событиях до синхронного обмена сообщениями.
Наконец, аппаратный контроль отвечает за обработку прерываний и за связь с машиной. Такие устройства, как диски и терминалы, могут прерывать работу центрального процессора во время выполнения процесса. При этом ядро системы после обработки прерывания может возобновить выполнение прерванного процесса. Прерывания обрабатываются не самими процессами, а специальными функциями ядра системы, перечисленными в контексте выполняемого процесса.
1.7 Структура данных ядра
Большинство информационных структур ядра (таблица процессов, таблица файлов, таблица индексов и т.п.) размещается в таблицах фиксированного размера, а не в динамически выделенной памяти. Преимущество такого подхода состоит в том, что программа ядра проста, но в ней ограничивается число элементов информационной структуры до значения, предварительно заданного при генерации системы. Если во время функционирования системы число элементов информационной структуры ядра выйдет за указанное значение, ядро не сможет динамически выделить место для новых элементов и должно сообщить об ошибке пользователю, сделавшему запрос. Если, с другой стороны, ядро сгенерировано таким образом, что выход за границы табличного пространства будет маловероятен, дополнительное табличное пространство может не понадобиться, поскольку оно не может быть использовано для других целей. Как бы то ни было, простота алгоритмов ядра представляется более важной, чем сжатие последних байтов оперативной памяти. Обычно в алгоритмах для поиска свободных мест в таблицах используются несложные циклы и этот метод более понятен и иногда более эффективен по сравнению с более сложными схемами выделения памяти.
1.8 Управление системой
К управляющим процессам, грубо говоря, относятся те процессы, которые выполняют различные функции по обеспечению благополучной работы пользователей системы. К таким функциям относятся форматирование дисков, создание новых файловых систем, восстановление разрушенных файловых систем, отладка ядра и др. С концептуальной точки зрения, между управляющими и пользовательскими процессами нет разницы. Они используют один и тот же набор обращений к операционной системе, доступный для всех. Управляющие процессы отличаются от обычных пользовательских процессов только правами и привилегиями, которыми они обладают. Например, режимы разрешения доступа к файлу могут предусматривать предоставление возможности работы с файлами для управляющих процессов и отсутствие такой возможности для обычных пользователей. Внутри системы ядро выделяет особого пользователя, именуемого суперпользователем, и наделяет его особыми привилегиями. Если сказать коротко, ядро системы не выделяет управляющие процессы в отдельный класс.
Дата добавления: 2014-12-19; просмотров: 136 | Поможем написать вашу работу | Нарушение авторских прав |