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

3. Алгоритмы планирования процессов и потоков

3.1. Планирование и диспетчеризация

Планирование процессов включает в себя решение следующих задач:

·  определение момента времени для смены выполняемого процесса;

·  выбор процесса на выполнение из очереди готовых процессов.

Различные алгоритмы планирования могут преследовать различные цели и обеспечивать разное качество мультипрограммирования. Например, алгоритм должен гарантировать, что ни один процесс не будет занимать процессор дольше определенного времени; другой обеспечивает максимально быстрое выполнение «коротких» задач; третий обеспечивает преимущественное право на процессорное время интерактивным приложениям. Именно особенности планирования процессов в наибольшей степени определяют специфику ОС.

В большинстве ОС универсального назначения планирование осуществляется динамически (on-line), то есть решения принимаются во время работы системы на основе анализа текущей ситуации. ОС не имеет никакой предварительной информации о задачах, которые появляются в случайные моменты времени.

Статический тип планирования используется в специализированных системах, где набор одновременно выполняемых задач определен заранее (например, в системах реального времени). Здесь решение о планировании принимается заранее (off-line).

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

·  сохранение контекста текущего процесса;

·  загрузка контекста нового процесса;

·  запуск нового процесса.

В отличие от планирования, осуществляемого программными средствами ОС, диспетчеризация реализуется совместно с аппаратными средствами процессора.

Примечание. В различных ОС компоненты, занимающиеся планированием, могут называться по-разному: scheduler – распорядитель, или планировщик, – в Unix; dispatcher – в Windows.

3.2. Вытесняющие и невытесняющие алгоритмы планирования

С самых общих позиций – по принципу освобождения процессора активным процессом – существует два основных типа процедур планирования процессов: вытесняющие и невытесняющие.

Невытесняющая многозадачность (non-preemptive multitasking) – способ планирования процессов, при котором активный процесс выполняется до тех пор, пока он сам, по собственной инициативе, не отдаст управление планировщику операционной системы для того, чтобы тот выбрал из очереди другой готовый к выполнению процесс.

При невытесняющем программировании механизм планирования распределен между ОС и прикладными программами, что создает проблемы как для пользователей, так и для разработчиков приложений, хотя и может быть преимуществом при решении некоторого фиксированного набора задач [1].

Вытесняющая многозадачность (preemptive multitasking) – способ, при котором решение о переключении процессора с выполнения одного процесса на выполнение другого принимается операционной системой, а не самой активной задачей.

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

Почти во всех современных операционных системах, ориентированных на высокопроизводительное выполнение приложений (Unix, Windows NT/2000, OS/2, VAX/VMS), реализованы вытесняющие алгоритмы планирования процессов, в которых механизм планирования задач целиком сосредоточен в операционной системе. Программист пишет свое приложение, не заботясь о том, что оно будет выполняться параллельно с другими задачами. Операционная система определяет момент снятия с выполнения активной задачи, запоминает ее контекст, выбирает из очереди готовых задач следующую и запускает ее на выполнение, загружая ее контекст.

3.3. Алгоритмы, основанные на квантовании (классификация по принципу смены активного процесса во времени)

В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если исчерпан квант процессорного времени, отведенный данному процессу (или процесс перешел в состояние ожидания, или произошла ошибка, или процесс завершился и покинул систему).

Процесс, который исчерпал свой квант, переводится в состояние готовности и ожидает, когда ему будет предоставлен новый квант процессорного времени, а на выполнение в соответствии с определенным правилом выбирается новый процесс из очереди готовых. Это – концепция разделения времени. Ниже изображен граф состояний процесса, соответствующий описанному алгоритму. Видно, что это частный случай графа рис. 2.4.

Рис. 2.6. Граф состояний процесс в системе с квантованием

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

· Случай, когда всем процессам предоставляются кванты одинаково длины (рис. 2.7).

Рис. 2.7. Режим разделения времени. Иллюстрация расчета времени ожидания в очереди

Приведем некоторые весьма грубые оценки.

Пусть в системе имеется n процессов, каждый из которых требует для своего выполнения примерно B единиц времени при монопольном использовании системы. Пусть q – длина кванта.

