sysinfo的定义
sysinfo
结构体的完整定义如下。这个定义包含了一些特定的类型,如 __kernel_long_t
和 __kernel_ulong_t
,这些类型是为了在不同架构上提供一致的数据大小而定义的。以下是对这个结构体中每个成员的详细解释:
struct sysinfo {__kernel_long_t uptime; /* 自系统启动以来的秒数 */__kernel_ulong_t loads[3]; /* 过去1分钟、5分钟和15分钟内的平均负载 */__kernel_ulong_t totalram; /* 可用的总物理内存大小(字节) */__kernel_ulong_t freeram; /* 可用的物理内存大小(字节) */__kernel_ulong_t sharedram; /* 共享内存大小(字节) */__kernel_ulong_t bufferram; /* 用于缓冲的内存大小(字节) */__kernel_ulong_t totalswap; /* 总交换空间大小(字节) */__kernel_ulong_t freeswap; /* 可用的交换空间大小(字节) */__u16 procs; /* 当前运行或等待运行的进程数量 */__u16 pad; /* m68k架构上的显式填充 */__kernel_ulong_t totalhigh; /* 总高内存大小(字节),通常是高于4GB的内存 */__kernel_ulong_t freehigh; /* 可用高内存大小(字节) */__u32 mem_unit; /* 内存大小单位,通常是字节 */char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)]; /* 填充:为了兼容libc5 */
};
以下是成员变量的详细说明:
uptime
: 系统自上次启动以来的运行时间,以秒为单位。loads
: 一个数组,包含三个元素,分别表示过去1分钟、5分钟和15分钟内的平均系统负载。totalram
: 系统总的物理内存大小,以字节为单位。freeram
: 当前未使用的物理内存大小,以字节为单位。sharedram
: 被多个进程共享的内存大小,以字节为单位。bufferram
: 被用作缓冲区的内存大小,以字节为单位。totalswap
: 系统总的交换空间大小,以字节为单位。freeswap
: 当前未使用的交换空间大小,以字节为单位。procs
: 当前系统中的进程数量。pad
: 在某些架构(如m68k)上用于对齐的结构体填充。totalhigh
: 系统总的高内存大小,通常是高于4GB的内存,以字节为单位。freehigh
: 当前未使用的高内存大小,以字节为单位。mem_unit
: 内存大小单位,通常为字节,但可能会根据系统的不同而变化。_f
: 填充字段,用于确保结构体的大小在所有平台上都是一致的,特别是在兼容旧版本库(如libc5)的情况下。
请注意,__kernel_long_t
和__kernel_ulong_t
是内核定义的类型,它们保证在32位和64位系统上具有一致的大小。在32位系统上,__kernel_long_t
和__kernel_ulong_t
通常分别是long
和unsigned long
,而在64位系统上,它们可能是64位的。
可用内存
在Linux系统中,系统当前可以使用的内存通常指的是“可用内存”(free memory),这包括以下几部分:
- 空闲内存(Free Memory):当前未被任何进程使用的内存。
- 缓冲区内存(Buffer Memory):用于文件系统元数据缓存的内存,如磁盘块的缓存。
- 缓存内存(Cache Memory):用于文件数据的缓存,可以提高文件访问速度。
在sysinfo
结构体中,这些信息分别可以通过以下字段获得:
freeram
:表示空闲内存的大小。bufferram
:表示缓冲区内存的大小。sharedram
:表示共享内存的大小,这部分通常不计入可用内存,因为它可能被多个进程共享使用。
要计算系统当前可以使用的内存总量,通常是将空闲内存和缓冲区内存相加。缓存内存虽然也被计算在内,但操作系统可以在需要时回收这部分内存以供其他用途。
以下是如何从sysinfo
结构体中获取并计算可用内存的示例代码:
#include <sys/sysinfo.h>
#include <stdio.h>
int main() {struct sysinfo info;if(sysinfo(&info) == 0) {// 可用内存 = 空闲内存 + 缓冲区内存 + 可回收的缓存内存long available_memory = info.freeram + info.bufferram;// 打印可用内存(单位:MB)printf("Available Memory: %ld MB\n", available_memory / 1024 / 1024);} else {perror("sysinfo");}return 0;
}
在上述代码中,available_memory
变量计算了系统当前可用的内存总量。需要注意的是,这个计算不包括共享内存(sharedram
),因为共享内存的使用情况可能比较复杂。
还要注意,这个计算方法并不是特别精确,因为操作系统可能会在后台使用缓存来提高性能,而这些缓存可能会随时被回收。实际上,操作系统会根据当前的工作负载和内存需求来动态管理这些内存资源。因此,即使可用内存看起来很少,操作系统通常也能有效地处理内存需求。