虚拟内存与实际内存

虚拟内存指的是,程序向操作系统所申请的内存空间,这个空间不一定会使用,这个空间也可以比服务器实际可提供内存空间大。

实际内存是程序所申请的内存页与物理内存中的物理页进行一一映射的内存空间,这个空间永远不会比物理内存大。

C语言内存空间分配函malloc()数简介.

调用形式:
(类型说明符*)malloc(size)
功能:在内存的动态存储区中分配一块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。
说明:
(1)“类型说明符”表示把该区域用于何种数据类型。
(2)(类型说明符*)表示把返回值强制转换为该类型指针。
(3)“size”是一个无符号数。
例如:
pc=(char*)malloc(100);
表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。

编程实现虚拟内存分配

#include <malloc.h>    /*malloc()函数所在的头文件*/
#include <unistd.h>    /*sleep()所在的头文件*/int main(int argc, char const *argv[])
{int *p;p=(int *)malloc(8000000000); /*此处分配8G内存空间*/sleep(90);return 0;
}

编译运行此程序并查看此进程内存占用情况

[zyq@zyq ~]$ ps aux | grep a.out
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
zyq      19931  0.0  0.0 7816672  348 pts/2    S+   15:46   0:00 ./a.out
zyq      19935  0.0  0.0   9044   664 pts/0    S+   15:46   0:00 grep --color=auto a.out

ps 命令中的VSZ代表虚拟内存,单位为KiB

VSZ       virtual memory size of the process in KiB (1024-byte units).  Device mappings are currently excluded; this is subject to change.  (alias vsize).

malloc(1000) 代表分配1000Bytes

所以malloc(size)函数中的 size/1024=VSZ (近似相等)

通过maps文件进一步验证

[zyq@zyq tmp]$ ps aux | grep a.out
zyq      20452  0.0  0.0 7816668  348 pts/2    S+   15:05   0:00 ./a.out
zyq      20462  0.0  0.0   9044   660 pts/0    S+   15:05   0:00 grep --color=auto a.out
[zyq@zyq tmp]$ cat /proc/20452/maps
00400000-00401000 r-xp 00000000 fd:00 68615735                           /tmp/a.out
00600000-00601000 r--p 00000000 fd:00 68615735                           /tmp/a.out
00601000-00602000 rw-p 00001000 fd:00 68615735                           /tmp/a.out
7ff1fb83c000-7ff3d85a2000 rw-p 00000000 00:00 0
7ff3d85a2000-7ff3d875a000 r-xp 00000000 fd:00 33754686                   /usr/lib64/libc-2.17.so
7ff3d875a000-7ff3d895a000 ---p 001b8000 fd:00 33754686                   /usr/lib64/libc-2.17.so
7ff3d895a000-7ff3d895e000 r--p 001b8000 fd:00 33754686                   /usr/lib64/libc-2.17.so
7ff3d895e000-7ff3d8960000 rw-p 001bc000 fd:00 33754686                   /usr/lib64/libc-2.17.so
7ff3d8960000-7ff3d8965000 rw-p 00000000 00:00 0
7ff3d8965000-7ff3d8986000 r-xp 00000000 fd:00 33754679                   /usr/lib64/ld-2.17.so
7ff3d8b68000-7ff3d8b6b000 rw-p 00000000 00:00 0
7ff3d8b85000-7ff3d8b86000 rw-p 00000000 00:00 0
7ff3d8b86000-7ff3d8b87000 r--p 00021000 fd:00 33754679                   /usr/lib64/ld-2.17.so
7ff3d8b87000-7ff3d8b88000 rw-p 00022000 fd:00 33754679                   /usr/lib64/ld-2.17.so
7ff3d8b88000-7ff3d8b89000 rw-p 00000000 00:00 0
7ffd51c3f000-7ffd51c60000 rw-p 00000000 00:00 0                          [stack]
7ffd51d4c000-7ffd51d4e000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

如上图7ff1fb83c000-7ff3d85a2000 rw-p 00000000 00:00 0  所示,其实这一行是虚拟内存中的heap段,malloc()函数所申请的内存都在heap段中, 计算本进程中这个段的大小

7ff3d85a2000-7ff1fb83c000=1DCD66000(换算成十进制为8000004096约等于malloc(8000000000))

结论

通过实验可以发现程序申请了8000000000Bytes/1024=7.812500GiB的虚拟地址空间,和展示的7816672 基本吻合,剩余的部分(7.816672-7.812500)是进程加载别的内容所申请的内存空间。

用C语言编写一个申请内存的程序相关推荐

  1. c语言编写一个成绩等级的程序,c语言作业 编写一个输出学生成绩等级的程序

    问题描述: c语言作业 编写一个输出学生成绩等级的程序 1.能够使用if else语句实现. 2.多分支结构的正确使用. 3.能够使用switch case语句实现. 4.正确使用break语句 5. ...

  2. 怎么用C语言编写一个求解幂函数的程序 成都软件开发

    其实在绝大多数C语言编译器内部是有幂函数这个函数的,具体的指令是pow(a,b),这个指令实现的功能就是求解a^b的值,也就是求解a的b次方. 例如,假如我们要求解6的7次方,并把最终的结果存入变量r ...

  3. c语言添加收支情况,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define TAXBASE 3500 //起征点 typedef struct{ //征税区间与征税率 long start; lo ...

  4. c语言个人所得税的打印思路,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define TAXBASE 3500 //起征点 typedef struct{ //征税区间与征税率 long start; lo ...

  5. 税费申报计算机代码,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define TAXBASE 3500 //起征点 typedef struct{ //征税区间与征税率 long start; lo ...

  6. c语言编程个人所得税 输入职工基本信息,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define TAXBASE 3500 //起征点 typedef struct{ //征税区间与征税率 long start; lo ...

  7. 计算税率c语言编写程序,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define TAXBASE 3500 //起征点 typedef struct{ //征税区间与征税率 long start; lo ...

  8. 工资个人所得税计算方法c语言,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define TAXBASE 3500 //起征点 typedef struct{ //征税区间与征税率 long start; lo ...

  9. 用c语言设计个人所得税的程序,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define TAXBASE 3500 //起征点 typedef struct{ //征税区间与征税率 long start; lo ...

最新文章

  1. vconsole插件_手机前端开发调试利器 – vConsole
  2. Tears in Heaven
  3. Java基础提升篇:equals()与hashCode()方法详解
  4. Microsoft Visual c++简介
  5. nodejs开发 过程中express路由与中间件的理解 - pyj063 - 博客园
  6. Codeforces-808D Array Division (multiset 折半???)
  7. Sting中方法举例
  8. linux-mysql了解
  9. mysql数据库编程(c 语言)_【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysql客户端...
  10. 在UITableView中使用自动布局以获取动态单元格布局和可变的行高
  11. English——限定性定语从句与非限定性定语从句(二)
  12. Linux 实现人脸识别
  13. MATLAB基础篇——基本语法
  14. 普通用户与root用户的相互切换
  15. java target文件夹_Maven不会创建“/ target / m2e-wtp / web-resources”文件夹
  16. Texstudio + sumatraPDF 正反向搜索关联设置
  17. 【Hadoop】Hadoop常见的操作命令
  18. @Windows server 2022安装使用(Workstation)
  19. linux服务器硬盘修复,Linux服务器磁盘坏道怎么修复
  20. oracle数据字典损坏恢复,PRM-DUL成功案例:恢复了700GB损坏严重的Oracle数据库

热门文章

  1. 利用Matlab绘制弹簧—阻尼动态振动模型
  2. PAT 甲级 1121  Damn Single
  3. Java学习笔记——从零开始(2018.04.22已更新)
  4. 关于图片加载的问题-如加载失败显示占位图,预加载,懒加载
  5. Java面试锦囊(五)
  6. java的三大体系分别是什么
  7. 神马笔记 版本2.2.2-内容共享
  8. 数学建模之马尔萨斯模型(入门版)
  9. OpenFeign实现降级
  10. word插入公式,如何输入事例四条件(或者更多)