实现一个进程管理子系统-Linux课程设计

要求:通过进程管理子系统案例的演示与操作步骤,掌握在 Linux 系统下创建进程并管理进程,并能根据自己的设计在 shell 命令行中管理进程。

下载:Linux操作系统 实现一个进程管理子系统 源代码

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;
}

4 系统功能说明

4.1 系统功能介绍

Shell是种命令解释程序,也可以看作是一种命令语言的解释器。 用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行。

Shell所使用的这种命令语言称为Shell 语言。Shell语言不仅仅是一种交互式语言, 它还是一种可编程的程序设计语言。将若干个Shell命令行写入个文件就构成了一个Shell程序,它可以被Shell逐条地解释执行。用Shell语言编写的Shell程序可以使用各种变量、参数和控制结构来组织命令流程,自动化地完成各种复杂冗繁的处理工作。

Linux系统中广泛使用了Shell程序来实现系统的初启、配置、管理和维护等工作。用户通过Ubuntu运行该程序。需说明的是主函数是实现进程管理的入口,在入口处需输入进程名称,然后输入进程的状态选项,如果完毕后,则通过相应的调度算法进行进程机的调度,同时也将结果显示在屏幕上。

本系统通过模拟多个进程的同步运行,实现了进程就绪,运行,阻塞三个状态的转换,并可以根据用户要求改变进程的状态。

4.2 系统实现原理

通过在Linux系统中,利用Shell语言编译程序,定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制,最终完成有创建、撤销、调度、阻塞、唤醒进程等功能。

4.3 功能实现说明

1.程序运行界面

cout << "\n  [------------请用户选择操作------------]\n";
	cout << "\n [1、执行进程……2、将阻塞队列中进程调入就绪队列………]\n";
	cout << "\n [3、封锁进程…………………4、结束进程 …………………]\n";
	cout << "\n [5、退出程序………………………………………………… ]\n选项: ";
	cin >> n;

2.执行进程

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;
	}

3.将阻塞队列的进程调入就绪队列

if (n == 2)
	{
		if (!clog.isempty())
		{
			a = clog.dequeue();
			if (a != r)
				ready.enqueue(a);
			goto L;
		}
		else
			goto L;
	}

4.封锁进程

if (n == 3)
	{
		if (!execute.isempty())
		{
			a = execute.dequeue();
			if (a != r)
				clog.enqueue(a);
			goto L;
		}
		else
			goto L;
	}

5.结束进程

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;

6.界面输出及退出操作

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;

5 系统测试
1.Shell命令编译程序,生成可执行文件
在这里插入图片描述

2.执行程序
在这里插入图片描述

3.进程创建以及实现进程堵塞
在这里插入图片描述

4.查看执行进程
在这里插入图片描述

5.封锁进程,实现阻塞
在这里插入图片描述

6.对堵塞中的进程,选中进程调入就绪队列
在这里插入图片描述

7.将就绪队列进程执行
在这里插入图片描述

8.结束进程
在这里插入图片描述

9.退出程序
在这里插入图片描述

6 用户使用说明

1.本程序执行文件为“ProcessManagement”。

2.进入本系统之后,随即显示系统主菜单界面。用户可在该界面下输入各子菜单前对应的数字并按下回车键,执行相应子菜单命令。

(1)创建进程——根据进程的顺序依次放入就绪队列;

(2)执行进程——管理系统将就绪队列中的第一个进程调入运行队列;

(3)将阻塞队列中进程调入就绪队列;

(4)封锁进程——管理系统将就绪队列中的第一个进程调入阻塞队列;

(5)结束进程——管理系统撤销所选进程;

3.根据程序的提示即可完成进程管的各项功能。

7 总结

本次课程设计是实现一个进程管理的系统,该系统包括硬件工作的模拟、模拟中断的种类和中断处理方式、进程控制等,从而观察诸进程的运行过程。 系统通过模拟多个进程的同步运行,实现了进程就绪,运行,阻塞三个状态的转换,并可以根据用户要求改变进程的状态。用户通过Ubuntu运行该程序。需说明的是主函数是实现进程管理的入口,在入口处需输入进程名称,然后输入进程的状态选项,如果完毕后,则通过相应的调度算法进行进程机的调度,同时也将结果显示在屏幕上。

课程设计初期遇到了很多困难,不知道从何下手,在同学的帮助和自己摸索的情况下还是完成了这次课程设计,从中认识到以我们现在的经验,不学到一定的深度和广度是难以在实际工作中应付自如的。因此反映出学习的还不够,缺点疏漏。需在加以刻苦钻研及学习,不断开拓视野,增强自己的实践操作技能。

这次课程设计,加深了我对进程概念及进程管理的理解;比较熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构等。操作系统的只是很深奥,仅靠课本是远远不够的,我将出现的所有错误都写成了博客发布到CSDN上,总结经验,不断提升自己的能力。

下载:Linux操作系统 实现一个进程管理子系统 源代码

  • 6
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于Linux系统进程控制的毕业设计,我可以给您提供一些思路和建议,希望能对您有所帮助。 1. 系统进程管理器设计 首先,您可以设计一个系统进程管理器,该管理器可以实现以下功能: - 实时监测系统中运行的进程,包括进程的PID、状态、CPU占用率、内存占用率等信息。 - 支持进程的启动、停止、重启、暂停、恢复等操作。 - 支持进程优先级的调整,可以让用户自行设置进程的优先级。 - 支持进程的监控和日志记录,方便用户对进程的运行状态进行监测和分析。 - 支持进程的自动重启和自动恢复功能,可以在进程异常退出或崩溃时自动重启或恢复进程。 2. 进程间通信设计 其次,您可以设计一些进程间通信的机制,以便实现不同进程之间的数据共享和交互。以下是一些常见的进程间通信机制: - 管道(Pipe):可以在父进程与子进程之间传递数据。 - 消息队列(Message Queue):可以在多个进程之间传递消息。 - 共享内存(Shared Memory):可以让多个进程共享同一块内存区域。 - 信号量(Semaphore):可以控制多个进程对共享资源的访问。 - 套接字(Socket):可以在不同的主机和进程之间进行通信。 您可以根据具体需求选择不同的进程间通信机制,或者结合多种机制来实现您的进程控制系统。 3. 进程调度算法设计 最后,您可以设计一些进程调度算法,以便让您的进程控制系统更加智能化和高效化。以下是一些常见的进程调度算法: - 先来先服务(FCFS):按照进程到达时间的先后顺序进行调度。 - 短作业优先(SJF):按照进程执行时间的短长顺序进行调度。 - 优先级调度(Priority Scheduling):按照进程的优先级进行调度,优先级越高的进程越先执行。 - 时间片轮转(Round Robin):将CPU时间分成若干个时间片,轮流分配给不同的进程,每个进程执行一个时间片后就切换到下一个进程。 - 多级反馈队列调度(Multi-level Feedback Queue Scheduling):将进程按照优先级分成多个队列,每个队列有不同的时间片长度和优先级,进程可以在不同的队列之间移动。 您可以根据具体需求选择不同的进程调度算法,或者结合多种算法来实现您的进程控制系统。 希望以上的建议能对您有所帮助,如果您有任何问题或需要进一步的帮助,请随时联系我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yeats_Liao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值