当前位置: 技术问答>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的实现是怎么样的?如何实现这个东西的,像驱动和文件系统中,只要简单说明原理即可。
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
[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)
说得简单点,跟多个进程读一个文件的概念差不多,需要协调和同步。
说得简单点,跟多个进程读一个文件的概念差不多,需要协调和同步。