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

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

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

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

实验二

实验内容

  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

用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. 对命令的熟悉度有待提高

相关文章
|
2月前
|
存储 算法 安全
操作系统之文件系统的奥秘
【9月更文挑战第19天】本文将深入探索操作系统中不可或缺的组件——文件系统,揭示其工作原理与实现细节。我们将通过浅显的语言和生动的比喻,一步步解析文件系统如何组织数据、管理存储空间,并确保数据的完整性和安全性。文章不仅适合初学者构建基础概念,也能帮助有经验的开发者更深入地理解文件系统的高级特性。
|
8天前
|
存储 安全 大数据
深入浅出操作系统:文件系统的秘密
【10月更文挑战第35天】本文将揭示文件系统背后的奥秘,从其基本概念到复杂的实现机制。我们将一起探索文件系统的结构和原理,并了解它如何影响我们的日常计算体验。通过简单的例子和比喻,文章旨在使读者对文件系统有一个清晰而深刻的理解,就像甘地所言:“你必须成为你希望在世界上看到的改变。”让我们一起成为理解操作系统的先行者。
|
2月前
|
存储 缓存 文件存储
探索操作系统中的文件系统管理
【9月更文挑战第25天】在数字世界的海洋中,操作系统是指引我们航行的灯塔。它不仅管理着硬件资源,还维护着软件的秩序。本文将深入探讨操作系统中一个至关重要的部分——文件系统管理。我们将从基础概念出发,逐步深入到文件系统的设计与实现,最后通过代码示例来直观展示文件系统的操作。让我们一起揭开文件系统管理的神秘面纱,理解其背后的逻辑与奥秘。
|
3月前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
45 12
|
3月前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
54 6
|
3月前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
4月前
|
弹性计算 运维
阿里云操作系统智能助手OS Copilot实验测评报告
**OS Copilot 产品体验与功能反馈摘要** 运维人员发现OS Copilot易上手,文档清晰,助其高效排查故障(8/10分)。愿意推荐并参与开源开发。亮点在于知识问答,能快速筛选答案。相较于竞品,优点是新手友好、文档清晰,但功能扩展性待增强。期望增加系统错误排查与解决方案,并集成ECS等,以优化系统安装流程。
阿里云操作系统智能助手OS Copilot实验测评报告
|
3月前
|
存储 算法 Unix
OS—文件系统
OS—文件系统
52 0
|
4月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
OS Copilot是针对Linux的智能助手,助力学习、运维及编程。用户界面直观,自然语言交互方便新手。官方文档详尽,但初次配置略复杂,适合学生和开发者。在提高代码编写和调试效率、系统学习上得分高,功能亮点包括代码生成、问答和命令执行。用户期待更多操作系统支持、自动错误分析和系统排查功能。
184 3
|
13天前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
34 0
Vanilla OS:下一代安全 Linux 发行版