Почему windows называют многозадачной средой

Windows — одна из наиболее популярных операционных систем в мире. Одной из главных особенностей Windows является ее способность выполнять несколько задач одновременно, что делает ее многозадачной системой. Несмотря на то, что и другие операционные системы, такие как macOS и Linux, также обладают этой возможностью, Windows выделяется своей эффективностью и гибкостью.

Важным аспектом многозадачности в Windows является способность операционной системы эффективно распределять ресурсы между различными задачами. Windows имеет специальный менеджер задач, который контролирует и оптимизирует использование центрального процессора, памяти и дискового пространства. Он автоматически распределяет ресурсы между запущенными программами и приложениями, чтобы обеспечить плавную работу системы.

Windows также предлагает широкий спектр инструментов и функций для работы с несколькими задачами одновременно. Например, пользователь может воспользоваться многооконным режимом, открывая несколько окон одновременно и переключаясь между ними с помощью мыши или клавиатуры. Он также может использовать функцию «Горячие клавиши», чтобы быстро переключаться между запущенными приложениями. Это очень удобно и позволяет эффективно управлять несколькими задачами одновременно.

Вывод: благодаря своей многозадачной природе, Windows обеспечивает комфортное и эффективное использование компьютера. Она позволяет пользователю одновременно выполнять несколько задач, обрабатывать большое количество информации и максимально раскрыть потенциал своего устройства.

Содержание

  1. Windows — многозадачная операционная система
  2. Гибкость и мощность Windows
  3. Богатый функционал ОС Windows

Windows — многозадачная операционная система

Операционная система Windows поддерживает многозадачность как на уровне аппаратуры, так и на уровне программного обеспечения. Виртуальная память и планировщик задач позволяют пользователям запускать и выполнять несколько приложений одновременно без необходимости ожидания окончания работы предыдущих.

Windows также обладает гибким интерфейсом, который позволяет пользователям легко переключаться между открытыми окнами и приложениями. Операционная система предоставляет такие функции, как окна, панели задач и меню пуск, чтобы облегчить навигацию и выполнение задач в многозадачной среде.

Благодаря многозадачности Windows, пользователи могут одновременно работать с несколькими приложениями, например, открывать браузер, работать с текстовым редактором, слушать музыку или просматривать фотографии. Выполнение нескольких задач одновременно помогает повысить производительность и эффективность работы пользователей.

В заключение, Windows является многозадачной операционной системой, которая предоставляет пользователям возможность выполнять несколько задач одновременно. Эта особенность делает ее популярным выбором как для домашнего использования, так и для коммерческого использования, обеспечивая эффективность и удобство работы.

Гибкость и мощность Windows

Одной из ключевых особенностей Windows является возможность запуска множества приложений одновременно. Благодаря механизму виртуальной памяти, операционная система способна разделить ресурсы компьютера между различными задачами, предоставляя каждому приложению необходимую область памяти. Это позволяет пользователям выполнять одновременно различные задачи, такие как работа с текстовым редактором, прослушивание аудиофайлов и пользование интернетом.

Windows также обладает качественным менеджером задач, который позволяет пользователю просматривать активные процессы, управлять ими и завершать ненужные задачи. Благодаря этому пользователь может легко контролировать и управлять работой системы.

Операционная система Windows также обеспечивает высокую степень совместимости с различным программным обеспечением. Большинство приложений, разработанных для Windows, могут запускаться на различных версиях операционной системы без изменений. Это позволяет пользователям выбирать наиболее подходящую версию Windows для своих нужд и использовать программное обеспечение без проблем.

Кроме того, Windows поддерживает широкий спектр аппаратных устройств. Операционная система обеспечивает драйверы для различных видов оборудования, а также предоставляет инструменты разработчикам для создания собственных драйверов. Это делает Windows универсальной операционной системой, которая может быть установлена на большинство компьютеров и устройств.

В целом, гибкость и мощность Windows делают ее идеальным выбором для пользователей, которые нуждаются в многозадачности и возможности работы с различным программным и аппаратным обеспечением.

Богатый функционал ОС Windows

Одна из ключевых особенностей Windows — это способность работать сразу с несколькими приложениями и задачами одновременно. Операционная система обладает мощной системой управления памятью и распределением ресурсов, что позволяет ей эффективно переключаться между различными задачами без значительного снижения производительности. Это позволяет пользователям выполнять одновременно несколько задач, таких как просмотр видео, браузинг веб-сайтов и работа с офисными приложениями, без задержек и прерываний.

Windows также предлагает множество инструментов для управления задачами и приложениями. Панель задач позволяет быстро переключаться между открытыми приложениями и окнами, а также отображает значки приложений, уведомления и системные индикаторы. Пользователи могут легко изменять размер и расположение окон, а также использовать функцию «Snap» для быстрого выравнивания окон по краям экрана или разделению экрана на две части для параллельной работы с двумя приложениями.

Windows также поддерживает множество расширенных функций многозадачности, таких как виртуальные рабочие столы. Пользователи могут создавать несколько независимых рабочих столов, на каждом из которых могут открыться отдельные приложения и окна. Это позволяет легко организовать рабочий процесс и переключаться между различными задачами и проектами.

Кроме того, ОС Windows предлагает множество интегрированных приложений и инструментов, которые расширяют ее возможности многозадачности. Это включает в себя приложение Task Manager для управления процессами и ресурсами, а также возможность запускать виртуальные машины и подсистемы, такие как Windows Subsystem for Linux, для выполнения различных операций и приложений на одном компьютере.

Благодаря своему богатому функционалу, Windows остается одной из самых популярных и широко используемых операционных систем в мире. Она предоставляет надежную и эффективную платформу для выполнения множества задач одновременно, делая ее отличным выбором для многозадачной работы.

2.2.1.
Основные
принципы
многозадачности
в Windows

В
Windows каждый процесс имеет свое собственное виртуальное адресное про-

странство (4Gb).
Процесс состоит из кода, данных и других
системных ресурсов, таких

как открытые файлы, каналы
(pipes), синхронизирующие объекты. Однако процесс

статический объект,
который сам по себе действия не производит.
Поток (thread) — базо-

вый объект,
которому операционная система
распределяет время центрального процес-

сора. Поток выполняет
команды программы с учетом заданного
ему маршрута. Каждый

57

процесс представляет собой
один начальный поток, который иногда
называют первич-

ным
потоком.

Первичный поток способен создать вторичные потоки. Все потоки, принадлежа-

щие одному процессу,
имеют совместный доступ к его ресурсам.
Все они работают под

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

ным переменным,
записывают информацию в одну и ту же
область памяти и имеют дос-

туп к одним и тем
же объектам. В целом следует отметить,
что программа может выпол-

нять поставленные задачи и без организации потоков, однако в данном случае для

запуска
«дочернего» процесса необходимо временно приостанавливать основной про-

цесс, что приводит
к замедлению выполнения программы в
целом. Дополнительные по-

токи создаются в первую очередь в том случае, когда программа должна выполнять

асинхронные операции, работает
одновременно с несколькими окнами.

Организация многозадачности в
MS Windows различается в линейках 9x и NT. В

Windows
9x реализована приоритетная многозадачность.
В данном случае каждому

активному
потоку предоставляется определенный
промежуток времени работы процес-

сора. По истечению данного промежутка управление автоматически передается сле-

дующему потоку.
Это не дает возможность программам
полностью захватывать ресурсы

процессора.

Windows
NT использует вытесняющую
многозадачность.
Выполнение всех про-

цессов строго
контролируется операционной системой.
Операционная система выделяет

каждой из программ
некоторое количество процессорного
времени и периодически про-

изводит переключение
между запущенными на компьютере
программами. Обратившись

к специальному
системному вызову, вы можете как бы
приостановить (sleep) выполне-

ние программы,
однако если вы этого не сделаете, со
временем операционная система

сделает это за
вас. Подвисание одной из программ не
приведет к подвисанию всей сис-

темы.

В общем и целом,
вытесняющая многозадачность, которая
ранее рассмотрена бо-

лее подробно, выглядит
привлекательней. Однако
за все приходится платить. И в пер-

вую очередь расплачиваться приходится программистам, которые
разрабатывают при-

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

Представьте себе, что на компьютере
работает несколько программ, использующих
один

и тот же файл журнала ошибок. Если вам
необходимо сделать запись в этом файле,
то в

Windows 9x вы можете
без лишних сложностей открыть файл,
записать в него данные, а

затем закрыть его.
Если при этом вы ни разу не обратились
к специальным системным

функциям, вы можете
быть уверенными, что в то время, пока вы
работали с файлом, ни

одна другая
программа не обратилась к этому же файлу
(так как фактически в ходе ра-

боты с файлом
на компьютере работает только одна
ваша программа, а все остальные

программы находятся в состоянии
ожидания).

В среде Windows NT все
не так просто. Предположим, что один из
потоков открыл

файл и начал в него
запись, но в этот момент операционная система
передала управле-

ние другому потоку.
Что произойдет, если другой поток
попытается открыть тот же са-

мый файл? Либо
этого сделать не удастся, либо другой
поток откроет файл в режиме со-

вместного доступа
(for sharing), что может не соответствовать
вашим ожиданиям. Даже

если в ходе работы с
файлом операционная система не осуществила
передачу управле-

ния другому потоку,
получить доступ к файлу может попытаться
поток, работающий на

другом процессоре. В результате вы
столкнетесь с той же проблемой.

58

На системном уровне каждый поток представляет собой
объект, созданный сис-

темным менеджером
объектов. Аналогично с остальными
системными объектами, поток

содержит данные
(атрибуты) и методы
(функции). Схематически объект-поток может

быть представлен в следующем виде
(рис.2.5.) [12]:

Стандартный
объект
заголовка

Атрибуты
потока

Идентификатор клиента

Контекст

Динамический приоритет

Базовый приоритет

Привязанность к архитектуре

процессора

Время выполнения

Статус оповещения

Счетчик прерываний

Маркер передачи прав доступа

Порт завершения

Код завершения

Методы
потока

Создание потока

Открытие потока

Запрос информации о потоке

Установка информации о потоке

Текущий поток

Завершение потока

Получение контекста

Установление контекста

Прерывание

Возобновление

Предупреждение

Проверка поступления преду-

преждения

Регистрация порта завершения

Рис.2.5.
Схема
объекта
потока.

Для большинства методов потока имеются
соответствующие API — функции Win32.

Windows защищает свои внутренние структуры от прямого вмешательства пользова-

тельских программ.
В отличии от более привилегированных
программ, функционирую-

щих на уровне
ядра операционной системы, пользовательские
не могут прямо анализи-

ровать или изменять
параметры системных объектов. Все
операции с ними выполняются

посредством функций
Win32 API. Windows предоставляет дескриптор, идентифици-

рующий объект.
При выполнении операций с объектом его
дескриптор передается в ка-

честве аргумента одной из
API-функций. Свои дескрипторы имеют потоки, процессы,

семафоры, файлы и др. объекты.
Внутренняя структура объектов
доступна только ме-

неджеру объектов.
Функция, создающая поток, возвращает
дескриптор нового объекта.

С помощью этого дескриптора можно
выполнить следующие операции:

• повысить или понизить плановый
приоритет потока;

• приостановить поток и возобновить
его выполнение;

• прекратить выполнение потока;

• определить код завершения потока.

В ОС
Windows потоки, процессы, семафоры и исключающие семафоры могут

иметь несколько разных дескрипторов. Завершив работу с объектом, необходимо вы-

звать функцию
CloseHandle, которая закрыв последний дескриптор, сама уничтожит

объект. В целом в
Windows каждый процесс не может одновременно
поддерживать бо-

лее 65536 открытых дескрипторов.

Работа
с потоками не сводится только к их
запуску и остановке. Необходимо обес-

печить совместное
функционирование потоков. Для организации
эффективного взаимо-

действия между несколькими потоками необходимо производить контроль за их вре-

менными параметрами. Контроль
осуществляется [12]:

59

• установлением приоритетов;

