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

Билет 16

1. Каналы в ос unix (16) – 80

Применение неименованных каналов реально только для взоимодействия родственных процессов. То есть неименованный канал должен быть создан до создания процессов. И неименованные каналы закрываются при завершении процесса.

Чтобы устронить эти недостатки предлогается механизм именованных каналов (или канал FIFO). При его создании создается и его имя:

#include<sys/types.h>

#include<sys/stat.h>

int mkfifo(const char *pathname,mode_t mode);

Создается именованный канал с именем указаным в качестве первого аргумента и правами доступа, определенными вторым аргументом с учетом маски создания файла.

После того как канал создан он должен быть открыт функцией open. Если канал открыт каким-то процессом для чтения, то процесс будет заблокирован до тех пор пока другой процесс не откроет его для записи или наоборот.Можно также выполнить не блокируемый вызов для канала FIFO.

fd=open(“/tmp/fifo1”,O_WRONLY|O_NONBLOCK);

В таком случае open вернет значение -1, а в errno установится ENXIO

#include<fcntl>

#include<stdio.h>

#include<string.h>

#include<errno.h>

#define MSG_S 60

char *fifo=“F_FIFO”;

main(int argc,char **argv)

{ int fd,j,n_w;

char msgbuf[MSG_S];

if(argc<2)

exit(1);

if((fd=open(fifo,O_WRONLY|O_NONBLOCK))<0)

exit(2);

for(j=1;j<argc;j++)

{ if(strlen(argv[j])>MSG_S)

continue;

strcpy(msgbuf,argv[j]);

if((n_w=write(fd,msgbuf,MSG_S+1))==-1)

exit(3);

}

exit(0);

}

#include<fcntl>

#include<stdio.h>

#include<string.h>

#include<errno.h>

#define MSG_S 60

int main(int argc,char **argv)

{ int f1;

char msgbuf[MSG_S+1]

if(mkfifo(fifo,0666)==-1)

{ if(errno!=EEXIST)

{ printf(“Ошибка, чтения mkfifo\n”);

exit(1);

}

if((fd=open(fifo,0_RDONLY))<0)

exit(2);

for(;;)

{ if(read(fd,msgbuf,MSG_S+1)<0)

exit(3);

printf(“Получено сообщение %s\n”,msgbuf);

}

}

}

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. Организация защиты в процессорах ia32

Процессор поддерживает 4 механизма защиты:

Защита по размеру сегмента – предотвращает выход за пределы сегмента;

Привилегированные команды – есть группа команд, которые могут выполнять только на нулевом уровне привилегий. Команды, связанные с обращением к системным регистрам. Есть группа IOPL команд: команды работают с портами ввода/вывода и команды установки флага прерывания. Они выполняются только когда уровень привилегий больший или равен IOPL;

Защита по привилегиям – есть понятие CPL – текущий уровень привилегий процессора (Current Privilege Level). Это уровень, на котором работает процесс в данный момент. Значение в младших битах регистра CS. При обращении к данным или другим системным объектам сравнивает значение текущего уровня привилегий с уровнем привилегий дескриптора (DPL). По результату сравнивания процессор выполняет/не выполняет действие. Более того, при обращении к памяти max(CPL,RPL)<=DPL;

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

Важным механизмом защиты является то, что передача управления возможна только на текущем уровне привилегий (команды FAR CALL и FAR IMP).

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

  1. подчиненные сегменты;

  2. шлюзы вызова.

БИЛЕТ 17

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