【操作系统】实验二:观察Linux,使用proc文件系统

news2025/2/27 1:58:23

实验二 观察Linux,使用proc文件系统

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

2.1 介绍

Linux操作系统提供了一套非常有用的在用户态检查内核状态的机制——/proc文件系统。在该文件系统将 进程的地址空间,系统的硬件信息(包括CUP、内存状态以及网卡等各种硬件设备)以及操作系统系统(中断、IO)等内容全部设置成虚拟的Linux文件——它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

​ /proc 中的每个文件都有一组分配给它的非常特殊的文件许可权,并且每个文件属于特定的用户标识,这里面的文件仅仅包含以下三种权限(除非root用户特别授权):

1. 只读:任何用户都不能更改该文件;它用于表示系统信息;

2. root 写:如果 /proc 中的某个文件是可写的,则通常只能由 root 用户来写;

3. root 读:有些文件对一般系统用户是不可见的,而只对 root 用户是可见的;

4. 其它:出于各种原因,您可能会看到不同于上面常见的三种许可权的组合。

当然,除了/proc/sys目录以外,其余大部分目录下的文件对于root用户是只读的,该目录下存放的是内核参数,并被设计成为运行时刻修改的。

以下列出了/proc文件系统各个子目录的内容:

目录名内容描述
apm高级电源管理信息
cmdline内核命令行
cpuinfocup信息
devices可用的设备信息
dma已经使用的 DMA 管道
filesystems系统支持的文件系统
interrupts中断信息
ioports端口使用信息
kcore内核核心映像
kmsg内核消息
ksyms内核符号表
loadavg平均负载
locks内核锁
meminfo内存信息
miscmisc信息
modules内核加载模块列表
mounts已加载文件信息
partitions系统识别的分区表
rtc实时锁
slabslab 对象池的信息
stat全面信息统计状态表
swaps交换分区使用情况
version内核版本
uptime系统正常运行时间
sys内核参数

并不是所有的目录在你的系统中都有,这取决于你内核的配置和装载的模块。另外,/proc目录下还有两个很重要的目录:net和scsi,均依赖于内核的配置。例如,如果你的系统不支持sici设备则sici目录不存在。

除此之外,你还会发现一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有一个对应的目录在/proc下,以进程的ID号为目录名,他们就是读取进程信息的接口。每个进程目录的结构如下:

子目录名称包含内容
cmdline该进程的命令行参数
enviroment进程换进变量的值
fd该进程所打开的文件的描述符
mem该进程的内存使用情况
stat进程状态
cwd进程的当前目录
root进程的根目录
maps内存映像
statm进程内存状态信息
exe当前进程的可执行文件(链接)

​ 如果你要察看系统信息,可以使用cat命令,例如:

# cat /proc/interrupts

CPU0

0: 8728810 XT-PIC timer

1: 895 XT-PIC keyboard

2: 0 XT-PIC cascade

3: 531695 XT-PIC aha152x

4: 2014133 XT-PIC serial

5: 44401 XT-PIC pcnet_cs

8: 2 XT-PIC rtc

11: 8 XT-PIC i82365

12: 182918 XT-PIC Mouse

13: 1 XT-PIC fpu PS/2

14: 1232265 XT-PIC ide0

15: 7 XT-PIC ide1

NMI: 0

前面已经说过,/proc/sys目录不仅提供了内核信息,而且可以通过它修改内核参数。(但是你必须很小心,因为可能会造成系统崩溃。最好是先找一台无关紧要的机子,调试成功后再应用到你的系统上。) 要改变内核的参数,只要用vi编辑或echo参数重定向到文件中即可。下面有一个例子:

# cat /proc/sys/fs/file-max

4096

# echo 8192 > /proc/sys/fs/file-max

# cat /proc/sys/fs/file-max

8192

2.2 实验内容

​ 部分A

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

如图所示:

img

选择一台机器,试着回答下列问题:

l CPU的类型和型号。

使用如下命令:cat /proc/cpuinfo | grep “model name”,如图所示:

img

l 所使用的Linux的版本。

使用命令uname -r来查看当前虚拟机的内核版本,如图所示:

img

l 从启动到当前时刻经过的时间。

使用命令uptime来查看从启动到当前时刻经过的时间,如图所示:

img

l 内存状态。

使用命令:cat /proc/meminfo来查看内存状态,如图所示:

img

​ 部分B

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

以下是读取内核参数swappiness(用于控制系统的内存管理,特别是交换空间(swap)的使用行为。它的值范围是 0 到 100)的值的代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int swappiness;
    FILE *fp;

    // 打开 /proc/sys/vm/swappiness 文件
    fp = fopen("/proc/sys/vm/swappiness", "r");
    if (fp == NULL) {
        perror("fopen");
        return 1;
    }

    // 读取 swappiness 值
    fscanf(fp, "%d", &swappiness);
    fclose(fp);

    printf("现在的swappiness值为: %d\n", swappiness);
    return 0;
}

我创建了一个getparameter.c 的文件,使用命令gcc -o getparameter getparameter.c命令来编译这个C语言文件,在使用./getparameter指令来执行上述C语言文件,执行之后的结果如下:

img

l I 编写一个程序,用来修改内核参数(任意的参数均可),现在我们编了一个可以更改swappiness(低值(如 10-20): 适用于需要高性能的场景,例如游戏或实时应用。这种情况下,系统会尽量保留数据在物理内存中,以提高访问速度;高值(如 60-80): 适用于服务器或需要长时间运行的应用,尤其是在内存较小的情况下。这样可以更好地利用交换空间,避免因内存不足导致的应用崩溃)的代码,我们选择将swappiness的值修改为10,代码如下:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int new_swappiness = 10; // 设置新的 swappiness 值
    FILE *fp;

    // 打开 /proc/sys/vm/swappiness 文件进行写入
    fp = fopen("/proc/sys/vm/swappiness", "w");
    if (fp == NULL) {
        perror("fopen");
        return 1;
    }

    // 写入新的 swappiness 值
    fprintf(fp, "%d", new_swappiness);
    fclose(fp);

    printf("Swappiness的值被设置为: %d\n", new_swappiness);
    return 0;
}

执行之后,如图所示:

img

此时,swappiness的值就成功的修改为了10。

2.3 实验步骤

1) 使用man命令了解/proc/stat文件的内容和格式:

man proc

如图所示:

img

2) 使用man命令了解下列函数的使用方法:

fopen:

命令:man fopen

原型:FILE *fopen( const char *filename, const char *mode );

以打开一个流(文件)。filename——文件名,mode——访问许可类型。

如图所示:

img

fscanf:

命令:man fscanf

原型:int fscanf( FILE *stream, const char *format [, argument ]… );

从流中读取格式化的数据。

例子fscanf (fp ,“cpu %ld”, &user)是指跳过字符串"cpu "及其前面的字符流,读取一个长整数并存入user中。其中fp为文件流指针。%ld对应长整数,%d对应整数,%s对应字符串。

如图所示:

img

fclose:

命令:man fclose

原型:int fclose( FILE *stream );

关闭流(文件)。

如图所示:

img

3)用c语言编程

总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时间信息
        unsigned long long total_time = get_cpu_time();
        unsigned long long 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;
}

4)编译和运行

使用命令vim CpuInfo.c创建一个C语言文件,将上述的代码复制进去

使用命令gcc -o CpuInfo CpuInfo.c编译此C语言文件

使用命令./CpuInfo运行此文件,结果如图所示:

img

2.4 实验总结

1.在本次实验中,我深入探索了Linux的proc文件系统,了解其在系统监控和管理中的重要性。proc文件系统以虚拟文件的形式提供了内核和进程的信息,位于 /proc 目录下。通过读取这些文件,我能够获取系统的实时状态,包括CPU使用率、内存占用、进程信息等。

2.使用命令如 cat /proc/cpuinfocat /proc/meminfo,我获取了详细的CPU和内存信息,帮助我理解系统资源的分配情况。此外,/proc/[pid]/status 文件让我能够查看特定进程的状态和资源使用情况,增强了我对进程管理的理解。

3.通过对proc文件系统的观察,我认识到其在系统调试和性能监控中的关键作用。这次实验不仅提升了我对Linux内核的理解,也为后续的系统优化和故障排查打下了基础。未来,我希望能进一步研究proc文件系统的其他功能,如进程调度和内核参数调整。

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

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

相关文章

Mysql体系架构剖析——岁月云实战笔记

1 体系架构 理论内容阅读了mysql体系架构剖析&#xff0c;其他的根据岁月云的实战进行记录。 1.1 连接层 mysql最上层为连接服务&#xff0c;引入线程池&#xff0c;允许多台客户端连接&#xff0c;主要工作&#xff1a;连接处理、授权认证、安全防护、管理连接等。 连接处理&a…

算法基础Day7(动态规划)

文章目录 1.题目2.题目解答1.第N个泰波那契数题目及题目解析动态规划算法学习1.状态表示2.状态转移方程3.初始化4.填表顺序5.空间优化 代码提交空间优化 2.三步问题题目及题目解析算法学习代码提交 1.题目 1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09;面试…

Python基础笔记17--面向对象(其他)

一、面向对象的三大特性 1、封装 1、 将属性和⽅法书写到类的⾥⾯的操作 2、封装可以为属性和⽅法添加私有权限 2、继承 1、⼦类默认继承⽗类的所有属性和⽅法 2、⼦类可以重写⽗类属性和⽅法 3、多态 1、 传⼊不同的对象&#xff0c;产⽣不同的结果 二、多态 多态指⼀类事…

梳理你的思路(从OOP到架构设计)_基本OOP知识03

目录 1、<基类/子类 >结构的接口(卡榫函数) 1&#xff09;卡榫(Hook) 2&#xff09;卡榫函数的Java实现 2、IoC机制与基於 Default 軟硬整合觀點 函数 1&#xff09;卡榫函数实现IoC机制 2&#xff09;默认(Default)行为 1、<基类/子类 >结构的接口(卡榫函数…

Y3编辑器官方文档1:编辑器简介及菜单栏详解(文件、编辑、窗口、细节、调试)

文章目录 一、新建项目二、 编辑器主界面2.1 游戏场景2.2 导航栏/菜单栏2.3 功能栏三、菜单栏详细介绍3.1 文件3.1.1 版本管理3.1.2 项目管理(多关卡)3.1.2.1 多关卡功能说明3.1.2.2 关卡切换与关卡存档3.2 编辑3.2.1 通用设置3.2.2 键位设置3.3 窗口(日志)3.4 细节3.4.1 语言…

微信小程序横屏页面跳转后,自定义navbar样式跑了?

文章目录 问题原因&#xff1a;解决方案&#xff1a; 今天刚遇到的问题&#xff0c;横屏的页面完成操作后跳转页面后&#xff0c;自定义的tabbar样式乱了&#xff0c;跑到最顶了&#xff0c;真机调试后发现navbar跑到手机状态栏了&#xff0c;它正常应该跟右边胶囊一行。 知道问…

十五、K8s计划任务JobCronJob

K8s计划任务CronJob&Job 一、Job可以干什么 Job 控制器用于管理 Pod 对象运行一次性任务,比方说我们对数据库备份,可以直接在 k8s 上启动一个 mysqldump 备份程序,也可以启动一个 pod,这个 pod 专门用来备份用的,备份结束 pod 就可以终止了,不需要重启,而是将 Pod…

【开源】基于SpringBoot框架美容院管理系统(计算机毕业设计)+万字说明文档 T012

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

基于卷积神经网络的垃圾分类系统实现(GUI应用)

1.摘要 本文主要实现了一个卷积神经网络模型进行垃圾图像分类&#xff0c;为了提高垃圾分类模型的准确率&#xff0c;使用使用Batch Normalization层、使用早期停止策略来防止过拟合等方法来优化模型&#xff0c;实验结果显示最终优化后的模型准确率较高90%左右。最终&#xf…

Qt Pro 常用配置