• синхронизацией.

Приоритет потока определяет, насколько часто
данный поток получает доступ к

центральному процессору. Синхронизация регулирует порядок обращения потоков к

общим ресурсам.
Когда системная программа-планировщик
останавливает один поток и

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

токам, имеющим наиболее высокий приоритет. Обработчики системных прерываний

всегда имеют более
высокий приоритет по сравнению с
пользовательскими процессами.

Каждому процессу
присущ собственный приоритет. Базовый
плановый приоритет пото-

ка определяется
на основе приоритета процесса, который
является владельцем этого по-

тока. Всего различают
32 уровня приоритета от 0 до 31. При этом
приоритеты уровня от

0 до 15 называются
переменными приоритетами, а от 16 до 31 –
фиксированными при-

оритетами. Схема наследования приоритетов
потока показана на рис.2.6 [12].

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Уровни

приоритета

Класс
реального

времени

Наивысший

класс

Класс
переднего

плана

Фоновый
класс

Класс
простоя

Базовый

приоритет

процесса

Диапазон
базового

приоритета
потока,

владельцем
которо-

го
является
процесс

с
приоритетом
пе-

реднего
плана

Диапазон
дина-

мического
при-

оритета
для
то-

го
же
самого

потока

Рис.2.6
Схема
наследования
приоритета
потоков
от
исходного
приоритета
процесса

60

Среди атрибутов объекта потока различают
базовый и динамический приоритеты.

При вызове команды
для изменения приоритета потока меняется
его базовый приоритет,

который не может
быть выше или ниже приоритета
процесса-владельца более чем на 2

уровня.
Операционная система способствует
«продвижению» потока для его выполне-

ния. Для этого система поддерживает динамический приоритет потоков, которые вы-

полняют важные задачи. Например, если процесс выводит информацию в окно, либо

считывает
данные с диска временно повышается
приоритет всех потоков такого процес-

са. Эти временные
приращения в сумме с базовым приоритетом
образуют динамический

приоритет процесса.
Планировщик определяет очередность
выполнения потоков на ос-

новании их динамического приоритета. Со следующим тактом процесса приращение

приоритета начинает
уменьшаться на один уровень, постепенно
достигая уровня базово-

го приоритета.

Выбирая поток,
который будет выполняться следующим,
программа-планировщик

начинает просмотр
очереди заданий с потоков, имеющий
наивысший приоритет, выпол-

няет
их, а затем переходит к остальным потокам.
Однако иногда в очереди заданий со-

держатся
не все созданные в системе потоки,
поскольку некоторые из них могут быть

приостановлены
или заблокированы. В каждый момент
времени поток может находить-

ся в одном из шести состояний.

Ready(готов) — поставлен в очередь и
ожидает выполнения.

Standby(ближайший) — готов быть выполненным
следующим.

Running
(выполнение) — находится в режиме
выполнения и взаимодействует с централь-

ным процессором.

Waiting(ожидание) не выполняется, ожидая
сигнала выполнения.

Transition(промежуточное) будет выполняться после того, как система загрузит его

контекст.

Terminated(завершен) — выполнение
завершено, однако объект не удален.

Когда
программа-планировщик выбирает из
очереди готовый к выполнению поток,

она
загружает его контекст.
В состав контекста входит набор значений
регистров про-

цессора, стек ядра,
блок параметров окружения потока и
пользовательский стек в адрес-

ном пространстве процесса, который является владельцем данного потока. Если часть

контакта была
записана на диск, поток проходит в
промежуточное состояние и ожидает,

пока система соберет все составные
части контекста.

Чтобы потоки могли надежно работать,
их необходимо синхронизировать. Пред-

ставьте себе, что
один поток создает кисть, а затем создает
несколько потоков, которые

вместе используют
эту кисть для выполнения графических
операций. Первый поток не

должен уничтожать
кисть до тех пор, пока другие потоки не
завершат операции рисова-

ния. Или представьте
себе, что один поток принимает данные,
введенные пользователем,

и записывает их в
файл, а другие потоки считывают данные
из этого файла и образовы-

вают веденный
текст. Считывание не должно происходить
в тот момент, когда идет за-

пись. В обоих случаях
надо принять меры по
координации последовательности опера-

ций в нескольких потоков.

Одно из возможных
решений заключается в создании глобальной
переменной типа

Boolean, которую один из потоков будет
использовать с целью информирования
других

потоков о том, что
объект занят. Например, поток, записывающий
данные в файл, может

присвоить
переменной bDone
значение TRUE,
а потоки, считывающие данные из файла,

будут циклически
просматривать эту переменную до тех
пор, пока ее значение не изме-

нится. Такая схема вполне работоспособна, однако циклический просмотр флага не-

сколькими потоками
занимает много времени процессора. Вот
почему в Win32 поддер-

живается набор синхронизирующих объектов
[9, 12]. Перечислим их.

Объект типа
исключающий семафор функционирует
подобно узкой двери, «про-

пуская» (т.е. давая допуск) одновременно
по одному потоку.

61

Объект типа семафор
функционирует подобно многостворчатой
двери, ограничи-

вая количество потоков, которые могут
проходить через него одновременно.

Объект
типа события
передает глобальный сигнал, воспринимаемый
любым пото-

ком, для которого он адресован.

Объект
типа критический
раздел
аналогичен исключающему семафору, но
рабо-

тает только в пределах одного процесса.

Все указные объекты являются системными и создаются менеджером объектов.

Хотя каждый
синхронизирующий объект координирует
определенный вид взаимодейст-

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

ределенную
синхронизируемую операцию, ожидает
ответ от одного из этих объектов и

осуществляет свои функции только после получения на то разрешения. Программа-

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

нимали времени
центрального процессора. После получения
соответствующего сигнала

планировщик
возобновляет работу потока. Место и
способ получения сигнала зависит

от конкретного объекта.

Исключающие семафоры, обычные семафоры и события позволяют координиро-

вать работу потоков, принадлежащих разным процессам, в то время как критические

разделы воспринимаются лишь потоками одного процесса. Если
один процесс создает

другой процесс,
дочерний процесс часто наследует
дескрипторы имеющихся синхрони-

зирующих объектов. Объекты критических
разделов не могу быть унаследованы.

С фундаментальной точке зрения, синхронизирующий объект, подобно другим

системным объектам,
представляет собой структуру данных. Синхронизирующие объ-

екты могут находиться
в двух состояниях: при наличии сигнала
и при отсутствии тако-

вого. Потоки
взаимодействуют с синхронизирующими объектами
путем установки сиг-

нала или путем его
ожидания. Поток, находящейся в состоянии
ожидания, блокируется

и не выполняется.
При наличии сигнала ожидающий поток завладевает объектом,
вы-

ключает сигнал,
выполняет определенные синхронизирующие операции,
а затем опять

включает сигнал и освобождает объект.

Потоки могут
ожидать разрешения не только от
исключающих и обычных семафо-

ров, событий и
критических разделов, но и от других
объектов. Иногда возникает ситуа-

ция,
когда необходимо ожидать разрешения от процесса,
другого потока, таймера или

файлового объекта.
Все эти объекты имеют свое предназначение,
но подобно синхрони-

зирующим объектом
они способны давать сигналы разрешения.
Процессы и потоки сиг-

нализируют о своем завершении, объекты-таймеры
— об истечении определенного ин-

тервала времени, а файловые объекты
— о завершении операций чтения или записей

файлов. Потоки могут ожидать появления
любого из этих сигналов.

2.2.2. API-функции
для
реализации
механизма
многозадачности

В Win32 API определены
следующие функции работы с процессами
и потоками [4]

(таблица 2.1.)

Таблица
2.1

Название функции

1

AttachThreadInput

CommandLineToArgvW

CreateProcess

CreateRemoteThread

CreateThread

Выполняемое действие

2

Переключение механизмов ввода с одной
нити на дру-

гую

Производит разбор командной строки в
Unicode

Создает процесс

Создает поток в адресном пространстве
другого про-

цесса

Создает поток

62

1

2

Продолжение
табл. 2.1

ExitProcess

ExitThread

FreeEnvironmentStrings

GetCommandLine

GetCurrentProcess

GetCurrentProcessId

GetCurrentThread

GetCurrentThreadId

GetEnvironmentStrings

GetEnvironmentVariable

GetExitCodeProcess

GetExitCodeThread

GetPriorityClass

GetProcessAffinityMask

GetProcessShutdownParame-

ters

GetProcessTimes

GetCurrentProcess

GetProcessWorkingSetSize

GetStartupInfo

GetThreadPriority

GetThreadTimes

OpenProcess

ResumeThread

SetEnvironmentVariable

SetPriorityClass

Завершает процесс и все его потоки

Завершает поток

Освобождает память области переменных
среды

Возвращает указатель на командную
строку

Возвращает описатель (handle) текущего
процесса

Возвращает идентификатор текущего
процесса

Возвращает описатель
(handle) текущего потока

Возвращает идентификатор текущего
потока

Возвращает строку переменных среды

Возвращает значение указанной переменной
среды

Возвращает код завершения процесса

Возвращает код завершения потока

Возвращает класс приоритета процесса

Сообщает, на каких процессорах разрешено
исполне-

ние процесса

Сообщает параметры поведения процесса
при завер-

шении работы системы

Возвращает временные характеристики
процесса

Сообщает версию Windows, для которой
предназна-

чен процесс

Возвращает характеристики доступного
процессу ад-

ресного пространства

Возвращает параметры процесса, полученные
им при

создании

Сообщает приоритет указанного потока

Возвращает временные характеристики
указанного

потока

Возвращает описатель (handle) указанного
процесса

Уменьшает счетчик задержаний потока
(или запуска-

ет его)

Устанавливает значение указанной
переменной среды

Устанавливает класс приоритета процесса

SetProcessShutdownParameters Устанавливает параметры
поведения процесса при

завершении работы системы

SetThreadAffinityMask

SetThreadPriority

Sleep

SleepEx

SetProcessWorkingSetSize

SuspendThread

TerminateProcess

TerminateThread

TlsAlloc

Устанавливает, на каких процессорах
разрешено ис-

полнение потока

Устанавливает приоритет указанного
потока

Задерживает исполнение потока на
указанное коли-

чество миллисекунд

Задерживает исполнение до наступления
события

ввода/вывода или на время

Устанавливает характеристики доступного
процессу

адресного пространства

Приостанавливает исполнение указанного
потока

Завершает указанный процесс

Завершает указанный поток

Распределяет индекс локальной памяти
потока

(thread local storage TLS)

63

TlsFree

1

Освобождает индекс TLS

2

Окончание
табл. 2.1

TlsGetValue

TlsSetValue

Возвращает данные, размещенные в TLS с
указанным индексом

Помещает данные в TLS с указанным индексом

WaitForInputIdle Ждет, пока не начнется ввод
для указанного процесса

WinExec

Выполняет указанное приложение

Подробное описание
функций приведено в Win32 Programmer’s
Reference. Далее

рассмотрим только некоторые основные
функции [4].

Функция
CreateProcess() — создает новый процесс и его первичный поток. Новый

процесс исполняет указанный исполняемый
файл. Формат функции:

BOOL CreateProcess(LPCTSTR lpApplicationName,
// имя исполняемого файла

LPTSTR lpCommandLine, // командная строка

LPSECURITY_ATTRIBUTES lpProcessAttributes, // атрибуты
защиты процесса

LPSECURITY_ATTRIBUTES lpThreadAttributes, // атрибуты защиты
потока

BOOL bInheritHandles, // флаг наследования
описателей

DWORD dwCreationFlags, // флаги создания

LPVOID lpEnvironment, // указатель блока переменных
среды

LPCTSTR lpCurrentDirectory, // текущий каталог

LPSTARTUPINFO lpStartupInfo, // блок начальных
параметров

LPPROCESS_INFORMATION lpProcessInformation //
указатель

// структуры, описывающей порожденный
процесс

);

Функция возвращает TRUE в случае успеха
и FALSE — в случае неудачи.

Параметры:

lpApplicationName
— указатель на строку, содержащую имя исполняемой программы.

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

щем каталоге. Параметру может быть
присвоено значение NULL. В этом случае в

качестве имени
файла выступает первая выделенная пробелами
лексема из строки

lpCommandLine;

lpCommandLine — указатель
командной строки. Если параметр
lpApplicationName имеет

значение NULL, то
имя исполняемого файла выделяется из
lpCommandLine, а по-

иск исполняемого
файла производится в соответствии с
правилами, действующими

в системе;

lpProcessAttributes —
указатель на структуру, описывающую
параметры защиты процесса.

Если параметру присвоено значение
NULL, то устанавливаются атрибуты “по

умолчанию”;

lpThreadAttributes- указатель
на структуру, описывающую параметры
защиты первично-

го
потока. Если параметру присвоено
значение NULL, то устанавливаются атрибу-

ты “по умолчанию”;

bInheritHandles
— определяет, будет ли порожденный процесс наследовать описатели

(handles) объектов
родительского процесса. Например, если
родительский процесс

AB, то он получил
описатель процесса B и может им
манипулировать. Если теперь

он порождает
процесс C с параметром bInheritHandles равным
TRUE, то и процесс

C сможет работать с описателем процесса
B;

dwCreationFlags
— определяет некоторые дополнительные условия
создания процесса и

его класс приоритета;

lpEnvironment- указатель на блок переменных
среды порожденного процесса. Если этот

параметр равен
NULL, то порожденный процесс наследует
среду родителя. Иначе

64

он должен указывать на завершающийся
нулем блок строк, каждая из которых за-

вершается нулем (аналогично
DOS);

lpCurrentDirectory — указатель
на строку, содержащую полное имя текущего
каталога по-

рожденного процесса.
Если этот параметр равен NULL, то
порожденный процесс

наследует каталог родителя;

lpStartupInfo
— указатель на структуру
STARTUPINFO, которая определяет параметры

главного окна порожденного процесса;

lpProcessInformation —
указатель на структуру, которая
будет заполнена информацией о

порожденном процессе после возврата
из функции.

Пример: программа, запускающая
Microsoft Word

#include <windows.h>

#include <conio.h>

#include <stdio.h>

main()

{

PROCESS_INFORMATION pi ;

STARTUPINFO si ;

ZeroMemory( &si, sizeof(si)) ;

si.cb = sizeof( si ) ;

printf( «Press any key to start WinWord — » );

getch() ;

CreateProcess( NULL, «WinWord», NULL, NULL, FALSE, 0,

NULL, NULL, &si, &pi ) ;

return 0 ;

}

Функция CreateThread()
— создает новый поток в адресном пространстве
процесса.

Формат функции [8]:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, // атрибуты защиты
потока

DWORD dwStackSize,

// размер стека в байтах

LPTHREAD_START_ROUTINE lpStartAddress,
//указатель на функцию потока

LPVOID lpParameter,

BDWORD dwCreationFlags,

LPDWORD lpThreadId );

// аргумент, передаваемый в функцию
потока

// флаги управления созданием потока

// область памяти для возвращения

//идентификатора потока

Функция возвращает описатель порожденного
потока. Параметры:

lpThreadAttributes — указатель на структуру,
описывающую параметры защиты потока.

Если параметру присвоено значение
NULL, то устанавливаются атрибуты “по

умолчанию”;

dwStackSize — устанавливает
размер стека, который отводится потоку.
Если параметр ра-

вен нулю, то устанавливается стек,
равный стеку первичного потока;

lpStartAddress — адрес функции, которую
будет исполнять поток. Функция имеет
один

32-битный аргумент и возвращает 32 битное
значение;

lpParameter — параметр, передаваемый в функцию,
которую будет исполнять поток;

dwCreationFlags
— дополнительный флаг, который управляет созданием потока. Если

этот параметр
равен CREATE_SUSPENDED, то поток после порождения
не запус-

кается на исполнение до вызова функции
ResumeThread;

65

lpThreadId — указатель на
32-битную переменную, которой будет присвоено значение

уникального идентификатора потока.

Пример: программа, порождающая поток

#include <stdio.h>

#include <conio.h>

#include <windows.h>

DWORD WINAPI Output( LPVOID Param )

{

while( TRUE )

{

printf( «A» ) ;

Sleep(100) ;

}

return( 0 ) ;

}

main()

{

HANDLE hThread ;

DWORD ThreadId ;

hThread = CreateThread( NULL, 0, Output, NULL, 0, &ThreadId ) ;

getch() ;

TerminateThread( hThread, 0 ) ;

return(0) ;

}

Потоки, обладающие высоким приоритетом, занимают большую часть времени

центрального
процессора, раньше завершают свою работу
и способны быстрее реагиро-

вать на
действия пользователя. Если всем потокам
будет присвоен одинаково высокий

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

присвоен один и
тот же приоритет (не имеет значения,
высокий или низкий), программа

— планировщик выделит им одинаковое
время работы центрального процессора,
и сама

идея приоритетов
утратит смысл. Один поток сможет
быстрее реагировать сигналы на

сигналы только в том случае, если будут
замедлены другие потоки. Это же правило
в

равной степени
и применимо и к процессом. Старайтесь
ограничивать приоритет всех

потоков и процессов
низким или средним уровнем и присваивайте
им высоких приори-

тет только по мере необходимости [8, 12].

Приведенные ниже функции проверяют или
изменяют базовый приоритет потока.

BOOL SetThreadPriority(

HANDLE hThread
// дескриптор потока

int iPriority );
// новый уровень приоритета

int GetThreadPriority ( HANDLE hThread );

Функция SetThreadPriority
возвращает значение TRUE
в случае успешного завер-

шения потока, а значение FALSE
-при возникновении ошибки. Функция GetThread-

Priority возвращает значение, определяющее приоритет. Для обозначения возможных

значений приоритета в обеих функциях
используется набор констант.

66

THREAD_PRIORITY_LOWEST

са

На два уровня ниже приоритета процес-

THREAD_PRIORITY_BELOW_NORMALНа один уровень ниже
приоритета про-

цесса

THREAD_PRIORITY_NORMAL

цесса

THREAD_PRIORITY_ABOVE_NORMAL

цесса

THREAD_PRIORITY_HIGHEST

са

THREAD_PRIORITY_TIME_CRITICAL

ских процессов)

THREAD_PRIORITY_IDLE

ских процессов)

Тот же уровень приоритета, что и у про-

На один уровень выше приоритета про-

На два уровня выше приоритета процес-

Уровень 15 (для обычных пользователь-

Уровень 1 (для обычных пользователь-

Прерванный поток приостанавливает
свое выполнение и не учитывается при
рас-

пределении времени
центрального процессора. Поток остается
в таком состоянии до тех

пор, пока другой
поток не возобновит его выполнение.
Остановку потока можно произ-

вести, в частности,
в том случае, если пользователь прерывает выполнение
определен-

ной задачи. До тех
пор, пока задание не будет отменено,
поток можно перевести в со-

стояние ожидания. Если пользователь решит продолжить работу, поток возобновит

выполнение с той
точки, где он был остановлен. Для
приостановки и возобновления вы-

полнения потоков служат функции

DWORD SuspendThread ( HANDLE hThread ) ;

DWORD ResumeThread( HANDLE hThread );

Один и тот же
поток можно последовательно остановить
несколько раз, не возоб-

новляя его выполнения, однако каждой последовательной команде SuspendThread

должна соответствовать ответная команда
ResumeThread.
Система отчитывает количе-

ство отмененных команд с помощью счетчика прерываний.
Каждая команда Suspend-

Thread
инкрементирует значения счетчика, а
каждая команда ResumeThread
декремен-

тирует его. Обе
функции возвращают предыдущее значение
счетчика в виде параметра

типа DWORD.
Поток возобновит свое выполнение только
в том случае, если счетчик

примет значение 0.

Поток способен остановить
себя, но он не в состоянии самостоятельно
возобновить

свое выполнение.
Однако он может на нужное время перенести
себя в режим ожидание.

Команда
Sleep задерживает выполнения потока, удаляя его из очереди программы-

планировщика до
тех пор, пока не пройдет заданный
интервал времени. Интерактивные

потоки, которые выводят определенную информацию
для пользователя, часто делают

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

режима ожидания
предпочтительнее задействования
«пустого» цикла, поскольку в этом

случае не используется время центрального
процессора.

Для осуществления паузы в течение заданного времени поток вызывает следую-

щие функции:

VOID Sleep ( DWORD dwMilliseconds ) ;

DWORD SleepEx(DWORD dwMilliseconds,

BOOL bAlertable );

// продолжительность паузы

// TRUE — возобновить работу

// при завершении операции ввода/вывода

67

Расширенная функция SleepEx обычно работает
совместно с функциями фонового

ввода/вывода и
может использоваться для инициации
команд чтения или записи, не тре-

буя их завершения.
Эти операции выполняются в фоновом
режиме. По завершении опе-

рации система извещает об этом пользователя, обращаясь к предусмотренной в про-

грамме процедуре обратного вызова. Фоновый ввод/вывод
(или перекрывающийся

ввод/вывод
далее будет рассмотрен более подробно)
чаще всего применяется в интерак-

тивных программах,
которые должны реагировать на команды
пользователя, не преры-

вая работы со сравнительно медленными устройствами, например с накопителем на

магнитной ленте или с сетевым диском.

Параметр bAlertable
функции SleepEx имеет тип Boolean. Если этот
параметр равен

TRUE, система может преждевременно возобновить выполнение потока при условии,

что перекрывающаяся
операция ввода/вывода завершилась до
истечения заданного вре-

мени
ожидания. В случае досрочного прерывания
функция sleepEx возвращает значение

WAIT_IO_COMPLETION, по истечении указанного
времени — значение 0.

По специальному запросу поток возвращает свои дескриптор и идентификатор.

Указанные ниже функции позволяют
получить информацию о текущем потоке:

DWORD GetCurrentThreadId( VOID ) ;

HANDLE GetCurrentThread( VOID );

Результирующее
значение функции GetCurrentThreadId совпадает
со значением па-

раметра lpIDThread
после выполнения функции CreateThread и
однозначно идентифици-

рует поток в
системе. Хотя идентификатор потока
нужен лишь для незначительного ко-

личества функций
Win32 API, он может использоваться с целью мониторинга

системных потоков
без необходимости поддерживать открытый
дескриптор для каждого

потока. Открытый дескриптор защищает
поток от уничтожения.

Дескриптор, полученный в результате выполнения функции
GetCurrentThread,

служит для тех же целей, что и дескриптор, возвращенный функцией
CreateThread. И

несмотря на то,
что он может использоваться аналогично другим
дескрипторам, на са-

мом деле этот параметр является псевдодескриптором. Псевдодескриптор
— это специ-

альная константа,
которая всегда интерпретируется системой
особым образом, подобно

тому,
как одиночная точка (.) в DOS всегда
указывает на текущий каталог, а параметр

this в C++ определяет
текущий объект. Константа — псевдодескриптор,
полученная в ре-

зультате выполнения
функции GetCurrentThread, указывает на текущий
поток. В отличие

от настоящих
дескрипторов, псевдодескриптор не может
передаваться другим потокам.

Чтобы получить настоящий переносимый дескриптор потока, необходимо выполнить

следующие действия:

HANDLE hThread;

hThread = DuplicateHandle(

GetCurrentProcess(),

GetCurrentThread(),

GetCurrentProcess(),

&hThread,

0,

FALSE,

DUPLICATE_SAME_ACCESS );

68

// процесс-источник

// исходный дескриптор

// целевой процесс

// новый дублирующийся дескриптор

//привилегии доступа (подавляемые

// последним параметром)

// дочерние объекты не унаследуют

// дескриптор

// привилегии доступа копируются у

// исходного дескриптора

Хотя функция CloseHandle не влияет на
псевдодескрипторы, дескриптор, созданный с

помощью функции
DuplicateHandle, является настоящим и в конце
концов должен быть

закрыт. Применение псевдодескрипторов значительно ускоряет работу функции

GetCurrentThread, поскольку в этом случае подразумевается, что поток имеет полный

доступ сам к себе, и функция возвращает
результат, не заботясь о мерах безопасности.

По аналогии с тем, как
Windows-программа завершается по достижении конца

функции WinMain, поток
обычно прекращает свое существование
при достижении кон-

ца функции, в
которой был начат. Когда он достигает
конца стартовой функции, система

автоматически вызывает команду
ExitThread, имеющую такой синтаксис:

VOID ExitThread( DWORD dwExitCode );

Хотя операционная
система вызывает функцию ExitThread
автоматически, при не-

обходимости
досрочного завершения потока вы можете
вызвать эту функцию явным об-

разом:

DWORD ThreadFunction( LPDWORD lpdwParam )

{

HANDLE hThread = CreateThread( <параметры>);

// далее следуют стандартные операции
инициализации;

// проверка наличия ошибочных условий

if ( <условие возникновения ошибки> )

{

ExitThread( ERROR_CODE ); // прекратить работу потока

}

// ошибки нет, работа продолжается

return( SUCCESS_CODE
);
// эта строка
программы

// заставляет систему вызвать функцию
ExitThread

}

Параметры ERROR_CODE
и SUCCESS_CODE определяются по вашему усмотре-

нию. В нашем простом примере поток
нетрудно прервать с помощью команды
return:

if( <условие возникновения ошибки> )

{

return( ERROR_CODE ); // прекратить работу
потока

}

В данном случае,
команда return приводит к тому же результату,
что и функция Ex-

itThread, так как при ее выполнении осуществляется неявный вызов последней. Эта

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

мы, вызываемой внутри функции типа
ThreadFunction.

Когда поток
завершается с помощью оператора return,
32-разрядный код заверше-

ния
автоматически передается функции
ExitThread. После прекращения работы потока

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

// один поток вызывает эту функцию для
получения кода завершения другого
потока

BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpdwExitCode );

Функция
GetExitCodeThread возвращает значение FALSE в том
случае, если опре-

делить код завершения помешала ошибка.

69

Независимо от того, как — явно или неявно
(в результате выполнения оператора re-

turn) — вызывается функция
ExitThread, она удаляет поток из очереди программы-

планировщика и
уничтожает его стек. Однако сам объект
при этом сохраняется. Поэто-

му даже после
прекращения выполнения потока вы можете
запросить его код заверше-

ния. По возможности
дескриптор потока следует закрывать явно
(с помощью функций

CloseHandle), с тем чтобы поток не
занимал лишний объем памяти. При
закрытии по-

следнего дескриптора система автоматически уничтожает поток. Система не может

уничтожить выполняющийся поток, даже если закрыты все его дескрипторы. В этом

случае поток
будет уничтожен сразу же после завершения
выполнения. Если по завер-

шении
процесса остаются незакрытые дескрипторы,
система закрывает их автоматиче-

ски и удаляет все
«подвешенные» объекты, которые не
принадлежат ни одному процес-

су.

С помощью команды
ExitThread поток может остановить
себя самостоятельно в

том месте программы,
где это необходимо. Кроме того, один
поток способен по своему

усмотрению мгновенно остановить другой
поток.

// с помощью вызова этой функции один
поток может остановить другой

BOOL TerminateThread ( HANDLE hThread, DWORD
dwExitCode );

Поток не в состоянии
защитить себя от прерывания. Имея
соответствующий деск-

риптор, любой
объект может мгновенно остановить поток
вне зависимости от его теку-

щего состояния
(конечно, в том случае; если дескриптор
разрешает полный доступ к по-

току). Если при вызове функции
CreateThread использовать набор атрибутов

безопасности,
заданный по умолчанию, то результирующий
дескриптор обеспечит пол-

ные привилегии доступа к созданному
потоку.

Функция TerminateThread не уничтожает
стек потока, а только возвращает код
его

завершения. Функции
ExitThread и TerminateThread переводят объект в сигнальное со-

стояние, что служит признаком возможности
запуска других потоков, ожидавших его

завершения. После выполнения любой из двух указанных функций поток продолжает

существовать
в сигнальном состоянии до тех пор, пока
не будут закрыты все его деск-

рипторы.

2.2.3.
Синхронизация
потоков

При работе с
потоками необходимо иметь возможность
координировать их дейст-

вия. Часто координация действий подразумевает определенный порядок выполнения

операций. Кроме
функций, предназначенных для создания
потоков и изменения их пла-

нового приоритета, Win32 API содержит
функции, которые переводят потоки в
режим

ожидания сигналов от определенных объектов, например от файлов или процессов.

Кроме того, эти функции обеспечивают
поддержку некоторых специальных
объектов, в

частности семафоров и исключающих
семафоров.

Лучше всего проиллюстрировать применение
синхронизирующих объектов можно

на примере функций,
ожидающих сигнала от объекта. С помощью
одного набора обоб-

щенных команд можно организовать ожидание сигналов от процессов,
семафоров, ис-

ключающих семафоров, событий и некоторых других объектов. Следующая функция

ожидает поступления сигнала от указанного
объекта:

DWORD WaitForSingleObject( HANDLE hObject,

DWORD dwMilliseconds );

70

// объект, сигнал от

// которого ожидается

// максимальное время ожидания

Функция WaitForSingleObject позволяет приостановить
выполнение потока до тех

пор, пока не поступит
сигнал от заданного объекта. Кроме того,
в этой команде указыва-

ется максимальное
время ожидания. Чтобы обеспечить
бесконечное ожидание, в качест-

ве временного интервала следует задать
значение INFINITE. Если объект уже доступен

или если он
подает сигнал в течение заданного времени,
функция WaitForSingleObject

возвращает значение
0 и выполнение потока возобновляется.
Но если заданный интер-

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

WAIT_TIMEOUT.

Для того чтобы заставить поток ожидать сигналы
сразу от нескольких объектов,

воспользуйтесь функцией
WaitForMultipleObjects. Функция возвратит управление
пото-

ку при поступлении
сигнала либо от одного из указанных
объектов, либо от всех объек-

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

DWORD WaitForMultipleObjects(

DWORD dwNumObjects,

LPHANDLE lpHandles,

BOOL bWaitAll,

DWORD dwMilliseconds );

// количество ожидаемых объектов

// массив дескрипторов

// TRUE — ожидание сигналов

// сразу от всех объектов;

// FALSE — ожидание сигнала от

// любого из объектов

// максимальный период ожидания

Результирующее значение WAIT_TIMEOUT,
опять-таки, говорит о том, что задан-

ный интервал
времени прошел, а сигнал от объектов
не поступил. Если флаг bWaitAll

имеет значение FALSE, соответствующее
ожиданию сигнала от любого из указанных

объектов,
в случае успешного завершения функция
WaitForMultipleObjects возвращает

код, который указывает, от какого из элементов массива
lpHandles поступил сигнал.

(Первый элемент
массива соответствует значению 0, второй
— значению 1 и т.д.). Если

флаг bWaitАll имеет значение TRUE, функция
не возвращает результат до тех пор,
пока

не
будут установлены флаги всех объектов
(т.е. пока не завершите выполнение всех
по-

токов).

Две расширенные
версии функций ожидания содержат
дополнительный флаг ста-

туса оповещения, который позволяет возобновить выполнение потока, если в течение

периода ожидания были завершены асинхронные
операции чтения или записи. Работу

этих функций
можно представить так, как будто они
просят «разбудить» их в одном из

трех случаев: если
становится доступным указанный объект,
если заканчивается задан-

ный период времени или если завершилось выполнение фоновой операции вво-

да/вывода.

DWORD WaitForSingleObjectEx (

HANDLE hObject,

DWORD dwMilliseconds,

BOOL bAlertable );

DWORD WaitForMultipleObjectsEx(

DWORD dwNumObjects,

LPHANDLE lpHandles,

BOOL bWaitAll,

// объект, сигнал от которого ожидается

// максимальное время ожидания

// TRUE — прекращение ожидания

// при завершении операции ввода/вывода

// количество ожидаемых объектов

// массив дескрипторов

// TRUE — ожидание сигналов

// сразу от всех объектов;

// FALSE — ожидание сигнала от

71

DWORD dwMilliseconds,

BOOL bAlertable );

// любого из объектов

// максимальный период ожидания

// TRUE — прекращение ожидания

// при завершении операции ввода/вывода

При успешном выполнении функции ожидания
объект, сигнал от которого ожи-

дался, обычно
определенным образом изменяется.
Например, если поток ожидал и по-

лучил сигнал от исключающего
семафора, функция восстанавливает несигнальное со-

стояние исключающего
семафора, чтобы остальные потоки знали о том, что он
занят.

Кроме того, функции
ожидания декрементируют значение
счетчика семафора и сбрасы-

вают информацию о некоторых событиях.

Функции ожидания
не изменяют состояния указанного
объекта до тех пор, пока не

поступит сигнал
от одного или нескольких других объектов.
В частности, поток не за-

хватывает
исключающий семафор сразу же после
поступления сигнала от него, а ожида-

ет сигналов от других объектов. Кроме
того, в течение времени ожидания
исключающий

семафор снова
может быть захвачен другим потоком,
который еще больше продлит со-

стояние ожидания.

Конечно, ожидать
поступления сигнала от объекта можно
лишь в том случае, если

этот
объект уже создан. Начнем с создания
исключающих
семафоров
и семафоров,
по-

скольку для работы
с ними существуют параллельные
API-команды, позволяющие соз-

давать и уничтожать
эти объекты, захватывать их и освобождать, а
также получать их

дескрипторы.

Функциям,
создающим исключающие
семафоры
и семафоры,
нужно указать тре-

буемые привилегии
доступа и начальные параметры создаваемого
объекта (можно также

указать его имя, но это необязательно)
[12].

HANDLE CreateMutex (

LPSECURITY_ATTRIBUTES lpsa,

сти

// необязательные атрибуты безопасно-

BOOL bInitialOwner

LPTSTR lpszMutexName )

HANDLE CreateSemaphore(

// TRUE — создатель хочет

// завладеть полученным объектом

// имя объекта

LPSECURITY_ATTRIBUTES lpsa,

//необязательные атрибуты безопасности

LONG lInitialCount,

LONG lMaxCount,

LPTSTR lpszSemName );

// исходное значение счетчика (обычно
0)

// максимальное значение

// счетчика (ограничивает число потоков)

// имя семафора (может иметь значение
NULL)

Если в качестве атрибута безопасности задано
значение NULL, результирующий

дескриптор
получит все привилегии доступа и не
будет наследоваться дочерними про-

цессами. Имена
объектов являются необязательными,
однако они становятся полезными

в ситуации, когда несколько процессов
управляют одним и тем же объектом.

Если флагу
bInitialOwner присвоить значение TRUE,
поток сразу после создания

объекта завладеет
им. Созданный исключающий семафор не
станет подавать сигналы до

тех пор, пока поток не освободит его.

В отличие от исключающего
семафора, который может принадлежать
только од-

ному потоку,
неисключающий семафор остается в
сигнальном состоянии до тех пор, по-

ка его счетчик
захватов не получит значения iMaxCount.
Если другие потоки в этот мо-

72

мент попытаются завладеть семафором, они будут приостановлены до тех пор,
пока

счетчик захватов не будет декрементирован
до значения ниже максимального.

Пока семафор (или исключающий семафор)
существует, поток взаимодействует с

ним посредством
операций захвата и освобождения. Для
захвата любого объекта поток

вызывает функцию
WaitForSingleObject (или одну из ее разновидностей).
Завершив вы-

полнение задачи, которая синхронизировалась захваченным объектом,
поток освобож-

дает этот объект с помощью одной из
следующих функций:

BOOL ReleaseMutex( HANDLE hMutex ) ;

BOOL ReleaseSemaphore(

HANDLE hSemaphore,

LONG lRelease,

LPLONG lplPrevious );

// величина, на которую

// инкрементируется значение счетчика

// при освобождении объекта (обычно 1)

// переменная, которой присваивается

// предыдущее значение счетчика

При освобождении семафора: или
исключающего семафора значение счетчика
за-

хватов инкрементируется.
Значение счетчика, превышающее
0, воспринимается систе-

мой как сигнал объекта ожидающим его
потокам.

Освободить
исключающий семафор может только тот
поток, который завладел им.

Однако любой поток
может вызвать функцию ReleaseSemaphore, которая
инкрементиру-

ет значение
счетчика захватов обычного семафора
вплоть до его максимального значе-

ния.
Изменение значения счетчика дает
возможность в процессе выполнения
программы

произвольным
образом задать количество потоков,
которые могут завладеть семафором.

Обратите внимание,
что функция CreateSemaphore позволяет при
создании нового сема-

фора
присвоить его счетчику значение, меньшее
максимального. Например, при разра-

ботке
нового семафора его счетчику можно задать начальное
значение 0. Такой прием

позволит
заблокировать все потоки до тех пор,
пока программа не произведет инициали-

зацию, а затем не увеличит значение
счетчика с помощью команды ReleaseSemaphore.

Не забывайте
вовремя освобождать синхронизирующие объекты.
Не задав макси-

мального времени ожидания и забыв освободить исключающий семафор,
вы заблоки-

руете все ожидающие его потоки.

Поток может ожидать несколько сигналов
от одного и того же объекта, не будучи

заблокированным,
однако после завершения каждого из
процессов ожидания необходи-

мо, выполнять операцию освобождения. Это требование справедливо для семафоров,

исключающих семафоров и критических
разделов.

Событие
представляет собой объект, который
создается программой при необхо-

димости информировать потоки о выполнении
определенных действий. В простейшем

случае (ручной
сброс) событие переключает свое состояние
с помощью команд SetEvent

(сигнал включен) и
ResetEvent (сигнал выключен). Когда сигнал
включается, его полу-

чают все потоки,
которые ожидают появления соответствующего
события. Если сигнал

выключается, все
такие потоки блокируются. В отличие от
семафоров и исключающих

семафоров, события
данного типа изменяют свое состояние только
при подаче соответ-

ствующей команды каким-нибудь потоком.

События целесообразно использовать
при условии, что поток должен выполняться

только после того,
как программа обновит свое окно или пользователь введет опреде-

ленную информацию [12]. Ниже представлены
основные функции, предназначенные для

работы с событиями:

73

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpsa,

BOOL bManualReset,

BOOL bInitialState,

LPTSTR lpszEventName );

BOOL SetEvent ( HANDLE hEvent );

BOOL ResetEvent( HANDLE hEvent );

// привилегии доступа

// (по умолчанию = NULL)

// TRUE — событие должно быть

// сброшено вручную

// TRUE — создание события в

// сигнальном состоянии

//имя события (допускается

// значение NULL)

При установке параметра bInitialState функция
CreateEvent создает событие, кото-

рое сразу же будет находиться в сигнальное
состоянии. Функции SetEvent и ResetEvent в

случае успешного
завершения возвращают значение TRUE, при
возникновении ошибки

— значение FALSE.

Параметр
bManualReset функции
CreateEvent позволяет создать событие, сбрасы-

ваемое не вручную, а автоматически.
Автоматически сбрасываемое событие
переходит в

несигнальное
состояние сразу же после выполнения
функции SetEvent. Для таких собы-

тий
функция ResetEvent является избыточной.
Кроме того, перед автоматическим сбро-

сом по каждому
сигналу событие освобождает только
один поток. Автоматически сбра-

сываемые события целесообразно применять
в таких программах, где один основной

поток подготавливает данные для других, вспомогательных потоков. При готовности

нового набора
данных основной поток устанавливает
событие, по которому освобожда-

ется один вспомогательный поток. Остальные вспомогательные потоки продолжают

ожидать подготовки новых данных.

Наряду с выполнением операций
установки и сброса события можно сгенериро-

вать импульсное событие:

BOOL PulseEvent( hEvent ) ;

Импульсное событие включает
сигнал на короткий промежуток времени.
Приме-

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

все ожидающие
потоки, а затем сбросить событие. Вызов
функции для события, сбрасы-

ваемого автоматически, дает возможность оповестить только один ожидающий поток.

Если не было ни
одного ожидающего потока, то никакой другой
поток не будет опове-

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

включенным до тех
пор, пока не появится ожидающий его
поток. После оповещения по-

тока событие сбрасывается автоматически.

Семафоры, исключающие семафоры и события могут совместно использоваться

несколькими
процессами, которые необязательно
должны быть связаны друг с другом.

Путем совместного
задействования синхронизирующих
объектов процессы могут коор-

динировать свои действия по аналогии
с тем, как это делают потоки. Существует
три

механизма
совместного использования. Первый из
них — это наследование, при котором

один процесс
создает новый процесс, получающий копии
всех дескрипторов родитель-

ского процесса.
Копируются только те дескрипторы,
которые при создании были поме-

чены как доступные для наследования.

Два других метода
сводятся к созданию второго дескриптора
существующего объ-

екта с помощью
вызова функций. Какая из функций будет вызвана, зависит
от имею-

щейся информации.
При наличии дескрипторов как исходного
процесса, так и процесса,

назначения следует
вызывать функцию DuplicateHandle, при наличии
только имени объ-

74

екта — одну из функций Openxxx. Две программы
могут заранее определить имя совме-

стно используемого объекта.
Кроме того, одна из программ способна передать
другой

это
имя посредством совместно используемой
области памяти функций DDEML (DDE

Management Library —
библиотека управления динамическим
обменом данных) или кана-

ла.

BOOL DuplicateHandle(

HANDLE hSourceProcess,

HANDLE hSource,

HANDLE hTargetProcess,

LPHANDLE lphTarget,

DWORD fdwAccess,

BOOL bInherit,

DWORD fdwOptions );

HANDLE OpenMutex(

DWORD fdwAccess,

BOOL binherit,

LPTSTR lpszName );

HANDLE OpenSemaphore(

DWORD fdwAccess,

BOOL bInherit,

LPTSTR lpszName );

HANDLE OpenEvent(

DWORD fdwAccess,

BOOL bInherit,

LPTSTR lpszName );

// процесс, которому
принадлежит

// исходный объект

// дескриптор исходного объекта

// процесс, который хочет создать

// копию дескриптора

// переменная для записи копии дескриптора

// запрашиваемые привилегии доступа

// может ли наследоваться копия
дескриптора?

// дополнительные операции, например

// закрытие исходного дескриптора

//запрашиваемые привилегии доступа

// TRUE — дочерний процесс может

// наследовать этот дескриптор

// имя исключающего семафора

// запрашиваемые привилегии доступа

//TRUE — дочерний процесс может

// наследовать этот дескриптор

// имя семафора

// запрашиваемые привилегии доступа

// TRUE — дочерний процесс может

// наследовать этот дескриптор

// имя события

Используемый в этом примере тип данных
LPTSTR — это обобщенный текстовый

тип, который компилируется по-разному
в зависимости от того, какой стандарт,
Unicode

или ASCII, поддерживается приложением.

Семафоры, исключающие
семафоры и объекты событий будут
сохраняться в памя-

ти до тех пор, пока
не завершатся все использующие их
процессы или пока с помощью

функции CloseHandle не будут закрыты все
дескрипторы соответствующего объекта:

BOOLCloseHandle(hObject);

Критический
раздел представляет собой
объект, выполняющий те же функции,

что и исключающий
семафор, но в отличие от последнего
критический раздел не может

наследоваться.
Оба объекта доступны только для
одного процесса. Преимущество кри-

тических разделов перед исключающими
семафорами состоит в том, что они проще
в

управлении и гораздо быстрее работают
[12].

Терминология,
принятая для функций, которые используются
при работе с крити-

ческими разделами,
отличается от терминологии,
разработанной для функций управле-

ния
семафорами, исключающими семафорами и
событиями, однако сами функции вы-

полняют одни и те же операции. В частности, принято говорить не о создании

75

критического раздела, а о
его инициализации.
Процесс не ожидает критический раздел,
а

входит в него, и
не освобождает критический раздел, а
покидает его; к тому же вы не

закрываете дескриптор, а удаляете
объект.

VOID InitializeCriticalSection ( LPCRITICAL_SECTION lpcs );

VOID EnterCriticalSection( LPCRITICAL_SECTION lpcs );

VOID LeaveCriticalSection( LPCRITICAL_SECTION lpcs );

VOID DeleteCriticalSection( LPCRlTICAL_SECTION lpcs );

Переменная типа
LPCRITICAL_SECTION содержит указатель
(а не дескриптор)

критического раздела. Функция
InitializeCriticalSection должна получить указатель на

пустой объект (&cs), который можно
создать следующим образом:

CRITICAL SECTION cs;

2.2.4.
Использование
классов MFC
для
создания
потоков

Способ создания потоков с помощью
функций библиотеки MFC, заключается в

создании
класса, порожденного от класса CWinThread.
Схема этого процесса выглядит

следующим образом:

// Класс CThreadExample

IMPLEMENT_DYNCREATE(CThreadExample, CWinThread)

CThreadExample::CThreadExample()

{

}

// инициализация переменных-членов
класса

CThreadExample::~CThreadExample()

{

}

BOOL CThreadExample::InitInstance()

{

// TODO: здесь следует выполнить инициализацию
потока

//здесь должны выполняться операции
инициализации,

//не связанные с переменными, например
создание

// экземпляров других объектов класса

return TRUE;

}

int CThreadExample::ExitInstance()

{

// TODO: здесь выполняются все операции
очистки для потока

return CWinThread::ExitInstance();

}

BEGIN_MESSAGE_MAP(CThreadExample, CWinThread)

//{{AFX_MSG_MAP(CThreadExample)

76

// ПРИМЕЧАНИЕ — Мастер ClassWizard будет
добавлять/удалять в

// этом месте макросы обработки сообщений

//}}AFX_MSG_MAP

END_MESSAGE_MAP ()

Объект класса CWinThread представляет поток
выполнения в рамках приложения.

Хотя основной поток
выполнения приложения обычно задается
объектом класса, поро-

жденного от
CWinApp, сам класс CWinApp является производным от класса

CWinThread.

Для обеспечения
безопасности потоков в MFC-приложениях
должны применяться

классы, являющиеся
производными от класса CWinThread, библиотека
MFC использует

переменные-члены
этого класса. Потоки, созданные с помощью
функции_beqinthreadex,

не могут использовать ни одной из
API-функций библиотеки MFC.

Поддерживаются два основных типов потоков, а именно рабочие и интерфейс-

ные.
Для рабочих потоков не нужно создавать
цикл обработки сообщений. Такие потоки

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

пользователем и не должны реагировать
на сообщения.

Интерфейсные потоки,
в отличие от рабочих, обрабатывают
сообщения, получен-

ные от системы
(или от пользователя). Для них необходима
специальная процедура об-

работки сообщений.
Создаются интерфейсные потоки на базе
класса CWinApp или не-

посредственно класса CWinThread.

Объект класса
CWinThread обычно существует в течение всего
времени существо-

вания потока,
однако такой способ функционирования
можно изменить, присвоив пере-

менной-члену m_bAutoDelete значение
FALSE.

Потоки создаются
с помощью функции AfxBeqinThread. Для создания
интерфейс-

ного потока функции AfxBeqinThread следует
передать указатель на класс CRuntimeC-

lass объекта, производного от класса
CWinThread. В случае рабочих потоков функция

AfxBeqinThread вызывается с указанием управляющей функции и параметра, переда-

ваемого последней.

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

параметры,
изменяющие приоритет, размер стека, флаги
создания и атрибуты безопас-

ности потока. Функция
AfxBeqinThread возвращает указатель на новый объект класса

CWinThread.

В качестве альтернативного
варианта можно определить, а затем создать объект,

производный от класса
CWinThread, вызвав функцию
CreateThread данного класса. В

