Linux进程的内存管理
内存是计算机的敏感资源,能够熟练的掌握内存的操作是一个优秀的程序员必备的素质!
数据的内部存储
在c语言中,不同的数据类型占用的`空间是不同的,比如说一个char类型,占用的是一个字节长度,一个int 类型,一般占用的是4个字节(与系统有关)
对于多个字节的的数据存储,数据存储的顺序就显得比较重要的了,一般来说,是有两种存储方式,一个是大端存储,另一个就是小端存储 www.zhishiwu.com
那么什么是大端存储,什么是小端存储呢?现在举例说明,
例如,一个整型数据为a=0x12345678,如果是小端存储,则我们设置一个指针指向这个数据时,这个指针指向的的是78,也就是说,如果一个 整型数我们用四个字节来存储,我们的数的低位存储在内存的低位,数的高位存储在内存的高位,这就是低端存储,如果想反,则就是高端存储。根据这个解释,我们可以写下以下的代码,来测试自己的机器到底是低端存储还是高端存储。
1 /*
2 * www.zhishiwu.com =====================================================================================
3 *
4 * Filename: test3.c
5 *
6 * Description:
7 *
8 * Version: 1.0
9 * Created: 2012年05月19日 00时48分26秒
10 * Revision: none
11 * Compiler: gcc
12 *
13 * Author: YOUR NAME (),
14 * Organization:
15 *
16 * =====================================================================================
17 */
18 #include <stdio.h>
19 int main()
20 {
21 int a=0x12345678;
22 char *p;
23 p=(char *)(&a);
24 if(*p==0x78)
25 printf("the little endian/n");
26 else
27 printf("the big endian/n");
28 return 0; www.zhishiwu.com
29 }
然后,我们讲述一下, 什么是进程!一个程序被加载到内存中运行,那么在内存中那个数据就被称为是一个进程!
程序: 通常为二进制文件,放置在存储媒质中,以物理形式存在!
进程:程序被触发后,执行者的权限属性,程序代码以及需要的数据都会被加载到内存中,这个被称为进程!
在内存中,数据分为为如下段:
1代码段
代码段可以说是进程中最重要的一个段,该段是cpu执行的指令部分,通常这个段被称为代码段 有的书上也把这个段称为文本段!。
通常来说,子进程与父进程是共享代码段的!
2 数据段
这个部分存储的是在程序中明确给定初始值的全局变量和静态变量 例如:int max=10;(全局变量)or static int n=10;(静态变量)这些变量在内存中的数据段中存储,当程序在编译的时候确定该段的大小,在程序运行时该段大小是不变的
3 bss 段
又称缓冲段,这个部分存储的是在程序中没有给地定初始值的全局变量和静态变量,在这个数据段中,你会发现在生成的链接文件是没有包含这些全局变量
下面我们可以用一个程序来看出这个问题!
www.zhishiwu.com
#include <stdio.h>
int a[30];
int main()
{
printf("hello world/n");
return 0;
}
在添加了int a[30]后,我们发现生成的目标文件的大小是7177,没有添加后,我们发现文件的大小是7159,我们发现只是少了18个字节,而在二进制文件中,一个int a[20]这样的数组是需要30×4=120个字节的大小,从这里可以看出,这个数组并没有在这个二进制的文件中,也就是说,它被存储在另外的外存中!如果我们是将这个全局数组初始成全为0,我们发现其文件大小仍然是7177,这个说明初始化后,这个数组是写到了bss段,没有写到数据段!仍然这个数组并没有写进二进制文件中去!
4,栈
对于局部变量,还有一些函数调用所需要保存的信息(如返回的地址,函数调用前在各个寄存器中的变量)都可以保存到栈中!
总结一下,变量的存储方式,对于初始化不为0的全局变量,和静态变量保存到数据段,没有初始化,或初始化为0的全局变量保存到bss段,还有一部分变量是保存到寄存器中,
剩余绝大多数的变量是保存到栈中! www.zhishiwu.com
5,堆
堆用于存储用户申请的内存空间,系统通常在堆中进行动态的内存分配,
在c语言中进行动态内存分配的函数是malloc函数,例如: char *p=(char *)malloc(sizeof(char)) 则p就指向了申请的新内存块中的首地址!
对于常量的存储
对于简单的常量,如 '1' 'b',等常量,是随指令一起存储,也就是说,它们在代码段中,这样能够进行高效的运算,但对于复杂的常量,如字符串常量,则并不是,编译器会将其值保存到数据段中,然后把其存储的首地址随着指令存储!
作者 波风七夜