Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 74 стр.

UptoLike

Составители: 

74
Этим достигается уверенность в том, что структуры данных, считываемые из
захваченного участка, никем не модифицируются, поэтому гарантирована их
целостность и непротиворечивость. В свою очередь, блокировка на запись запрещает
всем, кроме блокирующего процесса, любой доступ к заблокированному участку файла.
Это означает, что данный участок файла сейчас будет модифицироваться, и
целостность данных в нем не гарантирована.
В Linux возможны два режима блокировки: допустимая (advisory) и
обязательная (mandatory). Как та, так и другая блокировка может быть блокировкой на
чтение либо на запись. Допустимая блокировка являетсяблокировкой для честных”:
она не оказывает влияния на подсистему ввода/вывода, поэтому программа, не
проверяющая блокировок или игнорирующая их, сможет писать или читать из
заблокированного участка без проблем.
Обязательная блокировка требует больших накладных расходов, но запрещает
физический доступ к файлу: чтение или запись, в зависимости от типа блокировки.
При работе с разделяемыми структурами данных в ОЗУ было бы удобно иметь
аналогичные средства, но их реализация ведет к большим накладным расходам, даже на
системах с виртуальной памятью, поэтому ни одна из известных авторам систем таких
средств не предоставляет. Впрочем, в современных версиях системы UNIX есть
возможность отображать файл на виртуальную память. Используя при этом
допустимую блокировку участков файла, программы могут синхронизовать доступ к
нему (обязательная блокировка делает невозможным отображение на память).
Гармонически взаимодействующие последовательные процессы
Разделяемые структуры данных являются источником серьезных ошибок при
разработке программ. Легко показать, что критические секции может иметь только
программа, работающая с разделяемыми структурами данных. И этими критическими
секциями как раз и являются места, где программа модифицирует такие структуры или
просто обращается к ним. Синхронизация доступа к разделяемым структурам часто
приводит к усложнению программы, а стремление сократить участки исключительного
доступа - к ошибкам.
Желание устранить эти проблемы привело в свое время Дийкстру к концепции,
известной как гармонически взаимодействующие последовательные процессы. Эта
концепция состоит в следующем:
Каждый процесс представляет собой независимый программный модуль, для
которого создается иллюзия чисто последовательного исполнения;
Процессы не имеют разделяемых данных;
Все обмены данными, и вообще взаимодействие, происходят в выделенных
точках процессов.
В этих точках процесс, передающий данные, останавливается и ждет, пока его
партнер будет готов эти данные принять. В некоторых реализациях UNIX процесс-
передатчик может не ожидать приема, а просто складывать данные в системный буфер.
Аналогично, процесс, принимающий данные, ожидает, пока ему передадут данные.
Иными словами, все передачи данных неразрывно связаны с синхронизацией.
Синхронизация, не сопровождающаяся передачей данных, просто лишена
смысла - процессы, не имеющие разделяемых структур данных, совершенно
независимы и не имеют ни критических точек, ни нереентерабельных модулей.
Концепция гармонически взаимодействующих процессов очень привлекательна
с теоретической точки зрения и позволяет легко писать правильные программы. Однако
часто по соображениям производительности оказывается невозможно отказаться от
        Этим достигается уверенность в том, что структуры данных, считываемые из
захваченного участка, никем не модифицируются, поэтому гарантирована их
целостность и непротиворечивость. В свою очередь, блокировка на запись запрещает
всем, кроме блокирующего процесса, любой доступ к заблокированному участку файла.
Это означает, что данный участок файла сейчас будет модифицироваться, и
целостность данных в нем не гарантирована.
        В Linux возможны два режима блокировки: допустимая (advisory) и
обязательная (mandatory). Как та, так и другая блокировка может быть блокировкой на
чтение либо на запись. Допустимая блокировка является “блокировкой для честных”:
она не оказывает влияния на подсистему ввода/вывода, поэтому программа, не
проверяющая блокировок или игнорирующая их, сможет писать или читать из
заблокированного участка без проблем.
        Обязательная блокировка требует больших накладных расходов, но запрещает
физический доступ к файлу: чтение или запись, в зависимости от типа блокировки.
        При работе с разделяемыми структурами данных в ОЗУ было бы удобно иметь
аналогичные средства, но их реализация ведет к большим накладным расходам, даже на
системах с виртуальной памятью, поэтому ни одна из известных авторам систем таких
средств не предоставляет. Впрочем, в современных версиях системы UNIX есть
возможность отображать файл на виртуальную память. Используя при этом
допустимую блокировку участков файла, программы могут синхронизовать доступ к
нему (обязательная блокировка делает невозможным отображение на память).

        Гармонически взаимодействующие последовательные процессы
        Разделяемые структуры данных являются источником серьезных ошибок при
разработке программ. Легко показать, что критические секции может иметь только
программа, работающая с разделяемыми структурами данных. И этими критическими
секциями как раз и являются места, где программа модифицирует такие структуры или
просто обращается к ним. Синхронизация доступа к разделяемым структурам часто
приводит к усложнению программы, а стремление сократить участки исключительного
доступа - к ошибкам.
        Желание устранить эти проблемы привело в свое время Дийкстру к концепции,
известной как гармонически взаимодействующие последовательные процессы. Эта
концепция состоит в следующем:
       • Каждый процесс представляет собой независимый программный модуль, для
           которого создается иллюзия чисто последовательного исполнения;
       • Процессы не имеют разделяемых данных;
       • Все обмены данными, и вообще взаимодействие, происходят в выделенных
           точках процессов.
        В этих точках процесс, передающий данные, останавливается и ждет, пока его
партнер будет готов эти данные принять. В некоторых реализациях UNIX процесс-
передатчик может не ожидать приема, а просто складывать данные в системный буфер.
Аналогично, процесс, принимающий данные, ожидает, пока ему передадут данные.
Иными словами, все передачи данных неразрывно связаны с синхронизацией.
        Синхронизация, не сопровождающаяся передачей данных, просто лишена
смысла - процессы, не имеющие разделяемых структур данных, совершенно
независимы и не имеют ни критических точек, ни нереентерабельных модулей.
        Концепция гармонически взаимодействующих процессов очень привлекательна
с теоретической точки зрения и позволяет легко писать правильные программы. Однако
часто по соображениям производительности оказывается невозможно отказаться от


       74