Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шпоры

.doc
Скачиваний:
111
Добавлен:
15.06.2014
Размер:
159.23 Кб
Скачать

1. Понятие операционной системы (ОС), ее отношение к аппаратному и программному обеспечению.

ОС – комплекс программ обеспечивающих взаимодействие м/у пользователями и прикладными программами и аппаратурой компьютера.

2. Состав и основные функции ОС.

Основные функции ОС:

- Обслуживание хранимой в компьютере информации

- Программное управление устройствами

- Интерфейс (взаимодействие) между компонентами ОС и прикладными программами с пользователем.

- Эффективное использование компьютера путем параллельного выполнения программ и совместного использования ресурсов.

3. Классификация ОС.

- Универсальные и специализированные (военные, технологические и т.д.).

- Одно и многопользовательские.

- Одно и многозадачные.

- Одно и многопрограммные (сетевые ОС).

- Одно и многопроцессорные.

- Мобильные ОС.

4. Понятия дескрипторов и хэндлов (handle).

ОС управляет информационными объектами внутри ее. Информационный объект – структура данных. xCB(control block) – с Unix внутри области данных ОС не доступно прикладным программам. xCB – структура для управления, учета и распоряжения информационным объектом. Handle – специальный номер посредством которого ОС находит соответствующий ему xCB.

Дескриптор – управляющий блок или указательный блок, учетно-информационный описатель работы с файлом

5. Ввод и вывод в стандартные файлы.

OS/2:

APIRET DosRead(HFILE hFile,PVOID pBuffer,ULONG cbRead,

PULONG pcbActual);

APIRET DosWrite(HFILE hFile, PVOID pBuffer, ULONG cbWrite,

PULONG pcbActual);

MS Windows:

HANDLE GetStdHandle(DWORD nStdHandle),

nStdHandle: STD_INPUT/OUTPUT_HANDLE

STD_ERROR_HANDLE

INVALID_HANDLE_VALUE-если handle не получен.

BOOL WINAPI ReadFile(HANDLE hFile, LPVOID Buffer, DWORD len, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );

BOOL WINAPI WriteFile(HANDLE hFile, LPCVOID Buffer, DWORD len, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped );

Unix:

unsigned int read(int handle, void* buffer, unsigned int len).

unsigned int write(int handle, void* buffer, unsigned int len).

6. Базовые средства использования файловой системы.

OS/2:

APIRER DosOpen(PCSZ pszFileName, PHFILE pHf, PULONG pAction,

LONG cbFile, ULONG Attribute, ULONG OpenFlags, ULONG OpenMode, PEAOP2peaop2);

DosClose(fhandle);

MS Windows:

HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );

CloseHandle(fhandle);

Unix:

int open(char* filename, int access_mode, mode_t permission),

имя файла, режм доступа, только для создать (права доступа)

int fcntl(int handle, int cmd, . . .);

F_SETLK - блокировать файл, если операция завершилась успешно, F_SERLKW - блокировать файл и вызывающий процесс на все время, пока действует блокировка на файл, F_GETLK - запросить, какой процесс заблокировал указанную область файла. Третьим аргументом будет структура flockc close(fhandle); - закрывает хэндл файла.

7. Переназначение стандартных устройств.

Командная строка: test.exe (< -стандартный ввод из файла, > - стандартный вывод в файл) имя файла.

Если вместо файла nul, то вывода не будет.

8. Особенности работы с файлами в многопрограммной системе.

(2) OS/2: где pszFileName - место имени файла(в терминах языка СИ обозначает указатель на имя файла) , pHf - задает место для хэндла файла pAction - задает место для получаемого кода выполненных действий. cbFile обычно не используется(0). Attribute задает атрибут открываемого файла.Обычный (нормальный) файл имеет атрибут равный 0, файл доступный только для чтения - атрибут, равный 1, скрытый файл задается атрибутом 2, системный файл - атрибутом 4, значение атрибута для оглавления есть 0x10. OpenFlags что делать ОС, если файл существует при открытии для записи или не существует при открытии для чтения. Младший байт этого аргумента разбит на две тетрады (4 бита). Правая (младшая) тетрада определяет действия в случае существующего файла, а левая (старшая в байте) - действия в случае несуществующего файла. Для существующего файла нулевое значение младшей тетрады задает формирование кода ошибки. Значение, равное 1, приказывает открыть файл, а равное 2 - усечь файл до длины указанной параметром cbFile, в частности сократить его до нулевой длины (при cbFile равном 0). Для несуществующего файла значение старшей тетрады, равное 1, приказывает создать файл, а при нулевом его значении - сформировать код ошибки. OpenMode управляет поведением файла относительно ряда особых ситуаций в многозадачной системе. peaop2 в большинстве ситуаций его следует задавать равным нулю.

