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

2023-05-16

目录

  • 1 项目概述
    • 1.1 项目介绍
    • 1.2 项目目的
    • 1.3 项目开发环境
  • 2 需求分析
    • 2.1 系统需求分析
    • 2.2 可行性分析
    • 2.3 项目实施安排
  • 3 系统设计
    • 3.1 系统结构设计
    • 3.2 系统功能模块设计
    • 3.3 进程总体设计
    • 3.4 数据结构
    • 3.5 程序源代码
  • 4 系统功能说明
    • 4.1 系统功能介绍
    • 4.2 系统实现原理
    • 4.3 功能实现说明
  • 6 用户使用说明
  • 7 总结

要求:通过进程管理子系统案例的演示与操作步骤,掌握在 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操作系统 实现一个进程管理子系统 源代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现一个进程管理子系统-Linux课程设计 的相关文章

  • 4:File-Java API 实战

    目录 1 引言2 绝对路径和相对路径 xff1f 先学送快递吧 xff01 3 绝对路径4 相对路径5 File类6 Linux上的绝对路径有所不同 1 引言 文件要区别绝对路径和相对路径 xff0c 在Win系统中的文件路径和Linux
  • 5:IO Stream-Java API 实战

    目录 1 相对论和IO流之说2 汉语文学理解IO流3 图解IO流4 俩亲爹 xff1a InputStream和OutPutStream5 FileInputStream字节流读取文件6 FileOutPutStream字节流写入文件7 b
  • 6:CharSet-Java API 实战

    目录 1 阶段2 字符集编码吹X3 转换字符编码 1 阶段 Java NIO File Java NIO中的Files类 xff08 java nio file Files xff09 提供了多种操作文件系统中文件的方法 Java File
  • 7:Multithreading-Java API 实战

    目录 1 问题的提出2 核心数 进程 线程3 进程和线程的区别以及对应应用4 多线程程序含义 多线程的作用5 多线程的执行过程6 Runnable7 简化操作以及线程名8 抢购鞋 多线程案例9 后台 守护进程的提出10 匿名内部类创建多线程
  • 8:Java Conllections FrameWork-Java API 实战

    目录 1 原生数组带来的问题 xff0c 抛出问题2 Conllections家族3 黑帮的帮规4 ArrayList第一讲5 ArrayList第二讲6 ArrayList第三讲7 Linked链表8 LinkedList一带而过9 提醒
  • 9:JDBC-Java API 实战

    目录 1 说明2 JDBC的由来以及定义3 JDBC体验 xff0c statement executeQuery 查询4 整理和释放5 封装JDBCUtils6 增删改 executeUpdate 7 字符编码问题8 PreparedSt
  • 10:Java人脸识别认证-Java API 实战

    目录 1 提出问题 xff0c 引入SDK的概念2 选择平台3 SDK下载和文档说明4 人脸检测5 人脸对比6 建议和结束语 1 提出问题 xff0c 引入SDK的概念 什么是SDK xff1f 我们并不具备开发人脸识别的能力 xff0c
  • 个人学习笔记附Markdown格式下载

    B S方向 文章链接 xff1a https blog csdn net qq 46207024 article details 114378676 spm 61 1001 2014 3001 5502 下载链接 xff1a https d
  • Ubuntu/Linux 访问 Windows 共享文件夹

    文章目录 Ubuntu Linux 访问 Windows 共享文件夹SMB 协议安装 samba 客户端访问共享文件夹参考资料 Ubuntu Linux 访问 Windows 共享文件夹 SMB 协议 Linux 操作系统与 Windows
  • Java 序列化与反序列化

    目录 一 说明二 理解三 实现1 实现接口2 序列化方法3 反序列化方法 一 说明 序列化与反序列化是什么 序列化 xff1a 将Java对象表示为一个字节序列 xff0c 存储对象数据到文件中 xff0c 可用于网络传输 反序列化 xff
  • JavaMail 使用POP3/SMTP服务发送QQ邮件

    目录 一 说明二 理解三 实现1 导入jar包2 用户认证3 发送邮件创建步骤简单的Email带HTML的E mail带图片的Email包含附件的邮件 一 说明 邮件服务器 为用户提供接收邮件的功能 xff0c 有发邮件的SMTP服务器 x
  • Java多线程 Callable和Future

    目录 一 说明二 理解三 实现1 实现接口2 执行线程 一 说明 Java 提供了三种创建线程的方法 实现 Runnable接口继承 Thread类本身通过 Callable和 Future 创建线程 Callable和Future的引入
  • Java多线程 Future和FutureTask的区别

    目录 一 说明二 理解三 实现1 实现接口2 使用Future3 使用FutureTask 一 说明 Future和FutureTask的关系 Future 是一个接口 xff0c 无法直接创建对象 xff0c 需配合线程池使用 submi
  • Java多线程 CompletionService和ExecutorCompletionService

    目录 一 说明二 理解三 实现1 使用Future2 使用ExecutorCompletionService3 take 方法4 poll 方法5 poll long timeout TimeUnit unit 方法 一 说明 Future
  • Java多线程 线程池Executor框架

    目录 一 说明二 理解ExecutorExecutorServiceExecutors 三 实现1 newSingleThreadExecutor2 newFixedThreadPool3 newCachedThreadPool4 newS
  • Java多线程 ThreadPoolExecutor自定义线程池

    目录 一 说明二 理解三 实现1 SynchronousQueue2 ArrayBlockingQueue3 LinkedBlockingQueue 一 说明 ThreadPoolExecutor Java提供的线程池Executor框架相
  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略

    目录 一 说明二 理解三 实现1 AbortPolicy2 DiscardPolicy3 DiscardOldestPolicy4 CallerRunsPolicy5 自定义拒绝执行策略 一 说明 RejectedExecutionHand
  • Java多线程 关闭线程池 shutdown() 、shutdownNow()、awaitTermination()

    目录 一 说明二 理解三 实现1 shutdown 2 shutdownNow 3 awaitTermination 一 说明 ThreadPoolExecutor 继承 Executor 接口它有多个构造方法来实现自定义创建线程池 xff
  • Java多线程 线程池的生命周期及运行状态

    目录 一 说明二 理解三 实现 一 说明 线程池的生命周期 线程池的状态runState和工作线程数量workerCount共同保存在 AtomicInteger 类型的控制变量 ctl 中ctl高三位保存运行状态 23 61 8 gt 5
  • Unable to determine the device handle for GPU 0000:02:00.0: GPU is lost.

    TITAN X Pascal 的显卡 xff0c 当 batch size 过大爆显存时 xff0c 就会出现 GPU丢失 的错误

随机推荐