Главная страница Взаимодействие нетривиальных процессов увеличению порядкового номера новой версией программы, оно окажется примерно в 80 раз больше, чем для локального файла. Однако нужно понимать, что в этом случае происходит передача информации по сети и при операциях чтения и записи (для изменения порядкового номера). ПРИМЕЧАНИЕ Блокировка записей в NFS была связана с проблемами в течение многих лет, и большинство проблем были следствием плохой реализации. Несмотря натот факт, что большинство производителей Unix все-таки доделали эту реализацию, использование блокировки fcntl через NFS все еще далеко от совершенства. Не будем делать безответственных утверждений: блокировка fcntl должна работать и в NFS, но будет ли - зависит от реализации демона и сервера. 9.10. Резюме Блокирование записей с помощью fcntl предоставляет возможность установки рекомендательной или обязательной блокировки для файла, указываемого с помощью открытого дескриптора. Эти блокировки предназначены для сотрудничества процессов, но не отдельных потоков одного процесса. Термин запись используется не вполне корректно, поскольку ядро не различает отдельные записи в файле. Лучше использовать термин блокировка диапазона , поскольку при установке блокировки или ее снятии указывается именно диапазон байтов в файле. Практически во всех случаях применения этой блокировки она является рекомендательной и используется при совместной работе сотрудничающих процессов, поскольку даже обязательная блокировка не может исключить повреждения данных. При использовании fcntl не гарантируется, что читающие или пишущие процессы имеют приоритет при ожидании (в отличие от того, что мы реализовали в главе 8 с блокировками чтения-записи). Если это важно для приложения, придется реализовать блокировки самостоятельно (как в разделе 8.4) с тем приоритетом, который требуется. Упражнения 1. Создайте программу 1 оскпопе из листингов 9.2 и 9.1 и выполните ее много раз. Убедитесь, что программа не работает и результат непредсказуем. 2. Измените листинг 9.2 так, чтобы стандартный поток вывода не буферизовался. Как это повлияет на работу программы? 3. Продолжайте изменять программу, вызывая putchar для каждого выводимого символа (вместо printf). Как изменится результат? 4. Измените блокировку в функции ту 1 оск из листинга 9.3 так, чтобы устанавливалась блокировка на чтение, а не на запись. Что произойдет? 5. Измените вызов open в программе loopmain.c, указав также фшт D NDNBLDCK. Создайте программу loopfcntlnonb и запустите два экземпляра. Что произойдет? 6. Продолжите предьщущий пример, используянеблокируемую версию 1 oopmai п. с для создания программы loopnonenonb (используя файл locknone.с). Включите обязательную блокировку для файла seqno. Запустите один экземпляр этой программы и один экземпляр программы loopfcntlnonb из предыдущего примера одновременно. Что произойдет? 7. Создайте программу 1 oopfcntl и запустите ее 10 раз в фоновом режиме из сценария интерпретатора команд. Каждому из 10 экземпляров следует указать аргумент 10 ООО. Измерьте скорость работы сценария при использовании обязательной и рекомендательной блокировок. Как влияет обязательная блокировка на производительность? 8. Почему мы вызывали fork в листингах 9.6 и 9.7 для порождения процессов, вместо того чтобы воспользоваться pthгead cгeateдля создания потоков? 9. В листинге 9.9 мы вызываем ftruncate для установки размера файла в О байт. Почему бы нам просто не указать флаг D TRUNC при открытии файла? 10. Какой из констант - SEEK SET, SEEK CUR или SEEK END - следует пользоваться при указании блокируемого диапазона при написании многопоточного приложения и почему? ГЛАВА 10 Семафоры Posix 10.1. Введение Семафор представляет собой простейшее средство синхронизации процессов и потоков. Мы рассматриваем три типа семафоров: ш именованные семафоры Posix, идентифицируемые именами, соответствующими стандарту Posix для IPC (см. раздел 2.2); it размещаемые в разделяемой памяти семафоры Posix; Ш семафоры System V (глава 11), обслуживаемые ядром. Все три типа семафоров могут использоваться для синхронизации как отдельных процессов, так и потоков одного процесса. Мы начнем с рассмотрения проблем синхронизации между разными процессами с помощью бинарного семафора, то есть такого, который может принимать только значения О и 1. Пример подобной схемы приведен на рис. 10.1. процесс А процесс В функции для создания, установки значения и ожидания изменения состояния семафора (create, post, wait) семафор: О или 1 Рис. 10.1. Два процесса взаимодействуют с помощью бинарного семафора На этом рисунке изображен бинарный семафор, хранящийся в ядре (семафор System V). Семафоры Posix не обязательно должны обрабатываться ядром. Их особенностью является наличие имен, которые могут соответствовать именам реальных файлов в файловой системе. На рис. 10.2 изображена схема, лучше иллюстрирующая предмет обсуждения данной главы - именованный семафор Posix.
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |