Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OSISP_shpory.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

2. Взаимодействие процессов. Задача взаимного исключения. Вариант 4 (1, 16, 18) – 146

int flag[2];

void P0()

{

while (1)

{

flag[0]=1;

while (flag[1]);

{

flag[0]=0;

задержка;

flag[0]=1;

}

критический интервал 1;

flag[0]=0;

….

}

}

void P1()

{

while (1)

{

flag[1]=1;

while (flag[0]);

{

flag[1]=0;

задержка;

flag[1]=1;

}

критический интервал 2;

flag[1]=0;

….

}

}

void main()

{

flag[0]=0;

flag[1]=0;

parbegin(P0,P1);

}

3. Последовательность действий по преобразованию адреса в защищенном режиме:

При работе в защищенном режиме каждый сегмент определяется специальной восьмибайтной структурой, которая называется дескриптор сегмента (Segment Descriptor).

В этом режиме процессор обеспечивает все возможные функции. Адресное пространство становится равным 232 (4Gb памяти). При распределении памяти обязательно поддерживается сегментная организация и по включению страничной организации памяти. Есть режим виртуализации процессора Intel 8086. Обеспечивается поддержка более ранних процессоров.

При работе в защищенном режиме сегментные регистры состоят из трех частей.

Индекс TI RPL

15

3

1

0

2

Схема преобразования адреса при работе в защищенном режиме:

БИЛЕТ 2 – (9) 1. Понятие системного вызова в ОС UNIX. Обработка ошибок

Все версии UNIX предоставляют строго определенный ограниченный набор входов в ядро ОС, через которые прикладные задачи имеют возможность воспользоваться услугами, предоставляемыми ОС UNIX. Эти точки входа называются системными вызовами. Системный вызов определяет функцию, выполняемую ядром ОС от имени процесса, выполнившего вызов и является интерфейсом самого низкого уровня взаимодействия прикладных процессов с ядром. Современные ОС UNIX имеют более 100 системных вызовов. В среде программирования ОС UNIX системные вызовы определяются как функции языка C, независимо от фактической реализации вызова функции ядра ОС. В UNIX каждый системный вызов имеет соответствующую функцию или функции, с тем же именем, хранящуюся в стандартной библиотеке языка C.

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

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

/usr/include

/usr/include/sys

Пример компиляции и выполнения программы:

>gcc prog1.c <Enter> >gcc prog1.c –o prog1.exe //-o указывает имя исполняемого файла, в

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

>./a.out <Enter> >./prog1.exe

1.8 Обработка ошибок

Обработке ошибок уделяется большое значение в UNIX, так как написание надежных и устойчивых программ, особенно для многопользовательских систем, является весьма важным.

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

Имеются также две функции, помогающие сообщить причину ошибочной ситуации.

external int errno; #include <errno.h>

#include <string.h> #include <stdio.h>

char *strerror (int enum); void perror (char *s);

main (int argc, char *argv[ ])

{

fprintf(stderr, “ENOMEM:%s\n”, strerror (ENOMEM));

errno = ENOEXEC;

perror (argv[0]);

}

Функция strerror принимает в качестве аргумента номер ошибки и возвращает указатель на строку, содержащую сообщение о причине ошибочной ситуации.

Функция perror выводит в стандартный поток сообщений об ошибках информацию об ошибочной ситуации, основываясь на значении переменной errno. Строка s, передаваемая функции в качестве аргумента, предваряет сообщение об ошибке и может содержать дополнительную информацию, например название функции, в которой произошла ошибка.

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

Программистам также предоставляется большой набор функций общего назначения, которые не являются точками входа в операционную систему, хотя в процессе выполнения многие из них выполняют системные вызовы (например, функция printf записывает данные в файл, используя системный вызов read). Библиотечные функции, хранящиеся в стандартных библиотеках вместе с системными вызовами, составляют основу среды программирования UNIX.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]