通常情况下,往往忽视程序运行的细节,而内核却是严格的控制程序的运行空间,而我们却经常的忽视它的细节,如果在多线程编程中,这些细节确实不能忽视的,那么内核是怎么管理程序的运行空间的?
内核会给每个运行的程序一个自己的运行空间,也就是内存中的一段区域,这段区域的大小是由程序的代码量和程序的数据量决定的,程序需要存放要运行的代码、数据、堆、栈。
![](http://blogimg.chinaunix.net/blog/upfile2/090328155730.jpg)
test段/code段:,这里的正文区,就是存放代码的地方,而
DATA段: 初始化数据区,就是存放我们平常说的全局变量,需要注意的是这里存储的全局变量必须是带有初始化值的全局变量,也就是在任何函数外边定义的变量。
BSS段:而未初始化的全局变量会存储在BSS段,同时平常定义的static型的数据也存储在BSS段,如果你在函数中使用exec函数族,那么调用函数的一些信息也会存放在这块区域,
而堆区,就是是用malloc()、ralloc()此类函数的时候,申请的存储区域。
至于栈区,这个大家都比较熟悉了,如果你要在函数内调用函数,在执行被调用函数前,主函数的相关信息换放在这块区域。最顶部的命令行和环境变量区,这个在linux系统中,是非常重要的,我们平常写的程序不太符合内核的要求,内核需要每个函数都要返回值,通过这个返回值,来知道这个函数的执行情况,对与每个main()函数,定义应该为 : int main( int argv,void *argv);main函数的这两个参数就会存放在这块区域,同时,调用函数的shell 相关信息也会在这块区域中找到。 总结下,栈区存放的主要定义的局部变量、保存运行的上下文信息、和一些函数调用的行参。
DATA段: 初始化数据区,就是存放我们平常说的全局变量,需要注意的是这里存储的全局变量必须是带有初始化值的全局变量,也就是在任何函数外边定义的变量。
BSS段:而未初始化的全局变量会存储在BSS段,同时平常定义的static型的数据也存储在BSS段,如果你在函数中使用exec函数族,那么调用函数的一些信息也会存放在这块区域,
而堆区,就是是用malloc()、ralloc()此类函数的时候,申请的存储区域。
至于栈区,这个大家都比较熟悉了,如果你要在函数内调用函数,在执行被调用函数前,主函数的相关信息换放在这块区域。最顶部的命令行和环境变量区,这个在linux系统中,是非常重要的,我们平常写的程序不太符合内核的要求,内核需要每个函数都要返回值,通过这个返回值,来知道这个函数的执行情况,对与每个main()函数,定义应该为 : int main( int argv,void *argv);main函数的这两个参数就会存放在这块区域,同时,调用函数的shell 相关信息也会在这块区域中找到。 总结下,栈区存放的主要定义的局部变量、保存运行的上下文信息、和一些函数调用的行参。
相关热门文章
给主人留下些什么吧!~~
评论热议