Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мои шпоры ОСиСП(1).doc
Скачиваний:
32
Добавлен:
26.09.2019
Размер:
1.63 Mб
Скачать

1. Применение блокировок чтения-записи при взаимодействии потоков в ос unix.

Блокировки чтение-запись можно назвать интеллектуальным средством синхронизации, поскольку они делают различие между читателями и писателями. В большинстве случаев разделяемые данные чаще читают, чем изменяют (действительно, зачем писать то, что никто не будет читать?), и это делает блокировки чтение-запись весьма употребительными.

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

Применительно к блокировкам чтение-запись предоставляются следующие группы функций:

инициализация и разрушение блокировок: pthread_rwlock_init(), pthread_rwlock_destroy()

#include <pthread.h>

int pthread_rwlock_init (pthread_rwlock_t *restrict rwlock,

const pthread_rwlockattr_t *restrict attr);

int pthread_rwlock_destroy ( pthread_rwlock_t *rwlock);

установка блокировки на чтение: pthread_rwlock_rdlock(), pthread_rwlock_tryrdlock(), pthread_rwlock_timedrdlock()

#include <pthread.h>

int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock);

int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock);

#include <pthread.h>

#include <time.h>

int pthread_rwlock_timedrdlock (pthread_rwlock_t *restrict rwlock,

const struct timespec *restrict abstime);

установка блокировки на запись: pthread_rwlock_wrlock(), pthread_rwlock_trywrlock(), pthread_rwlock_timedwrlock()

#include <pthread.h>

int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock);

int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock);

#include <pthread.h>

#include <time.h>

int pthread_rwlock_timedwrlock ( pthread_rwlock_t *restrict rwlock,

const struct timespec *restrict abstime);

снятие блокировки чтение-запись: pthread_rwlock_unlock()

#include <pthread.h>

int pthread_rwlock_unlock ( pthread_rwlock_t *rwlock);

инициализация и разрушение атрибутных объектов блокировок: pthread_rwlockattr_init(), pthread_rwlockattr_destroy()

#include <pthread.h>

int pthread_rwlockattr_init (pthread_rwlockattr_t *attr);

int pthread_rwlockattr_destroy ( pthread_rwlockattr_t *attr);

опрос и установка атрибутов блокировок в атрибутных объектах: pthread_rwlockattr_getpshared(), pthread_rwlockattr_setpshared() (см.

#include <pthread.h>

int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *restrict attr,

int *restrict pshared);

int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared);

Тонким вопросом, связанным с блокировками чтение-запись, является взаимодействие читателей и писателей. Согласно стандарту POSIX-2001, если речь не идет о приложениях реального времени, то от реализации зависит, будет ли приостановлен поток управления при попытке установить блокировку на чтение при наличии ожидающих освобождения той же блокировки писателей. (Как правило, чтобы воспрепятствовать зависанию писателей, читателей в подобной ситуации «тормозят», иначе они так и будут

подхватывать блокировку друг у друга. Для политик планирования реального времени преимущество получает более приоритетный поток.)

Естественно, если блокировку установил писатель, читателю придется подождать. Если этим писателем оказался тот же поток, ждать придется долго. Параллельно одним или несколькими потоками управления может быть установлено несколько блокировок на чтение. Сколько раз устанавливали такую блокировку, столько же раз ее необходимо снять. (Установка блокировки писателем возможна только после последнего снятия.) Максимально допустимое число одновременно установленных блокировок на чтение зависит от реализации.

Когда снимают блокировку, на которую претендуют и читатели, и писатели, как правило, преимущество получают писатели, но, строго говоря, решение зависит от реализации.

Разумеется, снимать блокировку может только тот поток управления, который ее устанавливал; в противном случае поведение неопределено.

Можно видеть, что в данном случае оптимистичное применение блокировок чтение-запись без приостановки выполнения в случае невозможности немедленной установки себя полностью оправдало.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]