Pistachiout的博客

每天多学一点知识,就少写一行代码

Ubuntu进程管理子系统设计与实现

一、进程管理子系统

在Ubuntu下编制一个程序,模拟实现一个简单的进程管理子系统,它由进程建立模块、进程撤消模块、进程控制表组成,并包括进程切换和调度模块。

1. 【设计要求1】
   该子系统接收新进程建立请求的方式是循环显示“请输入新命令行”,然后根据用户键入内容启动相应进程,其后不等待子进程结束,马上显示下一个“请输入新命令行”如此循环往复。
     当建立进程时,相应读写进程控制表,然后借助底层环境OS中象fork和exec这样的函数将新进程投入运行(这与底层环境的实际OS不同,实际OS将新进程投入运行时要布置现场,最后时程序技术器寄存器)。进程撤消时,利用底层OS的wait( )从子进程回到本子系统,相应修改PCB。
     比较该子系统与实际系统中的相应功能的异同与差距,尤其在现场保存与恢复方面的比较。
2. 【设计要求2】
   在上题的基础上,进一步模拟实现进程切换。希望能实现时间片满或接到sleep调用(或信号时)进行进程切换(选择其一即可)。
     若要实现时间片,假设时间片为1秒钟,设定底层环境OS每个1秒向该系统发一个信号,本子系统将本子系统的进程切换和调度模块设定为该信号的处理程序。或者每当接到子进程发出的的sleep调用(或信号)时进行进程切换,这里子进程发出的sleep调用(或信号)代表实际系统中可能发生的sleep( )调用、等待某一时间发生等情况,进程调度采用简单的FIFO算法。
3. 【设计要求3】
   编制一个进程调度算法模块。进程调度是处理机管理的核心内容。本设计要求用编写和调试一个简单的进程调度程序。通过设计本项目可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
     (1) 进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
      (2) 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
     (3) 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。
     (4) 每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
     (5) 就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
     (6) 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
     (7) 重复以上过程,直到所要进程都完成为止。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include <iostream>
#include <cstring>

using namespace std;

//进程类
class pcb
{
public:
//构造函数
pcb(char Name[20], int Rank, int Needtime)
{
strcpy(name, Name);
state = "Wait";
rank = Rank;
needtime = Needtime;
runtime = 0;
next = NULL;
}
char name[20];
string state;
int rank;
int needtime;
int runtime;
pcb* next;
};
pcb *ready = NULL, *now = NULL;
//输出进程
void output(pcb *point)
{
cout << ".............................................................................";
cout << "\n 进程名称 \t 进程状态 \t 优先级 \t 所需时间 \t 已运行时间" << endl;
cout << "| " << point->name ;
cout << " | " << point->state ;
cout << " | " << point->rank ;
cout << " | " << point->needtime;
cout << " | " << point->runtime << endl;
cout << "............................................................................." << endl;
}

//进程依次排序
void sort(pcb *point)
{
if (ready == NULL)//若链表为空
{
ready = point;
}
else
{
pcb *point1 = ready, *point2 = ready->next;
if (point->rank > point1->rank)//若为优先等级最高,放在队首
{
point->next = ready;
ready = point;
}
else
{
while (point2 != NULL)//遍历链表,直到找到合适位置
{
if (point->rank > point2->rank)
{
point1->next = point;
point->next = point2;
break;
}
point1 = point2;
point2 = point2->next;
}
if (point2 == NULL)//若为优先等级最低,放在队尾
{
point1->next = point;
}
}
}
}

//进程结束函数,打印已完成进程,释放内存
void finish(pcb *point)
{
point->state = "Finish";

cout << "******************************** 进程" << point->name << "已经完成 ********************************" << endl;
cout << "\n 进程名称 \t 进程状态 \t 优先级 \t 所需时间 \t 已运行时间" << endl;
cout << "| " << point->name ;
cout << " | " << point->state ;
cout << " | " << point->rank ;
cout << " | " << point->needtime;
cout << " | " << point->runtime << endl;
delete(point);
point = NULL;
}

//运行一个单位时间
void running()
{
now = ready;
ready = ready->next;
now->next = NULL;
now->state = "Run";
now->rank--;
now->runtime++;

if (now->needtime == now->runtime)
{
//若当前进程执行完毕
finish(now);
now = NULL;
}
else
{
//若当前进程没有执行完毕
cout << "*************************** 当前正在运行的进程是 *************************** " << endl;
output(now);
}
//打印就绪队列
cout << "*************************** 当前就绪队列状态为 *************************** " << endl;
pcb *point = ready;
while (point != NULL)
{
output(point);
point = point->next;
}
//把没执行完的进程重新放入队列
if (now != NULL)
{
now->state = "Wait";
sort(now);
}
}

int main()
{
//freopen("in.txt", "r", stdin);
int t;
cout<<"**** 输入进程数目:";
cin >> t;
cout << endl;
//进程信息输入
for (int i = 1; i <= t; i++)
{
pcb *temp;
char name[20];int rank;int needtime;
cout << "**** 请输入第" << i << "个进程的信息 ****" << endl;
cout << "请输入该进程的名字:";
cin >> name;
cout << "请输入该进程的优先等级:";
cin >> rank;
cout << "请输入该进程需要的运行时间:";
cin >> needtime;
temp = new pcb(name, rank, needtime);
sort(temp);
temp = NULL;
cout << endl;
}

//打印执行前的就绪队列
cout << "*************************** 执行前就绪队列排序 *****************************" << endl;
pcb *point = ready;
while (point != NULL)
{
output(point);
point = point->next;
}
cout << "*************************** 程序准备正式开始执行 *****************************" << endl;

//程序开始执行
char ch;
while (now != NULL || ready != NULL)
{
//一次运行一个单位时间
cout << "\n\n 按任一键继续......" << endl;
ch = getchar();
running();
cout << endl;
}
//所有进程完成

cout << "*************************** 所有进程均已执行完成 ***************************" << endl;

return 0;
}

二、进程管理子系统截图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

-------------本文结束感谢您的阅读-------------