Тогда процесс проводит в ожидании следующего кванта время, равное q(n-1). Чем больше процессов в системе, тем больше эта величина и меньше возможность вести интерактивную работу с пользователями. Однако если величина кванта очень невелика, то время ожидания все равно будет приемлемым для пользователей. Типичное значение кванта в системах разделения времени составляет десятки миллисекунд.

Если квант короткий (т. е. в общем случае B >> q и процесс многократно участвует в цикле обработки), то суммарное время, которое процесс проводит в ожидании процессора, прямо пропорционально B.

Действительно, необходимое для процесса количество циклов выполнения равно B/q, и тогда общее время ожидания равно (q(n-1))*( B/q), или в итоге – B(n-1).

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

· Варианты алгоритмов квантования с изменяющимся квантом.

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

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

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

ŸŸ Процессы, которые не полностью использовали выделенный им квант (например, из-за ухода на выполнение операций ввода-вывода), могут получить компенсацию в виде привилегий при последующем обслуживании. Для этого планировщик создает две очереди готовых процессов (рис. 2.8).

Рис. 2.8. Квантование с предпочтением процессов, интенсивно обращающихся к вводу-выводу

Очередь 1 образована процессами, которые пришли в состояние готовности в результате исчерпания кванта времени, а очередь 2 – потоками, у которых завершилась операция ввода-вывода. При выборе процесса для выполнения прежде всего просматривается вторая очередь, и только если она пуста, квант выделяется потоку из первой очереди.

· Очереди готовых процессов также могут быть организованы по-разному: по правилу «первый пришел – первый обслужился» (FIFO) или по правилу «последний пришел – первый обслужился» (LIFO).

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

3.4. Алгоритмы, основанные на приоритетах (классификация по принципу выбора процесса на выполнение из очереди)

· Приоритет – это число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной машины, в частности, процессорного времени. Чем выше приоритет процесса, тем значительнее его привилегии и тем меньше времени он будет проводить в очередях.

Приоритет может выражаться целым или дробным, положительным или отрицательным значением. В некоторых ОС принято, что большее число обозначает больший приоритет, в других – наоборот (большее число означает меньший приоритет).

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

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

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

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

В системах с относительными приоритетами активный процесс выполняется до тех пор, пока он сам не покинет процессор, перейдя в состояние ожидания (или же произойдет ошибка, или процесс завершится) (см. рис. 2.9, а).

В системах с абсолютными приоритетами выполнение активного процесса прерывается еще при одном условии: если в очереди готовых процессов появился процесс, приоритет которого выше приоритета активного процесса. В этом случае прерванный процесс переходит в состояние готовности (см. рис. 2.9, б).

Рис. 2.9. Графы состояний процессов
в системах с относительными и абсолютными приоритетами

· В многопоточных ОС приоритет потока непосредственно связан с приоритетом процесса, в рамках которого выполняется данный поток. Приоритет процесса назначается операционной системой при создании процесса. ОС учитывает статус процесса (системный или прикладной), статус пользователя, запустившего процесс; наличие явного указания пользователя на присвоение процессу определенного уровня приоритета.

Значение приоритета включается в дескриптор процесса и используется при назначении приоритета потокам этого процесса. Поток может быть инициирован по команде пользователя или в результате выполнения системного вызова другим потоком. В последнем случае ОС принимает во внимание значение параметров системного вызова.

3.5. Смешанные алгоритмы планирования (квантование с приоритетами)

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

На смешанных алгоритмах основано планирование в системах Windows NT и Unix System V Release 4. И в одной, и в другой системе реализована дисциплина вытесняющей многозадачности, основанная на использовании абсолютных приоритетов и квантования. Эти системы используем как основу для рассмотрения смешанных алгоритмов. Обобщенный граф состояния процессов (потоков) в этом случае имеет вид, представленный на рис. 2.10.

Рис. 2.10. Граф состояний процессов (потоков)
в системах с планированием на основе абсолютных приоритетов и квантования

Общими для упомянутых ОС являются следующие моменты.

·  Диапазон приоритетов подразделяется на несколько классов.

·  Часть диапазона отведена для процессов (потоков) с переменными приоритетами, часть – для процессов (потоков) с фиксированными приоритетами. К последним относятся процессы реального времени, наиболее критичные ко времени и имеющие самые высокие приоритеты.

·  При планировании процессов (потоков) с динамическими приоритетами приоритет процесса (потока), полностью исчерпавшего свой очередной квант времени, снижается; напротив, если квант полностью не исчерпан, приоритет повышается.

· Планирование процессов в Unix

Понятие «поток» отсутствует. Планирование осуществляется на уровне процессов.

Подпись: Создание процессовВсе процессы создаются системным вызовом fork(). Этот вызов выполняется всякий раз, когда возникает необходимость в запуске нового процесса, например, из пользовательского приложения (fork содержится в приложении) или из командной строки (fork формируется системой). Процесс, сделавший этот вызов, называется родительским, а вновь созданный процесс – дочерним. Прародителем всех процессов является процесс init, называемый также распределителем процессов. Он загружается первым и производит настройку системы. Загрузившись, init запускает login – задачу регистрации пользователей, которая, проверив их имя и пароль, в свою очередь запускает рабочую оболочку (shell)

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

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

Подпись: Классы приоритетовПриоритетный класс

Глобальное значение

приоритета

Порядок выбора процесса

планировщиком

Реальное время

(real time)

159

Первый

…..

100

Системные процессы

(system)

99

…..

60

Процессы разделения времени

(time-shared)

59

…..

0

Последний

Каждый класс имеет свои характеристики планирования процессов.

Подпись: Планирование процессов разных классов

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

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

Характеристики планирования процессов реального времени включают две величины:

w  уровень глобального приоритета;

w  квант времени.

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

Состав класса процессов разделения времени наиболее неопределенный и часто меняющийся, в отличие от двух предыдущих классов. Эти процессы до появления Unix System V Release 4 были единственным классом процессов, и по умолчанию новому процессу назначается именно этот класс.

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

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

· Планирование процессов в Windows NT

ОС Windows NT является многопотоковой (многонитевой). Сразу после запуска процесса создается один поток. Этот поток может запускать другие потоки, реализуя многозадачность в рамках процесса.

Подпись: Создание процессов 

и потоков

В отличие от ОС Unix, концепция иерархии не является основополагающей и процессы могут запускаться независимо. Пользователь может непосредственно запустить процесс как исполняемый файл при помощи Диспетчера задач (Task Manager) или через командную строку.

Запуск процесса из приложения осуществляется как при помощи функций ОС WinExec и LoadModule, так и при помощи функции CreateProcess, специально предназначенной для запуска процессов. В последнем случае запущенный процесс можно расценивать как дочерний.

Запуск потоков выполняется только процессами. Однако то, какие именно фрагменты приложения могут выполняться параллельно, определяется пользователем, и соответствующие фрагменты описываются как потоки (thread).

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

Класс приоритета

Уровень приоритета

1

REALTIME_PRIORITY_CLASS (процессы реального времени)

24

2

HIGH_PRIORITY_CLASS (высокоприоритетные)

13

3

NORMAL_PRIORITY_CLASS (обычные)

9 или 7

4

IDLE_PRIORITY_CLASS (низкоприоритетные)

4

При запуске процесса через пользовательский интерфейс ОС по умолчанию присваивает ему приоритет класса 3. Приоритет выполняемого процесса может быть изменен администратором или пользователем (например, через Диспетчер задач, выделив процесс, нажав правую кнопку мыши и задав нужное значение). При запуске процесса из приложения с помощью функции CreateProcess класс приоритета можно задать как параметр функции.

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

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

Подпись: Классы и уровни приоритетовДля потоков в системе определено 32 уровня приоритетов и два класса – потоки реального времени (приоритеты 16 – 31) и потоки с переменными приоритетами (приоритеты 1 – 15; приоритет 0 зарезервирован для системных целей). Схема назначения приоритетов изображена ниже.

Организационная диаграмма

Рис. 2.11. Приоритеты и схема их назначения в Windows NT

Подпись: Планирование 

выполнения потоков

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

