上一篇
(更新于2025年8月,基于CLinux最新内核优化)
根据CLinux官方发布,2025年8月更新的5.19版本内核对共享内存管理进行了三项关键优化:
shmctl
系统调用异步清理模式,减少资源释放时的进程阻塞 💡 提示:建议所有生产环境升级至CLinux 5.19+,并通过
cat /proc/version
确认内核版本。
共享内存(Shared Memory)是Linux进程间通信(IPC)的最高效方式,但若释放不当会导致:
graph TD A[创建共享内存] --> B[映射到进程空间] B --> C[使用完毕] C --> D[解除映射] D --> E[删除共享内存段]
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> #define SHM_KEY 0x123456 // 唯一键值,可通过ftok生成 #define SHM_SIZE 1024 * 1024 // 1MB int main() { // 1. 创建共享内存段 int shmid = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666); if (shmid == -1) { perror("shmget failed"); exit(EXIT_FAILURE); } // 2. 映射到进程地址空间 void *shm_addr = shmat(shmid, NULL, 0); if (shm_addr == (void*)-1) { perror("shmat failed"); exit(EXIT_FAILURE); } // 3. 使用共享内存(示例:写入数据) sprintf(shm_addr, "Hello from Process %d!", getpid()); // 4. 关键步骤:解除映射 if (shmdt(shm_addr) == -1) { perror("shmdt failed"); // ❌ 常见错误:未执行此步骤导致内存残留 } // 5. 最终步骤:删除共享内存段 if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl failed"); // 💡 提示:删除后其他进程无法再访问该段 } printf("Shared memory released successfully!\n"); return 0; }
ipcs -m
显示SHMID
状态为dest
# 手动删除残留段 ipcrm -m <SHMID> # 或通过脚本批量清理 for shmid in $(ipcs -m | grep -v "SHMID" | awk '{print $2}'); do ipcrm -m $shmid done
/dev/shm
目录下存在.deleted
文件 // 使用shm_unlink替代rm命令 #include <sys/mman.h> shm_unlink("/my_shm_file"); // 确保所有进程已调用munmap
# 限制共享内存的NUMA节点 echo "0-1" > /proc/<PID>/numa_maps # 或通过mount选项绑定节点 mount -o remount,mpol=bind:/dev/shm /dev/shm
#!/bin/bash # 保存为shm_monitor.sh,需root权限运行 while true; do clear echo "=== Shared Memory Monitor ===" ipcs -m | grep -E "SHMID|key" echo -e "\n/dev/shm Usage: $(du -sh /dev/shm | cut -f1)" sleep 2 done
valgrind --tool=memcheck
(检测C/C++内存泄漏) 💬 互动话题:你在共享内存管理中遇到过哪些奇葩问题?欢迎留言讨论!
本文由 业务大全 于2025-08-22发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://cloud.7tqx.com/wenda/689683.html
发表评论