当前位置: 技术问答>linux和unix
shmat(shmid,NULL,0)) shmid相同的话,每次成功调用返回地址是一样,还是不确定
来源: 互联网 发布时间:2016-05-12
本文导语: 主函数创建两个子进程,每个子进程都有addr = shmat(shmid,NULL,0)) //其中shmid相同 可我发现两个子进程的addr都是一样的,是碰巧还是什么? shmat(shmid,NULL,0)) shmid相同的话,每次成功调用返回地址是一样,还是不确...
主函数创建两个子进程,每个子进程都有addr = shmat(shmid,NULL,0)) //其中shmid相同
可我发现两个子进程的addr都是一样的,是碰巧还是什么?
shmat(shmid,NULL,0)) shmid相同的话,每次成功调用返回地址是一样,还是不确定?
可我发现两个子进程的addr都是一样的,是碰巧还是什么?
shmat(shmid,NULL,0)) shmid相同的话,每次成功调用返回地址是一样,还是不确定?
|
不一定相同,相同只是偶然现象。
内核为程序分配一块共享内存,这时的地址还是内核地址,需要影射到进程的地址空间,影射过程中,从高地址忘下查找,直到找到空闲,就使这个地址对应那段共享内存空间。
内核为程序分配一块共享内存,这时的地址还是内核地址,需要影射到进程的地址空间,影射过程中,从高地址忘下查找,直到找到空闲,就使这个地址对应那段共享内存空间。
|
刚想了一下,这样测估计还是一样的,堆内存跟共享内存用的不是同一块地方
可以这样测试:其中一个子进程先申请一点共享内存,shmid为其他的什么值,反正与接下来的shmid不一样就可以了,然后再调用shmat(shmid,NULL,0)),这个时候返回的地址应该就跟另外一个子进程不一样
共享内存使用的是内存结构中的文件映射区
具体的内存分布,可以看一下这篇文章:http://blog.csdn.net/eroswang/archive/2007/04/02/1549110.aspx
可以这样测试:其中一个子进程先申请一点共享内存,shmid为其他的什么值,反正与接下来的shmid不一样就可以了,然后再调用shmat(shmid,NULL,0)),这个时候返回的地址应该就跟另外一个子进程不一样
共享内存使用的是内存结构中的文件映射区
具体的内存分布,可以看一下这篇文章:http://blog.csdn.net/eroswang/archive/2007/04/02/1549110.aspx
|
应该是不确定的...
楼主可以测试一下,在其中一个子进程里增加一个逻辑,申请一点点堆内存,然后再调用shmat(shmid,NULL,0))
两个子进程返回的应该就不一样了。。。test it
楼主可以测试一下,在其中一个子进程里增加一个逻辑,申请一点点堆内存,然后再调用shmat(shmid,NULL,0))
两个子进程返回的应该就不一样了。。。test it
|
申请分配的共享内存地址空间是固定的。
两个子进程使用的时候用的是同一个共享内存,而且你指定了由系统返回
共享内存的地址,所以返回的地址是一样的
两个子进程使用的时候用的是同一个共享内存,而且你指定了由系统返回
共享内存的地址,所以返回的地址是一样的
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。