Материал: Методические указания по выполнению лабораторных работ на языке программирования С# по дисциплине «Системное программное обеспечение». Кремер О.Б

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

ФГБОУ ВПО «Воронежский государственный

технический университет»

Кафедра автоматизированных и вычислительных систем

Методические указания

по выполнению лабораторных работ

на языке программирования С#

по дисциплине

«Системное программное обеспечение»

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

230100.62 «Информатика и вычислительная техника»,

профиля «Вычислительные машины, комплексы,

системы и сети»

заочной формы обучения

Воронеж 2012

Составитель канд. техн. наук О.Б. Кремер

УДК 004.45

Методические указания по выполнению лабораторных работ на языке программирования С# по дисциплине «Системное программное обеспечение» для студентов направления 230100.62 «Информатика и вычислительная техника», профиля «Вычислительные машины, комплексы, системы и сети» заочной формы обучения / ФГБОУ ВПО «Воронежский государственный технический университет»; сост. О.Б. Кремер. Воронеж, 2012. 32 с.

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

Методические указания подготовлены в электронном виде в текстовом редакторе MS Word и содержатся в файле СПО_МУ-ЗО.doc.

Табл. 4. Ил. 15. Библиогр.: 4 назв.

Рецензент канд. техн. наук, доц. Е.А. Ганцева

Ответственный за выпуск зав. кафедрой д-р техн. наук, проф. С.Л. Подвальный

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

© ФГБОУ ВПО «Воронежский государственный технический университет», 2012

Лабораторная работа № 1. Информационная структура процессов и потоков в операционной системе

Цель работы: приобретение навыков создания приложений, использующих информационную структуру процессов и потоков, с помощью библиотек базовых классов .NET языка программирования C#.

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

Теоретический материал

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

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

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

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

Рассмотрим взаимодействие с процессами с помощью библиотек базовых классов .NET языка программирования C#.

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

Таблица 1

Некоторые члены пространства имен System.Diagnostics

Название

Назначение

Process

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

ProcessModule

Позволяет представлять модуль (*.dll или *.ехе), который должен загружаться в определенный процесс.

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

Этот тип может применяться для представления любого модуля: на базе СОМ, на базе .NET или традиционного двоичного модуля на базе С.

ProcessModuleCollection

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

ProcessStartInfo

Позволяет указывать ряд значений, которые должны использоваться при запуске процесса посредством метода Process. Start().

ProcessThread

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

ProcessThreadCollection

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

Тип System.Diagnostics.Process позволяет анализировать процессы, выполняющиеся на определенной машине (как локальной, так и удаленной). Класс Process обладает членами, которые позволяют запускать и останавливать процессы программным образом, просматривать приоритет процесса, а также получать список активных потоков и/или загруженных модулей, которые выполняются в рамках конкретного процесса. В таблице 2 перечислены некоторые наиболее важные члены System.Diagnostics.Process.

Таблица 2

Некоторые члены типа Process

Название

Назначение

Id

Представляет собой свойство и позволяет получать идентификатор (PID) соответствующего процесса.

ProcessName

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

GetProcesses ()

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

Threads

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

StartTime

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

PriorityLevel

Позволяет получать или устанавливать уровень приоритета потока.

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

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

Чтобы посмотреть, как манипулировать типами Process, создадим новый проект типа С# (рис. 1) в виде консольного приложения по имени Processi (рис. 2).

Рис. 1. Создание проекта в среде Visual Studio

Рис. 2. Выбор и сохранение консольного приложения

Пользователю откроется окно редактора кода с заготовкой для проекта (рис. 3).

Рис. 3. Окно редактора кода проекта

Определим в проекте внутри класса Program вспомогательный статический метод ListAllRunningProcesses() (не забыв импортировать пространство имен System.Diagnostics).

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

Далее надо изменить метод Main() так, чтобы он вызывал этот вспомогательный метод ListAllRunningProcesses() (рис. 4).

Вывод списка процессов ОС, т.е. результаты работы программы, представлен на рис. 5.

Рис. 4. Листинг программы получения списка процессов

Рис. 5. Вывод списка процессов ОС

Программная реализация изучения конкретного процесса

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

//В случае отсутствия процесса с PID-идентификатором 987

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

static void GetSpecificProcess ()

{

Process theProc = null;

try

{

theProc = Process.GetProcessById(987);

}

catch // Общий блок catch используется для простоты.

{

Console.WriteLine("-> Sorry...bad PID!"); // неверный PID

}

}

Для выполнения данного метода надо в методе Main() добавить обращение к методу. Листинг программы представлен на рис. 6, а результат работы программы – на рис. 7.

Рис. 6. Обращение к конкретному процессу

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

Рис. 7. Результат обращения к заданному процессу

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

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

static void GetSpecificProcess(int pID)

{

Process theProc = null;

Try

{

theProc = Process.GetProcessById(pID);

}

catch // Общий блок используется для простоты.

{

Console.WriteLine("-> Извините...неверный номер процесса PID!"); // неверный PID

return;

}

// Отображение статистических данных по каждому

//потоку в указанном процессе

Console.WriteLine("Информация о процессе: {0}", theProc.ProcessName);

ProcessThreadCollection theThreads = theProc.Threads;

foreach(ProcessThread pt in theThreads)

{

string info = string.Format("-> Поток ID:

{0}\tВремя старта {1}\tПриоритет {2}",

pt.Id , pt.StartTime.ToShortTimeString(),

pt.PriorityLevel);

Console.WriteLine(info);

}

Console.WriteLine("***********************\n");

}

После написания кода в методе Main(), позволяющего пользователю вводить номер процесса, и организации обращения к представленному в листинге методу GetSpecificProcess приложение выдаст следующий результат работы программы (рис. 8).

Рис. 8. Информация о потоках заданного процесса

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

Источник: https://studfile.net/preview/16569123/