- •Системное программное обеспечение
- •Разд. 1. Операционные системы и среды
- •Тема 1.1. Структура программного обеспечения вычислительной системы
- •Тема 1.2 Назначение, функции и структура операционной системы
- •1.2.1 Типы ос. Системы реального времени и операционные системы реального времени
- •Тема 1.3. Управление временем центрального процессора
- •Рекомендуется всегда проверять возвращаемое значение Res. Получение и использование процессом ссылок на себя
- •Использование потоков при разработке приложений
- •1.3.3 Синхронизация взаимодействующих потоков
- •Interlocked – функции.
- •Семафорные примитивы Дейкстры
- •Решение проблемы критических участков с помощью семафорных примитивов Дейкстры
- •1.3.4 Синхронизации потоков средствами операционной системы
- •Пример 2
- •Пример 3 Поток_1 Поток_2
- •1.3.5. Проблема тупиков и методы борьбы с тупиками
- •Взаимного исключения, при котором процессы имеют монопольный доступ к ресурсам;
- •Ожидания, при котором процесс, запрашивающий ресурс, ждет до тех пор, пока запрос не будет удовлетворен, удерживая ранее полученные ресурсы;
- •Методы борьбы с тупиками
- •Тема 1.4 Управление памятью
- •Защищенный режим процессоров Intel и его возможности
- •1.4.2. Реализация многозадачного режима в защищенном режиме процессоров фирмы Intel
- •Аппаратная поддержка многозадачности
- •Обработка прерываний в реальном режиме. Вектора прерываний.
- •Режимы работы мп 386
- •Системный режим
- •Особенности s – режима.
- •Организация виртуальной памяти
- •Управление страничной памятью в ос ms Windows
- •Линейный адрес
- •1.4.4. Разделы в виртуальном адресном пространстве процесса
- •Области применения dll
- •Основные dll ms Windows:
- •Создание dll
- •Использование dll (импорт функций из dll)
- •Неявная загрузка dll (неявное подключение)
- •Явная загрузка dll
- •Выполнение процедур инициализации и деинициализации Dll
- •Тема 1.6 Структура ms Windows и драйверы режима ядра
- •Тема 1.7 Управление вводом-выводом и файловые системы Win32
- •Эволюция файловых систем эвм
- •Раздел 2. Программирование в операционной среде
- •Тема 2.1. Ассемблеры и макроязыки
- •2.1.1. Этапы подготовки программы к выполнению
- •Операнды команд
- •Алгоритмы работы Ассемблеров
- •Двухпроходный Ассемблер - 1-й проход
- •2.1.2. Макроязыки
- •Заголовок макроопределения
- •Окончание макроопределения
- •Локальные переменные макроопределения
- •Присваивание значений переменным макроопределения
- •Оператор безусловного перехода и метки макроопределения
- •Тема 2.2.Трансляторы
- •2.3.1. Трансляторы. Компиляторы и интерпретаторы. Мобильность программного обеспечения
- •Тема 2.3 Формальные языки и грамматики
- •Синтаксический и лексический анализатор
- •Детерминированные и недетерминированные автоматы
- •Алгоритм синтаксического анализа
- •Пример 1
- •Пример 2
Использование потоков при разработке приложений
Большинство приложений обходятся единственным, первичным потоком.
Использование дополнительных потоков позволяет добиться минимального простоя процессора. За счет чего?
За счет переключения на другой поток во время пауз между вводом символов с клавиатуры;
За счет времени ожидания данных от внешних устройств.
Пример 1. В электронных таблицах нужно пересчитывать данные при изменении пользователем содержимого ячеек. Для этого можно выделить блок расчетов в отдельный поток. Пока пользователь вводит данные - расчет не ведется. Пауза - работает поток более высокого приоритета – выполняется пересчет.
Пример 2. – Текстовый процессор. Дополнительный поток используется для разбивки введенного документа на страницы.
Пример 3. При выполнении операций, отнимающих длительное время (копирование файлов) можно открыть диалоговое окно кнопкой «отмена» (допустим пользователь передумал или копирует не тот файл). Копирование должно выполняться отдельным потоком.
Появление процессоров, поддерживающих гипертрединг (Hyperthreding - многопоточность), и многоядерных процессоров делает многопопочность необходимым условием конкурентоспособности разрабатываемых приложений.
Влияние приоритета потока на время его выполнения
Поток получает время ЦП в соответствии с его приоритетом – чем выше приоритет, тем больше времени он получает боле высокий приоритет потока ещё не означает, что приложение в целом станет работать быстрее. Существенное влияние оказывает загрузка процессора.
1.3.3 Синхронизация взаимодействующих потоков
Независимые и взаимодействующие потоки
Потоки делятся на независимые (параллельные) и взаимодействующие.
Взаимодействовать могу конкурирующие потоки (имеющие доступ к общим переменным) и сотрудничающие потоки (реализующие схему «поставщик-потребитель»).
Пример 1: Два потока одного приоритета увеличивают значение общей переменной global следующим образом:
Поток 1 |
Поток 2 |
x:=global |
x:=global |
x:=x+1 |
x:=x+1 |
global:=x |
global:=x |
Если сначала работает поток 1, потом – 2, то в итоге переменная global увеличится на 2. если произойдет прерывание потока 1, то в итоге переменная global увеличится на 1.
Решения:
1. (global);
2. interlocked (increment(global)).
Критические участки
Если более чем один поток используют общие данные (переменная, массив, запись файла), возможны искажения данных. Эти искажения возникают, если потоки выполняют запись значений в совместно используемую переменную.
Если один поток использует критический ресурс, то другие потоки не должны его использовать, а должны быть переведены ОС в состояние блокировки.
Условный пример: Два потока имеют доступ к одному и тому же файлу.
Рисунок 1 -7
Поток 1: открывает запись, пишет в поля 1-4, и его квант времени заканчивается.
Поток 2: изменяет поля5-6, записывает изменения.
Поток 1: из буфера пишет в базу, и изменения, сделанные потоком 2, уничтожаются.
Другой, более наглядный и более простой пример: Два потока, переменная global: word; начальное значение переменной равно 100, каждый поток пытается увеличить значение переменной global на 1, следующим образом:
For I: =1 to 10 do
Begin
Sleep(5);
I: =global;
I: =i+1;
запись в ListBox1 I;
Global: =I;
end;
Поток 2 также имеет:
For I; =1 to 10 do
Begin
Sleep (2);
I: =global;
I: =i+1;
запись в ListBox2 I;
Global: =I;
end;
Будет ли в итоге global=120, если потоки стартуют одновременно?
Если поток 1 берет I:=102, прибавляет 1, будет 103, квант истек.
Поток 2 берет I:=102, прибавляет 1, запишет 103, поток 1 запишет 103. в обоих случаях могут быть разные значения, единица потеряна!
Простейшее решение – inc(global).
