ЛАБОРАТОРНАЯ РАБОТА №4 (Метода по выполнению лабораторной работы 4 по СПО), страница 2

2015-07-19СтудИзба

Описание файла

Документ из архива "Метода по выполнению лабораторной работы 4 по СПО", который расположен в категории "". Всё это находится в предмете "системное программное обеспечение (спо)" из 6 семестр, которые можно найти в файловом архиве МПУ. Не смотря на прямую связь этого архива с МПУ, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "системное программное обеспечение (спо)" в общих файлах.

Онлайн просмотр документа "ЛАБОРАТОРНАЯ РАБОТА №4"

Текст 2 страницы из документа "ЛАБОРАТОРНАЯ РАБОТА №4"

3.3.4 Утилита crash

Фактическую информацию о структурах управления адресным пространст­вом процесса можно получить с помощью команды crash(). В следую­щем примере определяется содержимое структур pregion процесса и характеристики соответствующих областей.

Как можно увидеть из вывода команды crash(), с рассматриваемым процессом связаны пять областей: сегмент кода, данных и стека, а также сегменты кода и данных подключенной библиотеки. Столбец reg# опре­деляет запись таблицы областей, где расположена адресуемая каждой pregion область region. Заметим, что значение в столбце REG# лишь от­части соответствует полю p_reg структуры pregion, поскольку последнее является указателем, а не индексом таблицы. Столбец regva содержит значения виртуальных адресов областей

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

$ region 12 22 23

SLOT PGSZ VALID SMEM NONE SOFF REF SWP NSW FORM BACK INOX TYPE FLAGS

12 1 1 1 0 0 11 0 0 15 5 154 stxt done

  1. 3 1 0 0 01 00 238 23 154 priv done

  2. 2 1 1 0 01 00 135 24 priv stack

Столбец pgsz определяет размер области в страницах, а столбец valid -число страниц этой области, находящихся в оперативной памяти. Как мож­но заметить, для сегментов данных и стека страниц недостаточно, поэтому может возникнуть ситуация, когда процессу потребуется обращение к адре­су, в настоящее время отсутствующему в памяти. Стол­бец inox содержит индексы таблиц inode, указывающие на метаданные файлов, откуда было загружено содержимое соответствующих сегментов.

Можно получить дополнительные сведения об этом файле:

$ inode 154

INODE TABLE SIZE = 472

SLOT MAJ/MIN FS INUMB RCNT LINK UID GID SIZE MODE MNT M/ST FLAGS

154 1,42 2 1562 3 1 123 56 8972 f---755 0 R130 tx

Из этой таблицы мы можем определить файловую систему, в которой рас­положен файл (maj/min), а также номер его дискового inode -inumb. В данном случае он равен 1562. Выполнив команду ncheck, можно узнать имя исполняемого файла, соответствующего исследуемому процессу:

$ ncheck -i 1562

/de/root:

1562 /home/andrei/CH3/test

3.3.5 Общая структура программы

Общая структура программы выглядит следующим образом:

#include <stdio.h> //стандартные заголовочные файлы

#include «my_file.h » //пользовательские заголовочные файлы

main (int argc, char* argv[]) //функция main и ее параметры

{

printfHello world!!!\n »); //стандартные функции my_printfHello_user!!!\n »); //пользовательские функции

return 0;

}

В приведенной структуре:

int argc - количество аргументов командной строки. Если программа запущена без аргументов argc = 1.

char* argv[] - массив указателей на аргументы командной строки,

argv[0] - всегда имя программы.

3.3.6 Программные каналы

Для организации взаимодействия между несколькими процессами путем передачи данных от одного процесса к другому в системе UNIX используются каналы. С точки зрения программы, канал есть некая сущность, обладающая двумя файловыми дескрипторами (ФД). Через один ФД процесс может записать информацию в канал, через другой ФД процесс может читать информацию из канала. Так как канал это нечто, связанное с файловыми дескрипторами, то канал может передаваться по наследству дочерним процессам. Это означает, что два родственных процесса могут обладать одним и тем же каналом, т.е. если один процесс запишет какую-то информацию в канал, то другой процесс может прочесть эту информацию из этого же канала.

Функции дублирования файловых дескрипторов

int dup(fd); int dup2(fd, to_fd);

int fd; int fd, to_fd,

Аргументом функции dup является файловый дескриптор открытого в данном процессе файла. Эта функция возвращает -1 в том случае, если обращение не проработало, и значение больше либо равное нулю, если работа функции успешно завершилась. Работа функции заключается в том, что осуществляется дублирование ФД в некоторый свободный ФД. Т.е. можно как бы продублировать открытый файл.

Функция dup2 дублирует файловый дескриптор fd в некоторый файловый дескриптор с номером to_fd. При этом, если при обращении к этой функции ФД, в который мы хотим дублировать, был занят, то происходит закрытие файла, работающего с этим ФД, и переопределение ФД. Рассмотрим пример:

int fd,

chars[80];

fd = open ("a.txt",O_RDONLY);

dup2 (fd,0);

close (fd);

gets (s,80);

Программа открывает файл с именем a.txt только на чтение. Файловый дескриптор, который будет связан с этим файлом, находится в fd. Далее программа обращается к функции dup2, в результате чего будет заменен стандартный ввод процесса на работу с файлом a.txt. Далее можно закрыть дескриптор fd. Функция gets прочтет очередную строку из файла a.txt.

