Получение информации о выполняющихся процессах


Содержание

Приоритет процессов и управление процессами в AIX

Управление процессами в ОС AIX

Администратор AIX® обычно хорошо знает основы работы с процессами, включая получение информации о них, изменение их приоритета и завершение их выполнения, и умеет настраивать и оптимизировать процессы при помощи инструментальных средств, в том числе при помощи новых утилит, которые появились в AIX 5.3. Для обеспечения эффективного контроля процессов системы крайне важно понимать различие между процессами и потоками. Эта статья также затрагивает команды ps , nice и schedtune , Process Monitor Console (procmon), AIX Workload Manager (WLM) и другие инструментальные средства. Сначала обозначим различие между процессами и потоками:

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

Другая точка зрения на их различие состоит в том, что процесс — это сущность, которую ОС использует для контроля за системными ресурсами, в то время как потоки контролируют фактическое потребление времени процессора. Большинство инструментальных средств для управления системой все еще работают с процессами, а не с потоками. Каждый процесс может владеть одним или несколькими потоками ядра (например, многопоточные приложения). Что касается потоков, то различные потоки могут выполняться на заранее определенных центральных процессорах, что является определенным преимуществом в многопроцессорных компьютерах. Приложения могут быть разработаны для работы с потоками уровня пользователя, чья работа (потоков) планируется самим же приложением или планировщиком pthreads. Многопоточность позволяет приложению обрабатывать запросы от различных пользователей одновременно. При реализации библиотеки libpthreads пользовательские потоки выполняются на виртуальных процессорах, которые расположены над потоками ядра. По ходу этой статьи будет более подробно рассмотрено взаимодействие процессов с ядром и инструментальные средства, способные помочь управлять системой в целом. Для того, чтобы увеличить эффективность управления системой, нужно изучить и использовать множество проверенных временем команд, использующихся на платформе UNIX®, и новые инструментальные средства, разработанные специально для AIX.

Потоки и SMT

Возможность выполнять потоки на различных центральных процессорах реализована для наиболее эффективного использования параллельной многопоточности (simultaneous multi-threading (SMT)). В системе, работающей в режиме SMT, процессор получает инструкции от более чем одного потока. Реализованная только в архитектуре POWER5, концепция SMT состоит в том, что ни один процесс не занимает одновременно все модули команд процессора. Архитектура POWER5 реализует двухканальный режим SMT для каждого ядра центрального процессора – каждое ядро физического процессора представлено двумя виртуальными процессорами. SMT наиболее выгоден для бизнес-приложений, где скорость одной транзакции не так важна по сравнению с общим числом выполненных транзакций. SMT, как предполагается, должен увеличить производительность приложений с большими объемами или часто изменяющимися данными, например, серверов баз данных и Web-серверов. У приложений, использующих вычисления с плавающей точкой, производительность при использовании SMT скорей всего снизится, а не улучшится, поскольку они сильно загружают блок вычислений с плавающей точкой и оперативную память. Приложения с низким числом непопаданий в кэш и низким количеством операций за один цикл скорее всего получат минимальный прирост в производительности. В обычных случаях следует ожидать примерно 30-процентного увеличения производительности системы при использовании SMT. Нужно определить, извлекают ли максимальную пользу из SMT важнейшие процессы, выполняющиеся на конкретной системе. В большинстве случаев эффективность выполнения важнейших процессов увеличивается при использовании SMT; однако если это увеличение производительности не нужно, то можно отключить режим SMT (по умолчанию он включен).

Принципы планирования

Я не будут вдаваться в тонкости работы планировщика AIX, но стоит объяснить принципы его работы прежде чем углубляться в администрирование процессов или настройку планировщиков.

Каждый центральный процессор в системе имеет свою собственную очередь на выполнение, которая представляет из себя список запущенных потоков, отсортированных по приоритетам. Есть и другая очередь выполнения, называемая глобальной. Все новые потоки помещаются в глобальную очередь на выполнение. Каждый раз, как только центральный процессор готов запустить поток на исполнение, глобальная очередь на выполнение проверяется прежде, чем очередь на выполнение самого процессора. Когда поток отработал время, отведенное ему на центральном процессоре, он возвращается в очередь выполнения процессора, на котором выполнялся. Это помогает обеспечивать родственность (affinity) процессоров в AIX. (Мы рассмотрим родственность процессоров далее.)

Есть несколько переменных среды, которые можно настроить в планировщике для увеличения производительности, но они не рассматриваются в этой статье. Центральные процессоры в системе совместно используются всеми потоками путем задания каждому потоку определенного промежутка времени, в течение которого он может работать на процессоре. Интервал времени по умолчанию равняется 10 микросекундам (один такт системных часов). Его можно поменять командой schedo . Увеличение этого временного интервала может увеличить производительность системы из-за уменьшения контекстного переключения. Оценить интенсивность контекстного переключения можно командами vmstat или sar . Если число контекстных переключений очень велико, увеличение интервала времени (количество процессорного времени, выделяемого на поток) может поднять производительность, но делать подобные действия следует только после тщательного анализа работы системы.

Теперь относительно системных режимов — существует два режима, в которых работает центральный процессор: режим ядра и пользовательский режим. В пользовательском режиме программы имеют доступ на чтение и запись пользовательских данных в области памяти, закрепленной за процессом. В этом режиме процесс работает наибольшее количество своего времени, отведенного ему на выполнение в центральном процессоре. Другой режим называется режимом ядра. Некоторые программы, которые выполняются в режиме ядра, включают в себя обработчики прерываний и процессы, выполняющиеся в ядре. Программа, выполняющаяся в этом режиме, имеет доступ на чтение и запись данных, используя всю доступную память системы, включая область данных, закрепленную за ядром. Для доступа к пользовательским данным в пределах адресного пространства процесса нужно обращаться к службам ядра. Когда пользовательская программа обращается к системным вызовам, она делает это в режиме ядра, а не в пользовательском режиме. Необходимо учитывать эту концепцию при анализе результатов, выводимых командами vmstat и sar .

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

Родственность процессов — это возможность, предоставляемая операционными системами, работающими на аппаратном обеспечении с поддержкой симметричной многопроцессорной обработки (SMP). По существу все потоки внутри процесса можно привязать на выполнение к определенному процессору. AIX сама по себе способствует родственности процессов, поддерживая очередь выполнения для каждого центрального процессора, что было рассмотрено ранее. Использование настроек родственности процессов для привязывания или, наоборот, открепления потоков от процессоров, помогает определить причину зависаний, которые трудно отладить. Некоторые приложения могут работать быстрее, если их потоки будут выполняться всегда на каком-то единственном центральном процессоре.

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

Листинг 1. Использование команды bindprocessor

Эта команда выводит четыре доступных процессора: 0 1 2 3.

Следующая команда показывает, какие потоки привязаны к третьему центральному процессору (см. листинг 2).

Листинг 2. Узнаем, какие потоки привязаны к 3-му центральному процессору

Также можно использовать команду SMIT fast path smit bindproc для привязывания процессов. Другой путь привязать процессы в программе состоит в использовании команды bindprocessor с интерфейсом API, доступной для AIX. Рекомендую изучить и применять эти эффективные команды. Привязывание процесса к процессору в некоторых случаях может понизить эффективность выполнения этого процесса, если процессор, к которому его привязали, слишком загружен, в то время как другие процессоры простаивают.

Утилита PS

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

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

Листинг 3. Получение подробного списка процессов

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

Листинг 4. Идентификация процессов

Если нужно получить информацию о параметре nice для каждого процесса, то используйте флаг -l . Колонка NI отображает значение параметра nice (см. листинг 5).

Листинг 5. Использование флага -l для получения значений параметра nice

Команда в листинге 6 выводит три наиболее интенсивно загружающих ресурсы процесса вместе со значениями их параметров nice.

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

Итак, мы выяснили, какие процессы тормозят систему (для этих целей также можно использовать topas или nmon ) и теперь нужно понизить их приоритет. Существует команда, которая позволяет устанавливать приоритет процесса до начала его выполнения, и команда, которая позволяет менять приоритет уже выполняющихся процессов — nice и renice соответственно. Пользовательские процессы в AIX имеют базовое значение приоритета 40 и значение параметра nice равным 20. В сумме эти два числа являются значением приоритета по умолчанию 60. Большинство процессов имеют такой приоритет. Чем выше значение приоритета процесса, тем менее он приоритетен. Если нужно запустить процесс с наименьшим приоритетом, то используйте команду из листинга 7.

Листинг 7. Запуск процесса с наименьшим приоритетом

Команда в листинг 7 добавляет 10 единиц к значению параметра nice по умолчанию (20 единиц) (итого значение параметра nice становится 30) и суммарный приоритет становится 70.

Запуск команды из листинга 8 принудит процесс 1683 сменить значение параметра nice на 30.

Листинг 8. Изменение значения параметра nice на 10 единиц для процесса 1683

Утилита procmon

Хотя существует несколько инструментов контроля производительности, входящих в комплект поставки AIX, возможно самый эффективный из них – это появившаяся в AIX 5.3 утилита procmon. Эта утилита отображает список процессов, меняющийся со временем при необходимости, с подробной информацией о каждом элемента списка.Также она позволяет использовать базовые команды администрирования nice , renice и kill . Инструментальное средство procmon выполняется на платформе Performance Workbench, которая в свою очередь является приложением, созданным на основе Eclipse, и содержит некоторые элементы графического интерфейса для отображения деятельности системы. procmon вызывается командой perfwb, которая запустит Eclipse с плагином procmon (см. листинг 9) (для этого необходим набор файлов bos.perf.gtools.perfwb ).

Листинг 9. Выполнение perfwb

