КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
ЛЕКЦИЯ 14. Механизм системных вызовов
Механизм системных вызовов Системные вызовы Файлы Управление памятью Взаимоблокировка Когда взаимодействуют 2 или более процессов, они могут попадать в ситуации, которая не дает выполнятся далее без посторонней помощи, такая ситуация называется взаимоблокировка. Пример. Пусть к ПК подключены стример и пишущий DVD привод. Требуется записать данные со стримера на DVD. Процесс_1 запрашивает и получает в пользование стример. Создается Процесс_2, который запрашивает и получает в свое распоряжение DVD. После этого Процесс_1 запрашивает DVD, который занят Процессом_2. Поэтому процесс_1 приостанавливает свою работу и ждет, пока Процесс_2 не освободит DVD. Аналогично с процессом_2 по отношению к стримеру. И ждут оба). Вот это и есть взаимоблокировка. Проблемы: 1. защищенность 2. недостаточно адресного пространства, чтобы вся программа поместилась в ОЗУ. Тогда создается на жестком диске область памяти под виртуальную память. Либо файл подкачки - программа будет загружаться в ОЗУ по частям. Файл нужно открыть(создать) и закрыть. Файл можно читать и писать только тогда, когда он открыт. Файлы нужно хранить. За это отвечает файловая система: как и где? Место для хранения файлов называется каталог(директория, папка). Есть корневой каталог, есть дочерние. Используется принцип дерева. Сравнение иерархии файлов и процессов. (таблица)
Путь - это полное имя файла от корневого каталога. Файловые системы Юникс систем: - bin - sbin - usr -
Системные вызовы это интерфейс между программами пользователя и устройствами. Выполнение системного вызова похоже на выполнение процедуры. ПРИМЕР: системный вызов чтения данных из файлов в с++ этот системный вызов запускается функцией с таким же именем count read(fd, buffer, nbyte); fd - file descripter. идентификатор буфер - куда считавыются данные nbyte - кол. байт которые нужно прочесть count - количество байт которое необходимо прочесть Если системный вызов не может быть выполнен count = -1, а в глобальной переменной errno = сохраняет номер ошибки. Каждый системный вызов выполняется в несколько этапов:
Пример использования системных вызовов Пример1 "Системный вызов ioctl()": Системный вызов ioctl() универсальное средство управления аппаратными устройствами. Первый аргумент - дескриптор файла того устройства которым требуется управлять, второй аргумент - код запроса на конкретную операцию. Рассмотрим пример использования этого системного вызова для извлечения компакт-диска из дисковода.
// cdrom-eject.c #include <fcntl.h> #include <linux/cdrom.h> #include <sys/ioctl.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char* argv[]) { //открытие файла устройства указанного в командной строке int fd=open(argv[1], O_RDONLY); //Извлечение диска из устройства ioctl(fd, CDROMEJECT); close(fd); return 0; } Пример 2 "Использование API функций для работы с процессом" Вывод информации в не модальное окно может быть выполнен явно и не явно. При неявном выводе информация создается пользователем. При не явном выводе информация представляет собой значение возвращаемое какой либо системной API функции. В качестве примера вывод идентификатора в консоль Получить значения идентификатора текущего процесса позволяет функция которая называется DWORD GetCurrentProcessId(void). Алгоритм работы программы следующий: 1. Вызывается функция GetCurrentProcessId(void) и сохраняется в регистре EAX 2. Содержимое ЕАХ преобразуется в строку символов которая помещаетсяв буфер. 3. Адрес начала строки сохраняется в индексном регистре EDI 4. Строка символов передается в функцию MassageBox 5. Вызов функции MassageBox
Исходный модуль на ASM .386 model flat, stdcall include c\tasm\examples\wap32\win32.inc includelib import32.lib extrn GetCurrentProcessId:proc extrn MassageboxA:proc extrn ExitProcess:proc .data mesbox_title db "Id of current process: ", 0 textbuf db 11 dup(0), 0 .code Start: call GetCurrentProcessId;результат в EAX ; преобразование числа в строку lea edi, textbuf+11 mov esi,10 Clr_dvd: xor edx,edx div esi add edx,'0' dec edi mov Byte PTR[edi],dl or eax,eax jnz Clr_Dvd ; создание диалогового окна push MB_OK push offset messbox_title push offset edi push 0 call MessageBoxA call ExitProcess ends end start
Вариант на С++ #include <windows.h> #include <iostream.h> #include <conio.h> void main() { DWORD dwpid=GetCurrentProcessId(); cout<<"Current Id Of Processd:"<<wpid; getch(); }
Дата добавления: 2014-12-16; Просмотров: 469; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |