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

实验二 观察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.rhkb.cn/news/488320.html

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

相关文章

【密码学】AES算法

一、AES算法介绍&#xff1a; AES&#xff08;Advanced Encryption Standard&#xff09;算法是一种广泛使用的对称密钥加密&#xff0c;由美国国家标准与技术研究院&#xff08;NIST&#xff09;于2001年发布。 AES是一种分组密码&#xff0c;支持128位、192位和256位三种不同…

【学习笔记】目前市面中手持激光雷达设备及参数汇总

手持激光雷达设备介绍 手持激光雷达设备是一种利用激光时间飞行原理来测量物体距离并构建三维模型的便携式高科技产品。它通过发射激光束并分析反射回来的激光信号&#xff0c;能够精确地获取物体的三维结构信息。这种设备以其高精度、适应各种光照环境的能力和便携性&#xf…

探索 LeNet-5:卷积神经网络的先驱与手写数字识别传奇

一、引言 在当今深度学习技术蓬勃发展的时代&#xff0c;各种复杂而强大的神经网络架构不断涌现&#xff0c;如 ResNet、VGG、Transformer 等&#xff0c;它们在图像识别、自然语言处理、语音识别等众多领域都取得了令人瞩目的成果。然而&#xff0c;当我们回顾深度学习的发展历…

【数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现链栈的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取栈…

【笔记】架构上篇Day6 法则四:为什么要顺应技术的生命周期?

法则四&#xff1a;为什么要顺应技术的生命周期&#xff1f; 简介&#xff1a;包含模块一 架构师的六大生存法则-法则四&#xff1a;为什么要顺应技术的生命周期&#xff1f;&法则四&#xff1a;架构设计中怎么判断和利用技术趋势&#xff1f; 2024-08-29 17:30:07 你好&am…

Security自定义逻辑认证(极简案例)

项目结构 config SecurityConfig package com.wunaiieq.tmp2024121105.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.crypto.password.NoOpPasswordEnco…

docker安装ddns-go(外网连接局域网)

docker先下载镜像&#xff0c;目前最新版是v6.7.6 也可以csdn资源下载 再导入dockers https://download.csdn.net/download/u014756339/90096748 docker load -i ddns-go.tar 启动 docker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/…

技术速递|dotnet scaffold – .NET 的下一代内容创建

作者&#xff1a;Sayed Ibrahim Hashimi - 首席项目经理 排版&#xff1a;Alan Wang Visual Studio 中为 ASP.NET Core 项目搭建脚手架是一项长期特性&#xff0c;是在 ASP.NET Core 发布后不久添加的。多年来&#xff0c;我们一直支持从命令行搭建脚手架。根据从命令行操作中获…

基于ZYNQ 7z010开发板 oled点亮的实现

dc拉高的时候就是发送128字节数据的时候 发送指令dc拉低 模式是00 sck先置低再置高 复位是与开发板上的按键一样都是低有效 25位字节指令 加 3字节的 页地址加起始结束 b0,00,10, timescale 1ns / 1ps module top0(input wire clk ,input wire rst_n,// out…

使用torch模拟 BMM int8量化计算。

使用torch模型BMM int8计算。 模拟&#xff1a;BMM->softmax->BMM 计算流程 import torch import numpy as np torch.manual_seed(777) def int8_quantize_per_token(x: torch.Tensor, axis: int -1, attnsFalse):if x.dtype ! torch.float32:x x.type(torch.float32)…

【CSS in Depth 2 精译_070】11.3 利用 OKLCH 颜色值来处理 CSS 中的颜色问题(下):从页面其他颜色衍生出新颜色

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 11.2.2.1 RGB…

HTML:表格重点

用表格就用table caption为该表上部信息&#xff0c;用来说明表的作用 thead为表头主要信息&#xff0c;效果加粗 tbody为表格中的主体内容 tr是 table row 表格的行 td是table data th是table heading表格标题 &#xff0c;一般表格第一行的数据都是table heading

15.Java 网络编程(网络相关概念、InetAddress、NetworkInterface、TCP 网络通信、UDP 网络通信、超时中断)

一、网络相关概念 1、网络通信 网络通信指两台设备之间通过网络实现数据传输&#xff0c;将数据通过网络从一台设备传输到另一台设备 java.net 包下提供了一系列的类和接口用于完成网络通信 2、网络 两台以上设备通过一定物理设备连接构成网络&#xff0c;根据网络的覆盖范…

项目中使用AntV L7地图(五)添加飞线

项目中使用AntV L7地图&#xff0c;添加 飞线 文档地址&#xff1a;https://l7.antv.antgroup.com/zh/examples/line/animate/#trip_animate 一、初始化地图 使用的地图文件为四川地图JSON&#xff0c;下载地址:https://datav.aliyun.com/portal/school/atlas/area_selector#&…

MySQL-DQL之数据表操作

文章目录 零. 准备工作一. 简单查询1.查询所有的商品.2.查询商品名和商品价格.3.查询结果是表达式&#xff08;运算查询&#xff09;&#xff1a;将所有商品的价格10元进行显示. 二. 条件查询1. 比较查询2. 范围查询3. 逻辑查询4. 模糊查询5. 非空查询 三. 排序查询四. 聚合查询…

nacos bootstrap.yml 和 spring.config.import 加载配置的流程区别

相关依赖 springboot:2.7.15 nacos:2.2.3 bootstrap.yml加载方式 加载流程如下图所示 从图中可以看出,&#xff1a; 1.bootstrap.yml 的加载是在 BootstrapApplicationListener.onApplicationEvent 接收到 ApplicationEnvironmentPreparedEventEvent 事件后另起一个 Sprin…

Kubernetes Nginx-Ingress | 禁用HSTS/禁止重定向到https

目录 前言禁用HSTS禁止重定向到https关闭 HSTS 和设置 ssl-redirect 为 false 的区别 前言 客户请求经过ingress到服务后&#xff0c;默认加上了strict-transport-security&#xff0c;导致客户服务跨域请求失败&#xff0c;具体Response Headers信息如下&#xff1b; 分析 n…

关于idea-Java-servlet-Tomcat-Web开发中出现404NOT FOUND问题的解决

在做web项目时&#xff0c;第一次使用servlet开发链接前端和后端的操作&#xff0c;果不其然&#xff0c;遇到了诸多问题&#xff0c;而遇到最多的就是运行项目打开页面时出现404NOT FOUND的情况。因为这个问题我也是鼓捣了好久&#xff0c;上网查了许多资料才最终解决&#xf…

开发一套SDK 第一弹

自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…

深入理解 Apache Shiro:安全框架全解析

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在…