По умолчанию утилита procmon выведет информацию по следующим аспектам:

  • Как долго выполняется процесс
  • Сколько ресурсов центрального процессора потребляется использующими его процессами
  • Штрафуются ли процессы системой
  • Как много памяти используют процессы
  • Как много процессов ввода/вывода выполняется
  • Приоритет процесса
  • Кто запустил какой-либо определенный процесс

Также можно запускать ее со следующими опциями:

  • procfiles
  • proctree
  • procsig
  • procstack
  • procrun
  • procmap
  • procflags
  • proccred
  • procldd

Таблица с процессами, являющаяся главным компонентом procmon, отображает различные процессы, которые выполняются в системе, эти процессы могут быть упорядочены по критериям пользователя, или на них можно наложить фильтр, условия которого также задаются пользователем. Хотя по умолчанию число процессов, отображаемых в таблице, равно 20, можно изменить это число при помощи панели Table Properties (Свойства Таблицы), доступной из главного меню. Ознакомьтесь с разделом Ресурсы, в котором можно найти полную информацию об этом важном инструментальном средстве.

WLM — это комплексный инструмент, который можно использовать для текущего контроля за производительностью, для сбора данных о производительности, а также для управления загруженностью автономной системы. Если на системе организованы динамические логические разделы (DLPAR), то он может применяться для распределения ресурсов между разделами. Использование этой утилиты существенно упрощает для системного администратора мониторинг использования ресурсов процессами.

WLM на AIX включает себя инструменты, которые собирают статистику о производительности и реализуют механизм контроля за распределением ресурсов между процессами. WLM предназначена для использования на больших вычислительных системах, на которых консолидированы различные приложения, например, базы данных и системы обработки транзакций. Данная утилита обеспечивает динамическое распределение ресурсов системы между приложениями без разделения самой системы. WLM помогает предотвратить конфликты между приложениями и распределять ресурсы в зависимости от требований различных групп пользователей. Ее часто путают с Partition Load Manager (PLM), который является менеджером ресурсов, распределяющим их и переназначающим другим процессам основываясь на заданной политике и загруженности ресурсов в системах IBM System p™ с технологией Advanced Power Virtualization. PLM способен управлять памятью, разделами с выделенным процессорами и разделами внутри общего процессора при помощи технологии микроразбиения, которая настраивает использование ресурсов. Таким способом, PLM расширяет возможности технологии микроразделов гипервизора POWER. К сожалению, PLM не может определять приоритет приложений в разделах и поэтому не может менять приоритет в зависимости от изменения типа приложений.

Заключение

Управление процессами — это обязательная, хотя далеко не самая интересная процедура, которую должен выполнять системный администратор UNIX. Он должен при необходимости ускорить процесс и выяснить, почему процесс так медленно выполняется. Системный администратор также должен идентифицировать процессы, которые тормозят систему, и сделать все возможное для улучшения их эффективности. Он также должен правильно выбрать наиболее подходящий инструмент для конкретной задачи, независимо от того, будет ли это просто вызов команды ps и последующее использование renice, новая утилита procmon для контроля производительности или утилита для планирования процессов в масштабах предприятия WLM, которая поможет эффективно управлять всеми системными процессами. Рекомендую изучить подробнее сами концепции выполнения процессов на ядре и их планирования. Прежде чем выполнять какую-то работу, стоит точно выяснить, что нужно сделать.

Получение информации о потоках

Как известно, процесс может иметь параллельно выполняющиеся потоки (threads) или облегченные процессы (LWP, Light Weight Process). Для получения информации о потоках заданного процесса используется опция –L, например ps –fLC swriter.bin выводит список потоков приложения writer Open Office. Процессы, использующие более одного потока – редактор звуковых файлов audacity и soffice.bin, а также демоны (службы в по терминологии Windows). Как указано выше, многопоточные процессы помечено символом l в колонке состояния.


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

Команда lsof (List open files) без параметров выводит полный список открытых файлов. Пользователь-администратор получит несколько тысяч строк текста.

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

lsof -u имя_пользователя

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

Необходимо ввести команду lsof c указанием имени файла. Например lsof /bin/bash

Отображение информации об оперативной памяти системы

Текущее состояние системной памяти позволяет получить команда free

По умолчанию все значения представлены в килобайтах. Значения в М позволяет получить опция –m.

Отображение информации об использовании дискового пространства

Команда df выводит данные об объеме доступного дискового пространства (в Кбайтах). Опция –h улучшает восприятие результатов.

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

Файловая система /proc

Ядро Linux предоставляет механизм доступа к своим внутренним структурам и позволяет изменять установки ядра во время работы ОС посредством файловой системы /proc. Файловая система /proc является механизмом для ядра и его модулей, позволяющим посылать информацию процессам ( отсюда и название /proc ). С помощью этой виртуальной файловой системы можно работать с внутренними структурами ядра, получать полезную информацию о процессах и изменять установки (меняя параметры ядра ) на лету. Файловая система /proc располагается в памяти в отличие от других файловых систем, которые располагаются на диске.

Файловая система /proc контролируется ядром. Из-за того, что она предоставляет информацию, контролируемую ядром, она располагается в памяти, контролируемой также ядром. Команда «ls -l» покажет, что большинство файлов в этой системе имеют нулевую длину, но посмотрев любой файл, Вы получите достаточно информации. Как это может быть? Все просто — файловая система /proc как любая другая файловая система регистрируется на уровне VFS ( Virtual File System layer ). Поэтому при запросе файлов/каталогов, файловая система /proc создает эти файлы/каталоги на основании информации, содержащейся в ядре.

В действительности многие программы собирают информацию из файлов в /ргос, форматируют её своим собственным способом, а результат затем выводят на экран. Существует несколько программ, которые поступают именно так при выводе информации о процессах (top, ps и т. п.), /ргос — это также хороший источник информации об аппаратном обеспечении, и по аналогии с программами, показывающими процессы, некоторые другие программы являются просто интерфейсами к информации, находящейся в /ргос.

Также существует специальный подкаталог /proc/sys. Он позволяет отображать параметры ядра и изменять их в режиме реального времени.

Информация о процессах

Каждый из каталогов содержит одинаковые пункты, краткое описание некоторых из них:

1. cmdline: этот (псевдо-) файл содержит полную командную строку, использованную для вызова процесса. Он не отформатирован: между программой и ее аргументами нет пробелов, а в конце строки нет разделителя строки. Чтобы просмотреть его, вы можете использовать: perl -ple ‘s,\00, ,g’ cmdline.

2. cwd: эта символическая ссылка указывает на текущий рабочий каталог процесса (следует из имени).

3. environ: этот файл содержит все переменные окружения, определенные для этого процесса, в виде ПЕРЕМЕННАЯ=значение. Как и в cmdline вывод вообще не отформатирован: нет разделителей строк для отделения различных переменных, и в конце нет разделителя строки. Единственным решением для его просмотра будет: perl -pl -e ‘s,\00,\n,g’ environ.

4. exe: эта символическая ссылка указывает на исполняемый файл, соответствующий запущенному процессу.

5. fd: этот подкаталог содержит список файловых дескрипторов, открытых в данный момент процессом.

6. maps: когда вы выводите содержимое этого именованного канала (при помощи команды cat, например), вы можете увидеть части адресного пространства процесса, которые в текущий момент распределены для файла. Вот эти поля (слева направо): адресное пространство, связанное с этим распределением; разрешения, связанные с этим распределеним; смещение от начала файла, где начинается распределение; старший и младший номера (в шестнадцатиричном виде) устройства, на котором находится распределенный файл; номер inode файла; и, наконец, имя самого файла.

7. root: эта символическая ссылка указывает на корневой каталог, используемый процессом. Обычно это будет /.

8. status: этот файл содержит разнообразную информацию о процессе: имя исполняемого файла, его текущее состояние, его PID и PPID, его реальные и эффективные UID и GID, его использование памяти и другие данные.

Если вывести список содержимого каталога fd для процесса 127, получим примерно следующее:

ls -l fd total 0 lrwx—— 1 root root 64 Dec 16 22:04 0 -> /dev/console l-wx—— 1 root root 64 Dec 16 22:04 1 -> pipe:[128] l-wx—— 1 root root 64 Dec 16 22:04 2 -> pipe:[129] l-wx—— 1 root root 64 Dec 16 22:04 21 -> pipe:[130] lrwx—— 1 root root 64 Dec 16 22:04 3 -> /dev/apm_bios lr-x—— 1 root root 64 Dec 16 22:04 7 -> pipe:[130] lrwx—— 1 root root 64 Dec 16 22:04 9 -> /dev/console

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

6.2. Информация об аппаратном обеспечении

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

Список файлов каталога /рrос, полученный с помощью команды ls -d [a-z]*выглядит следующим образом:

Получение информации о потоках

Как известно, процесс может иметь параллельно выполняющиеся потоки (threads) или облегченные процессы (LWP, Light Weight Process). Для получения информации о потоках заданного процесса используется опция –L, например ps –fLC swriter.bin выводит список потоков приложения writer Open Office. Процессы, использующие более одного потока – редактор звуковых файлов audacity и soffice.bin, а также демоны (службы в по терминологии Windows). Как указано выше, многопоточные процессы помечено символом l в колонке состояния.

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

Команда lsof (List open files) без параметров выводит полный список открытых файлов. Пользователь-администратор получит несколько тысяч строк текста.

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

lsof -u имя_пользователя

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

Необходимо ввести команду lsof c указанием имени файла. Например lsof /bin/bash

Отображение информации об оперативной памяти системы

Текущее состояние системной памяти позволяет получить команда free

По умолчанию все значения представлены в килобайтах. Значения в М позволяет получить опция –m.

Отображение информации об использовании дискового пространства

Команда df выводит данные об объеме доступного дискового пространства (в Кбайтах). Опция –h улучшает восприятие результатов.

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

1.2 Файловая система /proc

Ядро Linux предоставляет механизм доступа к своим внутренним структурам и позволяет изменять установки ядра во время работы ОС посредством файловой системы /proc. Файловая система /proc является механизмом для ядра и его модулей, позволяющим посылать информацию процессам ( отсюда и название /proc ). С помощью этой виртуальной файловой системы можно работать с внутренними структурами ядра, получать полезную информацию о процессах и изменять установки (меняя параметры ядра ) на лету. Файловая система /proc располагается в памяти в отличие от других файловых систем, которые располагаются на диске.

Файловая система /proc контролируется ядром. Из-за того, что она предоставляет информацию, контролируемую ядром, она располагается в памяти, контролируемой также ядром. Команда «ls -l» покажет, что большинство файлов в этой системе имеют нулевую длину, но посмотрев любой файл, Вы получите достаточно информации. Как это может быть? Все просто — файловая система /proc как любая другая файловая система регистрируется на уровне VFS ( Virtual File System layer ). Поэтому при запросе файлов/каталогов, файловая система /proc создает эти файлы/каталоги на основании информации, содержащейся в ядре.

В действительности многие программы собирают информацию из файлов в /ргос, форматируют её своим собственным способом, а результат затем выводят на экран. Существует несколько программ, которые поступают именно так при выводе информации о процессах (top, ps и т. п.), /ргос — это также хороший источник информации об аппаратном обеспечении, и по аналогии с программами, показывающими процессы, некоторые другие программы являются просто интерфейсами к информации, находящейся в /ргос.

Илон Маск рекомендует:  Что такое код getinputstate

Также существует специальный подкаталог /proc/sys. Он позволяет отображать параметры ядра и изменять их в режиме реального времени.


Информация о процессах

Каждый из каталогов содержит одинаковые пункты, краткое описание некоторых из них:

1. cmdline: этот (псевдо-) файл содержит полную командную строку, использованную для вызова процесса. Он не отформатирован: между программой и ее аргументами нет пробелов, а в конце строки нет разделителя строки. Чтобы просмотреть его, вы можете использовать: perl -ple ‘s,\00, ,g’ cmdline.

2. cwd: эта символическая ссылка указывает на текущий рабочий каталог процесса (следует из имени).

3. environ: этот файл содержит все переменные окружения, определенные для этого процесса, в виде ПЕРЕМЕННАЯ=значение. Как и в cmdline вывод вообще не отформатирован: нет разделителей строк для отделения различных переменных, и в конце нет разделителя строки. Единственным решением для его просмотра будет: perl -pl -e ‘s,\00,\n,g’ environ.

4. exe: эта символическая ссылка указывает на исполняемый файл, соответствующий запущенному процессу.

5. fd: этот подкаталог содержит список файловых дескрипторов, открытых в данный момент процессом.

6. maps: когда вы выводите содержимое этого именованного канала (при помощи команды cat, например), вы можете увидеть части адресного пространства процесса, которые в текущий момент распределены для файла. Вот эти поля (слева направо): адресное пространство, связанное с этим распределением; разрешения, связанные с этим распределеним; смещение от начала файла, где начинается распределение; старший и младший номера (в шестнадцатиричном виде) устройства, на котором находится распределенный файл; номер inode файла; и, наконец, имя самого файла.

7. root: эта символическая ссылка указывает на корневой каталог, используемый процессом. Обычно это будет /.

8. status: этот файл содержит разнообразную информацию о процессе: имя исполняемого файла, его текущее состояние, его PID и PPID, его реальные и эффективные UID и GID, его использование памяти и другие данные.

Если вывести список содержимого каталога fd для процесса 127, получим примерно следующее:

ls -l fd total 0 lrwx—— 1 root root 64 Dec 16 22:04 0 -> /dev/console l-wx—— 1 root root 64 Dec 16 22:04 1 -> pipe:[128] l-wx—— 1 root root 64 Dec 16 22:04 2 -> pipe:[129] l-wx—— 1 root root 64 Dec 16 22:04 21 -> pipe:[130] lrwx—— 1 root root 64 Dec 16 22:04 3 -> /dev/apm_bios lr-x—— 1 root root 64 Dec 16 22:04 7 -> pipe:[130] lrwx—— 1 root root 64 Dec 16 22:04 9 -> /dev/console

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

6.2. Информация об аппаратном обеспечении

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

Список файлов каталога /рrос, полученный с помощью команды ls -d [a-z]*выглядит следующим образом:

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

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

Для управления процессами в командной строке есть две утилиты — tasklist и taskkill. Первая показывает список процессов на локальном или удаленном компьютере, вторая позволяет их завершить. Попробуем …

Если просто набрать команду tasklist в командной строке, то она выдаст список процессов на локальном компьютере.

По умолчанию информация выводится в виде таблицы, однако ключ /fo позволяет задать вывод в виде списка или в формате CSV, а ключ /v показывает более подробную информацию о процессах, например команда tasklist /v /fo list выведет подробное описание всех процессов в виде списка.

Список получится довольно большой, поэтому попробуем уточнить запрос. Для этого используем ключ /fi , который позволяет использовать фильтры для вывода данных, например команда tasklist /fi ″username eq user″ /fi ″memusage le 40000″ выводит список процессов пользователя user, которые потребляют не больше 40Мб памяти.

Найдя процессы, которые необходимо завершить, воспользуемся командой taskkill. Завершать процессы можно по имени, идентификатору процесса (PID) или задав условия с помощью фильтров. Для примера запустим несколько экземпляров блокнота (notepad.exe) и попробуем завершить его разными способами.

Ключ /f завершает процесс принудительно, а /t завершает все дочерние процессы.

Полную справку по командам tasklist и taskkill можно получить, введя их с ключом /?

Теперь пустим в ход тяжелую артиллерию PowerShell. Его можно запустить не выходя из командной строки. Для получения списка процессов используем командлет Get-Process.

Чтобы не выводить весь список процессов можем воспользоваться командлетом Where-Object, который задает фильтр для выводимой информации. Для примера выведем список процессов, которые загружают процессор и отсортируем их по возрастанию нагрузки с помощью команды:

Get-Process | where <$_.cpu -gt 0>| sort cpu

С помощью PowerShell мы можем получить любую информацию о любом процессе. В качестве примера возьмем процесс cmd и выведем список его свойств командой:

Get-Process -Name cmd | Get-Member -Membertype property

Выбираем те свойства, что нам интересны ( в примере имя и ID процесса, путь к файлу, используемые модули и время запуска) и выводим их в виде списка командой:

Get-Process -Name cmd | Format-List name, id, path, modules, starttime

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

Для завершения процесса в PowerShell есть командлет Stop-Process. Он завершает указанный процесс по его имени или идентификатору. Однако мы поступим по другому и передадим результат выполнения командлета Get-Process по конвейеру:

Get-Process | where <$_.name -match ″notepad″>| Stop-Process

Get-Process не может показать процессы на удаленном компьютере, для этого воспользуемся командлетом Get-WmiObject , например посмотрим процессы на удаленном компьютере PC командой:

Get-WmiObject win32_process -computername PC | ft name, processid, description

Для боле полного ознакомления с PowerShell можно воспользоваться встроенной справкой, для вызова справки нужно набрать Get-Help ″имя командлета″

Ну и для полноты обзора рассмотрим еще одно средство для управления процессами из командной строки. Это утилиты Pslist и Pskill входящие в состав пакета PSTools от компании Sysinternals.

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

Pslist может выводить информацию о процессах по имени или ID, например командой pslist notepad -x выведем подробную информацию о нашем «многострадальном» блокноте.

Особенностью утилиты Pslist является режим task-manager. В этом режиме информация автоматически обновляется, причем можно задать время работы и интервал обновления. Запускается режим ключом -s , например командой tasklist -s -r 10 запускаем режим программу в режиме task-manager с обновлением раз в 10 сек.

Завершение процесса программой pskill предельно просто, вводим команду и имя (или ID) процесса и все.

Справку по утилитам Pslist и Pskill можно посмотреть, введя команду с ключом /?

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

Введение

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

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

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

Действия, выполняемые с информацией, называются информационными процессами.

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


Информационный процесс — совокупность последовательных действий (операций), производимых над информацией (в виде данных, сведений, фактов, идей, гипотез, теорий и пр), для получения какого-либо результата (достижения цели) [3].

Информация проявляется именно в информационных процессах, которые всегда протекают в каких-либо системах (социальных, социотехнических, биологических и пр).

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

Информационные процессы

Поиск информации

Поиск информации — извлечение хранимой информации.

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

общение со специалистами по интересующему вопросу;

чтение соответствующей литературы;

просмотр теле-, видеопрограмм,

прослушивание радиопередач и аудиокассет;

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

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

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

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

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

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

Например, пользователь может получить информацию о движении поездов или самолетов сам, изучив расписание, или же от другого человека непосредственно, либо через какие-то документы, составленные этим человеком, или с помощью технических средств (автоматической справки, телефона и т.д.). Задача сбора информации не может быть решена в отрыве с других задач, — задачи обмена информацией (передачи).

3. Хранение информации.

Хранение информации — процесс поддержания исходной информации в виде, обеспечивающем выдачу данных по запросам конечных пользователей в установленные сроки [8].

Хранение информации — процесс такой же древний, как жизнь человеческой цивилизации. Уже в древности человек столкнулся с необходимостью хранения информации: зарубки на деревьях, чтобы не заблудиться во время охоты; счет предметов с помощью камешков, узелков; изображение животных и эпизодов охоты на стенах пещер.

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

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

Хранение информации происходит или в памяти человека, или на внешних носителях. В памяти человека информация может храниться как в образной форме (я помню, как пахнет роза), так и в знаковой (словесной, формульной). Информацию, хранимую в памяти, называют оперативной. Информацию, хранимую на внешних носителях (листе бумаги, диске, пластинке и т.д.), называют внешней. Она может быть переведена в разряд оперативной, если будет «прочитана» человеком. Внешние носители выполняют роль “дополнительной” памяти человека. На них могут храниться звук, тексты, изображения.

