|
||||||||||||
|
||||||||||||
|
|||||||||
МЕНЮ
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА - РЕФЕРАТЫ - Подсистема управления процессамиПодсистема управления процессамиМинистерство транспорта РФ Федеральное агентство железнодорожного транспорта ГОУ ВПО "ДВГУПС" Кафедра: "Информационные технологии и системы" КУРСОВАЯ РАБОТА на тему: "Подсистема управления процессами" Выполнил: Шолков И.Д. группа 230 Проверил: Решетникова О.В. Хабаровск 2010 Оглавление
1) Номер процесса - показывает порядковый номер процесса 2) Тип процесса - показывает действие, с которое выполняет данный процесс 3) Состояние процесса - показывает работает ли процесс в данный момент или нет. Также показывает, если процесс является остановленным, завершенным или только что возобновленным. 4) Приоритет процесса - показывает приоритет процесса, который был присвоен ему при создании. 5) Процент процессорного времени - отображает процент используемого процессорного времени. В правой части окна программы расположено поле, в которое записывается результат выполнения работающего процесса в реальном времени. В нижней части окна программы расположены элементы управления для работы с уже запущенными процессами. Кнопка "Остановить" - останавливает выбранный процесс с возможностью его последующего перезапуска. Кнопка "Возобновить" - вновь запускает остановленный процесс. Кнопка "Завершить" - останавливает выбранный процесс без возможности его завершения. Так же программа имеет стандартную строку состояния, с помощью которого можно свернуть, развернуть или закрыть рабочее окно программы. 2.3 Работа с программойЗапуск процессов выполняется с помощью кнопки "Запустить", однако перед этим следует установить параметры процесса.Случайное число - процесс генерирует случайное число в интервале от одного до ста и выводит его в поле вывода.Числа Фибоначчи - генерирует последовательность Фибоначчи, начиная с первого члена, и выводит их в поле вывода. Как только значение чисел последовательности превосходит тысячу - значения сбрасываются до первых членов.Рекурсивный синус - генерирует значение синуса X. Первоначально X равен 1, позже ему присваиваются посчитанные значения sin(x). Значения, округленные до третьего знака выводятся в поле вывода.Приоритет процесса показывает, насколько велики шансы процесса начать работу, если предыдущий процесс завершил работу. Например, если запустить три процесса с одинаковыми приоритетам, то количество раз, которое они будут работать, будет примерно одинаковым, а если запустить два процесса с высоким приоритетом и один процесс с низким, то процесс с низким приоритетом будет выполняться, примерно, один из шестнадцати раз. Однако, архитектура программы предусматривает то, что если количество запущенных процессов больше чем один, то один и тот же процесс не может быть выполнен более одного раза подряд.После запуска нескольких процессов окно программы примет следующий вид:рис 2: работа программы.Процесс, который находится в рабочем состоянии, обозначен подписью работает, и именно результаты выполнения его работы в данный момент выводятся в поле вывода.Если нам хочется остановить процесс под номером 2, необходимо выбрать вторую строку в таблице процессов и нажать кнопку "Остановить". После выполнения команды окно примет следующий вид:рис. 3: процесс с Process ID = 2 остановлен.Остановленный процесс отмечен подписью "Остановлен" в третьем столбце. Позднее, если мы захотим его восстановить, то необходимо опять выбрать его номер в меню "PID" и нажать кнопку "Возобновить". Если нажать кнопку "возобновить", указав на процесс, который не отмечен подписью "Остановлен", то ничего не произойдет.Процесс, который вновь начал работу, но еще ни разу не выполнялся отмечается подписью "Возобновлен" в третьем столбце, как на картинке:рис. 4: работа процесса с Process ID = 2 возобновлена.Если мы захотим завершить процесс, под номером 3, необходимо выбрать третью строку в таблице процессов и нажать кнопку "Завершить". Процесс, который завершен уже не может быть запущен вновь. Создайте процесс с такими же параметрами.Также существует возможность отсортировать запущенные потоки. По умолчанию они отсортированы по их ID, которое зависит от порядка их создания. Клик на заголовке столбца "Тип процесса" отсортирует процессы по типу, на "Состояние процесса" по состоянию, а на "Приоритет" сгруппирует процессы по типам приоритетов. Повторный клик группирует процессы в обратном порядке.Для корректного завершения работы программы необходимо просто щелкнуть мышкой на знак крестика в строке заголовка.2.4 Основные характеристики программы Process ManagerProcess Manager - это программа, предназначенная для управления процессами пользователем персонального компьютера. Она работает под управлением операционных систем MS Windows 2000/XP/Vista/7.Process Manager позволяет формировать списки процессов и выводить результаты их деятельности на экран с последующим сохранением. Стандартными средствами нельзя достичь точных результатов, можно лишь увидеть примерное количество ресурсов процессора и памяти, который процесс использует в данный период времени.Программа включает в себя набор базовых элементов, каждый из которых позволяет выполнить определенную задачу проекта. После загрузки проекта и запуска процессов значения и параметры работы процессов сразу отображаются на дисплее. Подробное описание работы с программой представлено в первом пункте настоящего документа. Подробное описание логической структуры программы и код программы можно найти в документе "Технический проект автоматизированной подсистемы для визуализации работы с процессами Process Manager". Программа работает в штатном режиме, однако в случае необходимости может работать круглосуточно и непрерывно. Программа прошла всестороннюю проверку и полностью защищена от сбоев и исключений.ЗаключениеПодсистема управления процессами является одной из важнейших частей операционной системы. В этой курсовой работе был представлен один из вариантов его реализации, неприменимый в реальной жизни. Тем не менее, нельзя не отметить, что этот проект весьма упрощен. Подсистема управления процессами, которая реально могла бы стать частью многозадачной операционной системы, требует гораздо большей степени проработанности, уметь работать с прерываниями, разнородными процессами, а к тому же иметь некоторую защиту от внешнего воздействия, ведь умышленное или неумышленное завершение критически важных процессов может привести к краху системы. Но все же, в работе представлена довольно изящная реализация. Главная ее проблема в том, что в ней реализованы не все возможные компоненты, и некоторые моменты регулируются встроенными средствами операционной системой, которая работает на компьютере, в данном случае Windows. При реальном программировании операционной системы, подсистема управления процессами должна быть построена с нуля и иметь определение и описание многих элементов, которые работает в этом проекте по умолчанию [3].Список литературы1) Безбогов, А.А. Безопасность операционных систем : учебное пособие / А.А. Безбогов, А.В. Яковлев, Ю.Ф. Мартемьянов. - М. : "Издательство Машиностроение-1", 2007. - 220 с.2) Операционные системы, лекции по операционным системам [Электронный ресурс] / www.osi-ru.ru. - Содержание: Управление процессами; Управление памятью; Управление данными; Управление устройствами3) Троелсен, Э. C# и платформа .NET: учебное пособие/ Э.Троелсен. - Спб. : "Питер Пресс", 2007. -796с.ПриложениеИсходный код программы Process Managerusing System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading;using System.Windows.Forms;using Timer=System.Threading.Timer;namespace ProcManager{abstract class BetaProc{protected Thread a;bool isWorking = false;public event EventHandler WorkingStateChanged = delegate { };public bool IsWorking{get { return isWorking; }set{isWorking = value;WorkingStateChanged(this, EventArgs.Empty);}}public void Delete(){if (a != null){a.Abort();a = null;if (IsWorking == true){if (WaitToStart.Set() == false)WaitToStart.Set();}}}public ThreadPriority Prior{get { return a.Priority; }set { a.Priority = value; }}public void Stop(){a.Abort();if(isWorking == true)WaitToStart.Set();}private DataGridView data;public delegate void ChangeStateEventHandler(string msg);public static event ChangeStateEventHandler change;public abstract string GetType();public string GetState(){return IsWorking ? "Работает" : "Не работает";}public string GetPriority(){return a.Priority.ToString();}public void ChangeState(){if (IsWorking == false){IsWorking = true;}else{IsWorking = false;}}public abstract void Base();private Control pReporter;public DataGridView reporterD{get{return data;}set{data = value;}}public Control reporter{get{return pReporter;}set{pReporter = value;}}public EventWaitHandle SwaitTostart{set{WaitToStart = value;}}protected Stopwatch timer = new Stopwatch();public void Start(){a = new Thread(Base);a.Start();}delegate void SetTextDelegate2(string Text);public static EventWaitHandle WaitToStart;public void SetText2(string Text){if (reporter.InvokeRequired){SetTextDelegate2 a = new SetTextDelegate2(SetText2);reporter.Invoke(a, new object[] { Text });}else reporter.Text += Text;}public void Restart(){if(isWorking == true)ChangeState();timer = new Stopwatch();a=new Thread(Base);a.Start();timer.Start();}}}using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading;namespace ProcManager{class FibbonProc:BetaProc{public readonly string Type = "Числа Фиббоначи";public override string GetType(){return Type;}private int FSum = 1;private int FSum2 = 1;private int temp = 0;public override void Base(){WaitToStart.WaitOne();if (IsWorking == false)ChangeState();timer.Reset();timer.Start();do{if (FSum >= 1000){FSum = 1;FSum2 = 1;}temp = FSum;FSum = FSum + FSum2;FSum2 = temp;SetText2(FSum.ToString() + "\r\n");Thread.Sleep(1110);}while (timer.ElapsedMilliseconds <= 3000);Restart();WaitToStart.Set();}}}using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading;namespace ProcManager{class ProcRandom:BetaProc{Random a = new Random();private int res;public readonly string Type = "Случайное число";public override string GetType(){return Type;}public override void Base(){WaitToStart.WaitOne();if (IsWorking == false)ChangeState();timer.Reset();timer.Start();do{res = a.Next(100);SetText2(res.ToString()+"\r\n");Thread.Sleep(1110);}while (timer.ElapsedMilliseconds <= 3000);Restart();WaitToStart.Set();}}}using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading;namespace ProcManager{class SinProc:BetaProc{private double x = 1;public readonly string Type = "Синус X";public override string GetType(){return Type;}public override void Base(){WaitToStart.WaitOne();if(IsWorking == false)ChangeState();timer.Reset();timer.Start();do{x = Math.Sin(x);SetText2(Math.Round(x, 3).ToString()+"\r\n");Thread.Sleep(1110);}while (timer.ElapsedMilliseconds <= 3000);Restart();WaitToStart.Set();}}}using System.Collections;using System.Threading;using System.Windows.Forms;using System;namespace ProcManager{class ClassProcManager{private BetaProc[] mas = new BetaProc[30];private DataGridView a;private int index = 0;public BetaProc[] ReturnMas(){return mas;}public int Index(){return index;}public DataGridView reporterD{get{return a;}set{a = value;}}public void AddThread(BetaProc a){if (index < mas.Length){mas[index] = a;}elseMessageBox.Show("Слишком много процессов");}public void ShowInDataView(BetaProc b){a.Rows.Add(index + 1, b.GetType(), b.GetState(), b.GetPriority());index++;}public void SetWaitProperty(BetaProc b){int i = Array.IndexOf(mas, b);if((i<0) || (i>a.Rows.Count - 1))return;for (int s = 0; s < index; s++){if ((int)a.Rows[s].Cells[0].Value == i+1){DataGridViewRow row = a.Rows[s];row.Cells[2].Value = b.GetState();}}}}}using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.Drawing;using System.Linq;using System.Text;using System.Threading;using System.Windows.Forms;namespace ProcManager{public partial class Form1 : Form{public Form1(){InitializeComponent();}public int index = 0;private ClassProcManager manager = new ClassProcManager();private EventWaitHandle wh1 = new AutoResetEvent(true);private RadioGroup processType;private RadioGroup processPriority;private ThreadPriority[] ProcessPriorities = new ThreadPriority[30];ThreadPriority HighestPriority = ThreadPriority.Lowest;/// <summary>/// Возвращает приоритет процесса/// </summary>/// <param name="priority">Tag </param>/// <returns>Объект из перечисления ThreadPriority</returns>private ThreadPriority IndexToPriority(int priority){switch (priority){case 0: return ThreadPriority.Lowest;case 1: return ThreadPriority.BelowNormal;case 2: return ThreadPriority.Normal;case 3: return ThreadPriority.AboveNormal;case 4: return ThreadPriority.Highest;default: return ThreadPriority.Normal;}}private void button1_Click(object sender, EventArgs e){BetaProc process;switch (processType.SelectedButton){case 0: process = new FibbonProc();break;case 1: process = new ProcRandom();break;case 2: process = new SinProc();break;default: process = new ProcRandom();break;}process.SwaitTostart = wh1;process.reporter = richTextBox1;process.reporterD = dataGridView1;process.Start();process.Prior = IndexToPriority(processPriority.SelectedButton);manager.AddThread(process);manager.ShowInDataView(process);process.WorkingStateChanged += new EventHandler(a_WorkingStateChanged);// расчёт процессорноного времениif (process.Prior > HighestPriority) HighestPriority = process.Prior;ProcessPriorities[index] = process.Prior;if (index >= 1){double FreeProcessorTime = 100;double TimePerProcess = 100 / (index + 1);double PriorityWeight = 0;int HighPriorityProcessCount = 0;// расчёт для процессов с приоритетом ниже самого большогоfor (int i = 0; i < index + 1; i++){if (ProcessPriorities[i] != HighestPriority){switch (ProcessPriorities[i]){case ThreadPriority.Lowest: PriorityWeight = 0.2;break;case ThreadPriority.BelowNormal: PriorityWeight = 0.4;break;case ThreadPriority.Normal: PriorityWeight = 0.6;break;case ThreadPriority.AboveNormal: PriorityWeight = 0.8;break;}FreeProcessorTime -= TimePerProcess * PriorityWeight;dataGridView1.Rows[i].Cells[4].Value = Math.Round(TimePerProcess * PriorityWeight);}else HighPriorityProcessCount++;}// расчёт для процессов с самым большим приоритетомfor (int i = 0; i < index + 1; i++){if (ProcessPriorities[i] == HighestPriority){dataGridView1.Rows[i].Cells[4].Value = Math.Round(FreeProcessorTime / HighPriorityProcessCount);}}}else dataGridView1.Rows[0].Cells[4].Value = "100";index++;}void a_WorkingStateChanged(object sender, EventArgs e){BetaProc b = sender as BetaProc;manager.SetWaitProperty(b);}private void Form1_Load(object sender, EventArgs e){manager.reporterD = dataGridView1;// Заполняем RadioGroup processType и processPriority объектами RadioButtonRadioButton[] processTypeRadioButtons = new RadioButton[3];for (int i = 0; i < groupBox1.Controls.Count; i++) processTypeRadioButtons[i] = (RadioButton)groupBox1.Controls[i];RadioButton[] processPriorityRadioButtons = new RadioButton[5];for (int i = 0; i < groupBox2.Controls.Count; i++) processPriorityRadioButtons[i] = (RadioButton)groupBox2.Controls[i];processType = new RadioGroup(processTypeRadioButtons);processPriority = new RadioGroup(processPriorityRadioButtons);}private void button2_Click(object sender, EventArgs e){int processID = (int)dataGridView1.SelectedRows[0].Cells[0].Value - 1;if (processID != -1 && (string)manager.reporterD.Rows[processID].Cells[3].Value != "Завершен"){manager.ReturnMas()[processID].Stop();manager.reporterD.Rows[processID].Cells[2].Value = "Приостановлен";}}private void button3_Click(object sender, EventArgs e){int processID = (int)dataGridView1.SelectedRows[0].Cells[0].Value - 1;if ((string)manager.reporterD.Rows[processID].Cells[2].Value == "Приостановлен"){manager.ReturnMas()[processID].Restart();manager.reporterD.Rows[processID].Cells[2].Value = "Возобновлен";}}private void button4_Click(object sender, EventArgs e){int processID = (int)dataGridView1.SelectedRows[0].Cells[0].Value - 1;if (processID != -1){manager.ReturnMas()[processID].Delete();manager.reporterD.Rows[processID].Cells[2].Value = "Завершен";}}}} |
РЕКЛАМА
|
|||||||||||||||||
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА | ||
© 2010 |