Процессы в операционной системе UNIX (3 глава дипломной работы), страница 2

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

Как и большинство современных операционных систем, UNIX использует механизм виртуальной памяти. Суммарный объем оперативной памяти, выделенной всем выполняющимся процессам (суммарная виртуальная память), может превышать физический объем оперативной памяти ЭВМ. При этом часть блоков памяти, не используемая в данный момент активными процессами, выгружается на диск, в область свопинга (swap); когда процесс обращается к адресам памяти из выгруженного блока, ядро фиксирует это обращение и считывает блок обратно в ОЗУ (возможно, с вытеснением на диск других данных). Обычно областью свопинга является раздел жесткого диска, хотя некоторые варианты UNIX используют в этом качестве файл.

            Ранние версии UNIX использовали такой механизм свопинга, при котором неактивные процессы полностью вытеснялись на диск. Во многих изданиях именно такой алгоритм реализации виртуальной памяти понимается под термином «свопинг». В настоящее время UNIX использует более гибкий механизм страничного замещения (paging).  Память процессам выделяется страницами – блоками фиксированного объема, обычно порядка 2-4 кбайт. Ядро ведет статистику обращений процессов к выделенным страницам памяти, и при необходимости переноса части данных на диск выгружаются наиболее редко используемые страницы.

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

С каждым процессом ассоциируются потоки ввода-вывода – программные интерфейсы, позволяющие процессу обмениваться информацией с внешней средой. Каждый процесс имеет потоки (рисунок 3.1):

-  поток стандартного ввода stdin  (по умолчанию - клавиатура);

-  поток стандартного вывода stdout (по умолчанию – экран терминала);

-  поток сообщений stderr (служит для вывода сообщений об ошибках и предупреждений; по умолчанию – также экран терминала).

При непосредственном запуске процесса (программы) средствами командного интерпретатора shell (ввод команды в командной строке, фрагмент shell-сценария) установкам по умолчанию соответствует простая команда, состоящая из имени исполняемого файла, и, возможно, параметров.

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

proc1

будет означать связывание входящего потока с клавиатурой, а обоих исходящих – с экраном терминала (рисунок 3.1).

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

Запись

proc1  <f1.dat

приведет к связыванию потока стандартного ввода с файлом f1.dat (рисунок 3.2). При этом те данные, которые предполагалось вводить с клавиатуры, будут считаны из файла.

Запись

proc1  >f1.dat

приведет к связыванию потока стандартного вывода с файлом f1.dat (рисунок 3.3). При этом информация, которая по умолчанию выводится на экран, будет записана в файл f1.dat; предыдущее содержимое файла будет уничтожено.

Для дозаписи в конец файла (без уничтожения содержимого) следует использовать конструкцию

proc1  >>f1.dat

Аналогичным образом производится перенаправление потока stderr (рисунок 3.4). Для этого используются символы «2>»  или «2>>» перед именем файла:

proc1  2>f2.dat

proc1  2>>f2.dat

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

proc1 | proc2

По такой команде сначала выполняется процесс proc1, а все данные, выведенные им в поток стандартного вывода, направляются на стандартный ввод процесса proc2 (рисунок 3.5). Например, команда more выдает данные, поступившие на ее ввод, в «постраничном» режиме, с паузой после заполнения экрана. Тогда запись

ls –lp | more

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

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

В UNIX-системах имеются штатные средства управления процессами. Наиболее важными из них являются средства получения информации о выполняющихся процессах и средства передачи процессам сигналов; на командном уровне они реализованы в виде команд ps и kill.

ps [-ключи]

Команда просмотра списка выполняющихся процессов. При запуске без параметров (ключей) выдает все процессы данного пользователя, связанные с данной сессией (данным терминалом). Наиболее употребительные ключи команды ps: -u <имя_пользователя>позволяет вывести все процессы указанного пользователя (включая не связанные с данной сессией); означает вывод более полной информации о каждом процессе. Получить доступ к процессам другого пользователя может только суперпользователь (root).

kill [-сигнал] идентификатор_процесса

Позволяет передать сигнал указанному процессу. По умолчанию (если номер сигнала не указан) передается сигнал на завершение процесса:

            kill 285 – завершить процесс с идентификатором (PID) 285.

Иногда используется сигнал принудительного (на уровне ядра) уничтожения процесса; например, при его зависании. Для этого используется сигнал SIGKILL с кодом 9:

            kill –9 285

Обычный пользователь может управлять только своими процессами; суперпользователь root имеет возможность управлять любыми процессами в системе.

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