Устройства, на которых хранится информация, называются информационными носителями.

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

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

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

Основные хранилища информации

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

Базы и банки данных, информационно-поисковые системы, электронные энциклопедии, медиатеки

4. Передача информации.

Передача информации может осуществляться в письменной, устной формах или с помощью жестов. Человек получает информацию с помощью органов чувств (зрение — 90%; слух — 9%; обоняние, осязание, вкус — 1%). Человеческое мышление можно рассматривать, как процесс обработки информации. Полученная информация хранится на носителях информации различного вида: книги, фотографии видеокассеты, лазерные диски т.д.

Установлена общность информационных процессов в живой природе, обществе и технике. Рассмотрим примеры:

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

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

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

Деятельность человека всегда была связана с передачей информации. Древний способ передачи — письмо, отправленное с гонцом. Разговаривая, мы передаем друг другу информацию. Человечество придумало много устройств для быстрой передачи информации: телеграф, радио, телефон, телевизор. К числу устройств, передающих информацию с большой скоростью, относятся электронные вычислительные машины, хотя правильнее было бы сказать телекоммуникационные сети.

В передаче участвуют две стороны:

источник — тот, кто передает информацию,

приемник — тот, кто ее получает.

Например, учитель передает информацию ученикам. Учитель — источник. Ученик — приемник. В африканских джунглях, в старину, важные новости передавали от одного племени к другому барабанным боем. Моряки иногда пользуются флажковой азбукой. Разговаривая, мы передаем друг другу информацию. Информация ЭВМ выводится на экран монитора — это тоже передача информации.

Очень часто при передаче информации возникают помехи. И тогда информация от источника к приемнику поступает в искаженном виде.

Ошибки, возникающие при передаче информации, бывают 3-х видов:

часть правильной информации заменяется на неправильную;

к передаваемой информации добавляются лишние, посторонние сообщения;

часть информации при передаче пропадает.

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

Канал связи — совокупность технических устройств, обеспечивающих передачу сигнала от источника к получателю.

Кодирующее устройство — устройство, предназначенное для кодирования (преобразования исходного сообщения источника информации к виду, удобному для передачи информации) информации.

Декодирующее устройство — устройство для преобразования полученного сообщения в исходное.

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


Источник сообщения — человек говорящий;

Кодирующее устройство — микрофон — преобразует звуки в электрические импульсы;

Канал связи — телефонная сеть (провод);

Декодирующее устройство — та часть трубки, которую мы подносим к уху, здесь электрический сигнал преобразуется в звук;

Приемник информации — человек слушающий.

Общая схема передачи информации может быть такой как представлено на рис.2:

Рис.2. Схема передачи информации

В процессе передачи информация может теряться, искажаться: искажение звука в телефоне, атмосферные помехи по радио, искажение или затемнение изображения в телевидении, ошибки при передаче в телеграфе. Эти помехи (шумы) искажают информацию. К счастью, существует наука, разрабатывающая способы защиты информации, — криптология.

5. Обработка информации.

Обработка информации — получение одних информационных объектов из других информационных объектов путем выполнения некоторых алгоритмов.

Обработка является одной из основных операций, выполняемых над информацией, и главным средством увеличения объёма и разнообразия информации. Средства обработки информации — это всевозможные устройства и системы, созданные человечеством, и в первую очередь, компьютер — универсальная машина для обработки информации. Компьютеры обрабатывают информацию путем выполнения некоторых алгоритмов. Живые организмы и растения обрабатывают информацию с помощью своих органов и систем.

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

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

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

Процесс обработки очень сложен.

Пример: Шум двигателя автобуса изменился. Для водителя это может служить информацией о каких-то неполадках в двигателе.

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

В примере №1 шум двигателя — косвенный источник информации. Человек обращается к базе знаний, которая хранится в памяти. Если база знаний неполная (человек малообразован), достоверную информацию получить невозможно.

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

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

Служебная собака по запаху находит человека (запах — исходная информация, куда пошел человек — новая).

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

6. Обмен информацией.

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

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

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

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

7. Защита информации.

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

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

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

Компьютерная система ПВО североамериканского континента однажды объявила ложную ядерную тревогу, приведя в боевую готовность вооруженные силы. А причиной послужил неисправный ЧИП стоимостью 46 центов — маленький, размером с монету, кремниевый элемент.

Конструкторы и разработчики программного и аппаратного обеспечения прилагают немало усилий, чтобы обеспечить защиту:

от сбоев оборудования;

от случайной потери или изменения информации, хранящейся в компьютере;

от преднамеренного искажения (компьютерные вирусы);

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

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

8. Качество информации

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

Получение информации о выполняющихся процессах

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

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

Подготовительный этап завершен, можно переходить к основной части. Получение информации о процессе выполняется в несколько стадий. Сперва надо открыть процесс для чтения и получения данных, затем с помощью функции NtQueryInformationProcess надо прочитать общую информацию о процессе в структуру PROCESS_BASIC_INFORMATION (с параметром ProcessBasicInformation ). Имейте в виду, что приложение, которое выполняет такой запрос, должно обладать соответствующими привилегиями. Затем надо прочитать блок окружения процесса PEB , который находится по адресу, определенному в PebBaseAddress структуры PROCESS_BASIC_INFORMATION . Дальше нам надо загрузить параметры процесса в структуру RTL_USER_PROCESS_PARAMETERS , адрес которой определен в структуре PEB параметром ProcessParameters . На самом деле в PEB содержится гораздо больше различных значений, но нас интересует только эта структура. Именно в ней записана нужная нам информация — путь к исполняемому файлу процесса и его командная строка.

Илон Маск рекомендует:  Книги о сайтах, об основах создания сайта

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

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

С 32-битными системами ничего сложного, но теперь, к сожалению, все чаще появляются операционные системы с 64-битной разрядностью. Для 64-битных процессов создаются свои структуры PEB, PROCESS_BASIC_INFORMATION и т.д. Причем получить доступ к ним описанными выше функциями Win32 невозможно, так как эта память находится в другом адресном пространстве с 64-битной адресацией. Однако, совмещение в одной программе возможностей полноценной работы без особых ограничений как под Win32, так и под Win64, на мой взгляд, будет большим плюсом. К примеру, сейчас лишь единицы таскменеджеров могут похвастаться такой универсальностью, остальные или не работают с 64-битными процессами, или же выпускаются в виде двух самостоятельных версий для систем с различной разрядностью.

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

По аналогии с 32-битными системами в сегменте данных на основании структур опишем необходимые нам массивы для чтения данных о процессе.

А теперь начинается самое интересное. Я уже писал выше, что из 32-битного приложения невозможно получить доступ к 64-битному пространству памяти при помощи обычных функций. Значит будем использовать необычные, то есть недокументированные функции. А именно, NtWow64QueryInformationProcess64 для получения информации о выбранном процессе и NtWow64ReadVirtualMemory64 для чтения данных из 64-битного пространства памяти. В MSDN описания этих функций нет, нет даже каких-либо упоминаний, можете даже не искать, к тому же их адреса придется самостоятельно импортировать из ntdll.dll .

Я долго не мог понять, как можно положить на 32-битный стек параметр функции размером четверного слова (QWORD). Чтобы наступило просветление, мне пришлось даже дизассемблировать и изучить несколько утилит из состава Windоws 7 x64, которые используют эти функции. Оказалось все очень просто. На стек кладется не целиковый QWORD, а по очереди его младший и старший DWORD. Из-за этого вызовы функций чтения памяти в исходнике выглядят немного непривычно. В остальном же принцип работы с процессами мало отличается от 32-битного варианта, последовательность действий точно такая же, разница только в используемых функциях.


Как видите, тоже ничего сложного нет, из 32-битного приложения мы легко получили доступ к памяти 64-битного пространства. Строковые данные, как и в случае с 32-битными системами, также хранятся в юникоде.

Остался последний важный момент. Как узнать разрядность процесса? Ведь для разной разрядности нам придется использовать различные методы получения информации. Нам на помощь приходит функция IsWow64Process. Логика ее работы следующая. Если такая функция отсутствует в системе, или присутствует, но при этом для нашего процесса возвращает FALSE, то это значит, что операционная система 32-битная и никаких 64-битных процессов на ней быть не может. А если она для нашего процесса возвращает TRUE, то система 64-битная и требуется дополнительная проверка. Естественно, подразумевается, что сами мы находимся в контексте 32-битного процесса. Если под 64-битной системой для проверяемого процесса функция IsWow64Process возвращает FALSE, то это 64-битный процесс, иначе 32-битный. Для выполнения всех этих проверок я написал вот такую вспомогательную функцию.

Блог о системном администрировании. Статьи о Linux, Windows, СХД NetApp и виртуализации.

Доброго времени, гости моего блога! В сегодняшнем посте расскажу о том, как работают процессы в ОC Linux, а так же как управлять этими самыми процессами, о выполнении процессов в фоне, о повышении/понижении приоритета процессов.

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

В многозадачной системе может быть запущено множество программ. Каждая программа может запустить множество процессов (читай: подпрограмм). При этом в единственный момент на машине, выполняется только 1 процесс. То есть в единственный момент времени ресурсы железа (процессорное время, память, порт ввода/вывода) может использоваться только единственным процессом. Очередью, в которой процессу выделяется определенный ресурс железа, управляет планировщик. При этом, во время прерывания одного процесса и запуска (возобновления) другого процесса, состояние процесса (выполняемые действия, на каком этапе процесс приостановлен) запоминается и записывается в область памяти. Планировщик в Linux — это часть ядра, отвечающая за указанную функциональность. В задачи планировщика так же входит отслеживание и выделение запускаемым процессам определенного приоритета, чтобы процессы «не мешали» друг-другу работать, а так же распределение пространства памяти, чтобы пространство памяти одного процесса не пересекалось с пространством другого.