9. Многопользовательская блокировка файлов.

(3) MS Windows: Функция CreateFileA имеет 7 аргументов, первым из которых является имя открываемого файла, вторым - код желаемого доступа к файлу, третьим - код режима разделяемого использования файла, далее следует адрес атрибутов защиты файла (мы не будет использовать эти довольно не простые возможности и этот аргумент всегда будем полагать равным NULL, т.е. сообщать ОС об отсутствии информации о защите файла). Пятый аргумент задает поведение ОС при открытии файла (диспозицию), шестой - атрибуты файла, а последний имеет специальный характер и рассматриваться нами не будет (будем указывать значение этого аргумента как NULL). Функция CreateFile при удачном выполнении возвращает значение хэндла файла, а при ошибке выдает вместо него значение, задаваемое символической константой INVALID_HANDLE_VALUE.

10. Функции управления курсором.

OS/2:APIRET16 VioGetCurPos(PUSHORT row, PUSHORT col, HVIO hvio);

APIRET16 VioSetCurPos(USHORT row, USHORT col, HVIO hvio).

строка , колонка, 0

MS Windows: BOOL SetConsoleCursorPosition(HANDLE hConsOut, COORD pos);

typedef struct _COORD {

SHORT X;

SHORT Y;

} COORD, *PCOORD;

BOOL GetConsoleScreenBufferInfo(HANDLE hConsOut,

CONSOLE_SCREEN_BUFFER_INFO*lpConsoleScreenBufferInfo);

typedef struct _CONSOLE_SCREEN_BUFFER_INFO {

COORD dwSize;

COORD dwCursorPosition;

WORD wAttributes;

SMALL_RECT srWindow;

COORD dwMaximumWindowSize;

} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;

Unix:

Printf("\033[строка;столбецH");

11. Многократный вывод символов и атрибутов.

OS/2:

APIRET16 VioWrtNCell(PBYTE pCell, USHORT len, USHORT row, USHORT col, HVIO hvio); где row - номер строки, а col - номер колонки позиции экрана, с которых начинается вывод (в случае одного символа - куда осуществляется вывод), len - число повторений вывода символа (сколько раз подряд заданный символ будет выводиться на экран), pCell - адрес ячейки из двух байтов, задающий информацию о символе для вывода, причем младший байт должен содержат ASCII код символа, а старший байт - атрибуты вывода. Следующая то же самое но без атрибутов.

APIRET16 VioWrtNChar(PBYTE pChar, USHORT len, USHORT row, USHORT

col, HVIO hvio);

APIRET16 VioWrtNAttr(PBYTE pAttr, USHORT len, USHORT row, USHORT

col, HVIO hvio); - позволяет предв. уст. новые атрибуты или изменить старые

MS Windows:

BOOL FillConsoleOutputCharacterA(HANDLE hConsOut,

CHAR character, WORD len, COORD pos, DWORD* actlen);

BOOL FillConsoleOutputAttribute(HANDLE hConsOut,

WORD attr, DWORD len, COORD pos, DWORD* actlen);

Unix:

\033[цветm

12. Вывод в произвольную позицию экрана.

OS/2:

APIRET16 VioWrtCharStr(PCH text, USHORT len, USHORT row,

USHORT col, HVIO hvio);

MS Windows:

BOOL WriteConsoleOutputCharacterA(HANDLE hConsOut,

CSTR* text, DWORD len, COORD pos, DWORD* actlen);

Unix:

Для этих целей используют управляющие последовательности.

Printf("\033[строка;столбецH");

\033[цветm

13. Событийное программирование и его использование в функциях ввода.

MS Windows:

BOOL ReadConsoleInputA(HANDLE hConsInput,INPUT_RECORD* buffer, DWORD len, DWORD* actlen).

Inprec.EventType = = MOUSE_EVENT, Inprec.EventType = = KEY_EVENT

OS/2:

KbdCharIn(PKBDKEYINFO pkbdi, USHORT fwait, HKBD hkbd);

typedef struct _KBDKEYINFO

UCHAR chChar;

UCHAR chScan;

UCHAR fbStatus;

UCHAR bNlsShift;

USHORT fsState;

ULONG time;

14. Средства чтения содержимого экрана в Windows.

BOOL ReadConsoleOutputCharacter(HANDLE hconsinput,

INPUT_RECORD* buffer,DWORD len, DWORD*actlen);

15. Средства чтения содержимого экрана в Unix.

hscreen= open(“/dev/vfs0”,O_RD_ONLY);

read(hscreen, buffer, len);

16. Системные функции мыши для текстового режима в Windows.

BOOL ReadConsoleInputA(HANDLE hConsInput,INPUT_RECORD* buffer, DWORD len, DWORD* actlen).

typedef struct _MOUSE_EVENT_RECORD {

COORD dwMousePosition; - координаты мыши.

DWORD dwButtonState; -

DWORD dwControlKeyState;

DWORD dwEventFlags;

} MOUSE_EVENT_RECORD, *PMOUSE_EVENT_RECORD;

dwButtonState выдает код нажатия клавиш мыши и может быть произвольной комбинацией следующих битовых значений, представляемых символическими константами FROM_LEFT_1ST_BUTTON_PRESSED, RIGHTMOST_BUTTON_PRESSED, FROM_LEFT_2ND_BUTTON_PRESSED, FROM_LEFT_3RD_BUTTON_PRESSED, FROM_LEFT_4TH_BUTTON_PRESSED.

Поле dwEventFlags позволяет определить двойное нажатие мыши и двигалась ли мышь в момент формирования сообщения. Для представления этой информации отдельными битами в данном поле служат символические константы MOUSE_MOVED и DOUBLE_CLICK.

17. Системные функции мыши для текстового режима в Unix.

int Gpm_Open (Gpm_Connect *CONN, int FLAG)

typedef struct Gpm_Connect {

unsigned short eventMask,определяет, какие сообщения будет получать программа клиента.

defaultMask; - какие сообщения передовать на обработку.

unsigned short minMod, maxMod;

int pid;

int vc; } Gpm_Connect;

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; =GPM_MOVE, GPM_DRAG, GPM_DOWN, GPM_UP.

int clicks; - число нажатий.

enum Gpm_Margin margin;

} Gpm_Event;

Gpm_Close();

18. Понятие процесса; параллельные и последовательные процессы.

Процесс – действия, выполняемые над конкретными данными под управлением программы. Процесс разворачивается во времени, это динамический объект, программа - это статический, неизменяемый объект. Процессы называются одновременно выполняющимися или параллельными, если каждый из них начат, но не завершен. Иначе процессы называются последовательными.

19. Состояния процесса, диспетчеризация и синхронизация процессов.

Состояния процесса: готов, выполняется , приостановлен. Диспетчеризация – управляет состояниями процесса Родительский процесс создает дочерний и приостанавливается до завершения этого дочернего процесса. Такой вариант называется синхронным и при этом говорят, что дочерний процесс запущен синхронно. Для задания синхронного запуска процесса служит аргумент flag со значением равным 0. При асинхронном запуске, когда флаг flag задается равным 1, и родительский процесс, и дочерний функционируют параллельно, т.е. выполняются далее одновременно оба.

.

20. Виды программных единиц в современных ОС.

Виды программных единиц: процессы, нити.

21. Программное порождение процессов в Unix.

Для создания процесса служит системная функция fork(), которая даже не имеет аргументов ! Эта функция по существу раздваивает процесс (fork - вилка), в результате в ОС оказываются два почти идентичных процесса. Единственно различие между ними для ОС - их различные идентификаторы, под которыми они зарегистрированы в системе. Различие этих процессов для выполняемой программы в том, что процесс-родитель получает как результат функции fork() значение идентификатора нового - дочернего процесса, а дочерний процесс в качестве числа, возвращаемого функцией, получает нуль. Поэтому в программе, общей хотя бы на участке порождения дочернего процесса, анализом кода возврата функции можно решить, кого в анализируемый момент обслуживает программа - родительский или дочерний процесс.

execl("child1.exe",0);

Эта функция имеет переменное число аргументов и последний из них должен иметь значение 0 (практически указатель NULL). В более общей форме эта функция позволяет задать аргументы для командной строки программы процесса и дополнительные текстовые строки в область окружения. После выполнения вызова execl("child1.exe",0) дочерний процесс управляется программой child1.exe, а исходная программа не имеет к нему уже никакого отношения.

22. Программное порождение процессов в Windows.

BOOL CreateProcess(ИмяМодуля //текст(файл проги.exe) или NULL, Текст командной строки, SECURITY_ATTRIBUTES АдресПроцесса //NULL, SECURITY_ATTRIBUTES АдресАтрибутаНити //NULL, BOOL InheritFlag //NULL, DWORD CreateFlag //флаги создания, LPVOID penv //указатель на окружение или NULL, LPCTSTR CurrDir //текущий каталог или NULL, STARTUPINFO *si, PROCESS_INFORMATION *pi);

Если парам-р ИмяМодуля NULL,то 2-ой парам-р – имя проги.EXE. Параметр CreateFlag: обычное значение - константа NORMAL_PRIORITY_CLASS.

Два последних параметра задают адреса двух спец структур данных для создания процесса. Структура PROCESS_INFORMATION содержит 4 поля для возврата учетной инфы из ОС после создания нового процесса: STRUCT {HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThread;}

Наиб важные поля: hProcess, возвращ хэндл созданного процесса, и dwProcessId, возвращ идентификатор (условный номер) созданного процесса.

Возвращаемое ф-ией CreateProcess значение типа BOOL позволяет вызывающей проге решить,как прошел запуск,удалось ли создать процесс. При создании возвращается TRUE, иначе FALSE.

23. Программное уничтожение процессов.

OS/2:

DosKillProcess(DKP_PROCESSTREE, rescod.codeTerminate); - на все дочерни процессы. DKP_PROCESS - только указанный.

Unix:

kill(pid, SIGKILL);

первый аргумент задает идентификатор процесса, полученный в свое время родительским процессом после выполнения функции fork(), второй является символической константой, определенной в заголовочном файле для посылки приказа именно уничтожения, а ни чего-то другого.

MS Windows: BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode)

в котором аргумент hProcess задает какой именно процесс следует уничтожить, а аргумент uExitCode - код завершения для такого принудительного завершения. Нормальный (не принудительный) код завершения задает функция VOID ExitProcess(UINT uExitCode),

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

24. Ожидание завершения процессов.

OS/2:DosWaitChild(DCWA_PROCESS, DCWW_WAIT, &rescods, &pid, rescod.codeTerminate);

Ожидание обеспечивается заданием идентификатора только что запущенного процесса в качестве последнего параметра вызова (параметра pid). Задается ожидание только для одного указанного процесса (параметр со значением DCWA_PROCESS).

Unix: pid_t wait(int *status)

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

pid_t waitpid(pid_t pid, int *status, int option),

позволяет задать с помощью значения pid завершение какого именно процесса будет ждать данный процесс, выполняющий функцию waitpid(), а параметром option - блокирующим или нет будет вызов функции. Использование этой функции требует включение заголовочного файла директивой #include <sys/wait.h>.

Windows: DWORD WaitForSingleObject(HANDLE hProcess, DWORD Timeout);

BOOL GetExitCodeProcess(HANDLE hProcess, LPDWORD pExitCode).

1-я ждет завершения, вторая получает информацию о завершение.

25. Иерархия процессов и ее использование.

Создающий процесс наз-ся родительским (parent), создаваемый – дочерним или процессом-сыном (child). Родительский процесс создаёт дочерний и приостанавливается до завершения этого дочернего процесса – это значит,что дочерний процесс запущен синхронно. При асинхронном запуске родительский и дочерний процессы функционируют параллельно, выполняются оба одновременно.

(Широко исп-тся в OS/2: ф-я для создания нового процесса APIRET DosExecPrm(...,ULONG flag,...). Для синхронного запуска процесса аргумент flag задаётся равным 0. При асинхронн запуске flag=1.

Процесс родитель может уничтожить дочерний: APIRET DosKillProcess(ск-ко потомков уничтожить (если один дочерний,знач-е 1,а если ещё и все потомки дочернего,знач-е 0), идентификатор дочернего процесса)).

26. Понятие нити и связь ее с процессом.

В современных операционных системах широко используются нити. Это понятие возникло как результат развития понятия абстрактного процесса. Оказалось, что иногда целесообразно разделить процесс на части, которые выполнялись бы параллельно, конкурируя за главный ресурс - процессор, но в остальном выполняли бы общую работу. Можно подойти к осознанию понятия процесса с другой стороны. Абстрактные процессы теоретически разделяют на конкурирующие и кооперативные. Конкурирующие по существу мешают друг другу, но в совокупности выполняют много работ одновременно. Кооперативные - выполняют по частям совместно общую работу. Организационно-техническое объединение - под одной "крышей" обобщенного процесса - аналогов кооперативных процессов и составляют существо объединения нитей в одном процессе. Процесс в современных ОС - это владелец всех основных ресурсов кооперативно работающих нитей. У этих нитей общее виртуальное адресное пространство, у них общие дескрипторы (описатели внутри служебных областей ОС) и соответствующие их хэндлы. Причем дескрипторы и хэндлы всевозможных допустимых в ОС объектов: файлов, созданных дочерних процессов, графических окон, семафоров и т.п. Практически нити одного процесса используют общий сегмент данных, откуда каждая из них может брать данные или записывать данные туда. Процессором нити пользуются по очереди, так что он не принадлежит ни одной из них, но он не принадлежит и самому процессу. Нити принадлежит только текущая совокупность значений в регистрах и собственный стек. Текущая совокупность значений в регистрах называют контекстом задачи.

27. Создание нитей (thread) в программе.

OS/2: APIRET DosCreateThread(PTID ptid, PFNTHREAD pfn, ULONG param, ULONG flag, ULONG cbStack);

где ptid - указатель на возвращаемый номер (идентификатор) нити, pfn - имя подпрограммы (описанной выше в программе прототипом), param - передаваемый в процедуру параметр, cbStack - размер стека для нити. Аргумент flag задает запускается ли в работу нить сразу после создания или создается приостановленной. В первом случае значение flag = 0, во втором flag = 1. Эти значения могут быть указаны символическими константами CREATE_READY и CREATE_SUSPENDED.

Unix: int pthread_create(pthread_t* tid, const pthread_attr_t* att,

void*(*fun)(void*), void* argp);

int pthread_exit(void *status)- завершение нити.

MS Windows:

unsigned long _beginthreadNT(void (*proc)(void*), unsigned stack_size, void *arglist, void *security_attrib, unsigned long flag, unsigned long* tid);

_endtread().- завершение нити.

28. Уничтожение нитей.

OS/2: APIRET DosKillThread(TID tid); - принудительно.

DosExit(0, код_возврата) – самоуничтожение.

Unix: int pthread_kill(pthread_t tid, int signum);

SIGSTOP – сигнал остановки.

Windows: BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);

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

BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);

Если задача, указанная аргументом hThread, в момент запроса кода возврата еще работает, то функция возвращает значение STILL_ACTIVE в качестве значения второго аргумента. Код возврата из нормально завершающейся нити формирует функция завершения ExitThread, которая имеет прототип

void ExitThread(DWORD dwExitCode);

29. Приостановка и повторный запуск нити.

OS/2: APIRET DosSuspendThread(TID tid) – приостановить.

APIRET DosResumeThread(TID tid) – возобновить.

Unix: int pthread_kill(pthread_t tid, int signum);

SIGSTOP – сигнал остановки.

SIGCONT – возобновить работу.

MS Windows: DWORD ResumeThread(HANDLE hthread); - приостановить.

DWORD SuspendThread(HANDLE hthread); - возобновить.

30. Ожидание завершения нити.

OS/2: APIRET DosWaitThread(PTID ptid, ULONG option).

DCWW_WAIT – для ожидания завершения.

DCWW_NOWAIT – для получения информации о завершении.

Unix: int pthread_join(pthread_t tid, void** status).

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

31. Критические секции.

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

В программах для Windows при выводе на консоль несколькими процессами возможно нежелательное взаимное влияние их друг на друга. Практически появляются некоторые искажения выводимой информации, но, к счастью, исключительно в виде искажения цветовых атрибутов. Для принципиального устранения проблемы такого влияния при выводе можно использовать универсальное средство изоляции участков программ друг от друга, называемое критическим интервалом. В данной программе это средство представлено описанием специальной общей для процедур переменной csec со структурным типом CRITICAL_SECTION и системными функциями InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection, DeleteCriticalSection. Все эти функции имеют единственный аргумент - адрес указанной переменной csec. Они относятся к средствам межпрограммного взаимодействия и позволяют правильно согласовывать параллельную работу нескольких нитей, использующих общий ресурс - в данном случае экран консоли. Подробное описание этих функций можно посмотреть в технической документации.