этом случае производный объект может многократно использоваться при последова-

тельных созданиях и уничтожениях потока.

77

Многозадачная среда Windows — это операционная система, разработанная корпорацией Microsoft. Она позволяет пользователям выполнять несколько программ одновременно, что делает ее одной из самых популярных ОС в мире.

Особенностью многозадачной среды Windows является то, что она позволяет работать с различными приложениями одновременно, не прерывая их исполнение. Например, вы можете слушать музыку, открывать документы и проверять почту одновременно, не останавливая воспроизведение музыки или закрывая документы. Это обеспечивает повышенную эффективность работы и удобство для пользователей.

Многозадачность Windows возможна благодаря использованию технологии под названием «переключение контекста». Она позволяет операционной системе быстро переключаться между различными программами и процессами, назначая каждому из них определенное количество времени для выполнения. Это позволяет пользователям с комфортом выполнять различные задачи и обеспечивает плавность работы приложений.

Однако, несмотря на все преимущества многозадачности Windows, некоторые приложения или задачи могут потреблять больше ресурсов, что может замедлить работу всей системы. Поэтому важно уметь эффективно управлять запущенными программами и процессами, чтобы поддерживать оптимальную производительность операционной системы.

Содержание

  1. Многозадачная среда Windows: самая популярная операционная система
  2. Определяем многозадачность
  3. Как работает многозадачная среда Windows

Многозадачная среда Windows: самая популярная операционная система

Windows предоставляет пользователям удобный и интуитивно понятный интерфейс, который позволяет легко управлять открытыми приложениями и переключаться между ними. Благодаря этому, пользователи могут одновременно работать с текстовыми документами, просматривать веб-страницы, слушать музыку и многое другое.

С помощью многозадачности Windows можно запускать и управлять несколькими приложениями одновременно. Пользователь может открыть несколько окон со своими задачами и переключаться между ними с помощью мыши или клавиатуры.

Windows также предлагает различные инструменты и функции для управления задачами. Например, панель задач позволяет быстро переключаться между открытыми приложениями, а панель уведомлений предоставляет информацию о текущих процессах и уведомлениях.

Многозадачная среда Windows позволяет пользователям эффективно работать и повышает их продуктивность. Она стала неотъемлемой частью нашей повседневной жизни, помогая нам выполнять различные задачи одновременно и упрощая нашу работу с компьютером.

Определяем многозадачность

Когда вы открываете несколько приложений или выполняете несколько задач одновременно, операционная система Windows эффективно распределяет ресурсы компьютера между ними. Это позволяет увеличить производительность и эффективность работы, так как каждое приложение выполняется независимо от других, не мешая им.

Кроме того, в Windows реализована планировка задач, которая определяет, какой задаче будет выделен процессорное время в каждый момент времени. С помощью этой функции операционная система эффективно управляет приоритетами задач и автоматически переключается между ними.

Многозадачность в Windows также поддерживает межпроцессное взаимодействие, что позволяет приложениям обмениваться данными и взаимодействовать друг с другом. Это открывает широкие возможности для разработки сложных и функциональных приложений.

Как работает многозадачная среда Windows

Основной принцип работы многозадачной среды Windows основан на переключении между задачами с использованием планировщика задач. Планировщик задач определяет, какие программы и приложения могут выполняться в данный момент, а также осуществляет распределение ресурсов компьютера между ними.

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

Как только задача получает необходимые ресурсы, она переходит в активное состояние и начинает выполняться. Пользователь может взаимодействовать с задачей, работать с ее окнами, выполнять операции и т. д. В то же время другие задачи могут оставаться в пассивном состоянии, ожидая своей очереди на выполнение.

Когда пользователь переключается с одной задачи на другую, операционная система сохраняет состояние первой задачи и загружает состояние второй задачи. Это позволяет пользователям быстро переключаться между задачами и продолжать работу с ними на том месте, где они закончили.

Многозадачная среда Windows также поддерживает многопоточность, что означает, что одно и то же приложение может выполняться в нескольких потоках одновременно. Это позволяет приложению выполнять более сложные и ресурсоемкие задачи параллельно, ускоряя и повышая эффективность работы.

Преимущества многозадачной среды Windows: Недостатки многозадачной среды Windows:
Возможность одновременного выполнения нескольких задач Возможность возникновения конфликтов при работе с ресурсами
Быстрое переключение между задачами Высокое потребление ресурсов компьютера
Увеличение производительности работы Возможность возникновения ошибок приложений

Windows, разработанная корпорацией Microsoft, является одной из самых популярных операционных систем в мире. Одной из главных особенностей Windows является ее многозадачность, что делает ее уникальной и предпочтительной для большинства пользователей.

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

Однако, многозадачность в Windows не ограничивается просто возможностью выполнять несколько задач одновременно. Эта операционная система также предоставляет пользователю широкий спектр инструментов и функций для управления и организации многозадачности. Пользователь может изменять приоритеты задач, замораживать и возобновлять процессы, а также устанавливать ограничения на использование ресурсов системы различными программами.

Благодаря всем этим возможностям, Windows позволяет пользователям эффективно выполнять различные задачи, не теряя в производительности и качестве работы.

Кроме того, многозадачность в Windows также отражается на интерфейсе операционной системы. Пользователи могут легко перемещаться между открытыми окнами, перетаскивать и изменять их размеры, а также использовать горячие клавиши для быстрого доступа к основным функциям и программам. Все это делает работу с Windows удобной и эффективной.

В целом, многозадачность является основным преимуществом системы Windows, которое делает ее уникальной и популярной среди пользователей различных профессий и интересов. Благодаря многозадачности, пользователи могут эффективно выполнять множество задач одновременно и получать наилучший результат.

Содержание

  1. Многозадачность системы Windows: что делает ее уникальной
  2. История развития многозадачности в Windows
  3. Основные принципы работы многозадачности
  4. Гибкость и масштабируемость многозадачности
  5. Управление ресурсами в многозадачной среде Windows

Многозадачность системы Windows: что делает ее уникальной

Одной из главных причин, почему многозадачность в системе Windows делает ее уникальной, является то, что она обеспечивает возможность одновременного выполнения различных типов задач. Система Windows позволяет работать с различными приложениями, такими как текстовые редакторы, браузеры, мультимедийные плееры и другие программы, одновременно и без проблем переключаться между ними.

Кроме того, Windows предоставляет возможность запускать задачи в фоновом режиме. Это означает, что вы можете запустить выполнение задачи и продолжать работать с другими программами или приложениями, не останавливая первоначальную задачу. Например, вы можете загрузить файлы из Интернета, просматривать видео на YouTube или обрабатывать фотографии в редакторе изображений, пока фоновая задача продолжает свое выполнение.

Еще одной уникальной особенностью многозадачности в системе Windows является возможность работы с разными окнами и вкладками в рамках одного приложения. Например, вы можете открыть несколько окон браузера или текстового редактора и свободно перемещаться между ними. Это удобно для параллельной работы над несколькими проектами, одновременного просмотра нескольких веб-страниц или сравнения данных на разных вкладках в Excel или другой таблицы.

И наконец, система Windows предлагает возможность создания виртуальных рабочих столов. Это позволяет создавать отдельные рабочие пространства для разных задач и приложений. Например, вы можете иметь одно рабочее пространство для работы с проектом, другое для воспроизведения мультимедиа, и третье для выполнения повседневных задач. Это помогает организовать рабочий процесс и улучшить продуктивность.

В целом, многозадачность в системе Windows является одной из ее основных особенностей и делает ее уникальной. Она предоставляет гибкий и эффективный способ работы с различными приложениями и задачами, повышает производительность и улучшает опыт использования операционной системы.

История развития многозадачности в Windows

Первая версия операционной системы Windows, выпущенная в 1985 году, предлагала простую многозадачность. Она позволяла пользователям запускать несколько программ одновременно, однако каждая программа работала в отдельном окне и не была полноценно интегрирована в общую систему.

С появлением Windows 95 в 1995 году был представлен новый подход к многозадачности. Операционная система активно использовала принципы предварительной загрузки программ и использовала виртуальную память, что позволяло выполнять несколько задач параллельно.

Windows XP, выпущенная в 2001 году, предложила еще более превосходную многозадачность. Она включала улучшенные механизмы планирования задач, которые позволяли динамически распределять ресурсы между запущенными программами, увеличивая производительность системы.

Windows 7, выпущенная в 2009 году, получила еще более усовершенствованный механизм многозадачности. Она позволяла запускать все программы в отдельных процессах и автоматически распределять ресурсы в зависимости от их приоритета и активности.

С выпуском Windows 10 в 2015 году была представлена концепция «Универсальных приложений», которая позволяет пользователям использовать одинаковые приложения на разных устройствах под управлением Windows. Это дало новые возможности для многозадачности, так как пользователи могут начать работу с одним устройством и продолжить ее с другого, не потеряв прогресс.

Сегодня многозадачность в Windows продолжает развиваться, наращивая производительность, улучшая пользовательский опыт и предлагая все больше гибких и удобных функций.

Основные принципы работы многозадачности

  1. Планирование задач: операционная система Windows распределяет доступные ресурсы компьютера между запущенными приложениями и задачами. В зависимости от их приоритетов и требований к ресурсам система определяет, какие задачи будут выполняться в данный момент и насколько длительный период времени они будут активными.
  2. Поддержка нескольких потоков выполнения: многозадачность в Windows позволяет запускать и одновременно выполнять несколько потоков внутри одной задачи. Это позволяет разделить выполнение кода на более мелкие фрагменты, улучшая отзывчивость и производительность системы.
  3. Управление памятью: операционная система Windows динамически выделяет и освобождает оперативную память для задач в зависимости от их потребностей. Это позволяет эффективно использовать ресурсы компьютера и предотвращает перегрузку системы.
  4. Обработка событий: многозадачность в Windows основывается на обработке событий. Операционная система получает сигналы и события от различных источников, таких как пользовательский ввод, сетевые сообщения или таймеры, и распределяет ресурсы для их обработки. Это позволяет системе эффективно реагировать на изменяющуюся ситуацию и обеспечивать плавную работу приложений.

Благодаря этим принципам многозадачности операционная система Windows обеспечивает уникальную возможность выполнять множество задач одновременно, что делает ее незаменимой для современных компьютерных систем.

Гибкость и масштабируемость многозадачности

Благодаря масштабируемости, система Windows может эффективно управлять ресурсами и адаптироваться под различные требования пользователя. Независимо от количества запущенных приложений и процессов, Windows предоставляет гибкую и производительную среду для работы с ними. Это особенно важно в современном информационном мире, где требуется выполнение сложных задач и операций одновременно.

Гибкость и масштабируемость многозадачности Windows демонстрируются в использовании различных функций и возможностей. Один из примеров — функция «Активные окна», которая позволяет пользователям легко переключаться между открытыми приложениями и задачами. Кроме того, операционная система предоставляет многочисленные средства для управления приоритетами процессов и ресурсами, что позволяет пользователю оптимизировать использование системы под свои нужды.

Гибкость и масштабируемость многозадачности важны для эффективной работы с системой Windows. Благодаря этим характеристикам, пользователи могут работать с различными приложениями и процессами одновременно, не ограничиваясь одним заданием. Это обеспечивает эффективность и удобство использования ОС Windows в повседневной жизни и профессиональных целях.

Управление ресурсами в многозадачной среде Windows

Операционная система Windows использует несколько методов для управления ресурсами в многозадачной среде:

  • Планировщик задач — эта функция операционной системы определяет, какие задачи будут выполняться и в каком порядке. Планировщик обеспечивает то, чтобы каждая задача получала достаточное количество времени процессора для выполнения и не блокировала работу других задач.
  • Управление памятью — Windows умеет эффективно использовать оперативную память, позволяя задачам иметь доступ к необходимым данным в памяти. С помощью виртуальной памяти операционная система может использовать дополнительное пространство на жестком диске для расширения доступной памяти.
  • Управление файлами и дисками — Windows предоставляет механизмы для организации файловой системы и управления доступом к файлам и дискам. Это позволяет задачам эффективно работать с данными на дисках и обеспечивает безопасность данных.
  • Управление сетью — операционная система Windows обеспечивает поддержку различных протоколов сети и способствует эффективной передаче данных между задачами и удаленными узлами в сети.