Все новые процессы в Linux порождаются клонированием какого-то уже имеющегося процесса, с помощью вызова системных функций clone(2) и fork(2) (от forking — порождение). У нового (порожденного или дочернего) процесса тоже окружение, что и у родителя, отличается только номер ID процесса (т.н. PID). Жизнь типичного процесса в Linux можно представить следующей схемой:

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

  • процесс /bin/bash клонирует себя системным вызовом fork()
  • при этом создается клон /bin/bash с новым P >Очень наглядную схему предоставила википедия:

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

Первый процесс в системе запускается при инициализации ядра. Данный процесс называется — init и имеет P >

В каких же состояниях может находиться процесс в Linux?

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

  • Активен (R=Running) – процесс находится в очереди на выполнение, то есть либо выполняется в данный момент, либо ожидает выделения ему очередного кванта времени центрального процессора.
  • «Спит» (S=Sleeping) – процесс находится в состоянии прерываемого ожидания, то есть ожидает какого-то события, сигнала или освобождения нужного ресурса.
  • Находится в состоянии непрерываемого ожидания (D=Direct) – процесс ожидает определенного («прямого») сигнала от аппаратной части и не реагирует на другие сигналы;
  • Приостановлен (T) – процесс находится в режиме трассировки (обычно такое состояние возникает при отладке программ).
  • «Зомби» (Z=Zombie) – это процесс, выполнение которого завершилось, но относящиеся к нему структуры ядра по каким-то причинам не освобождены. Одной из причин их появления в системе может быть следующая ситуация. Обычно освобождение структур ядра, относящихся к процессу, выполняет процесс-родитель после получения от потомка сигнала о завершении. Но бывают случаи, когда родительский процесс завершается раньше дочернего. Процессы, не имеющие родителя, называются «сиротами«. «Сироты» автоматически усыновляются процессом init, который и принимает сигналы об их завершении. Если процесс-родитель или init по каким-то причинам не может принять сигнал о завершении дочернего процесса, то процесс-потомок превращается в «зомби» и получает статус Z. Процессы-зомби не занимают процессорного времени (т. е. их выполнение прекращается), но соответствующие им структуры ядра не освобождаются. В некотором смысле это «мертвые» процессы. Уничтожение таких процессов — одна из обязанностей системного администратора. Хочу отметить, что появление данных процессов говорит о том, что в системе что-то не в порядке, и скорее всего не в порядке с аппаратной частью, так что берем memtest и MHDD и тестим-тестим. Не исключен вариант и кривого кода программы.

Так же, говоря о процессах в линуксе, можно выделить особый вид процессов — демоны. Данный вид процессов работает в фоне (подобно службам в Windows), без терминала и выполняет задачи для других процессов. Данный вид процессов на серверных системах является основным.

Т.к. в большинстве случаев, демоны в Linux простаивают и ожидают поступления каких-либо данных, соответственно, нужны относительно редко, так что держать их в памяти постоянно загруженными и расходовать на это ресурсы системы нерационально. Для организации работы демонов придуман демон inetd или его более защищенная модификация xinetd (eXtended InterNET Daemon или расширенный Интернет демон). В функции inetd (Xinetd) можно выделить:

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

Все процессы в системе, не важно Linux это или другая ОС, обмениваются между собой какой-либо информацией. Отсюда можно задать вопрос, а как же происходит межПРОЦЕССный обмен?

В ОС LINUX существует несколько видов можпроцессного обмена, а точнее сказать средств межпроцессного взаимодействия (Interprocess Communication — IPC), которые можно разбить на несколько уровней:

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

— каналы

  1. pipe (они же конвейеры, так же неименованные каналы), о них я много рассказывал в прошлом посте, примером можно привести: команда1 | команда2. По сути, pipe использует stdin, stdout и stderr.
  2. Именованные каналы (FIFO: First In First Out). Данный вид канала создаётся с помощью mknod или mkfifo, и два различных процесса могут обратиться к нему по имени. Пример работы с fifo:

в первом терминале (создаем именованный канал в виде файла pipe и из канала направляем данные с помощью конвейера в архиватор):

во втором терминале (отправляем в именованный канал данные):

в результате это приведет к сжатию передаваемых данных gzip-ом

— сигналы

  • с терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, а Ctrl-Z SIGTSTP);
  • ядром системы:
    • при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.);
    • ошибочных системных вызовах;
    • для информирования о событиях ввода-вывода;
  • одним процессом другому (или самому себе), с помощью системного вызова kill(), в том числе:
    • из шелла, утилитой /bin/kill.

сигнал — это асинхронное уведомление процесса о каком-либо событии. Когда сигнал послан процессу, операционная система прерывает выполнение процесса. Если процесс установил собственный обработчик сигнала, операционная система запускает этот обработчик, передав ему информацию о сигнале. Если процесс не установил обработчик, то выполняется обработчик по умолчанию.
Все сигналы начинаются на «SIG…» и имеют числовые соответствия, определяемые в заголовочном файле signal.h. Числовые значения сигналов могут меняться от системы к системе, хотя основная их часть имеет в разных системах одни и те же значения. Утилита kill позволяет задавать сигнал как числом, так и символьным обозначением.
Сигналы можно послать следующими способами:

— разделяемая память

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

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

— очереди сообщений

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

удаленный;

— удаленные вызовы процедур (Remote Procedure Calls — RPC)

RPC — разновидность технологий, которая позволяет компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удалённых компьютерах). Обычно, реализация RPC технологии включает в себя два компонента: сетевой протокол (чаще TCP и UDP, реже HTTP) для обмена в режиме клиент-сервер и язык сериализации объектов (или структур, для необъектных RPC).

— сокеты Unix

Сокеты UNIX бывают 2х типов: локальные и сетевые. При использовании локального сокета, ему присваивается UNIX-адрес и просто будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём простого чтения/записи из него. Сокеты представляют собой виртуальный объект, который существует, пока на него ссылается хотя бы один из процессов. При использовании сетевого сокета, создается абстрактный объект привязанный к слушающему порту операционной системы и сетевому интерфейсу, ему присваивается INET-адрес, который имеет адрес интерфейса и слушающего порта.

высокоуровневый

  1. Обычно — пакеты программного обеспечения, которые реализуют промежуточный слой между системной платформой и приложением. Эти пакеты предназначены для переноса уже испытанных протоколов коммуникации приложения на более новую архитектуру. Примером можно привести: DIPC, MPI и др. (мне не знакомы, честно говоря)

Итак. Подведем маленький итог:

  • В Linux есть процессы,
  • каждый процесс может запускать подпроцессы (нити),
  • создание нового процесса создается клонированием исходного,
  • прородителем всех процессов в системе является процесс init, запускаемый ядром системы при загрузке.
  • процессы взаимодействуют между собой по средствам можпроцессного взаимодействия:
    • каналы
    • сигналы
    • сокеты
    • разделяемая память
  • каждый процесс обладает свойствами (читай: обладает следующим контекстом):
    • PID — идентификатор процесса
    • PPID — идентификатор процесса, породившего данный
    • UID и GID — идентификаторы прав процесса (соответствует UID и GID пользователя, от которого запущен процесс)
    • приоритет процесса
    • состояние процесса (выполнение, сон и т.п.)
    • так же у процесса есть таблица открытых (используемых) файлов

Далее поговорим о том, как посмотреть состояние процессов в Linux и о том, как же ими управлять.

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

Получение информации о процессе

Перед тем как управлять процессами, нужно научиться получать о процессах необходимую информацию. В Linux существует псевдофайловая система procfs, которая в большинстве дистрибутивов монтируется в общую ФС в каталог /proc. У данной файловой системы нет физического места размещения, нет блочного устройства, такое как жесткий диск. Вся информация, хранимая в данном каталоге находится в оперативной памяти компьютера, контролируется ядром ОС и она не предназначена для хранения файлов пользователя. О структуре данного каталога я написал в статье о файловой системе Linux. В этой файловой системе дано достаточно много информации, чтобы узнать о процессах и о системе в целом.

Но пользоваться данным каталогом очень не удобно, чтобы узнать о каком-либо процессе информацию, придется просмотреть кучу файлов и каталогов. Чтобы избавиться от ненужного труда, можно использовать существующие утилиты ps и top для просмотра информации о процессах.

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

# ps aux

Прокомментируем некоторые интересные моменты. Можно заметить, что некоторые процессы указаны в квадратных скобках [ ] – это процессы, которые входят непосредственно в состав ядра и выполняют важные системные задачи, например, такие как управление буферным кэшем [pdflush] и организацией свопинга [kswapd]. С ними лучше не экспериментировать – ничего хорошего из этого не выйдет :). Остальная часть процессов относится к пользовательским.

Какую информацию можно получить по каждому процессу (комментарии к некоторым полям):

  • PID, PPID – идентификатор процесса и его родителя.
  • %CPU – доля процессорного времени, выделенная процессу.
  • %MEM – процент используемой оперативной памяти.
  • VSZ – виртуальный размер процесса.
  • TTY – управляющий терминал.
  • STAT– статус процесса:
    • R – выполняется;
    • S – спит;
    • Z – зомби;
    • + — сортировка по PID;
    • + — сортировать процессы по возрасту;
    • +

    — сортировать процессы по использованию ЦПУ;

  • + — сортировать процессы по использованию памяти;
  • + — сортировка по времени выполнения.

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

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

Итак, теперь об управлении процессами.

Управление процессами в Linux

Каждому процессу при запуске устанавливается определенный приоритет, который имеет значение от -20 до +20, где +20 — самый низкий. Приоритет нового процесса равен приоритету процесса-родителя. Для изменения приоритета запускаемой программы существует утилита nice. Пример ее использования:

где adnice — значение (от –20 до +19), добавляемое к значению nice процесса-родителя. Отрицательные значения может устанавливать только суперпользователь. Если опция adnice не задана, то по умолчанию для процесса-потомка устанавливается значение nice, увеличенное на 10 по сравнению со значением nice родительского процесса.

Команда renice служит для изменения значения nice для уже выполняющихся процессов. Суперпользователь может изменить приоритет любого процесса в системе. Другие пользователи могут изменять значение приоритета только для тех процессов, для которых данный пользователь является владельцем. При этом обычный пользователь может только уменьшить значение приоритета. Поэтому процессы с низким приоритетом не могут породить «высокоприоритетных детей».

Как я уже писал, одним из средств управления процессами являются сигналы. Некоторые сигналы можно сгенерировать с помощью определенных комбинаций клавиш, но такие комбинации существуют не для всех сигналов. Зато имеется команда kill, которая позволяет послать заданному процессу (указав его PID) любой сигнал:

где SIG — это номер сигнала или наименование сигнала, причем если указание сигнала опущено, то посылается сигнал 15 (SIGTERM — программное завершение процесса). Часто используется сигнал 9 (KILL), с помощью которого суперпользователь может завершить любой процесс. Но сигнал этот очень «грубый», если можно так выразиться, потому что он просто «убивает» процесс, не давая ему времени на корректное сохранение всех обработанных данных. Поэтому в большинстве случаев рекомендуется использовать сигналы TERM или QUIT, которые завершают процесс более «мягко». Если процессу необходимо как-то по-особенному реагировать на сигнал, он может зарегистрировать обработчик, а если обработчика нет, за него отреагирует система.

Два сигнала – 9 ( KILL ) и 19 ( STOP ) – всегда обрабатывает система. Первый из них нужен для того, чтобы убить процесс наверняка (отсюда и название). Сигнал STOP приостанавливает процесс: в таком состояниипроцесс не удаляется из таблицы процессов, но и не выполняется до тех пор, пока не получит сигнал 18 ( CONT) – после чего продолжит работу. В Linux сигнал STOP можно передать активному процессу с помощью управляющего символа » ^Z «.

Обычные пользователи могут посылать сигналы только тем процессам, для которых они являются владельцами. Если в команде kill воспользоваться идентификатором процесса (PID), равным -1, то указанный в команде сигнал будет послан всем принадлежащим данному пользователю процессам. Суперпользователь root может посылать сигналы любым процессам. Когда суперпользователь посылает сигнал идентификатору -1, он рассылается всем процессам, за исключением системных. Если этим сигналом будет SIGKILL, то у простых пользователей будут потеряны все открытые ими, но не сохраненные файлы данных.

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

В оболочке bash имеются две встроенные команды, которые служат для перевода процессов на передний план или возврата их в фоновый режим. Команда fg переводит указанный в аргументе процесс на передний план, а команда bg — переводит процесс в фоновый режим. Одной командой bg можно перевести в фоновый режим сразу несколько процессов, а вот возвращать их на передний план необходимо по одному. Аргументами команд fg и bg могут являться только номера заданий, запущенных из текущего экземпляра shell. Возможные значения заданий можно увидеть, выполнив команду jobs.

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

Запущенный таким образом процесс будет игнорировать посылаемые ему сигналы (не игнорируются только сигналы SIGHUP и SIGQUIT). Хочу так же выделить команду pstree, которая показывает дерево процессов. Очень наглядно, кстати.

Ну вот. как-то так. Буду рад любым комментариям и дополнениям.

Upd 2011.11.19: небольшой рестайлинг и дополнение информации о сигналах.

Получение информации о выполняющихся процессах

Подготовительный этап завершен, можно переходить к основной части. Получение информации о процессе выполняется в несколько стадий. Сперва надо открыть процесс для чтения и получения данных, затем с помощью функции NtQueryInformationProcess надо прочитать общую информацию о процессе в структуру PROCESS_BASIC_INFORMATION (с параметром ProcessBasicInformation). Имейте в виду, что приложение, которое выполняет такой запрос, должно обладать соответствующими привилегиями. Затем надо прочитать блок окружения процесса PEB, который находится по адресу, определенному в PebBaseAddress структуры PROCESS_BASIC_INFORMATION. Дальше нам надо загрузить параметры процесса в структуру RTL_USER_PROCESS_PARAMETERS, адрес которой определен в структуре PEB параметром ProcessParameters. На самом деле в PEB содержится гораздо больше различных значений, но нас интересует только эта структура. Именно в ней записана нужная нам информация — путь к исполняемому файлу процесса и его командная строка.

Оформим все вышесказанное в программный код. Подразумевается, что вы уже получили значение p >

  1. ; Открыть процесс для получения информации
  2. invoke OpenProcess , PROCESS_QUERY_INFORMATION + PROCESS_VM_READ , 0 , [ p >]
  3. ; Сохранить хэндл процесса
  4. movebx , eax
  5. ; Прочитать PROCESS_BASIC_INFORMATION
  6. invoke NtQueryInformationProcess , ebx , 0 , Info , \
  7. sizeof . PROCESS_BASIC_INFORMATION , tmp

  8. ; Прочитать PEB
  9. moveax , [ Info . PebBaseAddress ]
  10. invoke ReadProcessMemory , ebx , eax , peb , sizeof . PEB , tmp
  11. ; Прочитать RTL_USER_PROCESS_PARAMETERS
  12. invoke ReadProcessMemory , ebx , [ peb . ProcessParameters ] , pparam , \
  13. sizeof . RTL_USER_PROCESS_PARAMETERS , tmp
  14. ; Получить путь запуска с параметрами (CommandLine)
  15. movzxeax , word [ pparam . CommandLine . Length ]
  16. invoke ReadProcessMemory , ebx , \
  17. [ pparam . CommandLine . Buffer ] , buff1 , eax , tmp
  18. ; Получить рабочую директорию (CurrentDirectoryPath)
  19. movzxeax , word [ pparam . CurrentDirectoryPath . Length ]
  20. invoke ReadProcessMemory , ebx , \
  21. [ pparam . CurrentDirectoryPath . Buffer ] , buff2 , eax , tmp
  22. ; Получить путь запуска (ImagePathName)
  23. movzxeax , word [ pparam . ImagePathName . Length ]
  24. invoke ReadProcessMemory , ebx , \
  25. [ pparam . ImagePathName . Buffer ] , buff3 , eax , tmp

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

С 32-битными системами ничего сложного, но теперь, к сожалению, все чаще появляются операционные системы с 64-битной разрядностью. Для 64-битных процессов создаются свои структуры PEB, PROCESS_BASIC_INFORMATION и т.д. Причем получить доступ к ним описанными выше функциями Win32 невозможно, так как эта память находится в другом адресном пространстве с 64-битной адресацией. Однако, совмещение в одной программе возможностей полноценной работы без особых ограничений как под Win32, так и под Win64, на мой взгляд, будет большим плюсом. К примеру, сейчас лишь единицы таскменеджеров могут похвастаться такой универсальностью, остальные или не работают с 64-битными процессами, или же выпускаются в виде двух самостоятельных версий для систем с различной разрядностью.

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

  1. ; Структура для получения данных о процессе под Win64
  2. struct PROCESS_BASIC_INFORMATION_WOW64
  3. ExitStatus dd ?
  4. Reserved0 dd ?
  5. PebBaseAddress dq ? ; ULONG64
  6. AffinityMask dq ? ; ULONG64
  7. BasePriority dd ?
  8. Reserved1 dd ?
  9. uUniqueProcess >dq ? ; ULONG64
  10. uInheritedFromUniqueProcess >dq ? ; ULONG64
  11. ends
  12. ; Структура PEB процесса под Win64
  13. struct PEB64
  14. InheritedAddressSpace db ?
  15. ReadImageFileExecOptions db ?
  16. BeingDebugged db ?
  17. b003 db ?
  18. Reserved0 dd ?
  19. Mutant dq ?
  20. ImageBaseAddress dq ?
  21. Ldr dq ?
  22. ProcessParameters dq ?
  23. ends
  24. ; Юникодная строка в Win64
  25. struct UNICODE_STRING64
  26. Length dw ?
  27. MaximumLength dw ?
  28. Fill dd ?
  29. Buffer dq ? ; ULONG64
  30. ends
  31. ; Структура RTL_USER_PROCESS_PARAMETERS64 под Win64
  32. struct RTL_USER_PROCESS_PARAMETERS64
  33. MaximumLength dd ?
  34. Length dd ?
  35. Flags dd ?
  36. DebugFlags dd ?
  37. ConsoleHandle dq ? ; ULONG64
  38. ConsoleFlags dd ?
  39. Reserved dd ?
  40. StdInputHandle dq ? ; ULONG64
  41. StdOutputHandle dq ? ; ULONG64
  42. StdErrorHandle dq ? ; ULONG64
  43. CurrentDirectoryPath UNICODE_STRING64
  44. CurrentDirectoryHandle dq ?
  45. DllPath UNICODE_STRING64
  46. ImagePathName UNICODE_STRING64
  47. CommandLine UNICODE_STRING64
  48. ends
  1. section ‘.data’ datareadablewriteable
  2. . . .
  3. ; Данные о 64-битных процессах
  4. Info64 PROCESS_BASIC_INFORMATION_WOW64
  5. peb64 PEB64
  6. pparam64 RTL_USER_PROCESS_PARAMETERS64
  1. section ‘.data’ datareadablewriteable
  2. . . .
  3. ; Импортируемые функции
  4. ntdll db ‘ntdll.dll’ , 0
  5. nwiname db ‘NtWow64QueryInformationProcess64’ , 0
  6. nwmname db ‘NtWow64ReadVirtualMemory64’ , 0
  7. ; Прототипы функций
  8. ; NtWow64QueryInformationProcess64 (
  9. ; IN HANDLE DWORD ProcessHandle,
  10. ; IN PROCESSINFOCLASS DWORD ProcessInformationClass,
  11. ; OUT PVOID DWORD ProcessInformation,
  12. ; IN ULONG DWORD ProcessInformationLength,
  13. ; OUT PULONG DWORD ReturnLength OPTIONAL
  14. ; )
  15. ;
  16. ; NtWow64ReadVirtualMemory64(
  17. ; IN HANDLE DWORD ProcessHandle,
  18. ; IN ULONG64 QWORD BaseAddress,
  19. ; OUT PVOID DWORD Buffer,
  20. ; IN ULONG64 QWORD BufferLength,
  21. ; OUT PULONG64 DWORD ReturnLength OPTIONAL
  22. ; )
  1. ; Получить информацию о процессе
  2. invoke OpenProcess , PROCESS_QUERY_INFORMATION + PROCESS_VM_READ , 0 , [ p >]
  3. ; Сохранить хэндл процесса
  4. movebx , eax
  5. ; Получить адрес функции NtWow64QueryInformationProcess64
  6. invoke GetModuleHandle , ntdll
  7. invoke GetProcAddress , eax , nwiname
  8. ; NtWow64QueryInformationProcess64
  9. stdcalleax , ebx , 0 , Info64 , sizeof . PROCESS_BASIC_INFORMATION_WOW64 , tmp
  10. ; Получить адрес функции NtWow64ReadVirtualMemory64
  11. invoke GetModuleHandle , ntdll
  12. invoke GetProcAddress , eax , nwmname
  13. ; Сохранить адрес функции NtWow64ReadVirtualMemory64
  14. movesi , eax
  15. ; Прочитать из памяти PEB64 процесса
  16. push 0
  17. push 0
  18. pushsizeof . PEB64
  19. push peb64
  20. moveax , Info64 . PebBaseAddress
  21. pushdword [ eax + 4 ]
  22. pushdword [ eax ]
  23. ; NtWow64ReadVirtualMemory64
  24. stdcallesi , ebx
  25. ; Прочитать из памяти ProcessParameters процесса
  26. push 0
  27. push 0
  28. pushsizeof . RTL_USER_PROCESS_PARAMETERS64
  29. push pparam64
  30. moveax , peb64 . ProcessParameters
  31. pushdword [ eax + 4 ]
  32. pushdword [ eax ]
  33. ; NtWow64ReadVirtualMemory64
  34. stdcallesi , ebx
  35. ; Прочитать из памяти командную строку процесса (CommandLine)
  36. push 0
  37. push 0
  38. movzxeax , [ pparam64 . CommandLine . Length ]
  39. pusheax
  40. push buff1
  41. pushdword [ pparam64 . CommandLine . Buffer + 4 ]
  42. pushdword [ pparam64 . CommandLine . Buffer ]
  43. ; NtWow64ReadVirtualMemory64
  44. stdcallesi , ebx
  45. ; Прочитать из памяти рабочий каталог процесса (CurrentDirectoryPath)
  46. push 0
  47. push 0
  48. movzxeax , [ pparam64 . CurrentDirectoryPath . Length ]
  49. pusheax
  50. push buff2
  51. pushdword [ pparam64 . CurrentDirectoryPath . Buffer + 4 ]
  52. pushdword [ pparam64 . CurrentDirectoryPath . Buffer ]
  53. ; NtWow64ReadVirtualMemory64
  54. stdcallesi , ebx
  55. ; Прочитать из памяти путь процесса (ImagePathName)
  56. push 0
  57. push 0
  58. movzxeax , [ pparam64 . ImagePathName . Length ]
  59. pusheax
  60. push buff3
  61. pushdword [ pparam64 . ImagePathName . Buffer + 4 ]
  62. pushdword [ pparam64 . ImagePathName . Buffer ]
  63. ; NtWow64ReadVirtualMemory64
  64. stdcallesi , ebx

Как видите, тоже ничего сложного нет, из 32-битного приложения мы легко получили доступ к памяти 64-битного пространства. Строковые данные, как и в случае с 32-битными системами, также хранятся в юникоде.

Остался последний важный момент. Как узнать разрядность процесса? Ведь для разной разрядности нам придется использовать различные методы получения информации. Нам на помощь приходит функция IsWow64Process. Логика ее работы следующая. Если такая функция отсутствует в системе, или присутствует, но при этом для нашего процесса возвращает FALSE, то это значит, что операционная система 32-битная и никаких 64-битных процессов на ней быть не может. А если она для нашего процесса возвращает TRUE, то система 64-битная и требуется дополнительная проверка. Естественно, подразумевается, что сами мы находимся в контексте 32-битного процесса. Если под 64-битной системой для проверяемого процесса функция IsWow64Process возвращает FALSE, то это 64-битный процесс, иначе 32-битный. Для выполнения всех этих проверок я написал вот такую вспомогательную функцию.

  1. section ‘.data’ datareadablewriteable
  2. . . .
  3. ; Импортируемые функции
  4. kernel db ‘kernel32.dll’ , 0
  5. iwname db ‘IsWow64Process’ , 0
  1. ;—————————————————
  2. ; Процедура проверки разрядности процесса
  3. ;—————————————————
  4. ; Параметры:
  5. ; p >
  6. ; На выходе:
  7. ; EAX = 0 если процесс 32-битный
  8. ; EAX = 1 если процесс 64-битный
  9. ;—————————————————
  10. proc IsProcess64 p >: DWORD
  11. local result : DWORD
  12. local temp : DWORD
  13. pusha
  14. ; По умолчанию результат FALSE
  15. mov [ result ] , 0
  16. ; Определить запуск под Win64
  17. invoke GetModuleHandle , kernel
  18. invoke GetProcAddress , eax , iwname
  19. oreax , eax
  20. ; Мы под Win32, тут все процессы 32-битные
  21. jz . loc_ret
  22. ; Сохранить адрес IsWow64Process
  23. movesi , eax
  24. ; Наш процесс запущен под Win64?
  25. invoke GetCurrentProcess
  26. ; IsWow64Process
  27. leaedi , [ temp ]
  28. stdcallesi , eax , edi
  29. cmp [ temp ] , FALSE
  30. je . loc_ret
  31. ; Получить информацию о процессе
  32. invoke OpenProcess , PROCESS_QUERY_INFORMATION + PROCESS_VM_READ , 0 , [ p >]
  33. oreax , eax
  34. jz . loc_ret
  35. movebx , eax
  36. ; IsWow64Process
  37. stdcallesi , ebx , edi
  38. ; Прибраться за собой
  39. invoke CloseHandle , ebx
  40. ; 32-битный процесс под Win64?
  41. cmp [ temp ] , TRUE
  42. je . loc_ret
  43. mov [ result ] , 1
  44. . loc_ret :
  45. popa
  46. moveax , [ result ]
  47. ret
  48. endp

Поскольку готовых исходников в этой статье не будет, в качестве компенсации выкладываю удобную картинку-шпаргалку по работе с функцией NtQueryInformationProcess.

Шпаргалка по NtQueryInformationProcess

Получение информации о процессах

Команда ps выводит различную информацию о запущенных процессах. Запущенная без ключей, эта команда выводит сводку процессов, связанных с терминалом, с которого ее запустили. Ключи позволяют а) выбрать процессы, информацию о которых следует вывести; б) указать, какую информацию о процессах выводить.

Основные ключи команды ps:

-e вывести информацию обо всех запущенных процессах;

-u пользователь – вывести информацию о процессах указанного пользователя;

-f «полный» листинг (см. таблицу ниже);

-l «длинный» листинг (см. таблицу ниже);

-j вывести идентификаторы группы процессов и сеанса.

Таблица 1. Поля вывода команды ps

Поле Описание Ключи*
S Состояние процесса: O — выполняется (On processor), R — готов к запуску (Runnable), S — находится в состоянии сна (Sleeping), Z — зомби (Zombie), T — остановлен (Stopped). l
UID Идентификатор пользователя, от имени которого запущен процесс (с ключом -f выводится имя пользователя) f,l
PID Идентификатор процесса все
PPID Идентификатор родительскогопроцесса f,l
PGID Идентификатор группы процессов j
SID Идентификатор сеанса j
PRI Приоритет процесса (чем больше, тем ниже) l
NI Относительный приоритет (Nice Number) l
SZ Размер процесса в страницах (размер страницы можно узнать командой pagesize) l
STIME Время запуска процесса f
TTY Управляющий терминал (‘?’ — для демонов) все
TIME Суммарное время, затраченное процессором на исполнение процесса все
CMD Имя процесса (с ключом -f выводятся первые 80 символов командной строки) все

*) — в колонке Ключи указано, какой ключ надо дать команде ps, чтобы соответствующее поле появилось в выводе. Пометка «все» обозначает, что поле выводится всегда, в том числе и при запуске команды без ключей. Ключи -f, -l, -j можно использовать совместно для получения комбинированного вывода.

Ключи -f, -l, -j не определяют, о каких процессах выводить данные , а устанавливают только формат вывода. Для отбора процессов используйте ключи -e, -u.

Команда psимеет также ключ -o (буква «о»), параметром которого является список полей вывода через запятую. Таким образом, можно выбрать только необходимые поля, а также вывести дополнительные данные о процессе, не перечисленные в таблице выше. Наименования полей для ключа -o см. в справочнике man.

Команда pstree выводит процессы в форме дерева. Основным преимуществом является то, что вы сразу можете увидеть родительские процессы: если вам нужно уничтожить целую серию процессов, а они все происходят от одного родителя, вы можете просто убить этот родительский процесс. Вам придётся воспользоваться опцией -p для вывода PID всех процессов и опцией -u для вывода имени пользователя, запустившего процесс. Т.к. дерево зачастую довольно большое, вам потребуется запустить pstree следующим образом:

pstree -up | less

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

Команда psделает моментальный снимок процессов в текущий момент. В отличии от нее, команда top— динамически выводит состояние процессов и их активность в реальном режиме времени.(Для выхода из нее можно нажать клавишу Q).

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

Содержимое окна обновляется каждые 5 секунд. Список процессов может быть отсортирован по используемому времени ЦПУ (по умолчанию), по использованию памяти, по PID, по времени исполнения. Переключать режимы отображения можно с помощью следующих клавиатурных команд:

+ — сортировка по PID;

— сортировать процессы по использованию ЦПУ;

+ — сортировать процессы по использованию памяти;

+ — сортировка по времени выполнения.

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

Дата добавления: 2020-04-05 ; просмотров: 80 ; ЗАКАЗАТЬ РАБОТУ

Информационный процесс, понятие

Определение информационного процесса

Информационный процесс — процесс получения, создания, сбора, обработки, накопления, хранения, поиска, распространения и использования информации. [1]. Люди знакомые с информатикой, конечно же, знают этот термин, да и не только они. Вполне можно утверждать, что информационные процессы являются основой той жизни, которую мы знаем. В этой статье представлены основные алгоритма информационного процесса, различные формы его исполнения.

Информационный процесс как научное понятие

Любые действия, производимые с информацией, называются информационными процессами. Основную роль тут играют сбор, обработка, создание, сохранение и передача информации. На протяжении всей своей истории человечество развивала эти и другие процессы, а так же смежные отрасли. Одним из основных критериев развития общества было именно совершенствование информационных процессов. Искусство, религия, письменность, шифрование, книгопечатание, авторское право, телеграф, радиоэлектроника, компьютеры, интернет – это лишь основная часть достижений человечества в области работы с информацией.
Нужно отметить, что несмотря на кажущуюся определенность, научном сообществе не прекращаются споры об универсальности самого термина «информация». В частности, «информация» не синоним «данным», хотя в разговорной речи зачастую это и так. «Данные» это интерпретированная, обработанная и зарегистрированная в понятном виде информация, продукт информационного процесса [2]. То есть, информация это ресурс, данные это конечный, обработанный продукт прошедший обработку информационным процессом. Но как и любой продукт, данные потребляются для получения какого-то результата. В самом простом виде, можно представить такую схему:

ИСТОЧНИК ИНФОРМАЦИЯ ПРИЕМНИК/ОБРАБОТЧИК ДАННЫЕ
Звезда ХХХ Световые, радио и прочие волны Телескоп и ЭВМ Температура, яркость, размер, дальность и т.д.
Иностранец Речь на непонятном языке Переводчик Речь на понятном языке

Информационные процессы присущи всем биологическим организмам на планете, от простейших до человека. Но человек создал вычислительные системы и специфические каналы информации, которые породили особый их вид — информатику. Несмотря на единую схему алгоритма информационного процесса, как в природе, так и в информатике, они достаточно сильно различаются по своей сути. И различия, в первую очередь, в интерпретации.
В частности, если поместить в комнату человека, собаку, змею, цветок и через громкоговоритель дать голосовой сигнал, реакция у всех будет принципиально разная, а значит из одной и той же информации, каждый обработчик выдаст совершенно разные данные. В частности собака и змея обе способны слышать, но если собака хоть как-то может понимать команды человека, то змея на это неспособна. Цветок вообще не сможет даже воспринять звуковой сигнал, хотя в принципе он способен получать и обрабатывать информацию — некоторые растения могут даже двигаться вслед за солнцем или если их потревожить. Итак, следующей схемой является возможность интерпретации:

ВОСПРИЯТИЕ ИНТЕРПРЕТАЦИЯ ЭФФЕКТ
Человек Да Да Полный
Собака Да Да Частичный
Змея Да Нет Нет
Растение Нет Нет Нет

Основные элементы информационного процесса

Информационный процесс – это последовательные действия выстроенные в алгоритм, совершаемые с информацией, представленной в любом виде (цифровые/аналоговые данные, слухи, теории, факты, наблюдения и т.п.) для достижения некой цели (любой). Данный алгоритм состоит из ряда шагов, которые могут значительно отличаться в той или иной ситуации, но общая концепция выглядит следующим образом:

Получение → Обработка → Хранение → Передача
  • Получение информации – сбор сведений, из каких любых доступных восприятию источников – химический состав среды, радио/электромагнитный сигнал, зрение, слух, флеш-карта и т.п. Как видно, в первую очередь тут важен именно физический способ восприятия информации и ее передачи. Человек никак не воспринимает окружающие его радиоволны, а радиоприемник не способен воспринимать звук, хотя и может его генерировать.
    Но кроме этого, для информационных процессов внутри общества и лично для конкретного человека неотъемлемой частью успешности данного шага есть то, что можно назвать актуальностью, выраженной в первую очередь в организации самого действия получения, а так же целей и источников. Археолог не сделает никаких открытий, копаясь в социальных сетях. Однако рекламщику социальные сети будут крайне полезны. Несмотря на то, что в обоих случаях оба получают одинаковую информацию, одинаково интерпретируют ее в данные, для одного этот процесс совершенно бессмысленный.
  • Анализ / обработка информации – алгоритм преобразования информации в данные. Данный шаг полностью связан с преобразованием информации во что-то иное. Информационный процесс дошедший до этого шага, совершенно точно изменит исходную информацию. Фактически анализ информации, это апогей всего информационного процесса.
    Это, вероятно, самый сложный шаг. Один из самых сложных и малопонятных механизмов на планете — человеческий мозг — предназначен именно для этого. Мышление это фактически крайне сложный механизм анализа информации. Хотя в другой ситуации, как например преобразование радиосигнала в звуковой, происходит значительно проще. Но в любом случае этот шаг изменит исходную информацию в нечто подчас совершенно иное. В радиоприемнике радиоволны превращаются в звуковые, свет, пройдя через глаза и попав в мозг, становится визуальными образами, набор электрических и химических сигналов в мозгу преобразуется в мысль, а затем в звуковые сигналы речи или текст на бумаге.
    В анализе и обработки информации и кроится основная разница информационного процесса в биологии и информатике. Биологические объекты, в частности человек, интерпретируют полученную информацию. И, исходя из этой интерпретации, дают оценку и реакцию.
    Представим ситуацию, когда в одном строю стоят несколько солдат говорящих на одном языке, иностранный и древний человек. Командир отдает приказ бежать, и понимающие его солдаты бегут. Иностранец так же побежит, хотя слов он и не понял, но он точно знает, что тут происходит и понимает, что ему нужно делать то же, что и остальным. Древний человек, возможно, тоже побежит, но о его мотивации можно лишь гадать. Сержанты вообще не побегут, хотя команда им предельно ясна, но им не нужно. А магнитофон только лишь запишет звук, никак ничего не интерпретировать, хотя и произведя обработку информации.
  • Сохранение информации – любые действия для того, чтобы полученные после обработки данные могли быть использованы в дальнейшем, начиная от памяти живых организмов и заканчивая электронными носителями. Сюда же могут входить любые действия, препятствующие нежелательному использованию сохраненных сведений, начиная от закапывания тайных книг и заканчивая современными криптографическими методами.
    Эффективность этого шага напрямую зависит от используемых методов и технологий – чем лучше технология, тем надежнее сохранена информация. В некоторых ситуациях этот шаг может быть исключен из алгоритма, но в таком случае обязательно выполняется другой – коммуникационный процесс. Хотя, так или иначе, информация все равно хотя бы какое-то время, но хранится на неких носителях. Даже радиоприемник, который лишь принимает сигнал (получение) и интерпретирует его в звук (обработка), некоторое время «хранит» информацию в виде электрических импульсов на своих схемах.
  • Коммуникации / передача информации – процесс передачи информации другим субъектам. Практически каждый информационный процесс подразумевает под собой передачу полученной информации кому-либо другому, будь то человек или автоматическая машина для ее дальнейшего использования. В некоторых ситуациях процесс коммуникации может быть, как не заметен, как и «сохранение» информации в проводах радиоприемника. Но даже личные, секретные записи алхимика-экспериментатора можно отнести к некому виду коммуникации с самим собой.
    Что характерно, информация не имеет значения, если она не была как-то кем-то использована. Очевидно,
    что установка счетчика, на водяную трубу совершенно бессмысленна, если счетчик не оборудован табло с цифрами. Вопрос написания автором романа и сокрытия рукописей конечно философский, но с точки зрения прагматизма он ясен – это действие бессмысленно. Фактически, коммуникация является логическим завершением информационного процесса, действием придающим смысл всему.
    По сути, коммуникация есть то, что отличает информационный процесс от похожих процессов в неживой природе — вещества в химической реакции меняют цвет не «для чего-то», а «потому-то». А любой информационный процесс происходит исключительно с какой-то конечной целью, хотя и не всегда конкретной. В частности, та же лакмусовая бумажка меняющая цвет «потому что», только элемент информационного процесса по определению человеком химического состава вещества, фактически заменяющий орган чувств.

Основные виды информационных процессов

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

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

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

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

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

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

Защита информации. Любые действия, использующие какие-то дополнительные средства для защиты информации от использования другой стороной. Защита информации актуальна лишь в сложных информационных системах со многими участниками, в виду туго, что она нужна исключительно для того чтобы не дать нежелательному элементу воспользоваться некой информацией. Фактически единственный способ защиты информации это шифрование того или иного рода. Скрывание информации было бы неверно называть способом ее защиты, так как сокрытая информация и не требует защиты, ибо не участвует ни в каком процессе.
Использование информации. Самый объемный информационный процесс. Являет собой обоснованное принятие решений в разных видах человеческой деятельности в самом широком смысле.

  1. Государственный стандарт РФ «Защита информации. Порядок создания автоматизированных систем в защищенном исполнении» (ГОСТ Р 51583-2000 п. 3.1.10).
  2. ISO/IEC/IEEE 24765-2010 Systems and software engineering p 3.704
Илон Маск рекомендует:  Что такое код ocicancel
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL