Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 80
Текст из файла (страница 80)
В обеихрассматриваемых операционных системах существуют разные методы работы сфайловой системой и управления процессами. В данном случае рассматриваетсятолько один, но наиболее характерный для соответствующего интерфейса API вариант.Для того чтобы было удобнее сравнивать эту (листинг 9.1) и следующую (листинг 9.2) программы, а также учитывая, что задача не требует для своего решенияоконного интерфейса, в тексте использованы только те вызовы API, которые незатрагивают графический интерфейс. Конечно, нынче редко какое приложение неиспользует возможностей GUI, но зато в нашем случае сразу можно увидеть разницу в организации параллельной работы запускаемых вычислений.Листинг 9 . 1 .
Текст программы для Windows (WinAPI)finclude <windows.h>#include <stdio.h>finclude <stdlib.h>// Название: processFile// Описание: исполняемый код потока// Входные параметры: IpFlleName - имя файла для обработки// Выходные параметры: нетDWORD processFile(LPVOID IpFileName ) {HANDLE handle; // описатель файлаDWORD numRead. total = 0:char buf;// запрос к ОС на открытие файла (только для чтения)handle = CreateFile( (LPCTSTR)IpFileName. GENERIC_READ.FILE_SHARE_READ, NULL.
OPENJXISTING, FILE_ATTRIBUTE_NORMAL. NULL);// цикл чтения до конца файлаdo {продолжение£Глава 9 , Архитектура операционных систем308Листинг 9.1 (продолжение)II чтение одного символа из файлаReadFilet handle, (LPVOID) &buf. 1, SnumRead. NULL);if (buf == 0x20) total++:} while ( numRead > 0);f p r i n t f ( stderr, "(ThreadID: *Lu), File %s. spaces = %6\n\GetCurrentThreadldO.
lpFileName. t o t a l ) :// закрытие файлаCloseHandle( handle);return(O);// Название: main// Описание: главная программа// Входные параметры: список имен файлов для обработки// Выходные параметры: нетint maindnt argc. char *argv[]) {int i;DWORD pid;HANDLE hThrd[255];// массив ссылок на потоки// для всех файлов, перечисленных в командной строкеfor (i = 0: i< (argc-1): i++) {// запуск потока - обработка одного файлаhThrd[i] = CreateThread( NULL, 0x4000,(LPTHREAD_START_ROUTINE) processFile,(LPVOID) argv[i+l].
0, &pid);fprintf( stdout, "processFile started (HND=Xd)\n", hThrd[i]);// ожидание окончания выполнения всех запущенных потоковWaitForMultipleObjects( argc-1. hThrd, true. INFINITE);return(O);}Обратите внимание, что основная программа запускает потоки и ждет окончанияих выполнения.
Другими словами, мы имеем всего один вычислительный процесс,но используем мультизадачные возможности операционной системы.Листинг 9.2. Текст программы для Linux (POSIX API)#include <sys/types.h>finclude <sys/stat.h>#include <wait.h>#include <fcntl.h>finclude <stdio.h>// Название: processFile// Описание: обработка файла, подсчет кол-ва пробелов// Входные параметры: fileName - имя файла для обработки// Выходные параметры: кол-во пробелов в файлеi n t processFile( char *fileName) {int handle.
numRead, total = 0;Примеры программирования для разных интерфейсов API309char buf;// запрос к ОС на открытие файла (только для чтения)handle = open( fileName. 0_RDONLY):// цикл чтения до конца файлаdo {// чтение одного символа из файлаnumRead = read( handle. Sbuf. 1):if (buf == 0x20) total++;} while (numRead > 0);// закрытие файлаclose( handle);return( total);// Название: main// Описание: главная программа// Входные параметры: список имен файлов для обработки// Выходные параметры: нетint maindnt argc, char *argv[]) {int i.
pid, status;// для всех файлов, перечисленных в командной строкеfor (i = 1; i< argc; i++) {// запускаем дочерний процессpid = forkO;if (pid == 0) {// если выполняется дочерний процесс// вызов функции счета количества пробелов в файлеprintf( "(PID: %6). File %s.
spaces - Sd\n".getpidO. argv[ i]. processFile( argv[ i]));// выход из процессаexitO;}// если выполняется родительский процессelseprintf( "processFile started (pid=£d)\n", pid);}/Л ожидание окончания выполнения всех запущенных процессовif (pid != 0) while (wait(&status)>0);return;}Из листинга 9.2 видно, что здесь все вычисления имеют статус процессов, а не потоков выполнения.
Надо заметить, что многие современные версии UNIX поддерживают механизм потоков, поскольку потоки в ряде случаев позволяют повыситьэффективность вычислений и упрощают их создание, но в рассматриваемом интерфейсе потоков нет.о заключение можно заметить, что очень трудно сравнивать интерфейсы API. Прих разработке создатели, как правило, стараются реализовать функционально полный набор основных функций, используя которые можно решать разные задачи,"Равда, порой, различными способами.
Один набор системных функций хорош дляи310Глава 9. Архитектура операционных системодного набора задач, другой — для иного набора задач. Тем более что, фактически,сейчас мы имеем существенно ограниченное множество интерфейсов API из-затого, что имеет место доминирование наиболее популярных операционных систем и на их распространении в большей степени сказалась правильная маркетинговая политика их создателей, а не достоинства и недостатки самих этих систем иих интерфейсов.Контрольные вопросы и задачи1. Что вы понимаете под архитектурой операционной системы?2.
Перечислите и поясните основные принципы построения операционных систем.3. Для чего операционные системы используют несколько режимов работы процессора? Чем отличается супервизорный режим работы процессора от пользовательского? Как часто процессор переводится в супервизорный режим?4. Объясните принцип виртуализации. Имеется ли связь между принципом виртуализации и принципом совместимости? Если имеется, то поясните, в чемона заключается?5.
Что такое ядро операционной системы? Расскажите об основных моментах,характерных для микроядерных ОС. Какие основные функции должно выполнять микроядро ОС?6. Перечислите основные требования, предъявляемые к операционным системам в плане обеспечения информационной безопасности.7. Перечислите основные требования, предъявляемые к операционным системам реального времени.8. Какие задачи возлагаются на интерфейс прикладного программирования (API)?9. Какими могут быть варианты реализации API? В чем заключаются достоинства и недостатки каждого варианта?10. Что такое библиотека времени выполнения (RTL)?11.
Что такое POSIX? Какими преимуществами обладают программы, созданныес использованием только стандартных функций, предусмотренных POSIX?Глава 10. Краткий обзорсовременныхоперационных системТеперь, после знакомства с основными понятиями, относящимися к операционным системам, и изучения конкретных механизмов, реализующих известные методы организации вычислительных процессов, вкратце рассмотрим архитектурныеособенности современных операционных систем для персональных компьютеровтипа IBM PC.Прежде всего, отметим тот общеизвестный факт, что наиболее популярнымиявляются операционные системы семейства Windows компании Microsoft.
Этои Windows 95/98/МЕ, и Windows NT/2000, и новое поколение Windows XP/2003 — этим операционным системам посвящена отдельная глава (см. главу 11).Здесь же мы рассмотрим операционные системы, не относящиеся к продуктамMicrosoft, — это UNIX-подобные операционные системы Linux и FreeBSD, aтакже системы QNX и OS/2. При изучении известных всему миру систем с общим названием Linux и системы FreeBSD, по которым сейчас появляется немало монографий и учебников, упор будет сделан именно на основных архитектурных особенностях семейства UNIX, в абсолютном своем большинствеотносящихся ко всем UNIX-системам.
Система QNX была выбрана потому, чтоявляется наиболее известной и удачной операционной системой реального времени. Операционную систему OS/2 мы рассмотрим последней. Хотя сейчас этасистема уже практически всеми забыта1, она была одной из первых полноценных и надежных мультипрограммных и мультизадачных операционных системДля персональных компьютеров, в которой поддерживалось несколько операционных сред.о настоящее время ее используют те организации, которые в свое время создали под нее свои приложения, вложив немалые средства. И поскольку система по-прежнему в основном неплохо выполняет свои функции, эти организации не спешат вкладывать деньги для переноса своих задач на новыеплатформы.31 2Глава 10.
Краткий обзор современных операционных системСемейство операционных систем UNIXUNIX является исключительно удачным примером реализации простой мультипрограммной и многопользовательской операционной системы. В свое время онапроектировалась как инструментальная система для разработки программногообеспечения. Своей уникальностью система UNIX обязана во многом тому обстоятельству, что была, по сути, создана всего двумя разработчиками1, которые делали ее исключительно для себя и первое время использовали на мини-ЭВМ с оченьскромными вычислительными ресурсами. Первая версия этой системы занималавсего около 12 Кбайт и могла работать на компьютерах с очень небольшим объемом оперативной памяти.
Поскольку при создании второй версии UNIX разработчики отказались от языка ассемблера и специально придумали язык высокогоуровня, на котором можно было бы писать не только системные, но и прикладныепрограммы (речь идет о языке С), то и сама система UNIX, и приложения, выполняющиеся в ней, стали легко переносимыми (мобильными). Компилятор с языкаС для всех оттранслированных программ дает реентерабельный и разделяемыйкод, что позволяет эффективно использовать имеющиеся в системе ресурсы.Общая характеристикаи особенности архитектурыПервой целью при разработке этой системы было стремление сохранить простотуи обойтись минимальным количеством функций.