- 主题:共享内存中的内存泄露
那加个心跳,再开一块共享内存,每个进程周期性往共享内存的scoreboard数据块写入自己的心跳时间,多少时间没有刷新就认为跪了,别的进程扫一下继续使用
【 在 ziqin 的大作中提到: 】
: 情况2
: 问题是,就算知道了对方挂了,怎么知道对方占用了哪块内存?就算设计了数据结构,又不能保证申请内存+跟新结构 这个操作是原子的
:
--
FROM 115.45.111.*
【 在 ziqin 的大作中提到: 】
: 一个process从共享内存中申请了一块内存,但是突然死机,系统直接杀掉process,所有析构函数都没有调用,所以shared_ptr, unique_ptr都没用。如果是私有内存,系统自动释放内存,但是共享内存系统不会自动释放。这种内存泄漏怎么解决?
进程退出, 无论是正常还是异常, 不存在内存不回收的问题。
因为, 应用程序分配,操作的是虚拟内存, 使用的是都只对应用程序才有意义的虚拟地址,
程序在被清理的时候, 操作系统就已经把这个应用程序的虚拟地址空间销毁了,所以,不存在
所谓的泄露。
你所说的, 其它程序并不知道这个程序占用的内存是否还处于占用。 甚至, 异常退出程序导致的共享内存
数据状态不一致。这个问题是存在的, 这个需要在服务程序设计的时候,需要做一定的处理。
据我所知, 一些共享资源句柄的在应用程序的崩溃退出会对共享的资源状态产生影响,比如,一些信号量会
产生abandon状态。 socket会给对端发送 reset状态之类的, 文件句柄也可能有类似的结果。
对应这类问题, 通过对共享资源的精细设计和对句柄使用的状态检查,是可以发现问题的。
对这类问题, 最麻烦的不是程序崩溃退出, 麻烦的是产生死锁进程, 或者类僵尸进程, 这种才是彻头彻尾的锁定泄露效应。
--
FROM 115.171.245.*
system v shared memory 了解一下:)
【 在 poggy 的大作中提到: 】
:
: 进程退出, 无论是正常还是异常, 不存在内存不回收的问题。
: 因为, 应用程序分配,操作的是虚拟内存, 使用的是都只对应用程序才有意义的虚拟地址,
: ...................
--
FROM 115.45.111.*
房子都拆了,谁会关注房间有没有打扫干净?
共享的内存,也扔了,哪来的泄漏
【 在 ziqin 的大作中提到: 】
: 一个process从共享内存中申请了一块内存,但是突然死机,系统直接杀掉process,所有析构函数都没有调用,所以shared_ptr, unique_ptr都没用。如果是私有内存,系统自动释放内存,但是共享内存系统不会自动释放。这种内存泄漏怎么解决?
--
FROM 120.244.162.*
【 在 overcomeunic 的大作中提到: 】
: system v shared memory 了解一下:)
一样要做物理地址和虚拟地址映射, 你的应用程序一样要用应用程序的虚存访问。
有一些系统会让一些高位虚拟地址和系统使用共享值,也就是把物理地址统一映射到相同的虚拟地址。
一般,这些虚拟地址会被操作系统保留以保证应用程序本身不会占用挪作它用。
--
FROM 115.171.245.*
可以重新用啊,共享内存是通过命名访问的,如果你的是有固定的命名循环用就可以了,不循环用,删掉就行了。windows有可能都不用删,我没研究过这个windows的存储位置。
【 在 ziqin 的大作中提到: 】
: 一个process从共享内存中申请了一块内存,但是突然死机,系统直接杀掉process,所有析构函数都没有调用,所以shared_ptr, unique_ptr都没用。如果是私有内存,系统自动释放内存,但是共享内存系统不会自动释放。这种内存泄漏怎么解决?
--
FROM 103.10.85.*