Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
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-8-9) (1) Базовые средства использования файловой системы. Особенности работы с файлами в многопрограммной системе. Многопользовательская блокировка файлов 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, то вывода не будет. |
6-8-9) (2) OS/2: где pszFileName - место имени файла(в терминах языка СИ обозначает указатель на имя файла) , pHf - задает место для хэндла файла pAction - задает место для получаемого кода выполненных действий. cbFile обычно не используется(0). Attribute задает атрибут открываемого файла.Обычный (нормальный) файл имеет атрибут равный 0, файл доступный только для чтения - атрибут, равный 1, скрытый файл задается атрибутом 2, системный файл - атрибутом 4, значение атрибута для оглавления есть 0x10. OpenFlags что делать ОС, если файл существует при открытии для записи или не существует при открытии для чтения. Младший байт этого аргумента разбит на две тетрады (4 бита). Правая (младшая) тетрада определяет действия в случае существующего файла, а левая (старшая в байте) - действия в случае несуществующего файла. Для существующего файла нулевое значение младшей тетрады задает формирование кода ошибки. Значение, равное 1, приказывает открыть файл, а равное 2 - усечь файл до длины указанной параметром cbFile, в частности сократить его до нулевой длины (при cbFile равном 0). Для несуществующего файла значение старшей тетрады, равное 1, приказывает создать файл, а при нулевом его значении - сформировать код ошибки. OpenMode управляет поведением файла относительно ряда особых ситуаций в многозадачной системе. peaop2 в большинстве ситуаций его следует задавать равным нулю. |
6-8-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); |
17) Системные функции мыши для текстового режима в 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. |
18) Системные функции мыши для текстового режима в 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(); |
19) Понятие процесса; параллельные и последовательные процессы. Процесс действия, выполняемые над конкретными данными под управлением программы. Процесс разворачивается во времени, это динамический объект, программа - это статический, неизменяемый объект. Процессы называются одновременно выполняющимися или параллельными, если каждый из них начат, но не завершен. Иначе процессы называются последовательными. |
20) Состояния процесса, диспетчеризация и синхронизация процессов Состояния процесса: готов, выполняется , приостановлен. Диспетчеризация управляет состояниями процесса Родительский процесс создает дочерний и приостанавливается до завершения этого дочернего процесса. Такой вариант называется синхронным и при этом говорят, что дочерний процесс запущен синхронно. Для задания синхронного запуска процесса служит аргумент flag со значением равным 0. При асинхронном запуске, когда флаг flag задается равным 1, и родительский процесс, и дочерний функционируют параллельно, т.е. выполняются далее одновременно оба. . |
21) Виды программных единиц в современных ОС. Виды программных единиц: процессы, нити. |
22) Программное порождение процессов в Unix. Для создания процесса служит системная функция fork(), которая даже не имеет аргументов ! Эта функция по существу раздваивает процесс (fork - вилка), в результате в ОС оказываются два почти идентичных процесса. Единственно различие между ними для ОС - их различные идентификаторы, под которыми они зарегистрированы в системе. Различие этих процессов для выполняемой программы в том, что процесс-родитель получает как результат функции fork() значение идентификатора нового - дочернего процесса, а дочерний процесс в качестве числа, возвращаемого функцией, получает нуль. Поэтому в программе, общей хотя бы на участке порождения дочернего процесса, анализом кода возврата функции можно решить, кого в анализируемый момент обслуживает программа - родительский или дочерний процесс. execl("child1.exe",0); Эта функция имеет переменное число аргументов и последний из них должен иметь значение 0 (практически указатель NULL). В более общей форме эта функция позволяет задать аргументы для командной строки программы процесса и дополнительные текстовые строки в область окружения. После выполнения вызова execl("child1.exe",0) дочерний процесс управляется программой child1.exe, а исходная программа не имеет к нему уже никакого отношения. |
24) Программное уничтожение процессов. 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(), имеющую один аргумент - код завершения. |
25) Ожидание завершения процессов. 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-я ждет завершения, вторая получает информацию о завершение. |
26) Иерархия процессов и ее использование. |
27) Понятие нити и связь ее с процессом В современных операционных системах широко используются нити. Это понятие возникло как результат развития понятия абстрактного процесса. Оказалось, что иногда целесообразно разделить процесс на части, которые выполнялись бы параллельно, конкурируя за главный ресурс - процессор, но в остальном выполняли бы общую работу. Можно подойти к осознанию понятия процесса с другой стороны. Абстрактные процессы теоретически разделяют на конкурирующие и кооперативные. Конкурирующие по существу мешают друг другу, но в совокупности выполняют много работ одновременно. Кооперативные - выполняют по частям совместно общую работу. Организационно-техническое объединение - под одной "крышей" обобщенного процесса - аналогов кооперативных процессов и составляют существо объединения нитей в одном процессе. Процесс в современных ОС - это владелец всех основных ресурсов кооперативно работающих нитей. У этих нитей общее виртуальное адресное пространство, у них общие дескрипторы (описатели внутри служебных областей ОС) и соответствующие их хэндлы. Причем дескрипторы и хэндлы всевозможных допустимых в ОС объектов: файлов, созданных дочерних процессов, графических окон, семафоров и т.п. Практически нити одного процесса используют общий сегмент данных, откуда каждая из них может брать данные или записывать данные туда. Процессором нити пользуются по очереди, так что он не принадлежит ни одной из них, но он не принадлежит и самому процессу. Нити принадлежит только текущая совокупность значений в регистрах и собственный стек. Текущая совокупность значений в регистрах называют контекстом задачи. |
28) Создание нитей (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().- завершение нити. |
30) Уничтожение нитей. 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); |
31) Приостановка и повторный запуск нити. 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); - возобновить. |
32) Ожидание завершения нити. OS/2: APIRET DosWaitThread(PTID ptid, ULONG option). DCWW_WAIT для ожидания завершения. DCWW_NOWAIT для получения информации о завершении.
Unix: int pthread_join(pthread_t tid, void** status). Эта функция возвращает код возврата из нити, причем такой код формируется функцией pthread_exit(), завершающую нить ожидаемуя нить. Функция пригодна для ожидания только конкретной нити, идентификатор которой задается первым ее аргументом. Второй аргумент вызова функции (указатель на указатель) позволяет получить любой тип результата, предусмотренный программистом. |
33) Критические секции. Заметим, что в программе для управления поведением нитей используются их хэндлы, но никак не используются идентификаторы нитей. Практически в Windows всегда заметна некоторая избыточность средств, которая частично оправдывается большой суммарной сложностью системы. В программах для Windows при выводе на консоль несколькими процессами возможно нежелательное взаимное влияние их друг на друга. Практически появляются некоторые искажения выводимой информации, но, к счастью, исключительно в виде искажения цветовых атрибутов. Для принципиального устранения проблемы такого влияния при выводе можно использовать универсальное средство изоляции участков программ друг от друга, называемое критическим интервалом. В данной программе это средство представлено описанием специальной общей для процедур переменной csec со структурным типом CRITICAL_SECTION и системными функциями InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection, DeleteCriticalSection. Все эти функции имеют единственный аргумент - адрес указанной переменной csec. Они относятся к средствам межпрограммного взаимодействия и позволяют правильно согласовывать параллельную работу нескольких нитей, использующих общий ресурс - в данном случае экран консоли. Подробное описание этих функций можно посмотреть в технической документации. |