Большинство потоков в системе попадает в класс с переменными приоритетами. При планировании таких потоков используется стратегия динамических приоритетов. Если поток полностью исчерпал свой квант, то его приоритет понижается на некоторую величину, В то же время приоритет потоков, которые перешли в состояние ожидания, не использовав полностью выделенный квант, повышается. При таком подходе не дискриминируются интерактивные задачи, часто выполняющие операции ввода-вывода. ОС наращивает приоритет дифференцированно, в частности, повышает приоритет в большей степени интерактивным приложениям и в меньшей – потокам, выполняющим дисковые операции.

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

3.6. Маленький пример, иллюстрирующий работу с приоритетами

Приводится приложение, созданное в среде Delphi 6. Приложение содержит описание двух потоков – t1 и t2, выполнение которых состоит в циклическом вызове методов (процедур), изменяющих значение общей переменной value. Метод thread1.work для потока t1 увеличивает переменную value на 1, соответствующий метод для потока t2 уменьшает ее на 1.

Изменение значения value визуализируется посредством индикатора хода процесса в виде прямоугольника, закрашиваемого в синий цвет. Размер закрашиваемой области отображает значение value; 50% заполнения цветом соответствует value = 0.

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

Потоки запускаются нажатием кнопки запуска.

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

Задание обоим потокам максимально допустимых в приложении значений (установка обоих движков в крайнее правое положение) может привести к зависанию системы, устранить которое можно только через диспетчер задач путем завершения приложения. Причина следующая.

Реально при запуске приложения, а затем двух рассматриваемых потоков в системе существует три потока – два пользовательских и один, создаваемый системой, соответствующий собственно процессу и выполняющий все действия кроме тех, что выполняют потоки t1 и t2, в частности, этот «основной» поток прорисовывает окна. Изначально все три потока имеют одинаковый приоритет. Задавая потокам t1 и t2 максимальное значение, мы, во-первых, почти полностью загружаем процессор их выполнением (это можно видеть через посредство диспетчера задач). Во-вторых, мы лишаем третий поток процессорного времени. Это видно, если просто сделать активным любое окно любого другого приложения, а затем попытаться вернуться в окно рассматриваемого приложения. Это окно не прорисовывается. Единственный выход из ситуации – снять приложение через диспетчер задач. Поэтому экспериментировать с этим режимом работы не следует.

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

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, ComCtrls, StdCtrls;

type

TForm1 = class(TForm)

TrackBar1: TTrackBar;

Button1: TButton;

TrackBar2: TTrackBar;

Button2: TButton;

ProgressBar1: TProgressBar;

Label1: TLabel;

Label2: TLabel;

Timer1: TTimer;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Memo2: TMemo;

procedure Button1Click(Sender: TObject);

procedure TrackBar1Change(Sender: TObject);

