7. 系统信息与系统资源

7. 系统信息与系统资源

  • 1. 系统信息
    • 1.1 系统标识 uname()
    • 1.2 sysinfo()
    • 1.3 gethostname()
    • 1.4 sysconf()
  • 2. 时间、日期
    • 2.1 Linux 系统中的时间
      • 2.1.1 Linux 怎么记录时间
      • 2.1.2 jiffies 的引入
    • 2.2 获取时间 time/gettimeofday
      • 2.2.1 time()
      • 2.2.2 gettimeofday()
    • 2.3 时间转换函数
      • 2.3.1 ctime()
      • 2.3.2 localtime()
      • 2.3.3 gmtime()
      • 2.3.4 mktime()
      • 2.3.5 asctime()
      • 2.3.6 strftime()
    • 2.4 设置时间 settimeofday
  • 3. 进程时间
    • 3.1 times()
    • 3.2 clock()
  • 4. 产生随机数
    • 4.1 rand()
    • 4.2 srand()
  • 5. 休眠
    • 5.1 秒级休眠 sleep()
    • 5.2 微秒级休眠 usleep()
    • 5.3 高进度休眠 nanosleep()
  • 6. 申请堆内存
    • 6.1 在堆上分配内存
    • 6.2 在堆上分配对齐内存
  • 7. proc 文件系统
    • 7.1 使用cat命令读取
    • 7.2 使用read读取

1. 系统信息

1.1 系统标识 uname()

系统调用 uname() 用于获取当前操作系统内核的名称和信息。调用时先创建一个结构体类型变量,然后传入地址即可

#include <sys/utsname.h>
int uname(struct utsname *buf);

在这里插入图片描述

1.2 sysinfo()

可用于获取一些系统统计信息

#include <sys/sysinfo.h>
int sysinfo(const sysinfo *info);

在这里插入图片描述

1.3 gethostname()

可以单独获取 Linux 系统主机名

#include <unistd.h>
int gethostname(char *name, size_t len);
// 参数:用于存放主机名的缓冲区以及缓冲区大小

1.4 sysconf()

可在运行时获取系统的一些配置信息

