要求:通过进程管理子系统案例的演示与操作步骤,掌握在 Linux 系统下创建进程并管理进程,并能根据自己的设计在 shell 命令行中管理进程。
1 项目概述
1.1 项目介绍
现代计算机系统中,进程是资源分配和独立运行的基本单位,是操作系统的核心概念。进程调度是进程管理过程的主要组成部分,是必然要发生的事件。在现代操作系统中,进程的并发机制在绝大多数时候,会产生不断变化的进程就绪队列和阻塞队列。处于执行态的进程无论是正常或非正常终止、或转换为阻塞状态,都会引发从就绪队列中,由进程调度选择一个进程进占CPU。
本项目在 Linux 系统下创建进程并管理进程,在 shell 命令行中管理进程。通过编程实现操作系统进程调度子系统的基本功能,其中,必须实现的调度算法有:先来先服务、时间片轮转、多级反馈轮转法、优先级等,在程序设计过程中,在每个调度算法展示时,可以看到所有有关的队列结构和其中的内容,如就绪队列、阻塞队列等结构的动态变化的过程。
1.2 项目目的
课程设计是计算机科学与技术专业实践性环节之一,是学习完《操作系统》课程后进行的一次较全面的综合练习。目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养我们的系统设计能力,并了解操作系统的发展动向和趋势。
1.3 项目开发环境
我们的项目基于Linux进行开发,需要事先安装好开发环境。
- Git 项目源码管理。我们采用了github作为Git服务器,便于大家交换代码
- VMware Workstation Pro v16.0.0 虚拟机软件。VMware是功能最强大的虚拟机软件,用户可在虚拟机同时运行各种操作系统,进行开发、测试、演示和部署软件。
- Ubuntu 18.04 LTS。Ubuntu是一个以桌面应用为主的GNU/Linux操作系统。
- PuTTY 0.75。PuTTY是一个Telnet/SSH/rlogin/纯TCP以及串行阜连线软件,多用于远程登录控制功能。
- MTPuTTY 1.8.0.224。MTPuTTY用于管理不同的PuTTY连接,使用一个标签式的用户界面。每个 PuTTY 连接运行在不同的标签,你可以方便地切换它们。
- Zsh 5.8。Zsh是一种专为交互使用而设计的 shell,它也是一种强大的脚本语言。
- oh my zsh。oh-my-zsh是基于zsh的功能做了一个扩展,方便的插件管理、主题自定义,以及漂亮的自动完成效果。
系统配置:
系统:Windows 10 (64bit)
处理器:Intel CPU Core i5-2500K 3.3 GHz
内存:16 GB RAM
显卡:Nvidia GPU GeForce GTX 1650
存储:15 GB of available space
2 需求分析
2.1 系统需求分析
1.加深对进程概念的理解,明确进程和程序的区别。
2.进一步认识并加强进程管理中主要数据结构的设计及进程调度算法。
3.分析进程竞争资源现象,学习解决进程互斥的方法。
4.观察和管理进程——系统在运行过程中可显示或打印各进程的状态及有关参数的变化情况。
2.2 可行性分析
1.项目的目标
项目目标:实现一个进程管理子 ,通过编程实现操作系统进程调度子系统的基本功能,其中,必须实现的调度算法有:先来先服务、时间片轮转、多级反馈轮转法、优先级等,在程序设计过程中,在每个调度算法展示时,可以看到所有有关的队列结构和其中的内容,如就绪队列、阻塞队列等结构的动态变化的过程。
2.设计目的
通过模拟操作系统原理的实现,加深对操作系统工作原理和操作系统实现方法的理解;通过模拟操作系统原理的实现练习编程。
3.任务和要求
(1)良好的沟通和合作能力;
(2)充分利用课上所学的操作系统、程序设计、数据结构等相关知识;
(3)充分利用调试和排错技术;
(4)简单测试驱动模块和桩模块的编写;
(5)查阅相关资料,自学具体课题中涉及的新知识。
2.3 项目实施安排
序号 | 内容 | 时间(课时) |
1 | 系统分析 | 2 |
2 | 设计 | 4 |
3 | 编码、测试 | 6 |
4 | 验收 | 4 |
合计 | 16 |
3 系统设计
3.1 系统结构设计
3.2 系统功能模块设计
1.创建进程——根据进程的顺序依次放入就绪队列;
2.执行进程——管理系统将就绪队列中的第一个进程调入运行队列;
3.将阻塞队列中进程调入就绪队列;
4.封锁进程——管理系统将就绪队列中的第一个进程调入阻塞队列;
5.结束进程——管理系统撤销所选进程。
3.3 进程总体设计
为创建进程,执行进程,将阻塞队列中进程调入就绪队列,封锁进程,撤销已结束的进程,以及控制进程在运行过程中的状态转换:
1.进程创建的主要工作是:
(1)申请空白进程控制块;
(2)程序装入pcb//内存申请;
(3)初始化进程控制块;
(4)将进程链入就绪队列。
2.进程撤销的主要工作是:
(1)将结果写入out文件;
(2)回收进程控制块。
3.4 数据结构
类:
class queuenode
class queue
函数:
void enqueue( char &item);
char dequeue();
void del(char item);
void display();
int find(char item);
int isempty()
3.5 程序源代码
程序源代码 #include <iostream> #include <stdio.h> using namespace std; class queuenode { friend class queue; private: char data; queuenode* link; queuenode(char d = 0, queuenode* l = NULL) : data(d), link(l) {} }; class queue { public: queue() : rear(NULL), front(NULL) {}; ~queue(); void enqueue(char& item); char dequeue(); void del(char item); void display(); int find(char item); int isempty() { return front == NULL; } private: queuenode* front, * rear; }; queue::~queue() { queuenode* p; while (front != NULL) { p = front; front = front->link; delete p; } } void queue::enqueue(char& item) { if (front == NULL) front = rear = new queuenode(item, NULL); else rear = rear->link = new queuenode(item, NULL); } char queue::dequeue() { queuenode* p = front; char f = p->data; front = front->link; delete p; return f; } void queue::display() { queuenode* p; p = front; while (p != NULL) { cout << p->data << "->"; p = p->link; } cout << "NULL"; } int queue::find(char item) { queuenode* w; w = front; M: while (w != NULL) { if (item == w->data) { return 1; break; } else { w = w->link; goto M; return 0; } } if (w == NULL) return 0; } void queue::del(char item) { queuenode* q, * b; q = front; while (q->data != item) { b = q; q = q->link; } if (q == front) { front = front->link; delete q; } else if (q == rear) { rear = b; rear->link = NULL; delete q; } else { b->link = q->link; delete q; } } int main() { int n; char a; cout << "\n[-----------操作系统之进程管理模拟系统(先来先服务算法)------------]\n" << endl; queue execute, ready, clog; //执行,就绪,阻塞 cout << "\n[-------请用户输入进程名及其到达cpu的顺序(结束进程数请输入x)------]\n" << endl; char r; r = 'x'; for (int i = 0;; i++) { char e[100]; cout << "输入进程名:" << " "; cin >> e[i]; if (e[i] != r) ready.enqueue(e[i]); else break; } A: cout << "\n [------------请用户选择操作------------]\n"; cout << "\n [1、执行进程……2、将阻塞队列中进程调入就绪队列………]\n"; cout << "\n [3、封锁进程…………………4、结束进程 …………………]\n"; cout << "\n [5、退出程序………………………………………………… ]\n选项: "; cin >> n; if (n == 1) { if (!execute.isempty()) { cout << "已经有进程在执行!,此操作不能执行\n"; char w; cout << endl; cout << "如果要继续请输入#;如果要退出按其它任意键 " << endl; cout << "要选择的操作:"; cin >> w; if (w == '#') goto L; else goto E; } else { if (!ready.isempty()) { a = ready.dequeue(); if (a != r) execute.enqueue(a); goto L; } else goto L; } } else if (n == 2) { if (!clog.isempty()) { a = clog.dequeue(); if (a != r) ready.enqueue(a); goto L; } else goto L; } else if (n == 3) { if (!execute.isempty()) { a = execute.dequeue(); if (a != r) clog.enqueue(a); goto L; } else goto L; } else if (n == 4) { cout << "\n请输入要结束的进程名: "; cin >> a; if (execute.find(a) || ready.find(a) || clog.find(a)) { if (execute.find(a)) { execute.del(a); } else if (ready.find(a)) { ready.del(a); } if (clog.find(a)) { clog.del(a); } cout << "\n结束进程成功!\n" << endl; goto L; } else cout << "没有此进程 " << endl; goto L; L: if (n == 1 || n == 2 || n == 3 || n == 4) { cout << "执行队列" << endl; execute.display(); cout << endl; cout << "就绪队列" << endl; ready.display(); cout << endl; cout << "阻塞队列" << endl; clog.display(); cout << endl; goto A; } else if (n == 5) ; else { cout << "\n你的输入错误!\n"; goto A; } } E:; return 0; }
实现一个进程管理子系统-Linux课程设计2:https://developer.aliyun.com/article/1395397