Part1: Summary Qt 开发中 Pro 文件的内容很多&#xff0c;需要不断的去学习和使用&#xff0c;现系统性的整理一下。以备录&#xff1b; 1.创建pro文件 1.1 步骤&#xff1a; Qt Creator--->New Project--->应用程序--->Qt Widgets Application--->名称为&…

软件测试--录制与回放脚本

准备工作 安装phpstudy 配置两个内容 放demo44文件夹 在浏览器输入http://localhost/demo44/index.html&#xff0c;出现如图所示的网站 输入用户名和密码 步骤一&#xff1a;打开Virtual User Generator&#xff0c;点击新建&#xff0c;点击new 步骤二&#xff1a;点击如下…

WEB安全基础知识

WAF全称为Web Application Firewall&#xff08;网页应用防火墙&#xff09;是一种专门设计用来保护web应用免受各种网络攻击的安全防护措施。它位于客户端与服务器之间&#xff0c;监控和过滤HTTP流量&#xff0c;从而拦截恶意请求、识别并防御常见的web攻击。 WAF的主要功能…

android studio kotlin 本地c++工程添加oboe库的方法

1.新建本地c++的kotlin工程hellohao 如图 2.把开源的oboe源文件src、include、CMakelists.txt、debug-utils复制hellohao目录下 3.修改hellohao\app目录下的CMakelists.txt cmake_minimum_required(VERSION 3.22.1) project(hellohao LANGUAGES C CXX)get_filename_component…

ElasticSearch常见的索引_集群的备份与恢复方案

方案一&#xff1a;使用Elasticsearch的快照和恢复功能进行备份和恢复。该方案适用于集群整体备份与迁移&#xff0c;包括全量、增量备份和恢复。 方案二&#xff1a;通过reindex操作在集群内或跨集群同步数据。该方案适用于相同集群但不同索引层面的迁移&#xff0c;或者跨集…

cefsharp131.2.70升级cefsharp131.3.10( Chromium 131.0.6778.109)NETCore 版本升级体验

一、版本 cefsharp 131.3.10 小版本升级:cefsharp 131.2.70>>cef 131.3.10 CEF 131.3.1+gcb062df+chromium-131.0.6778.109 / Chromium 131.0.6778.109 二、测试(html5test)

#自定义数据类型-模拟进程执行

#include <iostream> #include <string> #include <iomanip> using namespace std;//定义一个名为process的结构体&#xff0c;用于表示进程相关信息 //包含进程名、进程ID、进程优先级、进程状态、进程所需CPU时间、进程描述等成员 struct process {string …

多线程的知识总结(8):用 thread 类 或全局 async (...) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数

&#xff08;40&#xff09;用 thread 类 或全局 async (…) 函数&#xff0c;创建新线程时&#xff0c;谁才是在新线程里第一个被执行的函数&#xff1f; 弄清楚这个问题&#xff0c;有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async &#xff08;…&#xff0…

12月11日IO进程线程

作业1、创建子父进程&#xff0c;子进程将1.txt内容拷贝到2.txt中&#xff0c;父进程将3.txt内容拷贝到4.txt中。 #include <myhead.h>int main(int argc, const char *argv[]) {//创建子父进程pid_t pidfork();if(pid>0) //父进程{//打开文件1文件2int fd1open(&q…

TikTok无网络黑屏原因及解决方法

TikTok运营中最常见的问题就是出现黑屏和“Something went wrong”“No internet connection”等字样&#xff0c;这时TikTok往往已经无法正常使用&#xff0c;大大影响运营流程。那么这种情况是什么原因&#xff0c;又有什么解决办法&#xff1f; 一、无网络黑屏原因 1.‌地理…

在 Ansys Mechanical 中使用“螺栓工具”插件自动生成螺栓

总结 在有限元分析 &#xff08;FEA&#xff09; 中&#xff0c;高效创建螺栓连接对于确保机械装配的结构完整性和性能至关重要。螺栓是连接组件不可或缺的一部分&#xff0c;它们在负载下的精确建模会影响整个系统。快速高效的螺栓建模使工程师能够快速优化设计&#xff0c;满…