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

news2024/12/26 14:34:14

🕺作者: 主页

我的专栏
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 256
 
int 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.coloradmin.cn/o/1402490.html

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

相关文章

以Python程序为例介绍算法复杂度的估算

文章目录 概念介绍时间复杂度估算空间复杂度估算 引自同一作者百家号文章&#xff1a;「Python语言进阶」算法复杂度是什么&#xff1f;如何估算&#xff1f; 概念介绍 算法&#xff0c;可以理解为解决问题的方法和思路&#xff0c;不是一定得有代码的才叫算法&#xff0c;它…

每日汇评:黄金的市场注意力转向央行和地缘政治

金价从2000美元附近的数周低点反弹&#xff1b; 到目前为止&#xff0c;黄金的进一步巩固当前价格是当前的主题&#xff1b; 地缘政治、宏观数据和央行是本周的主导市场情绪&#xff1b; 黄金价格设法恢复了平衡&#xff0c;扭转了本周开始时的负面走势&#xff0c;从关键争夺区…

AI数据模型支撑下,鼎捷「预测透镜」如何助力汽配厂商浙江华工提质增效?

关于【浙江华工】 浙江华工汽车零部件有限公司&#xff08;以下简称“华工”&#xff09;成立于1987年&#xff0c;位于“中国汽摩配之都”浙江省瑞安塘下镇鲍七工业区&#xff0c;是一家集汽车发动机用冷却水泵和机油泵研发、制造、销售于一体的民营股份制企业。 近些年来&…

六种pdf在线转换工具了解一下-轻松应对pdf转换

PDF文件是我们工作中经常需要使用到的一种文件格式。然而&#xff0c;有时候我们可能需要将PDF文件转换成其他格式以满足特定的需求。为了帮助大家解决这个问题&#xff0c;本文将介绍六种实用的PDF在线转换工具&#xff0c;让你轻松完成各种文件格式的转换。 一、迅捷PDF转换器…

【代码随想录算法训练营第二十四天|回溯算法的理论基础、77. 组合】

代码随想录算法训练营第二十四天|回溯算法的理论基础、77. 组合 回溯算法的理论基础77. 组合 回溯算法的理论基础 这里我觉得《代码随想录》和y总的课都比较好了 《代码随想录》 &#xff1a; https://programmercarl.com/0077.%E7%BB%84%E5%90%88%E4%BC%98%E5%8C%96.html#%E5…

代理IP助力云函数实现更高效的网络通信

一、前言 云计算的出现使得无服务器计算成为可能&#xff0c;例如云函数。云函数是一种无需管理服务器的计算服务&#xff0c;能够根据需求自动伸缩&#xff0c;并能处理网络请求。然而&#xff0c;云函数常常受限于网络通信速度问题&#xff0c;特别是面对大量请求时。为了提…

【JavaEE进阶】 关于⽇志框架(SLF4J)

文章目录 &#x1f333;SLF4j&#x1f332;⻔⾯模式(外观模式)&#x1f6a9;⻔⾯模式的定义&#x1f6a9;⻔⾯模式的优点 &#x1f343;关于SLF4J框架&#x1f6a9;不引⼊⽇志⻔⾯&#x1f6a9;引⼊⽇志⻔⾯ ⭕总结 &#x1f333;SLF4j SLF4J不同于其他⽇志框架,它不是⼀个真正…

MySQL TINYINT(1)和TINYINT(2)有什么区别?

文章目录 1.直接建表2.查询数据3.总结 身为程序员&#xff0c;拿事实说话拿代码说话最直观了&#xff0c;show the code 1.直接建表 CREATE TABLE tinyinttest (id int NOT NULL,a TINYINT(1) NOT NULL DEFAULT 0,b TINYINT(2) NOT NULL DEFAULT 0,c TINYINT(1) ZEROFILL NOT…

【Docker】部署和运行青龙面板:一个支持python3、javaScript、shell、typescript 的定时任务管理面板

引言 青龙面板是一个支持python3、javaScript、shell、typescript 的定时任务管理面板。 步骤 拉取镜像 从 Docker Hub 上拉取最新的 “qinglong” 镜像。 docker pull whyour/qinglong:latest启动容器 使用刚刚拉取的镜像来启动一个新的 Docker 容器。 docker run -dit \-v…

基于SpringBoot的高校学科竞赛平台管理系统

基于SpringBoot的高校学科竞赛平台管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台界面 管理员界面 教师界面 学生界面 摘要 本文详细介绍了一款基于…

【BERT】详解

BERT 简介 BERT 是谷歌在 2018 年时提出的一种基于 Transformer 的双向编码器的表示学习模型&#xff0c;它在多个 NLP 任务上刷新了记录。它利用了大量的无标注文本进行预训练&#xff0c;预训练任务有掩码语言模型和下一句预测&#xff0c;掩码语言模型指的是随机地替换文本中…

项目管理流程

优质博文 IT-BLOG-CN 一、简介 项目是为提供某项独特产品【独特指:创造出与以往不同或者多个方面与以往有所区别产品或服务&#xff0c;所以日复一日重复的工作就不属于项目】、服务或成果所做的临时性【临时性指:项目有明确的开始时间和明确的结束时间&#xff0c;不会无限期…

线框图是什么?怎么画?看这篇文章就够了

产品设计中&#xff0c;简洁清晰传达出复杂概念是件难度不小的事&#xff0c;但也是很重要的事&#xff0c;这不仅关系设计的准确性&#xff0c;更关乎整个项目的顺利进行。在这种情境下&#xff0c;线框图的作用不容小觑。它作为设计思路的初步可视化手段&#xff0c;不仅是产…

GIS项目实战06:超详细Node.js安装及系统环境配置

简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8 引擎&#xff0c;V8 引擎执行 Javascript 的速度非常快&#xff0c;性能…

HCIA——20应用层:C/S、P2P、peer

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

LabVIEW扫描探针显微镜系统开发

在纳米技术对高精度材料特性测量的需求日益增长。介绍了基于LabVIEW开发的扫描探针显微镜&#xff08;SPM&#xff09;系统。该系统不仅可以高效地测量材料的热物性&#xff0c;还能在纳米尺度上探究热电性质&#xff0c;为材料研究提供了强大的工具。 系统基于扫描探针显微技…

uniapp h5 生成 ubuntu桌面程序 并运行方法

uniapp h5 生成 ubuntu桌面程序 并运行方法,在window环境下开发&#xff0c;发布到ubuntu桌面&#xff0c;并运行 1、安装Nodejs 安装包官方下载地址&#xff1a;https://www.nodejs.com.cn/ 安装完后cmd&#xff0c;如图&#xff0c;即安装成功 2、通过Nodejs安装 electron…

基于大整形的运算收录

目录 目录 目录 前言 为什么要大整数 大整形的加/减法 大整形的乘法 大整形除法 大整形开方 代码实现 前言 好久没有更新博客了&#xff0c;hhh。时隔三个月&#xff0c;我又回来了。先来点简单的大整形&#xff0c;虽说简单&#xff0c;但是在编写的时候还是debug了…

redis优化系列(六)

本期分享redis内存过期策略&#xff1a;过期key的处理 Redis之所以性能强&#xff0c;最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。 可以通过修改配置文件来设置Redis的最大内存&#xff1a; maxmemory 1gb …

远程登录Linux服务器:命令+工具版

通常在工作过程中&#xff0c;公司中使用的真实服务器或者是云服务器&#xff0c;都不允许除运维人员之外的员工直接接触&#xff0c;因此就需要通过远程登录的方式来操作。 所以&#xff0c;远程登录工具就是必不可缺的&#xff0c;目前&#xff0c;比较主流的有 Xshell,SSHS…