当前位置:  技术问答>linux和unix

共享内存入门问题,大家指教,小弟初学。谢谢

    来源: 互联网  发布时间:2016-04-25

    本文导语:  1、mmap和shm系列函数建立的都是共享内存吗?还是mmap不是? 2、共享内存是个什么概念?(不要只从书本上说) 3、如果shm和mmap建立的都是共享内存,我在用shm建立之后用open打开那个文件,在用mmap映射但是失败,是...

1、mmap和shm系列函数建立的都是共享内存吗?还是mmap不是?
2、共享内存是个什么概念?(不要只从书本上说)
3、如果shm和mmap建立的都是共享内存,我在用shm建立之后用open打开那个文件,在用mmap映射但是失败,是已经在内存中的东西不可以mmap了,还是mmap和shm不是互相通用的?
4、linux中mmap的实现是怎么样的?如何实现这个东西的,像驱动和文件系统中,只要简单说明原理即可。

|
1、mmap和shm系列函数建立的都是共享内存吗?还是mmap不是? 
[joyself] 都可以。

对于posix共享内存,通常是两种方法:

1). 内存映射文件(memory-mapped file): 由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间。
2). 共享内存区对象(shared-memory object): 由shm_open打开一个POSIX.1 IPC名字(也许是在文件系统中的一个路径名),
所返回的描述符由mmap函数映射到当前进程地址空间。


POSIX内存映射文件
          fd = open(pathname, ...);
            
             
              
ptr=mmap(..., fd, ...)


POSIX共享内存区对象
           fd = shm_open(name, ...);
            
             
              
ptr=mmap(..., fd, ...)


对于System V共享内存,

用shmget,shmat,shmdt。
shmget函数创建一个尚未存在的共享内存区,或者访问一个已经存在的共享内存区
shmat把用shmget得到的共享内存区,attach到当前进程的地址空间。
shmdt 很明显是shmdt的反操作(detach)

看起来很像POSIX共享内存里的shm_open, mmap, munmap。

          
2、共享内存是个什么概念?(不要只从书本上说) 

[joyself] 书上说得也没什么不好啊 :) 
如果是有血缘关系的进程间通信,父进程在调用fork之前先指定以MAP_SHARED调用mmap,POSIX.1保证父进程中的内存映射关系存留到子进程中。父进程所作的修改子进程能看到,反之亦然。

3、如果shm和mmap建立的都是共享内存,我在用shm建立之后用open打开那个文件,在用mmap映射但是失败,是已经在内存中的东西不可以mmap了,还是mmap和shm不是互相通用的? 
[joyself] 用法不对。 一旦内存映射了一个文件,我们就不要再用open,read,write去访问该文件;我们只需要存取已有mmap映射到该文件的内存位置。(思考一下,没有重新得到文件描述符,而不是跟之前的一样用MAP_SHARED,如何共享?)
4、linux中mmap的实现是怎么样的?如何实现这个东西的,像驱动和文件系统中,只要简单说明原理即可。
[joyself] 驱动实现file_operations里的mmap方法。而mmap里一般会调用remap_pfn_range,它主要是把内存地址从内核空间映射到用户空间。应用程序通过mmap系统调用调用内核里的mmap方法。


你可以参考 Unix网络编程 第二卷 的第四部分 共享内存。

还有IBM网站关于 共享内存 的 文章
http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html

|


大部分看的是 UNP V2 第四部分,是经过自己的理解之后的。

|
2)
说得简单点,跟多个进程读一个文件的概念差不多,需要协调和同步。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 初学者关于共享内存的几个问题-->
  • 初学请教:samba配置好后,为何windows还是无法看到linux的共享资源呢
  • Linux 共享内存介绍及实现代码
  • NFS共享作业时, 在客户端只可以看到服务器端的共享目录,而看不到共享目录下的内容.?
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • 多个进程对系统V共享内存进行读写,怎样实现对共享内存部分进行加解锁?
  • 如何共享 共享库(*.so)中的变量?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?
  • 用samba共享其它机子访问Linux共享时,机子可以进入,但要打开共享文件夹时提示“无法访问...找不到网络名。”这是什么原因呢?
  • 局域网中的红旗2.0如何共享到win98服务器的联接共享?
  • 在linux下能不能创建一个堆,然后给堆指定一块共享内存,然后各个程序用此堆来new对象来共享?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?解决立即给分
  • 几个servlet共享一些数据 如我从数据库里读出一些重要的设置存入vector 让几个servlet共享 怎么做到?先谢
  • 求助linux普通用户下内存共享(系统V共享)大家进来看看啊!急!!
  • 关于中断共享的问题:ADC 与触摸屏的中断共享
  • 不同用户user之间如何访问共享内存?
  • 无法访问samba服务器中的共享文件夹
  • XP下设置与linux 本地连接的Internet共享问题
  • Unix/linux下如何监测共享内存的使用情况
  • 【求助】linux下什么是共享内存,怎么查看。
  • 我想知道LINUX如何与WIN98,WIN2000共享资源?
  • 判断共享内存中是否有数据
  • 多进程共享变量


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    网络技术 iis7站长之家