#include <unistd.h>
long sysconf(int name);
/* name:指定要获取哪个配置信息,可以使用 man 手册查看
 * _SC_ARG_MAX:exec族函数的参数的最大长度,这里先不用了解exec族
 * _SC_CHILD_MAX:每个用户的最大并发进程数
 * _SC_HOST_NAME_MAX:主机名的最大长度
 * _SC_LOGIN_NAME_MAX:登录名的最大长度
 * _SC_CLK_TCK:每秒时钟滴答数,也就是系统节拍率
 * _SC_OPEN_MAX:一个进程可以打开的最大文件数
 * _SC_PAGESIZE:系统页大小
 * _SC_TTY_NAME_MAX:终端设备名的最大长度
 * ...
 * /

2. 时间、日期

2.1 Linux 系统中的时间

操作系统中有两个时钟,一个是系统时钟,一个是实时时钟,也叫 RTC。系统时钟在系统启动之后由内核来维护,使用 date 命令获取到的就是系统时钟,在系统关机情况下不存在;实时时钟一般由 RTC 时钟芯片提供,该芯片有相应的电池,可以保证在系统关机的情况下依旧能够继续工作。

2.1.1 Linux 怎么记录时间

在启动之后先读取 RTC 作为系统时钟的初始值,之后一直维护系统时钟,然后就不会再对 RTC 进行读取操作。系统关机后,会将系统时钟写入到 RTC,进行同步操作。

2.1.2 jiffies 的引入

内核定义的一个全局变量,使用该变量来记录系统从启动以来的系统节拍数,所以这个变量用来记录以系统节拍时间为单位的时间长度,Linux 内核在编译配置时定义了一个节拍时间,使用节拍率(一秒钟多少个节拍数)来表示,譬如节拍率为 200Hz,就表示一秒钟 200 个节拍,节拍时间为 1s/200。节拍率越低,每一个系统节拍的时间就越短,意味着 jiffies 记录的时间精度越高。 但是高节拍率会导致系统中断的产生更加频繁,会加剧系统的负担,一般默认情况下都是采用 100Hz 作为系统节拍率。
内核其实通过 jiffies 来维护系统时钟,在系统开机时会设置一个初始值,上面所说的读取 RTC就是用来初始化 jiffies 变量的。当我们需要获取到系统当前时间点时,就可以使用 jiffies 变量去计算。

2.2 获取时间 time/gettimeofday

2.2.1 time()

获取当前时间,以秒为单位,返回值是从 1970-01-01 00:00:00 +0000(UTC) 以来的秒数

#include <time.h>
time_t time(time_t *tloc);
// 如果 tloc 不是空,则返回值存储在 tloc 指向的内存中

2.2.2 gettimeofday()

time 函数只能精确到秒,而这个函数可以精确到微秒

#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
// tz 直接设置为NULL即可
// 获取到的时间存储在tv中,这个结构体的有两个变量,得到的时间就是 tv_sec+tv_usec。tv_sec 的值和time获取的值相同

2.3 时间转换函数

2.3.1 ctime()

将时间转换为字符串形式

#include <time.h>
char *ctime(const time_t *timep);
char *ctime_r(const time_t *timep, char *buf);
// 成功就返回指向得到的字符串的指针,失败就返回NULl
// 但是 ctime 是一个不可重入的函数,推荐使用 ctime_r,是一个可重入函数,buf就是用于存放字符串的缓冲区地址。可重入后面再讲,_r 就一般表示可重入,也就是如果成功就返回buf
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
int main()
{
	char str[100]={0};
	time_t tm;
	tm=time(NULL);
	ctimr_t(&tm,str);
	cout << str<<endl;
	return 0;
}

2.3.2 localtime()

讲时间转换为一个 struct tm 结构体所表示的时间,对应的是本地时间

#include <time.h>
struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);

在这里插入图片描述

2.3.3 gmtime()

将 time_t 转换为 struct tm 结构体表示的时间,但是是 UTC 时间,不是本地时间

#include <time.h>
struct tm *gmtime(const time_t *timep);
struct tm *gmtime_r(const time_t *timep, struct tm *result);

2.3.4 mktime()

将 struct tm 结构体表示的时间转换为 time_t 时间

#include <time.h>
time_t mktime(struct tm *tm);

2.3.5 asctime()

和 ctime() 一样,但是可以将时间分解转换为固定格式字符串。

#include <time.h>
char *asctime(const struct tm *tm);
char *asctime_r(const struct tm *tm, char *buf);

2.3.6 strftime()

可以根据自己的需要设定格式

#include <time.h>
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
/* s:存放生成的字符串
 * max:字符串的最大字节数
 * format:格式
 * tm:指向结构体的指针 
 * /

在这里插入图片描述
这些格式字段可以任意组合,比如:"%Y-%m-%d %H:%M:%S<%p> %B %A"可以输出"2021-01-14 16:30:25<PM> January Thursday"

2.4 设置时间 settimeofday

设置系统本地时间,而且只有超级用户才能设置时间

#include <sys/time.h>
int settimeofday(const struct timeval *tv, const struct timezone *tz);
// tz 目前已经废弃,直接设置NULL即可

3. 进程时间

进程时间指的是进程从创建后,也就是程序运行后,到目前为止这段时间内使用 CPU 资源的时间总数。内核将 CPU 时间,也就是进程时间分为两部分:

  1. 用户 CPU 时间:进程在用户空间下运行所花费的 CPU 时间,也成为虚拟时间
  2. 系统 CPU 时间:进程在内核态下运行所花费的时间。这是内核执行系统调用或代表进程执行的其他任务所花费的时间。
    一般来说,进程时间指的是这两个时间总和
    注意: 进程时间不等于程序的整个生命周期所消耗的时间,如果进程一直处于休眠状态(进程被挂起、不会得到系统调度),那么它并不会使用 CPU 资源,所以休眠这段时间不计算在进程时间中。

3.1 times()

获取当前进程时间

#include <sys/times.h>
clock_t times(struct tms *buf);
// 返回值类型实际就是long类型,成功时返回从过去任意一个时间点所经过的时钟滴答数,就是系统节拍数,将节拍数/节拍率就是秒数,返回值可能会溢出,调用失败返回-1

在这里插入图片描述

// 计算一段程序耗费的进程时间和总的时间
#include <stdio.h>
#include <stdlib.h>
#include <sys/times.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
	struct tms _start;
	struct tms _end;
	clock_t start;
	clock_t end;
	long tck;
	int i,j;

	// 获取系统节拍率
	tck = sysconf(_SC_CLK_TCK);

	// 开始时间
	start = times(&_start);
	
	for(i=0;i<20000;i++);
	{
		for(j=0;j<20000;j++);
		{}
	}
	sleep(1);

	end = times(&_end);
	cout << "时间总和: << (end-start)/double(tck) << endl;// 2.910000秒,从起点到终点所经过的时间,并不是进程时间
	cout << "用户时间: << (_end.tms_utime-_start.tms_utime)/double(tck) << endl;// 1.900000秒
	cout << "系统时间: << (_end.tms_stime-_start.tms_stime)/double(tck) << endl;// 0.000000秒
}

3.2 clock()

更简单的函数获取进程时间,返回值描述了进程使用的总的 CPU 时间,也就是进程时间。

#include <time.h>
clock_t clock();
// 返回值就是到目前为止程序的进程时间,并不是系统节拍数,如果想要获取秒数,需要除 CLOCKS_PER_SEC,失败返回-1。但是此函数不能获取到单独的用户CPU时间和系统CPU时间

4. 产生随机数

4.1 rand()

#include <stdlib.h>
int rand();
// 这个函数每一次运行程序获得的随机数都是相同的,需要使用srand函数设置随机数种子。rand将1作为随机数种子

4.2 srand()

#include <stdlib.h>
void srand(unsigned int seed);

一般都是将当前时间作为种子传递给seed,因为时间是一直在变化的。

// 生成一组随机数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	int random_number_arr[8];
	int count;
	srand(time(NULL));
	for(count = 0; count<8;count++)
	{
		random_number_arr[count] = rand()%100;
	}
	for(count = 0; count<8;count++)
	{
		cout << random_number_arr[count] << " ";
	}
	cout << endl;
	return 0;
}

5. 休眠

5.1 秒级休眠 sleep()

#include <unistd.h>
unsigned int sleep(unsigned int seconds);
// 如果休眠时长等于seconds,就返回0;如果被信号中断,返回剩余的秒数

5.2 微秒级休眠 usleep()

#include <unistd.h>
int usleep(useconds_t usec);
// 成功返回0,失败返回-1

5.3 高进度休眠 nanosleep()

#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
// req:设置休眠时长,可精确到纳秒级
// rem:可以设置NULL
// 如果成功休眠设定的时长,返回0;如果被信号中断或错误,返回-1,并将剩余时间记录在rem中,如果为NULL,表示不接收剩余时间

6. 申请堆内存

6.1 在堆上分配内存

#include <stdlib.h>
void *malloc(size_t size);	// 在使用时通常需要强制类型转换,该函数不会初始化内存空间
void *calloc(size_t nmemb, size_t size);	// 分配nmemb个单位长度为size的连续空间,并初始化为0,总的大小是nmemb*size
void *realloc(void *ptr, size_t size); // 可以在原有的空间上扩容
void free(void *ptr);		// 释放堆内存空间

当进程终止时,会自动释放申请的空间,有时,因为加入了多次的 free() 调用,可能会消耗掉大量的 CPU 时间。但是依旧建议手动释放,否则容易发生内存泄漏。

6.2 在堆上分配对齐内存

#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);
void *valloc(size_t size);// 不建议使用

#include <malloc.h>
void *memalign(size_t alignment, size_t size); // 不建议使用
void *pvalloc(size_t size);

posix_memalign: 在堆上分配 size 个字节大小的对齐内存空间,将 *memptr 指向分配的空间。alignment 表示对其字节数,必须是 2 的幂次方,也是指针大小的整数倍。size 是分配的内存大小,如果为0,指向的空间值为NULL
aligned_alloc: 分配 size 个字节大小的内存空间,返回指向该空间的指针
valloc: 以 pagesize 页大小作为对齐的长度,可以通过 getpagesize() 获取页大小

7. proc 文件系统

是一个虚拟文件系统,它以文件系统的方式为应用层访问系统内核数据提供了接口,用户和应用程序可以通过 proc 文件系统得到系统信息和进程相关信息,对 proc 文件系统的读写作为与内核进行通信的一种手段。但是与普通文件不同的是,proc 文件系统是动态创建的,文件本身不存在于磁盘当中,只存在于内存中。该文件系统挂载在 /proc 目录下

7.1 使用cat命令读取

比如查看内核版本信息cat /proc/version

7.2 使用read读取

将你需要直到的信息读取到文件中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java集合(二)

1. Map 1.1 HashMap 和 Hashtable 的区别 线程是否安全&#xff1a; HashMap 是非线程安全的&#xff0c;Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。&#xff08;如果你要保证线程安全的话就使用 ConcurrentHashMap 吧&#xff01;&…

[多线程]阻塞队列和生产者消费者模型

目录 1.阻塞队列 1.1引言 1.2Java标准库中的阻塞队列 1.3自主通过Java代码实现一个阻塞队列(泛型实现) 2.生产者消费者模型 1.阻塞队列 1.1引言 阻塞队列是多线程部分一个重要的概念,它相比于一般队列,有两个特点: 1.线程是安全的 2.带有阻塞功能 1) 队列为空,出队列就会阻…

鸿蒙HarmonyOS从零实现类微信app效果——基础界面搭建

最近鸿蒙HarmonyOS开发相关的消息非常的火&#xff0c;传言华为系手机后续将不再支持原生Android应用&#xff0c;所以对于原Android应用开发对应的Harmony版本也被一系列大厂提上了日程。作为一个名义上的移动端开发工程师&#xff08;(⊙o⊙)…&#xff0c;最近写python多过A…

应急响应-挖矿病毒处理

应急响应-挖矿病毒处理 使用top​命令实时监控占用CPU资源的是哪个进程&#xff0c;结果可以看到是2725这个进程。 ​​ 再使用netstat -anltp命令查看网络连接状态&#xff0c;定位到对应的PID号后&#xff0c;就拿到了远程地址 ​​ 拿到远程IP&#xff0c;结果是VPN入口…

JVM 运行时内存(三)

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。 1. 新生代 是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象&#xff0c;所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、…

人工智能_机器学习059_非线性核函数_poly核函数_rbf核函数_以及linear核函数效果对比---人工智能工作笔记0099

人工智能_机器学习059_非线性核函数介绍---人工智能工作笔记0099 那么我们应该如何调整这个SVC的参数,也就是我们应该使用哪种核函数,比较合适呢?这取决于我们的数据,适合使用哪个核函数,正好我们有 提供的score = accuracy_score(y_test,y_pred) 这样的评分函数,我们可以根据…

B2B公司如何寻找意向客户的联系方式?

在B2B公司的营销过程中&#xff0c;少不了寻找意向客户的阶段&#xff0c;这也是销售过程中非常重要的一步。 很多新人都是拿到客户联系方式&#xff0c;就直接打电话拜访&#xff0c;俗话说不打没有准备的仗&#xff0c;因此在拜访客户之前就应该做好功课&#xff0c;充分了解…

AI医疗交流平台【Docola】申请823万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国的AI医疗交流平台Docola近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为 (DOCO) &#xff0c;Docola计划…

【五分钟】熟练使用numpy的histogram函数(干货!!!)

histogram函数重要参数详解 def histogram(a, bins10, rangeNone, normedNone, weightsNone, densityNone):...位置参数a&#xff1a; The histogram is computed over the flattened array.&#xff08;源码对参数a的解释&#xff09; 从源码对参数a的解释来看&#xff0c;参…

从0开始使用Maven

文章目录 一.Maven的介绍即相关概念1.为什么使用Maven/Maven的作用2.Maven的坐标 二.Maven的安装三.IDEA编译器配置Maven环境1.在IDEA的单个工程中配置Maven环境2.方式2&#xff1a;配置Maven全局参数 四.IDEA编译器创建Maven项目五.IDEA中的Maven项目结构六.IDEA编译器导入Mav…

设计模式之代理模式(1)

目录 概述定义应用场景主要角色类图 详述基本代码应用实例符合的设计原则 总结 概述 定义 代理模式是一种结构型设计模式&#xff0c;它允许通过一个代理对象来控制对原始对象的访问。代理对象可以在不改变原始对象的情况下&#xff0c;增加一些额外的功能&#xff0c;例如权限…

差分基准站

差分基准站&#xff0c;又称参考接收机&#xff0c;是一种固定式卫星接收机&#xff0c;用于提高卫星定位精度。 差分基准站的作用是提供已知位置和准确的位置信号&#xff0c;以纠正其他移动定位终端接收器接收到的卫星信号中的误差。 卫星定位信号会受到多种因素的影响&#…

selenium自动化测试:xpath八种定位方式!

01、前言 如果可以的话&#xff0c;请先关注&#xff08;专栏和账号&#xff09;&#xff0c;然后点赞和收藏&#xff0c;最后学习和进步。你的支持是我继续写下去的最大动力&#xff0c;个人定当倾囊而送&#xff0c;不负众望。谢谢&#xff01;&#xff01;&#xff01; 1.…

【蓝桥杯省赛真题49】Scratch小狗避障 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch小狗避障 一、题目要求 编程实现 二、案例分析 1、角色分析

JDK安装太麻烦?一篇文章搞定

JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA工具。 JDK包含的基本组件包括&#xff1a; javac – 编译器&#xf…

从零开始入门Zapier:与ChatGPT双剑合璧,手把手教程让你进入AI与自动化新纪元

coments 1. 1. 打开Zapier的官方界面 登录之后&#xff0c;会出现一个调查表&#xff0c;可以根据自己的情况进行选择。 第一次注册成功&#xff0c;会送你14天的免费体验

SAP ABAP ALV创建动态树形菜单

创建动态树形菜单——ALV 创建的合同越多&#xff0c;使用树形菜单能比较直观的地显示&#xff0c;而且展开下阶也能明确的知识相关的信息&#xff0c;比如合同中的出口成品有哪些。 设计要点&#xff1a; 第一、 Node_key一定要区分&#xff0c;不能重复&#xff0c;否则出错…

C语言--每日选择题--Day35

第一题 1. 有如下定义&#xff1a;(x y) % 2 (int) a / (int) b 的值是&#xff08;&#xff09; int x 3; int y 2;float a 2.5; float b 3.5; A&#xff1a;0 B&#xff1a;2 C&#xff1a;1.5 D&#xff1a;1 答案及解析 D 本题是考查强制类型转换和操作符优先级 操作…

JavaWeb 前端工程化

前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本。 前端工程化实现技术栈 前端工程化实现的技术栈有很多,我们采用ES6nodejsnpmViteVUE3routerpiniaaxiosElement-plus组合来实现 ECMAScri…

由11月27日滴滴崩溃到近两个月国内互联网产品接二连三崩溃引发的感想

文章目录 知乎文分析微信聊天截图微信公众号 滴滴技术 发文k8s 官方文档滴滴官方微博账号 近两个月国内互联网产品“崩溃”事件2023-10-23 语雀崩溃2023-11-12 阿里云崩溃2023-11-27 滴滴崩溃2023-12-03 腾讯视频崩溃总结 我的感想 知乎文分析 最近连续加班&#xff0c;打车较…