32. Абстрактные семафоры.

Семафор – это специальная переменная, защищенная от непосредственного доступа ОС, над которой будут выполняться операции P(S), V(S), (S – семафор) и инициализация средствами ОС. Простейшим видом семафоров являются двоичные семафоры.

P(S): если S = 1, то S <- 0, иначе блокировать нить по семафору S.

Если очередь готовых процессов (нитей) не пуста, то установить один из них на процессор – запустить.

V(S): если очередь нитей, блокированных по семафору S не пуста, деблокировать одну из них, иначе S <- 1.

Т.о. значение семафора 1 означает «путь свободен», значение 0 – «путь занят».

33. Семафоры взаимоисключения в Windows.

В современных ОС несколько разновидностей семафоров, среди них выделяют mutex-семафоры (MUTual EXclusion) – семафоры взаимоисключения.

V(S) может выполнить только та нить, которая перед этим выполнила P(S).

P(S) – нить запрашивает семафор, если нет – блокируется.

V(S) – отказаться от владения семафором.

Семафоры создаются внутри ОС.

В Windows:

HANDLE CreateMutex(SECURITY_ATTRIBUTES* MtxAttrs(адрес атрибутов защиты), BOOL bInitialOwner (наследование), STR* Name(имя семафора));

Функция создает семафор и возвращает его хэндл.

HANDLE OpenMutex(DWORD DesiredAccess, BOOL bInheritHandle, STR* Name);

BOOL ReleaseMutex(HANDLE hMutex). – отказаться от владения семафором

BOOL WaitForSingleObject(HANDLE хэндл семафора, timeout время ожидания); - запрос на владение семафором

34. Семафоры взаимоисключения в Unix.

В современных ОС несколько разновидностей семафоров, среди них выделяют mutex-семафоры (MUTual EXclusion) – семафоры взаимоисключения.

V(S) может выполнить только та нить, которая перед этим выполнила P(S).

P(S) – нить запрашивает семафор, если нет – блокируется.

V(S) – отказаться от владения семафором.

Семафоры создаются внутри ОС.

В Unix:

Для создания семафора используется функция

int pthread_mutex_init(ptread_mutex_t* hmtx, ptread_mutexattr_* pattr);

int pthread_mutex_lock(ptread_mutex_t* hmtx); - блокирует самафор

int pthread_mutex_trylock(ptread_mutex_t* hmtx); - не блокирует, а возвращает отличное от 0 значение, если семафор занят.

int pthread_mutex_unlock(ptread_mutex_t* hmtx); - деблокирует (отказывается от владения) семафор.

int pthread_mutex_destroy(ptread_mutex_t* hmtx); - освобождает хэндл семафора и уничтожает его.

35. Семафоры событий.

Семафоры событий (Event-semaphore)

OS/2: DosCreateEventSem(имя семафора, HEV *hev(хэндл), ULONG fbugattr, BOOL32 status(есть сигнал о событии или нет)); - создает семафор событий.

W: CreateEvent(адрес атрибута защиты, BOOL ManualRec, BOOL state, имя семафлора);

Основные операции:

Запуск сигнала события: DosPostEventSem(HEV hev); (OS/2)

SendEvent(HANDLE hev); (W)

W:CreateEvent(...,BOOL Munual);

В автономном режиме WaitForSingleObject(HANDLE hewsem(сотв.Event сбрасывается автоматически, timeout);

По сигналу Event пробуждается только одна из ожидающих нитей.

Unix: Аналогично EventSem – “условные переменные”

Pthread_cond_init(pthread_cond_t*cond, адрес атрибутов (или NULL));

Ожидание условной переменной:

pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *htmx);

pthread_cond_broadcast(pthread_cond_t *cond); - оповещение всех нитей.

зthread_cond_signal – выдача сигнала, pthread_cond_destroy – уничтожение условной переменной, pthread_cond_trywait – проверить, не было ли ожидания

36. Средства множественных ожиданий.

