【操作系统】实验二 Proc文件系统

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢支持!!!

文章目录

  • 实验二
    • 实验内容
    • 实验过程
    • 实验小结

实验二

实验内容

  1. 实验名称:Proc文件系统

  2. 实验目的:学习Linux内核、进程、存储和其他资源的一些重要特征。读/proc/stat文件,计算并显示系统CPU占用率和用户态CPU占用率。(编写一个程序使用/proc机制获得以及修改机器的各种资源参数。需要使用fopen(),fscanf(),printf())

  3. 实验任务:学习和掌握proc文件系统的功能、工作原理及其应用

实验过程

  1. 以超级用户的身份进入/proc目录,在终端上键入ls命令,察看该目录下的内容,同时察看每个文件的读写权限,如图1所示。

    图1 查看/proc目录

  2. 选择一台机器,试着回答下列问题:
    CPU的类型和型号,如图2所示。

    图2 查看CPU型号
    所使用的Linux的版本,如图3所示。

    图3 查看Linux版本
    从启动到当前时刻经过的时间,如图4所示。

    图4 查看时间
    内存状态,如图5所示。

图5 查看内存状态
3. 编码

  • 编写一个程序,用来获得内核参数(任意的参数均可)。
  • 编写一个程序,用来修改内核参数(任意的参数均可)。

两个任务我放到一个程序中,既可以获取参数又可以修改参数,由于内核参数太过重要不敢轻易修改,所以我找到网络信息最大连接数来修改,这样就不会太过影响机器,获取当前的网络信息最大连接数并修改它:

网络信息的最大连接数是一个相对概念,它取决于使用的网络设备和协议。在计算机网络中,最大连接数通常指的是某个网络设备(如路由器、交换机、防火墙等)所能同时支持的最大连接数,如图6所示。


图6 查看最大连接数

代码:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>#define MAX_BUF_SIZE 256int get_max_connections() {FILE *fp;char buf[MAX_BUF_SIZE];int max_connections;// 打开/sys文件系统中的内核参数文件fp = fopen("/proc/sys/net/core/somaxconn", "r");if (fp == NULL) {perror("打开文件失败");return -1;}// 读取最大连接数fgets(buf, sizeof(buf), fp);// 转换为整数max_connections = atoi(buf);// 关闭文件fclose(fp);return max_connections;
}int set_max_connections(int max_connections) {FILE *fp;// 打开/sys文件系统中的内核参数文件fp = fopen("/proc/sys/net/core/somaxconn", "w");if (fp == NULL) {perror("打开文件失败");return -1;}// 将最大连接数写入文件fprintf(fp, "%d", max_connections);// 关闭文件fclose(fp);return 0;
}int main() {int max_connections;// 获取当前最大连接数max_connections = get_max_connections();if (max_connections == -1) {return 1;}printf("当前最大连接数: %d\n", max_connections);// 修改最大连接数为新的值if (set_max_connections(1000) == -1) {return 1;}printf("最大连接数已修改为: 1000\n");return 0;
}
  1. 使用man命令了解/proc/stat文件的内容和格式,如图7所示。
    man proc

    图7 查看man命令

  2. 使用man命令了解下列函数的使用方法,如图8~10所示。
    fopen:
    原型:FILE *fopen( const char *filename, const char *mode );
    以打开一个流(文件)。filename——文件名,mode——访问许可类型。

    图8 查看fopen
    fscanf:
    原型:int fscanf( FILE *stream, const char *format [, argument ]… );
    从流中读取格式化的数据。
    例子fscanf (fp ,“cpu %ld”, &user)是指跳过字符串"cpu "及其前面的字符流,读取一个长整数并存入user中。其中fp为文件流指针。%ld对应长整数,%d对应整数,%s对应字符串。

    图9 查看fscanf
    fclose:
    原型:int fclose( FILE *stream );
    关闭流(文件)。

    图10 查看fclose

  3. 用c语言编程,如图11所示。
    总CPU时间= 用户占用时间+系统占用时间+优先进程占用时间+闲置进程占用时间
    系统CPU占用率 = 系统占用时间 / 总CPU时间
    用户态CPU占用率 = 用户占用时间 / 总CPU时间

代码:

#include <stdio.h>
#include <unistd.h>unsigned long long get_cpu_time() {unsigned long long user, nice, system, idle;// 读取/proc/stat文件中的CPU时间信息FILE* file = fopen("/proc/stat", "r");fscanf(file, "cpu %llu %llu %llu %llu", &user, &nice, &system, &idle);fclose(file);return user + nice + system + idle;
}
int main() {unsigned long long prev_total_time = 0, prev_user_time = 0;double system_cpu_usage, user_cpu_usage;while (1) {// 获取当前的CPU时间信息total_time = get_cpu_time();user_time = total_time - get_cpu_time();// 计算系统CPU占用率和用户态CPU占用率if (prev_total_time != 0) {system_cpu_usage = (double)(total_time - prev_total_time - (user_time - prev_user_time)) / (total_time - prev_total_time);user_cpu_usage = (double)(user_time - prev_user_time) / (total_time - prev_total_time);printf("系统CPU占用率:%.2f%%\n", system_cpu_usage * 100);printf("用户态CPU占用率:%.2f%%\n", user_cpu_usage * 100);}prev_total_time = total_time;prev_user_time = user_time;sleep(1);  // 每隔1秒钟更新一次CPU时间信息}return 0;
}

编译和运行

图11 运行程序显示结果

实验小结

问题:
1.在修改内核参数的时候发现很多都不能修改,需要root权限
注意事项:

  1. 不要随便修改内核参数,可能会导致机器出现莫名的问题
    提高的能力:
  2. 编码能力有待提高
  3. 对命令的熟悉度有待提高

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Rancher管理Kubernetes集群

部署前规划 整个部署包括2个部分&#xff0c;一是管理集群部署&#xff0c;二是k8s集群部署。管理集群功能主要提供web界面方式管理k8s集群。正常情况&#xff0c;管理集群3个节点即可&#xff0c;k8s集群至少3个。本文以3节点管理集群&#xff0c;3节点k8s集群为例 说明部署过…

vivado JTAG链、连接、IP关联规则

JTAG链 这列出了定义板上可用的不同JTAG链。每个链都列在下面<jtag_chain>以及链的名称&#xff0c;以及定义名称和链中组件的位置&#xff1a; <jtag_chains> <jtag_chain name"chain1"> <position name"0" component"part0…

ELK 分离式日志(1)

目录 一.ELK组件 ElasticSearch&#xff1a; Kiabana&#xff1a; Logstash&#xff1a; 可以添加的其它组件&#xff1a; ELK 的工作原理&#xff1a; 二.部署ELK 节点都设置Java环境: 每台都可以部署 Elasticsearch 软件&#xff1a; 修改elasticsearch主配置文件&…

计算机视觉工程师就业前景如何?

计算机视觉作为一门快速发展的技术领域&#xff0c;其就业前景非常广阔。以下是对计算机视觉就业前景的分析&#xff1a; 市场规模&#xff1a;计算机视觉行业的市场规模正在持续扩大。根据行业分析报告&#xff0c;预计全球计算机视觉市场规模将在2025年达到530亿美元&#xf…

【Web实操10】定位实操_图片上面定位文字

参考实现的效果是这样的&#xff1a; 目前还没有学到渐变色&#xff0c;所以标签效果的渐变色没有实现&#xff0c;只是利用radius设置了圆角图形&#xff0c;辅之以背景色和设置其中文本文字的颜色和居中对齐。 在自己写的过程中&#xff0c;对于标签的定位写成了相对定位&a…

RabbitMQ的安装使用

RabbitMQ是什么&#xff1f; MQ全称为Message Queue&#xff0c;消息队列&#xff0c;在程序之间发送消息来通信&#xff0c;而不是通过彼此调用通信。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时&#xff0c;消费者无法快速消费&#xff0c;…

打开json文件,读取里边的每一行数据,每一行数据是一个字典,使用matplotlib画图

这段代码的目的是读取 JSON 文件&#xff0c;提取关键信息&#xff0c;然后使用 Matplotlib 绘制四个子图&#xff0c;分别显示不同的指标随着 iter 变化的情况。这种图形化分析有助于直观地了解模型的性能。 画图结果如下&#xff1a; json文件格式如下&#xff1a;下面只粘贴…

计算机网络学习The next day

在计算机网络first day中&#xff0c;我们了解了计算机网络这个科目要学习什么&#xff0c;因特网的概述&#xff0c;三种信息交换方式等&#xff0c;在今天&#xff0c;我们就来一起学习一下计算机网络的定义和分类&#xff0c;以及计算机网络中常见的几个性能指标。 废话不多…

yarn集群datanode无法启动问题排查

一、问题场景 hdfs无法访问&#xff0c;通过jps命令查看进程&#xff0c;发现namenode启动成功&#xff0c;但是所有datanode都没有启动&#xff0c;重启集群&#xff08;start-dfs.sh&#xff09;后仍然一样 二、原因分析 先看下启动的日志有无报错。打开Hadoop的日志目录 …

C#,入门教程(24)——类索引器(this)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(23)——数据类型转换的一点基础知识https://blog.csdn.net/beijinghorn/article/details/124187182 工业软件首先要求高可靠性、高可维护性。 作为工业软件的开发者&#xff0c;我们对语言重载的需求是&#xff1a;“不可或缺”。 …

Gitee Reward让开源作者不再为爱发电

一、什么是Gitee Reward&#xff1f; Gitee Reward是Gitee为改善开源开发生命周期提出的新策略。开源项目的支持者们可以更轻松地为其喜爱的项目提供资金&#xff0c;贡献者们也可以因为其不懈的开源贡献得到奖励。 二、Gitee Reward上允许哪些类型的项目&#xff1f; 允许任…

stable diffuison的安装和使用

stable diffuison的安装和使用 简单介绍 Stable Diffusion是一个深度学习文本到图像的生成模型&#xff0c;它可以根据文本描述生成详细的图像。这个模型主要应用于文本生成图像的场景中&#xff0c;通过给定的文本提示词&#xff0c;模型会输出一张与提示词相匹配的图片。 S…

Cadence——布局部分相关教程

本文章基于【凡亿】Cadence Allegro 17.4零基础入门66讲PCB Layout设计实战加个人理解写出 &#xff08;一&#xff09;中英文切换 注意&#xff1a;只是将选项卡部分切换中文 1&#xff0c;设置中文 a,打开PCB Editor 17.4以后&#xff0c;点击Help和About b,可以看到与下…

服务器或服务器主板中的BIOS更新详解

BIOS更新总共有三种方式&#xff1a;DOS、UEFI Shell以及BMC网页更新&#xff0c;而其中&#xff0c;DOS与Shell的更新方式类似&#xff0c;因此以下为统一描述。 一、UEFI Shell或DOS下更新 当我们下载了官网的BIOS更新包并解压后可以获得一些更新文件&#xff0c;在更新文件…

Python基础第七篇(Python的文件操作)

文章目录 一、文件编码二、文件的读取操作1.操作代码2.读出结果 三、文件的写出操作1.源代码2.读出结果 四、文件的追加操作1.源代码2.读出结果 这篇文章旨在深入浅出地介绍Python在文件操作上的能力&#xff0c;包括文件的编码、读取和写入等基本操作。内容丰富、易于理解&…

公网环境调试本地配置的Java支付宝沙箱环境模拟支付场景

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境…

java SSM项目预算生成管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM项目预算生成管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的 源代码和数据库&#xff0c;系统主…

浅析Java虚拟机中的ZGC

引言 为什么需要垃圾回收&#xff08;Garbage Collection&#xff09; 垃圾回收是Java开发中的关键机制&#xff0c;负责自动管理内存&#xff0c;防止内存泄漏&#xff0c;提高开发效率和应用程序的稳定性。 Java中主要的垃圾回收方法 标记-清除算法&#xff08;Mark and …

暴力破解常见的服务器

目录 使用 pydictor 生成自己的字典工具liunx下载使用常用的参数说明插件型字典 (可自己根据 API 文档开发) 使用 hydra 工具在线破解系统用户密码使用 hydra 破解 windows 7 远程桌面密码使用 hydra 工具破解 ssh 服务 root 用户密码 使用 Medusa 工具在线破解medusa参数说明M…

jquery学习-1

jquery学习-1 1.jquery类似的框架 MooTools 对比反应时间2.Jquery Api jquery api中文文档 jquery注重的是看文档 3.Jquery下载和导入(压缩版) Jquery 下载 下载后导入项目中进行使用 <!DOCTYPE html> <html><head><meta charset"utf-8"…