毕业设计项目——基于RISC-V的标签化跨层调度应用任务管理(论文/代码)

完整的论文代码见文章末尾 以下为核心内容

摘要

在现代操作系统中,高效的系统调度策略对于优化系统性能、提高资源利用率和保证系统稳定性至关重要。本文提出了一个基于Linux进程文件系统(procfs)的系统监控工具,旨在通过实时收集系统运行数据,为系统调度提供精确的决策依据。该监控工具利用Linux特有的/proc文件系统,实时监控CPU使用率、内存占用、网络流量等关键性能指标,支持多线程并行数据收集,以最小化监控过程对系统性能的影响。

本文详细探讨了系统监控工具与系统调度之间的互动机制。监控工具收集的数据反映了系统当前的状态和负载情况,这些信息对于调度器优化任务分配、调整资源分配策略以及处理系统瓶颈具有重要价值。特别是在面对复杂应用和高并发场景时,基于实时监控数据的动态调度策略能够显著提升系统的响应速度和处理能力。

系统设计

本文实现了Linux系统资源的全面监控系统。用于实时监测和展示主机的CPU使用率、内存占用、运行时间以及网络接口的流量信息。其基本原理涉及到操作系统级别的资源监控、多线程编程和网络编程。大致分为以下几个模块:

CPU使用率监控:通过读取/proc/stat文件,获取系统CPU的使用情况。该文件提供了自系统启动以来各项CPU时间的累积值,包括用户模式、系统模式和空闲时间等。计算两个时间点之间的差值,可得到CPU使用率。

内存占用监控:通过读取/proc/meminfo文件和使用sysinfo结构,获取系统的内存使用情况。该文件提供了系统的总内存、可用内存等信息,从而可以计算出内存占用率。

系统运行时间监控:利用sysinfo结构提供的uptime成员,计算出系统的运行时间。
网络接口信息获取:通过socket编程和ioctl系统调用,获取每个网络接口的基本信息,如名称、IP地址和MAC地址等。

网络流量监测:通过读取/proc/net/dev文件,获取网络接口的收发包数量。计算一定时间间隔内的收发包差值,从而得到网络接口的上行和下行速度。

项目通过创建多个线程分别进行系统资源监控和网络接口流量监控:

CPU、内存和运行时间监控线程(thread_core):定期更新系统的CPU使用率、内存占用和运行时间信息。

网络流量监控线程(thread_net):定期更新网络接口的流量信息,包括上行和下行速度。

系统资源监控

系统资源监控的原理主要涉及到CPU使用率、内存使用率和系统运行时间的获取和计算。本文的逻辑如下:

初始化和资源获取:使用open_sysinfo()函数初始化并获取系统的全局状态信息。

运行时间监控:通过get_host_runtime()函数获取系统的累计运行时间。

CPU使用率监控:使用get_cpuoccupy()函数获取两个时间点的CPU使用情况。利用

cal_occupy()函数计算得到CPU使用率。

内存使用率监控:调用get_mem_usage()函数计算系统的内存使用率。

通过这些函数的协同工作,项目能够实时监控和显示系统的CPU和内存使用情况,以及系统的累计运行时间。这些信息对于标签调度来说非常有用,可以帮助其他辅助程序了解系统的当前状态和性能瓶颈,及时作出调整。

网络接口流量监控

网络接口流量监控是通过收集网络接口上的数据包信息来实现的,主要关注网络流量的上行(发送)和下行(接收)速度。该过程涉及读取系统网络接口的状态,特别是/proc/net/dev文件,该文件提供了Linux系统中每个网络接口的统计数据,包括接收和发送的字节数等信息。本文通过以下流程执行整个过程:

初始化网络接口信息链表:get_interface_info(&p_interface, &nums):首先调用此函数初始化网络接口信息,包括接口名称、IP地址和MAC地址等。这些信息被存储在一个NET_INTERFACE类型的链表中,每个节点代表一个网络接口。

开启网络信息监控线程:在main()函数中,使用pthread_create()创建一个线程,线程执行函数为thread_net(下文提到)。这个线程负责定期更新网络接口的流量信息。
在thread_net函数中,周期性地调用get_network_speed()函数。这个函数遍历p_interface链表中的每个网络接口,使用以下函数收集每个接口的流量信息:

首先,对每个接口调用get_rtx_bytes()函数获取初始的接收(rx)和发送(tx)字节总数。这些数据被存储在rtx0中。

再次调用get_rtx_bytes()函数获取等待一段时间后的接收和发送字节总数,存储在rtx1中。使用cal_netinterface_speed()函数计算两个时间点之间的网络流量速度,包括上行速度u_speed和下行速度d_speed,同时确定速度的单位(KB/s或MB/s),存储在speed_level中。最后,调用show_netinterfaces()函数显示每个网络接口的名称、IP地址、MAC地址和计算得到的上行及下行速度。

