- •Методические указания к лабораторным работам по дисциплине «Операционные системы» Содержание
- •Раздел 5. Управление памятью в ос
- •Раздел 8. Управление файлами и доступом к объектам ос
- •Введение
- •Разделы 3 и 4. Параллельное выполнение и взаимодействие программ в ос
- •1. Создание и уничтожение потоков
- •Общие сведения
- •Указания к выполнению работы
- •Вопросы для самопроверки
- •2. Синхронизация потоков с помощью мьютексов и неименованных семафоров
- •Общие сведения
- •Устранение блокировок
- •Указания к выполнению работы
- •Вопросы для самопроверки
- •3. Взаимодействие потоков через неименованные каналы
- •Общие сведения
- •Устранение блокировок
- •Указания к выполнению работы
- •Шаблон программы представлен ниже:
- •Вопросы для самопроверки
- •4. Создание и уничтожение процессов
- •Общие сведения
- •Указания к выполнению работы
- •Вопросы для самопроверки
- •5. Синхронизация процессов с помощью именованных семафоров
- •Общие сведения
- •Указания к выполнению работы
- •Вопросы для самопроверки
- •Раздел 5. Управление памятью в ос
- •6. Взаимодействие процессов через разделяемую память
- •Общие сведения
- •Указания к выполнению работы
- •Вопросы для самопроверки
- •Разделы 6. Управление внутренними коммуникациями в ос
- •7. Взаимодействие процессов через именованные каналы
- •Общие сведения
- •Указания к выполнению работы
- •Вопросы для самопроверки
- •8. Взаимодействие процессов через очереди сообщений
- •Общие сведения
- •Указания к выполнению работы
- •Вопросы для самопроверки
- •Разделы 7. Управление внешними коммуникациями в ос
- •9. Сетевое взаимодействие процессов через сокеты
- •Общие сведения
- •Указания к выполнению работы
- •Вопросы для самопроверки
- •Раздел 8. Управление файлами и доступом к объектам ос
- •10. Программный интерфейс пространств имен
- •Общие сведения
- •Указания к выполнению работы
- •Вопросы для самопроверки
Устранение блокировок
Если поток, захвативший ресурс, завершится, не освободив его, например, аварийно, то потоки, ожидающие ресурс, т.е. вызвавшие операции pthread_mutex_lock() или sem_wait(), так и останутся в заблокированном состоянии.
Устранить проблему позволяют неблокирующие операции проверки занятости ресурсов.
Для мьютексов это следующие операции:
int pthread_mutex_trylock(pthread_mutex_t *mutex);
Если ресурс свободен, то функция работает также как и функция pthread_mutex_lock(). Если ресурс занят, то функция не блокируется в ожидании освобождения ресурса, а сразу же возвращает управление с кодом ошибки EBUSY.
int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abs_timeout);
Если ресурс свободен, то функция работает также как и функция pthread_mutex_lock(). Если ресурс занят, то функция блокируется в ожидании освобождения ресурса до времени abs_timeout. Если в течение времени ожидания ресурс не освободится, функция завершается с кодом ошибки ETIMEDOUT.
Важной особенностью последней функции является использование в качестве второго параметра абсолютного времени. Т.е. перед вызовом данной функции необходимо получить текущее время, прибавить к нему требуемое время ожидания и передать это время в функцию.
Для получения текущего времени можно использовать функцию:
int clock_gettime(clockid_t clk_id, struct timespec *tp);
где:
clockid_t clk_id тип часов, например, CLOCK_REALTIME,
время задается в виде структуры:
struct timespec {
time_t tv_sec; /* секунды */
long tv_nsec; /* наносекунды */
};
Например, чтобы получить время ожидания 1 сек, надо выполнить следующие действия:
вызовом clock_gettime получить время в структуру tp,
выполнить операцию tp.tv_sec += 1,
передать модифицированное значение tp в функцию pthread_mutex_timedlock.
Для семафоров неблокирующими являются следующие функции:
int sem_trywait(sem_t *sem);
Если ресурс свободен, то функция работает также как и функция sem_wait(). Если ресурс занят, то функция не блокируется в ожидании освобождения ресурса, а сразу же возвращает управление с кодом ошибки EAGAIN.
И функция:
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
Время ожидания устанавливается аналогично предыдущему варианту.
Указания к выполнению работы
Написать программу, содержащую два потока, осуществляющих координированный доступ к разделяемому ресурсу. В качестве разделяемого ресурса в данной работе выбирается экран.
Необходимо убедиться, что в случае отсутствия мьютекса (семафора) потоки выводят символы в произвольном порядке, например:
121212121212121212121212121212121212121212121212121212121212121.
В случае использования мьютекса (семафора) потоки выводят символы в определенном порядке, например:
111111111122222222221111111111222222222211111111112222222222.
Студент согласовывает с преподавателем средство координации доступа к ресурсу – мьютекс или семафор.
В обоих случаях студент реализует три варианта программы:
С блокирующей операцией захвата мьютекса (семафора) pthread_mutex_lock() (sem_wait());
С операцией проверки захвата мьютекса (семафора) без блокировки pthread_mutex_trylock() (sem_trywait());
С блокировкой на время операции захвата мьютекса (семафора) pthread_mutex_timedlock() (sem_timedwait()).
Шаблон программы представлен ниже:
объявить флаг завершения потока 1;
объявить флаг завершения потока 2;
объявить идентификатор мьютекса /*неименованного семафора*/;
функция потока 1()
{
пока (флаг завершения потока 1 не установлен)
{
захватить мьютекс /*неименованный семафор*/;
в цикле несколько раз выполнять
{
выводить символ ‘1’ на экран;
задержать на время;
}
освободить мьютекс /*неименованный семафор*/;
задержать на время;
}
}
функция потока 2()
{
пока (флаг завершения потока 2 не установлен)
{
захватить мьютекс /*неименованный семафор*/;
в цикле несколько раз выполнять
{
выводить символ ‘2’ на экран;
задержать на время;
}
освободить мьютекс /*неименованный семафор*/;
задержать на время;
}
}
основная программа()
{
объявить идентификатор потока 1;
объявить идентификатор потока 2;
инициализировать мьютекс /*неименованный семафор*/;
создать поток из функции потока 1;
создать поток из функции потока 2;
ждать нажатия клавиши;
установить флаг завершения потока 1;
установить флаг завершения потока 2;
ждать завершения потока 1;
ждать завершения потока 2;
удалить мьютекс /*неименованный семафор*/;
}