procedure TrackBar2Change(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

{Определение классов для 1-го и 2-го потоков}

thread1 = class(TThread)

protected

procedure execute; override; //переопределение процедуры класса потока

procedure work;//добавляется метод класса (собственно обработка)

end; {thread1}

thread2 = class(TThread)// класс для 2-го потока

protected

procedure execute; override;

procedure work;

end; {thread2}

{Описание потоков и др.}

var

Form1: TForm1;

t1:thread1; //1-й поток

t2:thread2; //2-й поток

value:longint; //разделяемый ресурс (изменяется обоими потоками)

c1,c2:int64; // число запусков каждого потока

implementation

{$R *.dfm}

{Формирование кода потока (вставка кода потока в метод execute для каждого потока)}

procedure thread1.execute;

begin

repeat

synchronize(work); //вызов метода обработки критической секции

until terminated; //цикл до вызова метода, завершающего выполнение потока

end;

procedure thread2.execute;

begin

repeat

synchronize(work);

until terminated;

end;

{Описание метода обработки разделяемой переменной value для каждого потока}

procedure thread1.work;

begin

value:=value+1;

c1:=c1+1;

end;

procedure thread2.work;

begin

value:=value-1;

c2:=c2+1;

end;

{создание потоков t1 и t2 при нажатии Button1}

procedure TForm1.Button1Click(Sender: TObject);

begin

c1:=1;

c2:=1;

value:=0;

t1:=thread1.create(false);

t2:=thread2.create(false);

end;

{обработка события перемещения движков для обоих потоков}

procedure TForm1.TrackBar1Change(Sender: TObject);

begin

case TrackBar1.position of //диапазон изменения приоритета потока

1: t1.priority:=tpIdle;

2: t1.Priority:=tpLowest;

3: t1.Priority:=tpLower;

4: t1.priority:=tpNormal;

5: t1.priority:=tpHigher;

6: t1.priority:=tpHighest;

end;

{вывод приоритета потока в боковое поле memo2}

memo2.lines. add('Thread 1: '+inttostr(getthreadpriority(t1.handle)));

end;

procedure TForm1.TrackBar2Change(Sender: TObject);

begin

case TrackBar2.position of

1: t2.priority:=tpIdle;

2: t2.Priority:=tpLowest;

3: t2.Priority:=tpLower;

4: t2.priority:=tpNormal;

5: t2.priority:=tpHigher;

6: t2.priority:=tpHighest;

end;

memo2.lines. add('Thread 2: '+inttostr(getthreadpriority(t2.handle)));

end;

{остановка и завершение работы обоих потоков при нажатии Button2}

procedure TForm1.Button2Click(Sender: TObject);

begin

t1.suspend;

t2.suspend;

t1.terminate;

t2.terminate;

{Вывод числа запусков каждого потока в течение сеанса}

memo2.lines. add('Thread 1: '+inttostr(c1)+' запусков, Thread 2: '+inttostr(c2)+' запусков');

end;

{Вывод значения value в виде индикатора прогресса каждые 10 мс: обработка сообщений от таймера}

procedure TForm1.Timer1Timer(Sender: TObject);

begin

form1.progressbar1.position:=value;

end;

begin

end.

Верхний колонтитул

Заголовок1. Arial 12, полужирный, по центру, интервал одинарный, перед: 6 пт, после: 6 пт

Заголовок2. Arial 12, полужирный, курсив, по центру, интервал одинарный, перед: 6 пт, после: 6 пт

Заголовок 3. Arial 11, полужирный, курсив, интервал одинарный, перед: 6 пт, после: 3 пт

Подзаголовок 1. Основной текст, полужирный. Так выглядит текст, отформатированный в этом стиле.

Обычный – Arial 10, влево, интервал одинарный. Так выглядит текст, отформатированный в этом стиле.

Основной текст - Обычный, по ширине, интервал после: 6 пт.

Так выглядит текст, отформатированный в этом стиле. Так выглядит текст, отформатированный в этом стиле.

Основной текст с отступом - Обычный №1 + отступ: первая строка 0.67, по ширине, интервал после: 6 пт.

Так выглядит текст, отформатированный в этом стиле. Так выглядит текст, отформатированный в этом стиле.

·  Маркиров. список1

·  Так выглядит текст, отформатированный в этом стиле отформатированный в этом стиле отформатированный в этом стиле

·  отформатированный в этом стиле.

-  Маркиров. список2

w  Маркиров. список 3

w  Так выглядит текст, отформатированный в этом стиле отформатированный в этом стиле отформатированный в этом стиле

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

-  отформатированный в этом стиле.

1.  Нумеров. Список №1.

2.  Так выглядит текст, отформатированный в этом стиле отформатированный в этом стиле отформатированный в этом стиле отформатированный в этом стиле.

3.  Так выглядит текст, отформатированный в этом стиле.

Курсив-выдел. Так выглядит текст, отформатированный в этом стиле.

Курсив-жирный. Так выглядит текст, отформатированный в этом стиле.

Полужирный

Заголовок таблицы

Подпись под рисунком

Тексты выносок: обычный

Тексты выносок по центру

Алгоритм, 1-я строка: обычный + интервал перед 6

Алгоритм

Алгоритм

Алгоритм

Алгоритм, последняя строка: обычный + интервал после 6

Формула: p=(np/n)*

[1] Примером эффективного использования невытесняющего планирования являются файл-серверы NetWare 3.x и 4.x, в которых благодаря такому планированию достигнута высокая скорость выполнения файловых операций.



Подпишитесь на рассылку:


Алгоритмы


Проекты по теме:

Основные порталы, построенные редакторами

Домашний очаг

ДомДачаСадоводствоДетиАктивность ребенкаИгрыКрасотаЖенщины(Беременность)СемьяХобби
Здоровье: • АнатомияБолезниВредные привычкиДиагностикаНародная медицинаПервая помощьПитаниеФармацевтика
История: СССРИстория РоссииРоссийская Империя
Окружающий мир: Животный мирДомашние животныеНасекомыеРастенияПриродаКатаклизмыКосмосКлиматСтихийные бедствия

Справочная информация

ДокументыЗаконыИзвещенияУтверждения документовДоговораЗапросы предложенийТехнические заданияПланы развитияДокументоведениеАналитикаМероприятияКонкурсыИтогиАдминистрации городовПриказыКонтрактыВыполнение работПротоколы рассмотрения заявокАукционыПроектыПротоколыБюджетные организации
МуниципалитетыРайоныОбразованияПрограммы
Отчеты: • по упоминаниямДокументная базаЦенные бумаги
Положения: • Финансовые документы
Постановления: • Рубрикатор по темамФинансыгорода Российской Федерациирегионыпо точным датам
Регламенты
Термины: • Научная терминологияФинансоваяЭкономическая
Время: • Даты2015 год2016 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

АвиацияАвтоВычислительная техникаОборудование(Электрооборудование)РадиоТехнологии(Аудио-видео)(Компьютеры)

Общество

БезопасностьГражданские права и свободыИскусство(Музыка)Культура(Этика)Мировые именаПолитика(Геополитика)(Идеологические конфликты)ВластьЗаговоры и переворотыГражданская позицияМиграцияРелигии и верования(Конфессии)ХристианствоМифологияРазвлеченияМасс МедиаСпорт (Боевые искусства)ТранспортТуризм
Войны и конфликты: АрмияВоенная техникаЗвания и награды

Образование и наука

Наука: Контрольные работыНаучно-технический прогрессПедагогикаРабочие программыФакультетыМетодические рекомендацииШколаПрофессиональное образованиеМотивация учащихся
Предметы: БиологияГеографияГеологияИсторияЛитератураЛитературные жанрыЛитературные героиМатематикаМедицинаМузыкаПравоЖилищное правоЗемельное правоУголовное правоКодексыПсихология (Логика) • Русский языкСоциологияФизикаФилологияФилософияХимияЮриспруденция

Мир

Регионы: АзияАмерикаАфрикаЕвропаПрибалтикаЕвропейская политикаОкеанияГорода мира
Россия: • МоскваКавказ
Регионы РоссииПрограммы регионовЭкономика

Бизнес и финансы

Бизнес: • БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумаги: • УправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги - контрольЦенные бумаги - оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудит
Промышленность: • МеталлургияНефтьСельское хозяйствоЭнергетика
СтроительствоАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством

Каталог авторов (частные аккаунты)

Авто

АвтосервисАвтозапчастиТовары для автоАвтотехцентрыАвтоаксессуарыавтозапчасти для иномарокКузовной ремонтАвторемонт и техобслуживаниеРемонт ходовой части автомобиляАвтохимиямаслатехцентрыРемонт бензиновых двигателейремонт автоэлектрикиремонт АКППШиномонтаж

Бизнес

Автоматизация бизнес-процессовИнтернет-магазиныСтроительствоТелефонная связьОптовые компании

Досуг

ДосугРазвлеченияТворчествоОбщественное питаниеРестораныБарыКафеКофейниНочные клубыЛитература

Технологии

Автоматизация производственных процессовИнтернетИнтернет-провайдерыСвязьИнформационные технологииIT-компанииWEB-студииПродвижение web-сайтовПродажа программного обеспеченияКоммутационное оборудованиеIP-телефония

Инфраструктура

ГородВластьАдминистрации районовСудыКоммунальные услугиПодростковые клубыОбщественные организацииГородские информационные сайты

Наука

ПедагогикаОбразованиеШколыОбучениеУчителя

Товары

Торговые компанииТоргово-сервисные компанииМобильные телефоныАксессуары к мобильным телефонамНавигационное оборудование

Услуги

Бытовые услугиТелекоммуникационные компанииДоставка готовых блюдОрганизация и проведение праздниковРемонт мобильных устройствАтелье швейныеХимчистки одеждыСервисные центрыФотоуслугиПраздничные агентства

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