这个流程实现了对系统中所有网络接口的实时流量监控,通过周期性地计算每个接口在一定时间间隔内的流量变化,来监测网络活动和性能。这些信息对于网络管理和性能优化是非常有用的,可以帮助辅助程序及时发现网络瓶颈或异常流量模式,来进行任务调度。

部分代码如下:

int get_interface_info(NET_INTERFACE **net, int *n)
{int fd;int num = 0;struct ifreq buf[16];struct ifconf ifc;NET_INTERFACE *p_temp = NULL;(*net)->next = NULL;if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {close(fd);printf("socket open failed\n");}ifc.ifc_len = sizeof(buf);ifc.ifc_buf = (caddr_t)buf;if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc)) {num = ifc.ifc_len / sizeof(struct ifreq);*n = num;while (num-- > 0) {strcpy((*net)->name, buf[num].ifr_name);if (!(ioctl(fd, SIOCGIFADDR, (char *)&buf[num]))) {memset((*net)->ip, 0, 16);strcpy((*net)->ip,inet_ntoa(((struct sockaddr_in *)(&buf[num].ifr_addr))->sin_addr));}if (!ioctl(fd, SIOCGIFHWADDR, (char *)(&buf[num]))) {memset((*net)->mac, 0, 13);snprintf((*net)->mac, 13, "%02x%02x%02x%02x%02x%02x",(unsigned char)buf[num].ifr_hwaddr.sa_data[0],(unsigned char)buf[num].ifr_hwaddr.sa_data[1],(unsigned char)buf[num].ifr_hwaddr.sa_data[2],(unsigned char)buf[num].ifr_hwaddr.sa_data[3],(unsigned char)buf[num].ifr_hwaddr.sa_data[4],(unsigned char)buf[num].ifr_hwaddr.sa_data[5]);}if (num >= 1) {p_temp = (NET_INTERFACE *)malloc(sizeof(NET_INTERFACE));memset(p_temp, 0, sizeof(NET_INTERFACE));p_temp->next = *net;*net = p_temp;}}return 0;} else {return -1;}
}

多线程监控

本文通过多线程的方式同时进行网络流量监控和系统资源(CPU、内存、系统运行时间)监控。

网络信息监控线程:通过pthread_create创建一个线程thread_net_id,执行thread_net函数。这个线程无限循环地调用get_network_speed(p_interface)来更新网络接口的流量信息,然后通过show_netinterfaces(p_interface, 1)展示每个接口的流量信息(上传和下载速度)。

系统资源监控线程:同样通过pthread_create创建另一个线程thread_core_id,执行thread_core函数。这个线程也是无限循环,每隔一段时间(这里是10秒)更新和展示系统资源信息,包括系统运行时间、内存使用率和CPU使用率。

通过将网络监控和系统资源监控分配到两个独立的线程中,程序能够同时监控网络和系统资源,增加了监控的效率和实时性。充分利用了系统资源,为调度程序提供了一个实用的监控和诊断工具。

任务调度

本文实现的算法如下:
初始化:所有任务在创建时被标记为 IO 密集型或 CPU 密集型。系统维护两个队列,一个用于 IO 密集型任务,一个用于 CPU 密集型任务。系统定期(或根据需求)监控 CPU 和 IO 资源的使用情况。

任务分发:调度器检查 CPU 和 IO 的当前负载情况。如果 CPU 负载高,优先调度 IO 密集型任务;如果 IO 负载高,优先调度 CPU 密集型任务。如果相应资源的负载低,从相应队列中取出任务进行调度。

动态优先级调整:根据实时反馈调整任务的优先级,例如,如果某类型任务因资源不足而频繁等待,则提高该类型任务的优先级。设置优先级阈值来控制不同类型任务的调度比例,以优化整体性能。

资源监控与反馈:持续监控资源使用情况,如 CPU 和 IO 的负载。根据监控数据动态调整任务分发中的调度策略,确保资源利用最优化。

性能评估:定期评估任务执行的效率和响应时间,以检测并优化调度策略的有效性。调整任务标签分配策略或任务优先级算法以应对系统性能瓶颈。

部分代码如下:

enum ResourceType { CPU, IO };
struct Resource {ResourceType type;int amount;
};
class Task {
public:int task_id;std::string task_type;int priority;int duration;  // 任务持续时间(秒)std::map<ResourceType, int> resourceRequirements;Task(int id, std::string type, int pri, int dur) : task_id(id), task_type(type), priority(pri), duration(dur) {if (type == "cpu") {resourceRequirements[CPU] = 1;} else {resourceRequirements[IO] = 10;}}bool operator<(const Task& other) const {return priority < other.priority;}
};class Scheduler {
private:std::priority_queue<Task> tasks;std::map<ResourceType, int> availableResources;std::mutex mtx;std::condition_variable cv;bool stop = false;
public:Scheduler() {availableResources[CPU] = 4;  // CPU核心数量availableResources[IO] = 100;  // IO带宽数量}~Scheduler() {stop = true;cv.notify_all();}void addTask(const Task& task) {std::lock_guard<std::mutex> lock(mtx);tasks.push(task);cv.notify_one();}void run() {std::unique_lock<std::mutex> lock(mtx);while (!stop) {cv.wait(lock, [&]{ return !tasks.empty() || stop; });while (!tasks.empty()) {Task task = tasks.top();bool canDispatch = true;for (auto& req : task.resourceRequirements) {if (availableResources[req.first] < req.second) {canDispatch = false;break;}}if (canDispatch) {tasks.pop();lock.unlock();dispatchTask(task);lock.lock();} else {break;}}}}void dispatchTask(Task& task) {std::cout << "Dispatching Task ID: " << task.task_id << " (" << task.task_type << ") with priority: " << task.priority << std::endl;for (auto& req : task.resourceRequirements) {availableResources[req.first] -= req.second;}std::this_thread::sleep_for(std::chrono::seconds(task.duration));for (auto& req : task.resourceRequirements) {availableResources[req.first] += req.second;}std::cout << "Task ID: " << task.task_id << " completed and resources released." << std::endl;}
};

系统评估

资源监控

使用Makefile脚本编译出可执行文件,之后打开一个游览器,观察系统运行结果,运行结果如下所示:

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

任务调度

本文模拟了几个虚拟的任务节点,可以看到调度器如何处理和执行不同任务的详细过程。
// 创建一些示例任务

scheduler.addTask(Task(1, "cpu", 5, 2));
scheduler.addTask(Task(2, "io", 3, 1));
scheduler.addTask(Task(3, "cpu", 1, 3));
scheduler.addTask(Task(4, "io", 4, 2));

在这里插入图片描述

获取方式

功能完备,具有40页完整论文及代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559415.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud全解析:链路追踪之springCloudSleuth简介

文章目录 springCloudSleuth简介链路追踪&#xff1f;SpringCloudSleuth术语链路示意图zipkin依赖配置 springCloudSleuth简介 链路追踪&#xff1f; 什么是链路追踪&#xff1f;就是将一次分布式请求还原成调用链路&#xff0c;将一次分布式请求的调用情况集中展示&#xff…

算法:1、动态规划算法DP(Dynamic Programming)

算法介绍 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;‌&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。它的关键思想是对于最终结果依赖前序步骤的问题&#xff0c;将结果定义为状态值dp&#xff0c;然后推导出后续步骤由…

深度学习常见问题

1.YOLOV5和YOLOV8的区别 YOLOv5 和 YOLOv8 是两个版本的 YOLO&#xff08;You Only Look Once&#xff09;目标检测算法&#xff0c;它们在网络架构、性能优化、功能扩展等方面有显著的区别。YOLOv5 是 YOLO 系列的重要改进版本&#xff0c;而 YOLOv8 是最新的一次重大升级&am…

SQL性能优化指南:如何优化MySQL多表join场景

目录 多表join问题SQL 这里解释下 Using join buffer (Block Nested Loop)&#xff1a; 对性能产生的影响&#xff1a; 三种join算法介绍 join操作主要使用以下几种算法&#xff1a; &#xff08;1&#xff09;Nested Loop Join &#xff08;2&#xff09;Block Nested …

搭建企业域名服务器案例

任务要求&#xff1a; 某企业要建立一台应用于以下情况的主域名服务器 拥有一个C类网段地址&#xff0c;为202.101.55.0。企业域名注册为company.com。域名服务器的IP地址定位为202.101.55.55&#xff0c;主机名为dns.company.com。企业网通过路由器与Internet连接。要解析的…

第九届清洁能源与发电技术国际学术会议(CEPGT 2024)

第九届清洁能源与发电技术国际学术会议&#xff08;CEPGT 2024&#xff09; 2024 9th International Conference on Clean Energy and Power Generation Technology (CEPGT 2024) 【早投稿早录用&#xff0c;享受早鸟优惠】 第九届清洁能源与发电技术国际学术会议&#xff0…

记录一个Ajax发送JSON数据的坑,后端RequestBody接收参数小细节?JSON对象和JSON字符串的区别?

上半部分主要介绍我实际出现的问题&#xff0c;最终下面会有总结。 起因&#xff1a;我想发送post请求的data&#xff0c;但是在浏览器中竟然被搞成了地址栏编码 如图前端发送的ajax请求数据 如图发送的请求体&#xff1a; 很明显是keyvalue这种形式&#xff0c;根本就不是…

开源的键鼠共享工具「GitHub 热点速览」

十一长假回来&#xff0c;我的手放在落灰的键盘上都有些陌生了&#xff0c;红轴竟敲出了青轴般的响声&#xff0c;仿佛在诉说对假期结束的不甘。 假期回归的首更&#xff0c;让我们看看又有什么好玩的开源项目冲上了开源热榜。一套键盘和鼠标控制多台电脑的工具 deskflow&#…

supOS加速数实融合发展

作为工业操作系统领军企业&#xff0c;蓝卓受邀参加2024金砖国家新工业革命伙伴关系论坛&#xff0c;深度参与多个环节。在9月11日召开的金砖国家新工业革命伙伴关系论坛产融合作专题研讨上&#xff0c;蓝卓总经理谭彰分享了supOS在产融协同的最新实践&#xff0c;以及supOS进入…

云上考场小程序+ssm论文源码调试讲解

2 关键技术简介 2.1 微信小程序 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种全新的连接用户与服务的方式&#xff0c;可以快速访问、快速传播&#xff0c;并具有良好的使用体验。 小程序的主要开发语言是JavaScript&#xff0c;它与…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下&#xff0c;在线教育已成为教育领域的热门话题。而在众多在线教育平台中&#xff0c;集师知识付费小程序凭借其独特的定位和创新的模式&#xff0c;成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序&#xff0c;是一个集课程展示、…

数据分析Power BI设置万为单位的数据

玩过Power BI的同学都知道&#xff0c;power BI在度量值设置单位里&#xff0c;唯独没有万这个单位&#xff0c;但是我们可以自定义&#xff0c;操作过程如下&#xff1a; 1.用DAX新建单位表 单位 SELECTCOLUMNS( { ( "元", 1), ("万",10000), ("千…

面试题:Redis(三)

1. 面试题 背景 问题&#xff0c;上面业务逻辑你用java代码如何写&#xff1f; 2. 缓存双写一致性谈谈你的理解&#xff1f; 3. 双检加锁策略 多个线程同时去查询数据库的这条数据&#xff0c;那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。 其他的线程走到这…

进程守护化

文章目录 概念引入ps细节展示什么是进程组什么是会话细节演示有关指令的处理 用户级任务和进程组的关系关系不同 什么是守护进程如何创建守护进程 代码说明如何关闭守护进程 问题 概念引入 我们在之前的章节中已将看过进程相关的概念, 本篇介绍守护进程 进程还有进程组, 作业,…

锐龙7 7800X3D与i7-14700K到底怎么选!其实很简单

从2022年的锐龙7 5800X3D到后来的锐龙7 7800X3D&#xff0c;笔者使用X3D处理器已有2年多的时间。站在自己的立场&#xff0c;我是非常希望游戏老鸟购买这类处理器的&#xff0c;并且也推荐了不少。 这里说的是老鸟&#xff0c;也就是比较懂电脑的玩家。 但是对于新手玩家而言&a…

Kali Linux 下载与安装手册

目录 Kali 是什么&#xff1f; 通过Kali官方网站下载 Kali 是什么&#xff1f; Kali Linux&#xff0c;前称BackTrack&#xff0c;是一个基于Debian的Linux发行版&#xff0c;专为数字取证和渗透测试而设计。它由Offensive Security Ltd.开发和维护&#xff0c;旨在为安全专…

HarmonyOS NEXT应用开发实战(二、封装比UniApp和小程序更简单好用的网络库)

网络访问接口&#xff0c;使用频次最高。之前习惯了uniapp下的网络接口风格&#xff0c;使用起来贼简单方便。转战到鸿蒙上后&#xff0c;原始网络接口写着真累啊&#xff01;目标让鸿蒙上网络接口使用&#xff0c;简单程度比肩uniapp&#xff0c;比Axios更轻量级。源码量也不多…

【Parsec】一款安全高效的远程桌面软件

Parsec 是一款远程桌面软件&#xff0c;它允许用户通过P2P&#xff08;点对点&#xff09;技术远程访问和控制另一台计算机。以下是Parsec的一些主要作用、安全私密性特点以及优缺点&#xff1a; 作用&#xff1a; 远程游戏&#xff1a;用户可以远程访问高性能PC进行游戏&am…

记一次pyc逆向

.py文件   源代码文件。   这是开发者编写的 Python 源代码文件&#xff0c;包含了可执行的 Python 代码。 .pyc文件   字节码文件。   Python 源文件&#xff08;.py&#xff09;在执行时会被编译为字节码&#xff0c;并存储在 __pycache__ 目录下&#xff0c;文件名通…

Halcon形态学

形态学图像处理&#xff08;简称形态学&#xff09;是指一系列处理图像形状特征的图像处理技术。 形态学的基本思想是利用一种特殊的结构元来测量或提取输入图像中相应的形状或特征&#xff0c;以便进一步进行图像分析和目标识别。本章节依次对腐蚀&#xff0c;膨胀&#xff0…