Для решения средства группового ожидания в W: WaitForMultipleObjects(DWORD ск-ко ожидаемых системных объектов, HANDLE *ArrayHandles //массив хэндлов объектов, BOOL WaitAll //ждать всех true или false, DWORD timeout //время ожидания);

Сначала создаётся массив всех используемых хэндлов: HANDLE hSem[s];

WaitForMultipleObjects(5, hSem,TRUE,INFINITE);

ф-ия выполняется,когда все сем-ры будут освобождены.

37. Программные семафоры с внутренним счетчиком в Windows.

В Windows: Создание : HANDLE CreateSemaphore(адрес атрибутов защиты(или NULL), LONG – начальное значение, LONG maxValue //для значения семафора (имя семафора) //илиNULL, значение семафора (>=0));

Ожидание таких семафоров: WaitForSingleObject(HANDLE, timeout);- если значение семафора =0, то ожидание, иначе уменьшение на 1.

Изменение значения счетчика семафора:

BOOL ReleaseSemaphore(HANDLE hsem, LONG приращение значения(>0), LONG *predvalue(предыдущее значение));

Открытие семафора:

HANDLE OpenSemaphore(DWORD access, DWORD inherit, имя семафора);

38. Программные семафоры с внутренним счетчиком в Unix.

Программные семафоры с внутренним счетчиком в Windows

Считающие семафоры могут принимать любые неотрицательные значения

P(S): если S>0, то S <-S-1, иначе Wait(S) – блокировать нить по семафору S.

V(S): если очередь нитей, заблокированных по S не пуста, то блокировать одну из них, иначе S <- S+1.

Обобщенно можно считать, что семафоры принимают любые целые значения, причем при S>0 – число свободных единиц ресурсов, при S<0 – число нитей, заблокированных по этому семафору

В Unix: для использования между нитями

Инициализация: int sem_init(sem_t *sem, int chare(=0), int value(начальное значение));

Уничтожение: int sem_destroy(sem_t *sem);

int sem_wait(sem_t sem); - если S<0, то ожидание, иначе декремент

int sem_post(sem_t sem); - инкремент

int sem_trywait(sem_t sem);

int sem_getvalue(sem_t sem); - возвращает значение семафора.

39. Проблема тупиков при взаимодействии программных единиц.

Процесс А Процесс В

P(S1) – S1 закрыт P(S2) – S2 закрыт

P(S2) P(S1)

... – ждет S2 ... – ждет открытия S1

V(S2) V(S1)

V(S1) V(S2)

Такую ситуацию также называют deadlock

40. Средства реализации виртуальной памяти, страничная переадресация.

Взаимодействие между виртуальной и оперативной памятью зависит от архитектуры процессора.

Страничная переадресация вызвана рядом причин: разрыв между теоретич. Возможной 232 и реальной ОП (128-512 Мб), необходимость защиты областей.

Аналог ячейки ОП – квартира в доме.

XXXXXXXX XXX

^^^^^^^номер дома ^^^^^ номер квартиры.

Каждому процессу виден номер страницы, но на самом деле эти страницы находятся на разных страницах.

Переход от номера «видимой процессу» - виртуальной страницы к реальной странице (с номером «дома») происходит с помощью таблиц. Таблицы создаются и обрабатываются ОС, причем каждому процессу соответствует своя таблица переадресации.

В ?32 используется двухуровневая переадресация виртуальный адрес – физическая ячейка ОП.

41. Средства реализации виртуальной памяти; стратегия подкачки страниц.

Страничная переадресация включает возможность временного помещения содержимого страниц во внешнюю память. Освободившееся место используется процесоом в ОП. Такую «откачку» реалиует ОС на основе дополнительной информации в строках таблиц каталога и в основной таблице страниц. В них отмечается, находится ли страница в ОП или во внешней памяти. Область внешней памяти, куда откачивается содержимое страниц называется областью подкачки (swapping).

42. Системные функции распределения памяти.

В современных архитектурах доступ к страницам памяти ограничивается правами доступа как минимум: чтение и/или запись, доступ для выполнения.

Unix: void malloc(size_t size); - резервирует память, возвращает адрес, если NULL – ошибка.

free(void *addr) – освобождает память.

realloc(void *addr, size_t newsize);

В OS/2 и W выделяется 2х-уровневая переадресация страниц:

1. Выделяются диапазоны в таблице каталогов и стоятся таблицы страниц (заготовка)

2. Выделяется действительная память в ОП или swap-файле с заполнением строк таблиц страниц.

???

OS/2: DoasAllocMem(void *addr, ULONG size, ULONG flag);

flag: PAG_COMMIT

PAG_READ

PAG_WRITE

PAG_EXECUTE

43. Системные функции распределения и включение в действие памяти.

Unix: void malloc(size_t size); - резервирует память, возвращает адрес, если NULL – ошибка.

Free(void *addr); - освобождает память.

realloc(void *addr, size_t newsize);

OS/2: DoasAllocMem(void *addr, ULONG size, ULONG flag);

flag: PAG_COMMIT

PAG_READ

PAG_WRITE

PAG_EXECUTE

DosSetMem(void *addr, ULONG size, flag);

DosFreeMem(void *addr);

Windows: VirtualAlloc(void *adr, DWORD size, DWORD type, DWORD prot);

adr – желаемый адрес начала блока, size – размер, type – MEM_RESERVE | MEM_COMMIT, prot – PAGE_READONLY | PAGE_READWRITE | PAGE_GUARD

VirtualFree(void *adr, DWORD size, DWORD type); type – MEM_DECOMMIT | MEM_RELEASE

VrtualProtect(void *adr, DWORD size, DWORD prot, DWORD oldprot);

44. Совместное использование оперативной памяти в Windows.

Для совместного использования ОП используются функции отображения файла в ОП. В техническом решении промежуточным этапом служит объект.

HANDLE CreateFileMapping(HANDLE hfile, адрес атрибутов защиты, DWORD protect, DWORD maxsizehigh, DWORD maxsizelow, char *имяфайла);

Для совместной памяти hfile должно быть искусственной константой (-1).

void MapViewofFile(HANDLE хэндл от createfilemapping, DWORD access, DWORD offsethigh, DWORD offsetlow, DWORD size);

Обратная функция: UnmapViewofFile(void *addr);

45. Совместное использование памяти в Unix.

Unix: совместная память - «shared memory».

Использование в программе требует подключение заголовочного файла shm.h

Для каждой области shared memory выделяется:

- уникальный ID (число)

- размер, атрибуты

Соответсвенно доступ к shared memory разбивается на 2 этапа:

1. Открытие доступа (получение handle)

2. Подключение (attach) области к виртульному адресному пространству текущего процесса.

1. int shmget(key_t key, int size, int flag);

функция возвращает хэндл области. Key указывает ID (уникальный номер).

2. int shmat(int shmid, void *adr, int, flag); shmid – хэндл от shmget, adr – желаемый виртуальный адрес.

Для отключения (detach):

int shmdet(void *adr);

46. Основные файловые системы (ФС) в современных ОС.

К файловым системам относят все ОС, связанные с обслуживанием файлов, но не относят драйверы. ФС в основной структуре (независимых от ВУ) данных, обеспеченных хранением информации в виде файлов. На ФС можно смотреть с двух сторон:

-от пользователя;

-от стороны обслуживающих компьютеров;

К настоящему моменту различными ОС используется несколько файловых систем: FAT16, FAT32, NTFS (Windows/ Windows NT), HPFS (OS/2), файловая система Unix.

47. Структуры файловых систем для пользователя.

Сложилась ситуация, когда нужно одинаковые имена, но они разные.

al_Khavarism Muhammed

Для внешнего пользователя существенно две разности ФС:

-используемые логические диски (FAT и т.п.) - Wind, 9x, WinNT,MS-DOS, OS

-неиспользуемые логические диски – клоны Unix

Полное имя последователь каталогов от корневого через \ [каталог, каталог,… каталог] собственное имя.

48. Методы распределения внешней памяти.

Принципный элемент распределения – каталог с элементами

Внешняя память – совокупность единиц хранения(сектора, не байты). Они пронумерованы аппаратными средствами или компонентами систем ввода-вывода.

1. Простейший метод распределения – последовательное непрерывное распределение.

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

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

- произвольное хранение (вразброс) – FAT

- хранение небольшими наборами непрерывных участков (extent) – NTFS

Принципы распределения (информация о свободных/занятых участках):

1. Связанный список свободных блоков

2. Карта свободных участков (еxtent`ов)

3. Битовые карты

4. Таблица размещения.

49. Принципы построения файловых систем типа FAT.

FAT – File Allocation Table (таблица размещения файлов).

FAT представляет собой битовую карту, в которой каждый бит расширен до много битового элемента, причем единицей распределения внешней памяти является кластер, а не сектор. Кластер – группа из последовательных 2k секторов(1,2,4…). Сектор содержит 32 Кб => файл занимает как минимум 32 Кб.

В элементах таблицы FAT может быть:

- условный код свободного кластера

- условный код сбойного кластера (bad)

- номер следующего кластера

- условный код последнего кластера файла

Размер элемента FAT:

FAT12 – 12 бит/элемент 212 = 4096 кластеров – годится для дискеты

FAT16 – 65536 кластеров. Таблица занимает 128 Кб.

Структура лог. диска: загрузочная область / FAT – 1й экз. / FAT – 2й экз. / Корневой каталог / область файлов

50. Современные модификации файловой системы FAT.

В современных ОС Windows 9x используются модификации файловой системы FAT: FAT16 и FAT32.

Особенностью этих файловых систем является то, что они поддерживают т.н. длинные имена файлов (до 255 байт).

В структуре элемента FAT16 выделяются дополнительные записи, хранящие дополнительную информацию об имени файла, причем записи расположены в обратном порядке:

2я доп. запись / 1я доп. запись / Основная запись.

FAT32: элемент таблицы FAT – 32 бита (4б) (поддерживается более 4 млрд. кластеров) => если лог. диск 2Гб – FAT 4Мб, 4Гб – FAT 40Мб.

Структура FAT на диске:

Со смещения 0x2C номер кластера, где начинается корневой каталог. Загрузочный сектор со служебной информацией / Таблица FAT – 1й экз / Таблица FAT – 2й экз. / Область файлов

Самый первый кластер в области файлов имеет номер 2. Кластерами нумеруется только область данных.

Соседние файлы в предмете Операционные системы