Системное программирование в UNIX средствами Free Pascal



         

Пример работы с разделяемой памятью: программа shmcopy


В этом разделе создадим простую программу shmcopy для демонстрации практического использования разделяемой памяти. Программа shmcopy просто копирует данные со своего стандартного ввода на стандартный вывод, но позволяет избежать лишних простоев в вызовах fdread и fdwrite. При запуске программы shmcopy создаются два процесса, один из которых выполняет чтение, а другой – запись, и которые совместно используют два буфера, реализованных в виде сегментов разделяемой памяти. Когда первый процесс считывает данные в первый буфер, второй записывает содержимое второго буфера, и наоборот. Так как чтение и запись выполняются одновременно, пропускная способность возрастает. Этот подход используется, например, в программах, которые выводят информацию на ленточный накопитель.

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

Программа shmcopy использует следующий заголовочный файл share_ex.inc:

(* Заголовочный файл для примера работы с разделяемой памятью *)

const

  SHMKEY1:tkey=$10; (* ключ разделяемой памяти *)

  SHMKEY2:tkey=$15; (* ключ разделяемой памяти *)

  SEMKEY :tkey=$20; (* ключ семафора *)

  

  (* Размер буфера для чтения и записи *)

  BUFSIZ=8192;

  SIZ=5*BUFSIZ;

  

(* В этой структуре будут находиться данные и счетчик чтения *)

type

  databuf=record

    d_nread:integer;

    d_buf:array [0..SIZ-1] of char;

  end;

  pdatabuf=^databuf;

Напомним, что постоянная BUFSIZ определена в файле stdio и задает оптимальный размер порций данных при работе с файловой системой. Шаблон databuf показывает структуру, которая связывается с каждым сегментом разделяемой памяти. В частности, элемент d_nread позволит процессу, выполняющему чтение, передавать другому, осуществляющему запись, через участок разделяемой памяти число считанных символов.




Содержание  Назад  Вперед