Особенности работы с каналом

Под хранение информации передаваемой через канал выделяется некоторый фиксированный объем оперативной памяти. В некоторых системах этот буфер может быть продолжен на внешнюю память. Что происходит, если процесс хочет записать информацию в канал, но буфер переполнен, или прочесть информацию из канала, но в буфере нет еще данных? В обоих случаях процесс приостанавливает свое выполнение и дожидается, пока не освободится место либо, соответственно, пока в канале не появится информация. Надо заметить, что в этих случаях работа процесса может изменяться в зависимости от установленных параметров, которые можно менять программно. Для реализации каналов в системе используется функция pipe. Аргументом этой_функции должен быть указатель на массив двух целых переменных:

int pipe (pipes);

int pipes[2];

Нулевой элемент массива после обращения к функции pipe получает ФД для чтения, первый элемент этого массива получает ФД для записи. Если нет свободных ФД, то эта функция возвращает -1. Признак конца файла для считывающего дескриптора не будет получен до тех пор, пока не закрыты все дескрипторы, связанные с записью в этот канал.

Рассмотрим небольшой пример:

char *s = "Это пример";

char b[80];

int pipes[2];

pipe (pipes);

write (pipes[l],s, strlen(s)+l);

read (pipes[0],s, strlen(s)+l),

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

3.3.7 Сигналы

Ввзаимодействие между процессами можно осуществить с помощью приема-передачи сигналов. В системе Unix можно построить аналогию механизму прерываний из некоторых событий, которые могут возникать при работе процессов.

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

  • некоторое событие внутри программы, например, деление на ноль или переполнение;

  • событие, связанное с приходом некоторой информации от устройства, например, событие, связанное с передачей от клавиатуры комбинации "Ctrl+C";

  • событие, связанное с воздействием одного процесса на другой, например, "SIG_KILL".

Система имеет фиксированный набор событий, которые могут возникать. Каждое событие имеет свое уникальное имя, эти имена обычно едины для всех версий Unix. Такие имена называются сигналами. Перечень сигналов находится в include-файле "signal.h".

Прототип функции обработки сигнала:

void (* signal (sig, fun)) ()

int sig;

void (* fun) ();

При обращении к signal передаем: sig — имя сигнала; fun — указатель на функцию, которая будет обрабатывать событие, связанное с возникновением этого сигнала. Она возвращает указатель на предыдущую функцию обработки данного сигнала.

Событие, связанное с возникновением сигнала может быть обработано в системе тремя способами:

SIG_DEF — стандартная реакция на сигнал, которая предусмотрена системой;

SIG_IGN — игнорирование сигнала (следует отметить, что далеко не все сигналы можно игнорировать, например, SIG_KILL).

Еще две функции, которые необходимы для организации взаимодействия между процессами:

  • int kifl(int pid, sig) — это функция передачи сигнала процессу. Она работает следующим образом: процессу с номером pid осуществляется попытка передачи сигнала, значение которого равно sig. Соответственно, сигнал может быть передан в рамках процессов, принадлежащих одной группе. Код ответа: -1, если сигнал передать не удалось. Функция kill может использоваться для проверки существования процесса с заданным идентификатором. Если функция выполняется с sig=0, то это тестовый сигнал, который определяет - можно или не тпередать процессу сигнал, если можно, то код ответа kill отличен от "-1". Если pid=0, то заданный сигнал передается всем процессам, входящим в группу.

  • int wait(int *wail_rel). Ожидание события в дочернем процессе. Если его нет, то управление возвращается сразу же с кодом ответа "-1". Если в дочернем процессе возникло событие, то анализируются младшие 16 бит в значении wait_ret:

- если дочерний процесс приостановлен (трассировка или получение сигнала), тогда старшие 8 бит wait_ret - код сигнала, который получил дочерний процесс, а младшие содержат код 0177.

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

- если дочерний процесс завершился из-за возникновения у него необрабатываемого сигнала, то старшие 8 бит равны нулю, а младшие - номеру сигнала, который завершил процесс.

Функция wait возвращает идентификатор процесса в случае успешного выполнения и "-1" в противном случае. Если одно из перечисленных событий произошло до обращения к функции, то результат возвращается сразу же, то есть никакого ожидания не происходит, это говорит о том, что информация о событиях в процессе безвозвратно не теряется.

Рассмотрим пример многопроцессного взаимодействия.

alr()

{

printf ("\n Быстрее!!! \п");

signal (SIG_ALRM, alr);

}

main ()

{

char s[80];

int pid;

signal(SIG_ALRM, alr);

if (pid=fork())

for (;;)

{

sleep(5); kill(pid, SIG_ALRM); /* приостанавливаем процесс на 5 секунд

и отправляем сигнал SIG_ALRM

дочернему процессу */

}

printf ("имя?");

for (;;)

{

printf ("имя?");

if gets(s,80)!=NULL) break;

}

printf("OK!\n");

kill(getpid(), SIG_KILL); /* убиваем зациклившийся родительский процесс */

}

Следует заметить, что в разных версиях Unix имена сигналов могут различаться.

3.4 Порядок выполнения

1) * Выполняется под контролем преподавателя.

2) Вывод на экран «Hello world!!!»

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5288
Авторов
на СтудИзбе
417
Средний доход
с одного платного файла
Обучение Подробнее