Операционная система UNIX

На нашем литературном портале можно бесплатно читать книгу Операционная система UNIX, Робачевский Андрей Михайлович-- . Жанр: ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Операционная система UNIX
Название: Операционная система UNIX
Дата добавления: 16 январь 2020
Количество просмотров: 437
Читать онлайн

Операционная система UNIX читать книгу онлайн

Операционная система UNIX - читать бесплатно онлайн , автор Робачевский Андрей Михайлович

Книга посвящена семейству операционных систем UNIX и содержит информацию о принципах организации, идеологии и архитектуре, объединяющих различные версии этой операционной системы.

В книге рассматриваются: архитектура ядра UNIX (подсистемы ввода/вывода, управления памятью и процессами, а также файловая подсистема), программный интерфейс UNIX (системные вызовы и основные библиотечные функции), пользовательская среда (командный интерпретатор shell, основные команды и утилиты) и сетевая поддержка в UNIX (протоколов семейства TCP/IP, архитектура сетевой подсистемы, программные интерфейсы сокетов и TLI).

Для широкого круга пользователей.

 

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 77 78 79 80 81 82 83 84 85 ... 156 ВПЕРЕД
Перейти на страницу:

 exit(0);

}

Клиент:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include "mesg.h"

main {

 /* Структура нашего сообщения (может отличаться от

    структуры msgbuf */

 Message message;

 key_t key;

 int msgid, length;

 /* Тип посылаемого сообщения, может использоваться для

    мультиплексирования */

 message.mtype = 1L;

 /* Получим ключ */

 if ((key = ftok("server", 'A')) < 0) {

  printf("Невозможно получить ключn");

  exit(1);

 }

 /* Получим доступ к очереди сообщений, очередь уже

    должна быть создана сервером */

 if ((msgid = msgget(key, 0)) < 0) {

  printf("Невозможно получить доступ к очередиn");

  exit(1);

 }

 /* Поместим строку в сообщение */

 if ((length = sprintf(message.buff,

  "Здравствуй, Мир!n")) < 0) {

  printf("Ошибка копирования в буферn");

  exit(1);

 } /* Передадим сообщение */

 if (msgsnd(msgid, (void*)&message, length, 0) != 0) {

  printf("Ошибка записи сообщения в очередьn");

  exit(1);

 }

 /* Удалим очередь сообщений */

 if (msgctl(msgid, IPC_RMID, 0) < 0) {

  printf("Ошибка удаления очередиn");

  exit(1);

 }

 exit(0);

}

Семафоры

Для синхронизации процессов, а точнее, для синхронизации доступа нескольких процессов к разделяемым ресурсам, используются семафоры. Являясь одной из форм IPC, семафоры не предназначены для обмена большими объемами данных, как в случае FIFO или очередей сообщений. Вместо этого, они выполняют функцию, полностью соответствующую своему названию — разрешать или запрещать процессу использование того или иного разделяемого ресурса.

Применение семафоров поясним на простом примере. Допустим, имеется некий разделяемый ресурс (например, файл). Необходимо блокировать доступ к ресурсу для других процессов, когда некий процесс производит операцию над ресурсом (например, записывает в файл). Для этого свяжем с данным ресурсом некую целочисленную величину — счетчик, доступный для всех процессов. Примем, что значение 1 счетчика означает доступность ресурса, 0 — его недоступность. Тогда перед началом работы с ресурсом процесс должен проверить значение счетчика. Если оно равно 0 — ресурс занят и операция недопустима — процессу остается ждать. Если значение счетчика равно 1 — можно работать с ресурсом. Для этого, прежде всего, необходимо заблокировать ресурс, т. е. изменить значение счетчика на 0. После выполнения операции для освобождения ресурса значение счетчика необходимо изменить на 1. В приведенном примере счетчик играет роль семафора.

Для нормальной работы необходимо обеспечить выполнение следующих условий:

1. Значение семафора должно быть доступно различным процессам. Поэтому семафор находится не в адресном пространстве процесса, а в адресном пространстве ядра.

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

Таким образом семафоры являются системным ресурсом, действия над которым производятся через интерфейс системных вызовов.

Семафоры в System V обладают следующими характеристиками:

□ Семафор представляет собой не один счетчик, а группу, состоящую из нескольких счетчиков, объединенных общими признаками (например, дескриптором объекта, правами доступа и т.д.).

□ Каждое из этих чисел может принимать любое неотрицательное значение в пределах, определенных системой (а не только значения 0 и 1).

Для каждой группы семафоров (в дальнейшем мы будем называть группу просто семафором) ядро поддерживает структуру данных

semid_ds
, включающую следующие поля:

struct ipc_perm sem_perm
Описание прав доступа
struct sem *sem_base
Указатель на первый элемент массива семафоров
ushort sem_nsems
Число семафоров в группе
time_t sem_otime
Время последней операции
time_t sem_ctime
Время последнего изменения

Значение конкретного семафора из набора хранится во внутренней структуре

sem
:

ushort semval
Значение семафора
pid_t sempid
Идентификатор процесса, выполнившего последнюю операцию над семафором
ushort semncnt
Число процессов, ожидающих увеличения значения семафора
ushort semzcnt
Число процессов, ожидающих обнуления семафора
1 ... 77 78 79 80 81 82 83 84 85 ... 156 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название