linux之地址空间
2016-06-04 14:39
281 查看
程序:一组指令的有效集合。它是静态的,不具有任何的运行意义。程序最终转换为二进制文件。
进程:程序的执行就是进程。可以把它看成独立的程序,在内存中有其对应的代码空间和数据空间。一个进程所拥有的数据和代码只属于自己。进程是资源分配的基本单位,也是调度运行的基本单位。
进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程。
进程还具有并发性和交往性,而程序却是封闭的。
这节中有几个重要的问题,我举个例子给大家看吧~
第一例:
![](http://img.blog.csdn.net/20160604152811545?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这段代码是说什么的呢?显然,它输出了函数、初始化的变量,未初始化的变量,堆区,栈区的地址,那么,这些地址有什么规律呢?
![](http://img.blog.csdn.net/20160604153026859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看的出来,它的地址是依次从低地址到高地址。
然而,还有一类特殊的函数---主函数,它的地址是如何分布的呢?
![](http://img.blog.csdn.net/20160604154532036?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
地址为:
![](http://img.blog.csdn.net/20160604154706523?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
显然,,带有命令行参数的主函数的地址比前面比较的栈区的地址还要大。
所以就有了如图的地址空间:(如果地址空间中的数都是连续的,则我们称之为线性地址空间)
![](http://img.blog.csdn.net/20160604155147475?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
第二例:
父进程和子进程:
![](http://img.blog.csdn.net/20160604160329904?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
运行结果为:
![](http://img.blog.csdn.net/20160604160405858?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在这里,我们会不会很奇怪一个问题呢?这里将if和else里边的内容都执行了。然而在我们经常编写的代码中,if和else是不能同时执行的。进程却在这里做到了。
fork():是创建子进程。这里的getpid()是获取到子进程的pid,getppid()是获取到父进程的pid(即这里的2677);
我们发现,父进程和子进程指向的是同一块内存,那么我们也应该想到他们的指向也应该是一样的,(这只是我们的推测哦),,看个例子我们就知道了。
eg:
![](http://img.blog.csdn.net/20160604170540662?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
结果是什么呢?
![](http://img.blog.csdn.net/20160604170644209?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
看到那个200和100了吗?它们的值竟然不一样。
说明它们并不是同一个指向,那么为什么地址一样呢?这里就引出了我们的虚拟地址。
虚拟地址空间:在一个带有虚拟存储器的系统中,cpu从一个有N=2的n次方个地址的地址空间中生成虚拟地址。
如图所示:
![](http://img.blog.csdn.net/20160604171356106?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在这里,虚拟地址空间通过页表和MMU(存储器管理单元)映射到物理地址中,它们的物理地址是不相等的,所以最后得到的值也不相等。
今天的内容先说到这里喽。~~~
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/tongue.gif)
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/tongue.gif)
欢迎来访,多多提议哦。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/shy.gif)
进程:程序的执行就是进程。可以把它看成独立的程序,在内存中有其对应的代码空间和数据空间。一个进程所拥有的数据和代码只属于自己。进程是资源分配的基本单位,也是调度运行的基本单位。
进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程。
进程还具有并发性和交往性,而程序却是封闭的。
这节中有几个重要的问题,我举个例子给大家看吧~
第一例:
这段代码是说什么的呢?显然,它输出了函数、初始化的变量,未初始化的变量,堆区,栈区的地址,那么,这些地址有什么规律呢?
可以看的出来,它的地址是依次从低地址到高地址。
然而,还有一类特殊的函数---主函数,它的地址是如何分布的呢?
地址为:
显然,,带有命令行参数的主函数的地址比前面比较的栈区的地址还要大。
所以就有了如图的地址空间:(如果地址空间中的数都是连续的,则我们称之为线性地址空间)
第二例:
父进程和子进程:
运行结果为:
在这里,我们会不会很奇怪一个问题呢?这里将if和else里边的内容都执行了。然而在我们经常编写的代码中,if和else是不能同时执行的。进程却在这里做到了。
fork():是创建子进程。这里的getpid()是获取到子进程的pid,getppid()是获取到父进程的pid(即这里的2677);
我们发现,父进程和子进程指向的是同一块内存,那么我们也应该想到他们的指向也应该是一样的,(这只是我们的推测哦),,看个例子我们就知道了。
eg:
结果是什么呢?
看到那个200和100了吗?它们的值竟然不一样。
说明它们并不是同一个指向,那么为什么地址一样呢?这里就引出了我们的虚拟地址。
虚拟地址空间:在一个带有虚拟存储器的系统中,cpu从一个有N=2的n次方个地址的地址空间中生成虚拟地址。
如图所示:
在这里,虚拟地址空间通过页表和MMU(存储器管理单元)映射到物理地址中,它们的物理地址是不相等的,所以最后得到的值也不相等。
今天的内容先说到这里喽。~~~
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/tongue.gif)
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/tongue.gif)
欢迎来访,多多提议哦。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/shy.gif)
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/shy.gif)
相关文章推荐
- Linux中通配符的作用
- Linux学习之正则表达式
- screen ssh 上边虚拟窗口的运行
- Linux编码风格简述
- Ubuntu安装sunpinyin输入法
- 嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程
- 嵌入式Linux ARM汇编(六)——GNU ARM汇编编程
- linux find指令详解
- linux scp 无密码复制文件和目录
- Linux下创建ftp用户并锁定根目录
- Linux date使用
- Linux 常见命令说明
- Linux查找替换
- linux 运行级别修改
- linux&windows双系统:linux访问windows文件,出现ntfs问题
- linux中cat指令的用法
- ip_forward路由转发
- linux常用的命令
- Linux中的configure、pkg-config、pkg_config_path
- linux 下解压命令汇总