|
1. Понятие операционной системы (ОС), ее отношение к аппаратному и программному обеспечению
1. Понятие операционной системы (ОС), ее отношение к аппаратному и программному обеспечению
Операционной системой (ОС) называют комплекс программ, обеспечивающих взаимодействие прикладных программ и пользователей с аппаратурой компьютера. Т.е. операционная система – это промежуточное звено между аппаратной частью компьютера и частью прикладных программ. Наличие операционных систем избавляют разработчиков и пользователей заниматься управлением аппаратной частью и множеством управляющих кодов.
2. Состав и основные функции ОС
Основные фукнции:
1) обслуживание информации, хранимой в компьютере;
2) программное управление устройствами компьютера;
3) обеспечение простого диалога компонентов ОС с пользователем или прикладной программой;
4) обеспечение эффективного использования системы путем задействования общих ресурсов или одновременного выполнения нескольких прикладных программ.
Состав:
3. Классификация ОС По кол-ву пользователей
| По кол-ву задач
| По кол-ву процессоров
| По назначению
| однопользовательские
многопользовательские
| многозадачные
однозадачные
| однопроцессорные
много процессорные
| специализированные
универсальные
|
До недавнего времени ОС по типу используемого в них интерфейса с пользователем разделяли на текстовые и графические. К настоящему времени все современные ОС включают графический интерфейс либо как основной (в системах фирмы Microsoft), либо как дополнительную интерфейсную оболочку (в системах Unix).
4. Понятие дескрипторов и хэндлов
FileControlBlock (FCB) – это учётная информация для управления операционной системой, аналогия человеческого паспорта. Управляющие блоки размещаются в служебной области операционной системы, причем, как правило, в виде таблицы, и для доступа к ним используется номер строк такой таблицы. Этот номер строк таблицы управляющих блоков и называют handle.
Иным наименованием для хэндла, использовавшимся как раз в Unix, служит слово дескриптор.
Управляющий блок содержит учётную информацию, описывающую файл и необходимую для выполнения файловых операций. Для операций над файлом при обращении к системной функции в качестве одного из параметров вызова используется значение такого хэндла. По этому значению подпрограмма ОС обращается к соответствующей строке таблицы управляющих блоков и использует информацию из управляющего блока, отвечающего этой строке.
5. Ввод и вывод в стандартные файлы
В Unix для этих целей предназначены универсальные системные функции с прототипами
unsigned int read(int handle, void* buffer, unsigned int len)
unsigned int write(int handle, void* buffer, unsigned int len)
handle – хэндл файла,
buffer - адрес буфера для чтения или записи данных
len – запрашиваемое для чтения или задаваемое для записи число байтов.
Функции возвращают число байтов, которые им удалось передать при вводе или выводе. Это число может не совпадать с запрошенным, если ввод осуществляется с клавиатуры и завершается символом Enter.
В операционных системах клонов Windows использование стандартных файлов для программиста усложняется за счёт того что в данной системе нет фиксированных значений хэндлов. Их необходимо запрашивать следующей функцией:
HANDLE GetStdHandle(DWORD nStdHandle)
После значения хэндлов можно использовать в следующих функциях:
BOOL WINAPI ReadFile(HANDLE hFile, void* buffer, DWORD len, DWORD *pactualen, OVERLAPPED *pOverlapped);
BOOL WINAPI WriteFile(HANDLE hFile, void* buffer, DWORD len, DWORD *pactualen, OVERLAPPED *pOverlapped),
Ряд функций вывода языка Си используют так называемый буферизованный вывод. К этим функциям относятся все те программные функции, которые используют для обозначения файлов указатели типа FILE*. (printf() и fprintf()). Для их использования нужно явно очищать внутренний буфер следующей функцией:
fflush(stdout)
6. Базовые средства использования файловой системы Для выполнения операций над файлом, файл необходимо открыть.
Windows.
Для получения хэндла открываемого файла в них используется функция CreateFile, которая предназначена и для собственно создания и, в частности, для открытия уже существующего файла:
HANDLE CreateFile(LPCSTR pFileName, DWORD DesiredAccess, DWORD ShareMode, LPSECURITY_ATTRIBUTES pSecurityAttributes, DWORD CreationDisposition, DWORD FlagsAndAttributes, HANDLE hTemplateFile)
Для закрытия файла используется функция CloseHandle, назначение которой значительно шире, чем просто функций закрытия файла в других ОС. Функция эта имеет прототип
BOOL CloseHandle(HANDLE hObject)
Unix для открытия файла служит функция с прототипом
int open(char* filename, int access_mode, mode_t permission)
Для закрытия файла в Unix служит функция с прототипом
int close(int handle)
Для получения хэндла для уже открытого файла служит функция
int dup(int hsource)
7. Переназначение стандартных устройств
Вместо стандартных устройств ввода-вывода используетсятся файл.
Командная строка:
primer.exe (<стандартный ввод из файла,
>стандартный вывод в файл) имя файла
Запустить с переадресацией стандартного вывода:
primer.exe <файл_откуда_переносить_данные
>файл_куда_переносить_данные
8. Особенности работы с файлами в многопрограммной системе
Windows
HANDLE CreateFile(LPCSTR pFileName, DWORD DesiredAccess, DWORD ShareMode, LPSECURITY_ATTRIBUTES pSecurityAttributes, DWORD CreationDisposition, DWORD FlagsAndAttributes, HANDLE hTemplateFile)
pFileName – имя файла
DesiredAccess – код доступа. Принимает значения GENERIC_ READ и GENERIC_WRITE. Могут быть использованы совместно.
ShareMode – совместный доступ. Принимает значения FILE_SHARE_READ, FILE_SHARE_ WRITE. Могут быть использованы совместно.
SecurityAttributes – атрибуты безопасности. Обычно необходимо чтобы было знчение NULL.
CreationDisposition – диспозиция. Принмает значения CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, OPEN_ALWAYS. Нельзя использовать совместно.
Unix
int open(char* filename, int access_mode, mode_t permission)
Функция возвращает в случае удачного выполнения хэндл открытого файла.
filename - имя открываемого файла.
access_mode - режим доступа к файлу. Принимает значения O_RDONLY, O_WRONLY, O_RDWR с модификаторами: O_APPEND, O_CREAT, O_EXCL, O_TRUNC.
permission - необходим, когда в access_mode установлено O_CREAT (файл создается). Обычно 0777.
9. Многопользовательская блокировка файлов
Unix
int fcntl(int handle, int cmd, struct flock *ldata)
Средства Unix позволяют управлять совместным доступом не только ко всему файлу, но и к отдельным его участкам его. В частности, разрешить другим процессам только читать отдельные участки файла, а другим, может быть, разрешить изменять их. За это отвечают атрибуты cmd и указатель на ldata.
struct flock{
short l_type; // тип блокировки
short l_whence; // код базовой позиции для отсчёта смещения
off_t l_start; // смещение относительно базовой позиции
off_t l_len; // сколько байтов в заблокированной области
pid_t l_pid; // PID процесс, который заблокировал файл
};
Windows
BOOL LockFile(HANDLE hFile, DWORD FileOffsetLow, DWORD FileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh)
Атрибуты в данном файле последовательно означают следующее: хэндл блокируемого файла, начальное значение смещение, конечное значение смещения, начальное значение в смещении и конечное значение в смещении.
Удалось или нет заблокировать запрошенный участок, программа определяет по возвращаемому функцией LockFile логическому значению. Данная функция при удачном выполнении блокирует доступ к указанному в ней участку для всех других процессов.
BOOL UnlockFile(HANDLE hFile, DWORD FileOffsetLow, DWORD FileOffsetHigh, DWORD cbUnlockLow, DWORD cbUnlockHigh)
10. Функции управления курсором. Классические языки высокого уровня не содержат средств управления позицией вывода на экране и цветом символов текста. Такая ситуация в значительной степени предопределена тем, что когда создавались эти языки, подобные средства были недоступны по аппаратным причинам.
Windows
BOOL SetConsoleCursorPosition(HANDLE hConsOut, COORD pos)
В pos записывается структура COORD с амперсандом.
В операционной системе Unix для управления курсором и некоторых других действий с экраном предназначены управляющие последовательности.
"\033[строка;столбецH"
11. Многократный вывод символов и атрибутов.
Для многократного вывода одного символа в Windows предназначена функция FillConsoleOutputCharacter, а для многократного вывода одного и того же атрибута – функция FillConsoleOutputAttribute. Эти функции имеют прототипы
BOOL FillConsoleOutputCharacter(HANDLE hConsOut, CHAR character, WORD len, COORD pos, DWORD* actlen)
BOOL FillConsoleOutputAttribute(HANDLE hConsOut, WORD attr, DWORD len, COORD pos, DWORD* actlen)
BOOL SetConsoleTextAttribute(HANDLE houtput, WORD attrib)
Последняя функция устанавливает цвет, автоматически используемый далее при выводе на экран функцией WriteFile, а также используемый при отображении символов в процессе ввода функцией ReadFile.
В операционной системе Unix отсутствуют системные функции многократного вывода символов и атрибутов. Проблема использования цвета в Unix была решена с помощью управляющих последовательностей.
"\033[цветm"
12. Вывод в произвольную позицию экрана
В Windows для вывода строки текста в произвольную позицию экрана служит функция
BOOL WriteConsoleOutputCharacter(HANDLE hConsOut, CSTR* text, DWORD len, COORD pos, DWORD* actlen)
Парное сочетание функций FillConsoleOutputAttribute и WriteConsoleOutputCharacter характерно для консольных приложений Windows, в которых требуется выполнять вывод с новым цветом в непоследовательных позициях экрана.
Рассмотренной функции вывода символов вместе с их атрибутами соответствует функция:
BOOL WriteConsoleOutput(HANDLE hConsOut, CHAR_INFO* cells, COORD dwBufferSize, COORD dwBufferCoord, SMALL_RECT* rect)
В Unix для вывода строки текста с различными атрибутами следует использовать управляющие последовательности между отдельными выводимыми символами:
"\033[1;31;44mП\033[0;32;40mр\033[1;36;40mи\033[33;44mв\033[31;42mе\033[34;43mт\n"
13. Событийное программирование и его использование в функциях ввода.
В настоящее время поведение программных систем зависит не столько от действия последовательности действий алгоритма а от воздействий на системы. Такими воздействиями являются нажатия клавиш клавиатуры, перемещение мыши и нажатие ее кнопок, а также более сложные действия, реализуемые обычно также с помощью мыши. Момент когда алгоритм прерывается и выполняется какая-то часть программы назвается механизмом прерываний. Разработка программ обработчиков прерываний очень не простая задача и поэтому ее выполняют разработчики операционных систем. Остальным предоставляется неявно пользоваться этим механизмом.
Для текстовой консоли Windows, по замыслу разработчиков, теоретически возможны сообщения от нажатия клавиши клавиатуры, от мыши, сообщения об изменении размера окна, о переходе активности к текущему окну или о потере такой активности.
В Windows программа для текстового окна может запросить сообщение путем вызова системной функции ReadConsoleInput.
BOOL ReadConsoleInput(HANDLE hConsInput, INPUT_RECORD* buffer, DWORD len, DWORD* actlen)
Для использования какого либо события необходимо пользоваться следующими константами:
KEY_EVENT, MOUSE_EVENT, WINDOW_BUFFER_SIZE_EVENT, MENU_EVENT, FOCUS_EVENT.
14. Средства чтения содержимого экрана в Windows.
BOOL ReadConsoleOutputCharacter(HANDLE hConsOut, STR* buffer, DWORD len, COORD dwReadCoord, DWORD *len)
BOOL ReadConsoleOutput(HANDLE hConsOut, CHAR_INFO* cells, COORD dwBufferSize, COORD dwBufferCoord, SMALL_RECT* rect)
BOOL ReadConsoleOutputAttribute(HANDLE hConsOut, WORD* attribs, DWORD len, COORD pos, DWORD* actlen)
ReadConsoleOutputCharacter – функция выполняет чтение символа на экране и переносит в массив buffer.
ReadConsoleOutput – функция чтения символов с их атрибутами на экране. При этом функция читает информацию из прямоугольник rect и переносит её в двумерный массив cells. Также dwBufferCoord – позиция того элемента массива с котрого используется массив а dwBufferSize – размер массива
ReadConsoleOutputAttribute – функция выполняет чтение только аттрибутов и переносит в массив слов attribs.
Число читаемых при этом символов или атрибутов задаётся параметром len, чтение выполняется с позиции экрана задаваемой идентификатором pos, а действительное число прочитанных символов или аттрибутов возвращается с помощью параметра actlen.
15. Средства чтения содержимого экрана в Unix. В операционной системе Unix отсутствуют стандартные средства чтения символов с экрана. Это объясняется тем, что основные принципы работы с Unix формировались еще в то время, когда основным средством вывода информации для отдельного пользователя интерактивной ОС были телетайпы, осуществляющие вывод на бумажную ленту, считывать информацию с которой было невозможно по техническим причинам.
Одним из устройств, которое позволяет считывать информацию, является "виртуальный экран консоли", обозначаемый в файловой системе Unix как vcs (сокращение от virtual console screen). Заметим, что специальные файлы устройств стандартным образом размещаются в каталоге /dev, поэтому полное наименование устройства виртуального экрана консоли следует задавать в виде /dev/vcs.
int hscreen;
hscreen = open("/dev/vcs", O_RDONLY, 0600);
Далее можно производить чтение с экрана с помощью функции:
read(hscreen, &buffer, 100)
buffer - массив, в котрый считываются символы
Последний атрибут – сколько байт нужно прочитать
16. Перенастройка консоли Unix для немедленного ввода нажатий отдельных клавиш
Для доступа с клавиатуры нужно открыть специальное виртуальное устройство dev/tty.
hcons = open(“/dev/tty”, O_RDONLY)
По причине того что вводимые символы поступают только после нажатия клавиши Enter необходимо отменить стандартный режим работы консоли.
int tcgetattr(int htty, struct termios *tsave)
int tcsetattr(int htty, int action, srtuct termios *tnew) – установить новые режимы
struct termios sterm, term;
int htty;
htty = open(“/dev/tty”, O_RDONLY);
tcgetattr(htty, &sterm);
tcgetattr(htty, &term);
term.c_lfkag &= (ICANON|ECHO);
term.c_cc[VMIN]=1;
term.c_cc[VTIME]=0;
tcsetattr(htty, TCSAFLUSH, &sterm);
17. Программные средства использования мыши в текстовом режиме Windows
В операционной системе Windows информация от мыши получается в результате универсального запроса событий для текстовой консоли посредством вызова функции ReadConsoleInput. При получении указанной функцией сообщения от мыши, поле EventType этого сообщения оказывается равным константе MOUSE_EVENT, а комбинированный компонент Event является записью типа MOUSE_EVENT_RECORD, который определяется в заголовочном файле описанием
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition;
DWORD dwButtonState;
DWORD dwControlKeyState;
DWORD dwEventFlags;
} MOUSE_EVENT_RECORD, *PMOUSE_EVENT_RECORD;
Компонент dwMousePosition этой структуры дает текущую позицию мыши. Поле dwButtonState выдает код нажатия клавиш мыши и может быть произвольной комбинацией следующих битовых значений:
#define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001
#define RIGHTMOST_BUTTON_PRESSED 0x0002
#define FROM_LEFT_2ND_BUTTON_PRESSED 0x0004
#define FROM_LEFT_3RD_BUTTON_PRESSED 0x0008
#define FROM_LEFT_4TH_BUTTON_PRESSED 0x0010
Поле dwEventFlags позволяет определить двойное нажатие мыши и двигалась ли мышь в момент формирования сообщения.
#define MOUSE_MOVED 0x0001
#define DOUBLE_CLICK 0x0002
Поле dwControlKeyState совпадает по названию и назначению с соответствующим полем в записи события от клавиатуры и содержит комбинацию битов, отражающих текущее состояние отдельных управляющих клавиш.
18. Программные средства использования мыши в текстовом режиме Linux Для использования мыши в Linux служит программная подсистема gpm. Построена она по технологии клиент-сервер. Основой подсистемы служит сервер мыши.
Перед началом использования мыши процесс должен зарегистрироваться у сервера и передать ему информацию, какие сообщения от мыши интересуют этот процесс. Получаемые сообщения от мыши процесс-клиент может обрабатывать как полностью сам, так и передавать другой процедуре обработчика сообщений от мыши.
Для регистрации у сервера программа процесса должна заполнить структуру Gpm_Connect и выполнить вызов функции Gpm_Open с этой структурой в качестве аргумента. Функция Gpm_Open имеет прототип
int Gpm_Open (Gpm_Connect *CONN, int flag)
После удачной регистрации программа клиента может запрашивать и получать сообщения от мыши, для этого служит функция Gpm_GetEvent с прототипом
int Gpm_GetEvent (Gpm_Event *EVENT)
typedef struct Gpm_Event {
unsigned char buttons, modifiers;
unsigned short vc;
short dx, dy, x, y;
enum Gpm_Etype type;
int clicks;
enum Gpm_Margin margin;
} Gpm_Event;
Поля x, y этой структуры дают координаты позиции курсора мыши на момент формирования сообщения. Поле buttons выдает код нажатия клавиш и является логической комбинацией следующих констант:
#define GPM_B_LEFT 4 // Левая клавиша мыши
#define GPM_B_MIDDLE 2 // Средняя клавиша мыши
#define GPM_B_RIGHT 1 // Правая клавиша мыши
После завершения использования мыши клиентом следует вызвать функцию Gpm_Close(), которая разрывает связь клиента с сервером. Функция эта не имеет аргументов. Заголовочным файлом для программ с использованием подсистемы gpm служит файл gpm.h.
Другим, более компактным вариантом, является использование вспомогательной опции задания дополнительной библиотеки.
gcc -o prim1.exe prim1.c –lgpm
19. Понятие процесса; параллельные и последовательные процессы Следует отметить существенное отличие процесса от программы и даже от выполнения программы. Процесс разворачивается во времени, это динамический объект, программа – это статический, неизменяемый объект. Замечательной особенностью современных операционных систем является их способность обеспечивать одновременное выполнение нескольких программ.
Реентерабельной называют программу, которая обеспечивает правильное функционирование множества одновременных процессов, функционирующих на ее основе.
Процессы называются одновременно выполняющимися или параллельными, если каждый из них начат, но не завершен. Процессор компьютера может быстро переключаться с одного процесса на другой, запоминая при этом переключении всю необходимую информацию, чтобы в дальнейшем продолжить выполнение процесса с места его приостановки.
После порождения некоторым процессом другого процесса, первый из них становится родительским (parent), а порожденный – дочерним (child). Данная иерархия используется для организации совместных работ многими процессами. При этом в простейшем случае процесс, становящийся родителем, порождает процесс для выполнения некоторых вычислительных работ, а сам при этом приостанавливается. Его дочерний процесс выполняет запланированную работу и завершает свои действия специальным обращением к операционной системе, информирующей последнюю об успешном или неуспешном завершении. В ответ на это обращение операционная система переводит приостановившийся родительский процесс опять в функционирующее состояние. При таком порядке выполнения родительского и дочернего процессов их называют последовательными процессами.
20. Состояния процесса, диспетчеризация процессов Для технической организации переключения процессов очень важное значение имеет характеристика, которую называют состоянием процесса. Эта характеристика записывается как одно из важнейших полей в управляющий блок процесса или управляющий блок нити, в зависимости от того, используются нити в операционной системе или нет. Абстрактный процесс (нить) обязательно использует как минимум три различных состояния. Эти состояния называют состоянием готовности (ready), состоянием выполнения (run) и состоянием блокировки или заблокированности (blocked).
Диаграмма состояний абстрактного процесса
Функционирование операционной системы, когда она обеспечивает выполнение параллельных процессов на основе использования квантов времени, называют режимом разделения времени.
Заметим, что, так как абстрактных процессов, находящихся в состоянии готовности, как правило, более одного, то все они организуются в одну или более очередей, описываемых как связные списки. Поле связи для такого списка также входит в состав управляющего блока абстрактного процесса. Действия операционной системы по установке на процессор и снятии с процессора в связи с истечением кванта выполняет компонент ОС, называемый диспетчером или планировщиком задач. Сами действия этого диспетчера называют диспетчеризацией абстрактных процессов. |
|
|