Архитектура операционной системы UNIX - [160]
11.2.3 Семафоры
Системные функции работы с семафорами обеспечивают синхронизацию выполнения параллельных процессов, производя набор действий единственно над группой семафоров (средствами низкого уровня). До использования семафоров, если процессу нужно было заблокировать некий ресурс, он прибегал к созданию с помощью системной функции creat специального блокирующего файла. Если файл уже существовал, функция creat завершалась неудачно, и процесс делал вывод о том, что ресурс уже заблокирован другим процессом. Главные недостатки такого подхода заключались в том, что процесс не знал, в какой момент ему следует предпринять следующую попытку, а также в том, что блокирующие файлы случайно оставались в системе в случае ее аварийного завершения или перезагрузки.
Дийкстрой был опубликован алгоритм Деккера, описывающий реализацию семафоров как целочисленных объектов, для которых определены две элементарные операции: P и V (см. [Dijkstra 68]). Операция P заключается в уменьшении значения семафора в том случае, если оно больше 0, операция V — в увеличении этого значения (и там, и там на единицу). Поскольку операции элементарные, в любой момент времени для каждого семафора выполняется не более одной операции P или V. Связанные с семафорами системные функции являются обобщением операций, предложенных Дийкстрой, в них допускается одновременное выполнение нескольких операций, причем операции уменьшения и увеличения выполняются над значениями, превышающими 1. Ядро выполняет операции комплексно; ни один из посторонних процессов не сможет переустанавливать значения семафоров, пока все операции не будут выполнены. Если ядро по каким-либо причинам не может выполнить все операции, оно не выполняет ни одной; процесс приостанавливает свою работу до тех пор, пока эта возможность не будет предоставлена.
Семафор в версии V системы UNIX состоит из следующих элементов:
• Значение семафора,
• Идентификатор последнего из процессов, работавших с семафором,
• Количество процессов, ожидающих увеличения значения семафора,
• Количество процессов, ожидающих момента, когда значение семафора станет равным 0.
Для создания набора семафоров и получения доступа к ним используется системная функция semget, для выполнения различных управляющих операций над набором — функция semctl, для работы со значениями семафоров — функция semop.
>#include ‹sys/types.h›
>#include ‹sys/ipc.h›
>#include ‹sys/shm.h›
>#define SHMKEY 75
>#define K 1024
>int shmid;
>main() {
> int i, *pint;
> char *addr1, *addr2;
> extern char *shmat();
> extern cleanup();
> for (i = 0; i ‹ 20; i++) signal(i, cleanup);
> shmid = shmget(SHMKEY, 128*K, 0777IPC_CREAT);
> addr1 = shmat(shmid, 0, 0);
> addr2 = shmat(shmid, 0, 0);
> printf("addr1 0x%x addr2 0x%x\n", addr1, addr2);
> pint = (int *) addr1;
> for (i = 0; i ‹ 256, i++) *pint++ = i;
> pint = (int *) addr1;
> *pint = 256;
> pint = (int *) addr2;
> for (i = 0; i ‹ 256, i++) printf("index %d\tvalue %d\n", i, *pint++);
> pause();
>}
>cleanup() {
> shmctl(shmid, IPC_RMID, 0);
> exit();
>}
Рисунок 11.11. Присоединение процессом одной и той же области разделяемой памяти дважды
>#include ‹sys/types.h›
>#include ‹sys/ipc.h›
>#include ‹sys/shm.h›
>#define SHMKEY 75
>#define K 1024
>int shmid;
>main() {
> int i, *pint;
> char *addr;
> extern char *shmat();
> shmid = shmget(SHMKEY, 64*K, 0777);
> addr = shmat(shmid, 0, 0);
> pint = (int *) addr;
> while (*pint == 0);
> for (i = 0; i ‹ 256, i++) printf("%d\n", *pint++);
>}
Рисунок 11.12. Разделение памяти между процессами
Рисунок 11.13. Структуры данных, используемые в работе над семафорами
Синтаксис вызова системной функции semget:
id = semget(key, count, flag);
где key, flag и id имеют тот же смысл, что и в других механизмах взаимодействия процессов (обмен сообщениями и разделение памяти). В результате выполнения функции ядро выделяет запись, указывающую на массив семафоров и содержащую счетчик count (Рисунок 11.13). В записи также хранится количество семафоров в массиве, время последнего выполнения функций semop и semctl. Системная функция semget на Рисунке 11.14, например, создает семафор из двух элементов.
Синтаксис вызова системной функции semop:
oldval = semop(id, oplist, count);
где id — дескриптор, возвращаемый функцией semget, oplist — указатель на список операций, count — размер списка. Возвращаемое функцией значение oldval является прежним значением семафора, над которым производилась операция. Каждый элемент списка операций имеет следующий формат:
• номер семафора, идентифицирующий элемент массива семафоров, над которым выполняется операция,
• код операции,
• флаги.
>#include ‹sys/types.h›
>#include ‹sys/ipc.h›
>#include ‹sys/sem.h›
>#define SEMKEY 75
>int semid;
>unsigned int count;
>/* определение структуры sembuf в файле sys/sem.h
>struct sembuf {
> unsigned shortsem_num;
> short sem_op;
> short sem_flg;
>}
>; */
>struct sembuf psembuf, vsembuf;
>/* операции типа P и V */
>main(argc, argv)
>int argc;
>char *argv[];
>{
> int i, first, second;
> short initarray[2], outarray[2];
> extern cleanup();
> if (argc == 1) {
> for (i = 0; i ‹ 20; i++) signal(i,cleanup);
> semid = semget(SEMKEY, 2, 0777IPC_CREAT);
> initarray[0] = initarray[1] = 1;
Одно из немногих изданий на русском языке, которое посвящено старейшей глобальной компьютерной сети "Fidonet". Сатирический справочник о жизни и смерти самого древнего сетевого сообщества, которое до сих пор существует среди нас.
В пособии излагаются основные тенденции развития организационного обеспечения безопасности информационных систем, а также подходы к анализу информационной инфраструктуры организационных систем и решению задач обеспечения безопасности компьютерных систем.Для студентов по направлению подготовки 230400 – Информационные системы и технологии (квалификация «бакалавр»).
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями shell.Для программистов-пользователей операционной системы UNIX.
Книга адресована программистам, работающим в самых разнообразных ОС UNIX. Авторы предлагают шире взглянуть на возможности параллельной организации вычислительного процесса в традиционном программировании. Особый акцент делается на потоках (threads), а именно на тех возможностях и сложностях, которые были привнесены в технику параллельных вычислений этой относительно новой парадигмой программирования. На примерах реальных кодов показываются приемы и преимущества параллельной организации вычислительного процесса.
Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.
Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.