Благодаря эффективному управлению ресурсами, операционная система Windows позволяет пользователям выполнять несколько задач одновременно без ощутимого снижения производительности системы. Это делает Windows идеальным выбором для пользователей, которым требуется многозадачность и высокая производительность.

Обновлено: 09.10.2023

  • Операционная система реального времени (RTOS). Операционные системы реального времени используются для управления оборудованием, научными приборами и промышленными системами. ОСРВ обычно имеет очень мало возможностей пользовательского интерфейса и не имеет утилит для конечного пользователя, поскольку система будет представлять собой «запечатанную коробку» при доставке для использования. Важно, чтобы ОСРВ управляла ресурсами компьютера таким образом, чтобы конкретная операция выполнялась точно за одно и то же время каждый раз, когда она происходит. В сложной машине более быстрое перемещение детали только потому, что доступны системные ресурсы, может иметь столь же катастрофические последствия, как и отсутствие движения вообще из-за занятости системы.
  • Один пользователь, одна задача. Как следует из названия, эта операционная система предназначена для управления компьютером, чтобы один пользователь мог эффективно выполнять одну задачу за раз. MS-DOS — хороший пример однопользовательской однозадачной операционной системы.
  • Однопользовательская, многозадачная. Сегодня большинство людей используют этот тип операционной системы на своих настольных и портативных компьютерах. Платформы Microsoft Windows и Apple macOS являются примерами операционных систем, которые позволяют одному пользователю одновременно работать с несколькими приложениями. Например, вполне возможно, что пользователь Windows пишет заметку в текстовом процессоре, загружая файл из Интернета и печатая текст сообщения электронной почты.
  • Многопользовательский режим. Многопользовательская операционная система позволяет нескольким пользователям одновременно использовать ресурсы компьютера. Операционная система должна следить за тем, чтобы требования различных пользователей были сбалансированы, и чтобы каждая из используемых ими программ имела достаточные и отдельные ресурсы, чтобы проблема с одним пользователем не затрагивала все сообщество пользователей. Unix, VMS и операционные системы для мэйнфреймов, такие как MVS, являются примерами многопользовательских операционных систем.
  • Распределенная. Эти операционные системы управляют несколькими компьютерами одновременно. Вместо того, чтобы использовать один мощный компьютер для решения больших задач, распределенные операционные системы разбивают его на части среди множества более мелких компьютеров. Вы можете найти эти системы в гигантских фермах серверов, но любители и преподаватели также создают свои собственные распределенные системы, используя недорогие машины и даже перепрофилированные игровые консоли.

Важно различать многопользовательские операционные системы и однопользовательские операционные системы, поддерживающие работу в сети. Если вы работаете в офисе, где системный администратор контролирует, какое программное обеспечение вы можете или не можете иметь на своем рабочем компьютере, вы используете однопользовательскую систему, которая является частью сети. Вы можете распечатать документ на принтере, совместно используемом другими сотрудниками, или иметь файловый сервер, на котором хранятся документы вашего отдела.

Помня о различных типах операционных систем, пришло время рассмотреть основные функции, предоставляемые операционной системой.

Что такое однозадачная операционная система? Однозадачная система может одновременно запускать только одну программу, в то время как многозадачная операционная система позволяет одновременно запускать более одной программы. Совместная многозадачность достигается за счет того, что каждый процесс выделяет время другим процессам определенным образом.

В чем разница между однозадачными и многозадачными операционными системами? Основное различие между однопользовательской и многопользовательской операционной системой заключается в том, что в однопользовательской операционной системе только один пользователь может получить доступ к компьютерной системе одновременно, в то время как в многопользовательской операционной системе несколько пользователей могут получить доступ к компьютерной системе одновременно.

Что такое многозадачность в операционной системе? Многозадачность в операционной системе позволяет пользователю выполнять более одной компьютерной задачи (например, работу прикладной программы) одновременно. Операционная система может отслеживать, где вы находитесь в этих задачах, и переходить от одной к другой без потери информации.

Что такое однопользовательская многозадачная ОС? Однопользовательская/многозадачная ОС

Операционная система, которая позволяет одному пользователю выполнять несколько задач одновременно, называется однопользовательской многозадачной операционной системой. Примеры включают ОС Microsoft Windows и Macintosh.

Что такое многопользовательская и многозадачная система? Резюме: разница между многопользовательской и многозадачностью заключается в том, что многопользовательская операционная система позволяет двум или более пользователям запускать программы одновременно. В то время как многопроцессорная операционная система поддерживает два или более процессоров, выполняющих программы одновременно, это также называется многозадачностью.

Что такое однозадачная операционная система? – Дополнительные вопросы

Какие бывают 4 типа ОС?

Ниже приведены популярные типы ОС (операционных систем): Пакетная операционная система. Многозадачная ОС с разделением времени. Многопроцессорная ОС.

Что такое многозадачность и ее виды?

Существует два основных типа многозадачности: вытесняющая и совместная.При вытесняющей многозадачности операционная система выделяет кванты времени ЦП каждой программе. При совместной многозадачности каждая программа может управлять ЦП столько времени, сколько ей нужно.

Что является примером многозадачности?

Многозадачность – это когда один человек выполняет несколько задач одновременно. Примеры включают жевание резинки во время ходьбы, отправку электронных писем во время встречи и разговор по телефону во время просмотра телевизора. Исследования показывают, что у многозадачности есть как преимущества, так и недостатки.

Сколько существует типов ОС?

Существует пять основных типов операционных систем. Эти пять типов ОС, скорее всего, работают на вашем телефоне, компьютере или других мобильных устройствах, таких как планшет.

Является ли однопользовательская и многозадачная операционная система?

Однозадачность и многозадачность

Однозадачная система может одновременно запускать только одну программу, тогда как многозадачная операционная система допускает одновременное выполнение нескольких программ. Unix-подобные операционные системы, такие как Solaris и Linux, а также не-Unix-подобные, такие как AmigaOS, поддерживают вытесняющую многозадачность.

Кто создал Boss OS?

BOSS – это индийский дистрибутив GNU/Linux, разработанный CDAC и настроенный в соответствии с цифровой средой Индии. Он поддерживает большинство индийских языков.

Что такое многопользовательская и многозадачная система класса 9?

ОС, которая позволяет выполнять несколько задач одновременно, называется многозадачной ОС. В этом типе ОС могут одновременно загружаться и использоваться в памяти несколько приложений. В то время как процессор обрабатывает только одно приложение в определенное время.

Что такое пакетные операционные системы?

Пакетная операционная система —

Операционная система этого типа не взаимодействует с компьютером напрямую. Есть оператор, который берет похожие задания с одинаковыми требованиями и группирует их в пакеты. Ответственность за сортировку заданий с одинаковыми потребностями лежит на операторе.

Это пример многопользовательской многозадачной операционной системы?

Многопользовательская. Многопользовательская операционная система позволяет нескольким пользователям одновременно использовать ресурсы компьютера. Unix, VMS и операционные системы для мэйнфреймов, такие как MVS, являются примерами многопользовательских операционных систем.

Какие существуют два основных типа операционных систем?

Что делают операционные системы?

Работа операционной системы

Операционная система (ОС) управляет всем программным и аппаратным обеспечением компьютера. Он выполняет основные задачи, такие как управление файлами, памятью и процессами, обработка ввода и вывода, а также управление периферийными устройствами, такими как дисководы и принтеры.

При включении компьютера какое программное обеспечение должно запускаться первым?

Когда вы включаете питание компьютера, первая запускаемая программа обычно представляет собой набор инструкций, хранящихся в постоянной памяти (ПЗУ) компьютера. Этот код проверяет аппаратное обеспечение системы, чтобы убедиться, что все работает правильно.

Что такое структура ОС?

Операционная система состоит из ядра, возможно, нескольких серверов и, возможно, некоторых пользовательских библиотек. Ядро предоставляет службы операционной системы через набор процедур, которые могут вызываться пользовательскими процессами через системные вызовы.

Что за ОС Linux?

Что за ОС Linux?

Какой тип операционной системы не относится?

1) Что из перечисленного не является операционной системой? Объяснение: Oracle — это СУБД (система управления реляционными базами данных). Он известен как Oracle Database, Oracle DB или Oracle Only.

Какие 5 операционных систем?

Пять наиболее распространенных операционных систем – Microsoft Windows, Apple macOS, Linux, Android и iOS от Apple.

Почему Windows 10 называют многозадачной ОС?

Являясь многозадачной системой, MS Windows позволяет нескольким программам находиться в памяти и работать в любой момент времени. Каждая программа имеет свое окно на экране дисплея. Это позволило реализовать многозадачность и упростить обмен данными. Windows 3.1 также могла запускать несколько приложений DOS в отдельных окнах.

Зачем нам нужна многозадачная ОС?

Многозадачность – это обычная функция компьютерных операционных систем. Это позволяет более эффективно использовать компьютерное оборудование; если программа ожидает завершения какого-либо внешнего события, такого как пользовательский ввод или ввод/вывод с периферийным устройством, центральный процессор все еще может использоваться с другой программой.

Краткий ответ, что такое многозадачность?

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

Многозадачность — это хорошо или плохо?

Во многих отношениях многозадачность кажется хорошей идеей: работая над несколькими задачами одновременно, они теоретически более продуктивны.Но даже если кажется, что многозадачники лучше справляются со своей работой, несколько исследований показывают, что многозадачность на самом деле снижает производительность.

Вот что означают все части для myfile:

Команда ls -l показывает нам много информации о файле. Давайте сломаем это. Это поля (слева направо) и их значения:

  • — Это обычный файл.
  • rw- Пользователь (владелец, aaron) может читать и записывать (изменять) файл, но не может его выполнять.
  • r— Любой член группы (пользователи) может читать файл, но не может записывать (изменять) или выполнять его.
  • — Все остальные (остальные, мир) вообще не имеют разрешений.
  • Это эквивалентно 640 в восьмеричном формате. ( 1102 равно 6, 1002 равно 4, 0002 равно 0)
  • — = обычный файл
  • d = каталог
  • l = символическая ссылка (буква «L» в нижнем регистре)
  • r = читаемый
  • w = доступно для записи
  • x = исполняемый файл
    • u — пользователь
    • g – это группа
    • o — другое
    • a это все (ugo)
    • + означает добавление этого разрешения
    • — означает удалить это разрешение
    • = означает установку всех разрешений
    • ОС работает в двух режимах
      • Режим ядраРежим ядра (также известный как привилегированный режим или режим супервизора)
        • Используется ОС для системных задач, таких как ввод-вывод.
        • Прерывания обрабатываются в привилегированном режиме. (Прерывание — это асинхронное уведомление о том, что что-то требует внимания.)
        • Может выполнять любую инструкцию на процессоре.
        • Задачи пользователя выполняются в этом режиме.
        • Пользователь не может переключиться в привилегированный режим
        • Пользователь должен запросить выполнение системных (привилегированных) задач
        • Чтобы разрешить одновременное выполнение нескольких задач, каждой задаче дается квант времени: задача выполняется в течение этого периода времени, после чего выполняется следующая задача.
        • ОС использует аппаратный таймер для временных интервалов.
          • ОС устанавливает временной интервал и запускает таймер.
          • ОС запускает/возобновляет выполнение задачи пользователя.
          • Таймер генерирует прерывание по истечении времени.
          • ОС (планировщик) восстанавливает управление.
            имеет все утилиты для изучения системы Windows. Заменой диспетчера задач является Process Explorer.

          • Используйте kill и killall для отправки сигнала другим процессам. (-SIGTERM, -SIGSTOP, -SIGCONT, -SIGKILL и т. д.)
          • Используйте top/htop, чтобы увидеть, как процессы меняют ядра (соответствие процессоров) во время работы.
          • Каждой задаче выделяются сегменты (страницы) памяти (фактические данные зависят от компилятора)
            • Кодовый сегментКодовый сегмент (также называемый текстовым сегментом)
            • Сегмент данныхСегмент данных (включая BSSBSS и кучу)
            • Сегмент стекаСегмент стека, показывающий взаимосвязь между сегментами. из книги Интерфейс программирования Linux. (Настоятельно рекомендуется)
            • ОС должна управлять ресурсами ввода-вывода, которые являются общими для всех задач.

            gcc в Windows (32-разрядная версия)

            bcc32 (32-разрядная версия)

            cl 9.0 (32-разрядная версия)

            cl 10.0 (64-разрядная версия)

            gcc в Linux 64-разрядная версия (4.4.3) )

            gcc в 32-разрядной версии Linux (3.3)

            отображает этот вывод. Кажется, он помещается между сегментами BSS и Data, но, возможно, он находится в сегменте BSS (см. gcc в Windows ниже):

            cl 9.0 (32-разрядная версия)

            gcc в 64-разрядной версии Linux (4.8.5)
            clang в 64-разрядной версии Linux (6.0.1)
            gcc в 32-разрядной версии Windows (4.5.3)

            Глядя на исполняемый файл программы nm, мы можем точно сказать, где он находится. Исполняемый файл называется segments:

            • Управление очередью печати
            • Управление сетью
            • Автоматическое обнаружение и подключение съемных дисков (например, USB-накопителей)
            • Веб-серверВеб-сервер
            • БрандмауэрБрандмауэр

            API операционной системы

            • Интерфейс между операционной системой и пользовательскими программами определяется набором системных вызовов, предоставляемых операционной системой.
            • Системные вызовы различаются в зависимости от операционной системы.
            • Однако большинство операционных систем придерживаются одной и той же концепции.
            • Фактическая механика выполнения системного вызова сильно зависит от машины.
              • Многие написаны на ассемблере.
              • Это одна из причин, по которой OS API использует язык программирования C.
              • Компьютер с одним процессором/ядром может одновременно выполнять только одну инструкцию.
              • Пользовательские программы работают в пользовательском режиме.
              • Когда процессу требуется системная служба: (например, открыть файл, прочитать клавиатуру, выделить память и т. д.)
                • Инструкция системного вызова (называемая ловушкой) выполняется (через прерывание) для передачи управления (переключение контекста) операционной системе (режим ядра).
                • ОС проверяет параметры и выясняет, чего именно хочет вызывающий процесс.
                • Системный вызов выполняется и возвращает управление инструкции, следующей за системным вызовом. (Как и любой «нормальный» вызов функции.)
                • Чтобы сделать возможным написание программ, которые могли бы работать в любой UNIX-совместимой системе, IEEEIEEE (Институт инженеров по электротехнике и электронике) разработал стандарт для UNIX под названием POSIXPOSIX.
                • Большинство версий UNIX поддерживают POSIX.
                • macOS имеет сертификат POSIXСертификация POSIX. (Пройдено автоматизированное тестирование.)
                • Mostly_POSIX-совместимыйMostly_POSIX-совместимый:
                  • Большинство дистрибутивов Linux
                  • iOS
                  • Android
                  • Cygwin в значительной степени совместим с POSIX.
                  • Вызов библиотеки: fopen (имеет ограниченную функциональность, проще в использовании)
                  • Системный вызов: open (намного больше функций, сложнее в использовании)

                    Прототип выглядит примерно так:
                  • Аргументы, переданные пользователем в стек, будут помещены в регистры для вызова, например
                    • дескриптор файла для чтения помещается в регистр ebx.
                    • адрес буфера для записи помещается в регистр ecx.
                    • количество байтов для чтения помещается в регистр edx.
                    • Если системный вызов ожидает ввода, вызывающий объект может быть заблокирован, и операционная система переключится на другой процесс.
              Концепции операционной системы — 8-е издание Зильбершац, Галвин, Ганье ©2009
              Позывной Описание
              < tt>pid = fork(); Создать дочерний процесс.
              pid = waitpid( pid, &statloc, options); Дождитесь завершения дочернего процесса.
              s = execve (name, argv, environp); Заменить процесс другим процессом.
              s = kill(pid, signal); Отправить сигнал процессу.
              exit(status ); Завершить процесс и вернуть статус.
              Позывной Описание
              < tt>fd = open(file, mode); Открывает файл для чтения/записи и т.д.
              s = close(fd); Закрывает файл.
              n = read(fd, buffer, nbytes); Чтение байтов из файла в память.
              n = write(fd, buffer, nbytes); Записать байты из памяти в файл.
              Позывной Описание
              < tt>s = mkdir(name, mode); Создать новый каталог.
              s = rmdir(name); Удаляет каталог.
              s = chdir(name); Перейти в другой каталог.
              s = unlink(name); < /td> Удалить существующий файл.
              Позывной Описание
              < tt>id = getuid(); Получить идентификатор текущего пользователя.

              Сравнение системных вызовов с использованием кода C и ассемблера. Вы действительно можете увидеть системные вызовы при написании ассемблерного кода. Эти тривиальные программы просто читают из стандартного ввода и записывают в стандартный вывод.

              Сборка: (readwrite.asm) Соответствующие системные вызовы:

              • Программисты могут использовать Win32 APIWin32 API (интерфейс прикладного программирования) для доступа к службам операционной системы.
              • Интерфейс не связан с системными вызовами, что позволяет Microsoft изменять фактический системный вызов без нарушения работы программ.
              • Количество функций в WIN32 API чрезвычайно велико. (тысячи, ссылка)
              • Большинство вызовов процедур выполняются в пространстве пользователя.
              • Система с графическим интерфейсом пользователя UNIX работает в основном в пользовательском режиме, за исключением нескольких системных вызовов, таких как вывод пикселя на экран.
              • Напротив, Win32 API имеет огромное количество вызовов для управления графическим интерфейсом, причем большинство вызовов выполняются в режиме ядра.
              • В следующей таблице перечислены некоторые API Win32, соответствующие вызовам POSIX.

              < td>Перемещает указатель файла. < td>stat

              UNIX/POSIX Windows Описание
              fork CreateProcess Создает новый процесс.
              waitpid WaitForSingleObject Ждет завершения процесса.
              execve ( нет) CreateProcess = fork + execve
              выход ExitProcess Завершить выполнение.
              open CreateFile Создать новый файл или открыть существующий.
              close CloseHandle Закрывает файл
              read ReadFile Чтение данных из файла.
              запись WriteFile Записать данные в файл.
              lseek SetFilePointer
              GetFileAttributes Получить атрибуты из файла.
              mkdir CreateDirectory Создает новый каталог.
              rmdir RemoveDirectory Удаляет каталог.
              unlink DeleteFile Удаляет существующий файл.
              chdir SetCurrentDirectory Изменить текущий рабочий каталог.
              time GetLocalTime Получить текущее системное время.

              Программа strace

              Можно «шпионить» за программами и точно видеть, какие именно системные вызовы выполняются. Это тривиально сделать в системах на основе Unix, таких как Linux или macOS. (Если strace недоступен в macOS, попробуйте вместо него dtrace. Возможно, существует скрипт-оболочка под названием dtruss, который, вероятно, будет работать лучше.)

              Эта программа (ptime.c) просто извлекает текущее системное время, соответствующим образом форматирует его и затем выводит на экран. Точный формат зависит от компилятора/библиотеки. Вот как это выглядит для трех разных компиляторов:

              Давайте проследим за программой и посмотрим, что происходит за кулисами. Предполагая, что исполняемый файл называется ptime, мы запускаем strace в программе следующим образом (под Linux):

              Опция Значение
              -c Показать только сводную информацию.
              < tt>-i Отображает указатель инструкций при каждом вызове.
              — r Отображает относительную метку времени (в микросекундах).
              -t Показать время каждого звонка.
              -tt Показать время суток с микросекундами для каждого вызова.
              -v Подробный. Показать все параметры для системных вызовов.
              -x Показать не- ASCII в шестнадцатеричном формате.
              -y Включить имя файла с дескриптором файла.
              -столбец Выравнивание возвращаемых значений по определенному элементу столбец.
              -e trace=set Только показывать вызовы в set (например, trace=open,close).

              Краткий обзор отношений между FILE * и дескрипторами файлов:

              Структура ФАЙЛА из компилятора GNU (версия 4.4.3):

              Кстати, существует также программа ltrace, которая отслеживает вызовы библиотек (пользовательский режим). Запустите его таким же образом:

              и это результат, который мы видим: (Используйте -n X для отступа вызовов, где X — столбец для выравнивания. -S< Параметр /tt> также показывает системные вызовы.)

              Многозадачность в операционной системе позволяет пользователю одновременно выполнять более одной компьютерной задачи (например, работу прикладной программы). … Microsoft Windows 2000, IBM OS/390 и Linux являются примерами операционных систем, которые могут выполнять многозадачность (почти все современные операционные системы могут).

              Что такое многозадачная операционная система?

              Многозадачность в операционной системе (ОС)

              Определение. Многозадачная операционная система предоставляет интерфейс для выполнения нескольких программных задач одним пользователем одновременно в одной компьютерной системе. Например, любую задачу редактирования можно выполнять одновременно с другими программами.

              Какая операционная система является многозадачной?

              Операционная система, которая позволяет одному пользователю выполнять несколько задач одновременно, называется однопользовательской многозадачной операционной системой. Примеры включают ОС Microsoft Windows и Macintosh.

              Что такое многозадачность, объяснить типы многозадачности?

              В многозадачности задействован только один ЦП, но он переключается с одной программы на другую так быстро, что создается впечатление, что все программы выполняются одновременно. … Существует два основных типа многозадачности: упреждающая и совместная.

              Каковы преимущества многозадачной операционной системы?

              Преимущества многозадачной операционной системы:

              • Совместное использование времени.
              • Обрабатывает несколько пользователей.
              • Защищенная память.
              • Эффективная виртуальная память.
              • Программы могут работать в фоновом режиме.
              • Повышает надежность системы.
              • Пользователь может использовать несколько программ и компьютерных ресурсов.
              • Распределение процессов.

              Почему Windows 10 называют многозадачной ОС?

              Являясь многозадачной системой, MS Windows позволяет нескольким программам находиться в памяти и работать в любой момент времени. Каждая программа имеет свое окно на экране дисплея. … Это позволило реализовать многозадачность и упростить обмен данными. Windows 3.1 также могла запускать несколько приложений DOS в отдельных окнах.

              Какие существуют два типа многозадачности?

              Операционные системы ПК используют два основных типа многозадачности: совместную и вытесняющую.

              Краткий ответ, что такое многозадачность?

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

              Что такое процесс многозадачности?

              В компьютерных технологиях многозадачность – это одновременное выполнение нескольких задач (также называемых процессами) в течение определенного периода времени. … Многозадачность не требует параллельного выполнения нескольких задач в одно и то же время; вместо этого он позволяет выполнять более одной задачи за определенный период времени.

              Что называется многозадачностью класса 11?

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

              Что вы подразумеваете под многозадачной ОС?

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

              Почему Linux многозадачен?

              С точки зрения управления процессами ядро ​​Linux представляет собой вытесняющую многозадачную операционную систему. Будучи многозадачной ОС, она позволяет нескольким процессам совместно использовать процессоры (ЦП) и другие системные ресурсы. Каждый процессор одновременно выполняет одну задачу.

              Читайте также:

                  

              • Какие драйверы нужны для Windows 10
              •   

              • Поиск приложения что такое windows 10
              •   

              • Bluescreen 1049 windows 7 как исправить
              •   

              • Как выйти из библиотеки изображений в Windows
              •   

              • Линия в Windows 10 не работает

  • Почему windows лучше чем linux
  • Почему windows лучше mac os
  • Почему windows запускается только с флешки
  • Почему windows запускается только в безопасном режиме
  • Почему windows defender не удаляет вирусы