当前位置: 首页 > wzjs >正文

栾城区住房建设局官方网站做网站客源

栾城区住房建设局官方网站,做网站客源,长沙百度做网站多少钱,静态网站上下篇代码《网络编程卷2:进程间通信》第八章:共享内存深度解析与多进程高性能通信实践 引言 共享内存(Shared Memory) 是进程间通信(IPC)中性能最高的机制,允许多个进程直接读写同一块物理内存区域&…

《网络编程卷2:进程间通信》第八章:共享内存深度解析与多进程高性能通信实践


引言

共享内存(Shared Memory) 是进程间通信(IPC)中性能最高的机制,允许多个进程直接读写同一块物理内存区域,避免了数据拷贝开销。然而,共享内存的灵活性与高性能也伴随着复杂的同步与内存管理挑战。Richard Stevens在《网络编程卷2:进程间通信》第八章中深入剖析了共享内存的设计原理与实现细节。本文结合Linux内核源码分析多进程同步策略生产级代码实例,全面解析匿名共享内存、具名共享内存的实现机制,并给出高性能开发的最佳实践指南。


一、共享内存核心架构

1.1 物理内存与虚拟内存映射

共享内存的实现依赖于操作系统的虚拟内存管理机制:

  1. 物理内存分配:内核分配连续的物理页框。
  2. 虚拟地址映射:各进程通过页表将同一物理内存映射到自身虚拟地址空间的不同位置。
  3. 同步访问:需借助信号量、互斥锁等机制避免数据竞争。

1.2 内核数据结构(Linux 5.x)

共享内存在内核中通过struct shmid_kernel管理,关键字段如下:

struct shmid_kernel {struct kern_ipc_perm shm_perm;  // 权限控制struct file *shm_file;          // 关联的共享内存文件unsigned long shm_nattch;      // 附加进程数unsigned long shm_segsz;       // 内存段大小time_t shm_atime;              // 最后附加时间time_t shm_dtime;              // 最后分离时间time_t shm_ctime;              // 最后修改时间struct pid *shm_cprid;         // 创建进程PIDstruct pid *shm_lprid;         // 最后操作进程PIDstruct user_struct *mlock_user; // 内存锁定用户
};

二、System V共享内存

2.1 核心API与生命周期

#include <sys/ipc.h>
#include <sys/shm.h>// 创建/获取共享内存标识符
int shmget(key_t key, size_t size, int shmflg);// 附加/分离共享内存
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);// 控制操作(删除、获取信息等)
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

2.2 代码实例:进程间数据共享

写入进程(writer.c)

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>#define SHM_SIZE 4096int main() {key_t key = ftok("shmfile", 65);int shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT);char *shm_ptr = (char*)shmat(shmid, NULL, 0);strcpy(shm_ptr, "Hello System V Shared Memory!");printf("Write done. Press Enter to exit...\n");getchar();  // 阻塞等待读取进程shmdt(shm_ptr);shmctl(shmid, IPC_RMID, NULL);  // 删除共享内存return 0;
}

读取进程(reader.c)

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>int main() {key_t key = ftok("shmfile", 65);int shmid = shmget(key, 0, 0666);char *shm_ptr = (char*)shmat(shmid, NULL, SHM_RDONLY);printf("Read from shared memory: %s\n", shm_ptr);shmdt(shm_ptr);return 0;
}

运行命令

# 终端1
./writer
# 终端2
./reader

三、POSIX共享内存

3.1 基于内存映射的实现

POSIX共享内存通过shm_open创建内存文件,再使用mmap映射到进程地址空间:

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>// 创建/打开共享内存对象
int shm_open(const char *name, int oflag, mode_t mode);// 调整共享内存大小
int ftruncate(int fd, off_t length);// 内存映射
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);

3.2 代码实例:高性能计数器

#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define SHM_NAME "/posix_shm_example"
#define SHM_SIZE sizeof(int)int main() {int fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);ftruncate(fd, SHM_SIZE);int *counter = (int*)mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);*counter = 0;pid_t pid = fork();if (pid == 0) {  // 子进程累加for (int i = 0; i < 1000000; ++i) (*counter)++;munmap(counter, SHM_SIZE);} else {         // 父进程累加for (int i = 0; i < 1000000; ++i) (*counter)++;munmap(counter, SHM_SIZE);wait(NULL);printf("Final counter: %d\n", *counter);  // 预期2000000,但存在竞争!}shm_unlink(SHM_NAME);return 0;
}

问题分析
该示例存在数据竞争,正确实现需结合信号量同步。


四、匿名共享内存

4.1 基于mmap的匿名映射

匿名共享内存不依赖文件系统,通过MAP_ANONYMOUS标志创建:

void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

4.2 代码实例:父子进程通信

#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>#define SHM_SIZE 4096int main() {void *shm_ptr = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);pid_t pid = fork();if (pid == 0) {  // 子进程写入sprintf((char*)shm_ptr, "Hello from child process!");_exit(0);} else {         // 父进程读取wait(NULL);printf("Parent received: %s\n", (char*)shm_ptr);munmap(shm_ptr, SHM_SIZE);}return 0;
}

五、共享内存同步策略

5.1 信号量同步示例

结合POSIX信号量实现原子计数:

#include <fcntl.h>
#include <sys/mman.h>
#include <semaphore.h>struct shared_data {sem_t sem;int counter;
};int main() {int fd = shm_open("/sync_shm", O_CREAT | O_RDWR, 0666);ftruncate(fd, sizeof(struct shared_data));struct shared_data *data = mmap(NULL, sizeof(*data), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);sem_init(&data->sem, 1, 1);  // 进程间信号量需设为1(pshared=1)pid_t pid = fork();if (pid == 0) {  // 子进程for (int i = 0; i < 1000000; ++i) {sem_wait(&data->sem);data->counter++;sem_post(&data->sem);}_exit(0);} else {         // 父进程for (int i = 0; i < 1000000; ++i) {sem_wait(&data->sem);data->counter++;sem_post(&data->sem);}wait(NULL);printf("Final counter: %d\n", data->counter);  // 正确输出2000000}sem_destroy(&data->sem);shm_unlink("/sync_shm");return 0;
}

六、高级主题与性能优化

6.1 大页内存(Huge Pages)

  • 优势:减少TLB Miss,提升内存访问性能。
  • 配置方法
    # 预留2MB大页
    echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
    
  • 代码使用
    void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_HUGETLB, fd, 0);
    

6.2 内存屏障(Memory Barrier)

确保指令执行顺序,避免乱序优化导致数据不一致:

__asm__ __volatile__("" ::: "memory");  // 编译器屏障
__sync_synchronize();                   // 硬件内存屏障

七、System V与POSIX共享内存对比

特性System V共享内存POSIX共享内存
标识方式键值(key_t文件名(/name格式)
生命周期显式删除(shmctl可设置自动删除(shm_unlink
访问控制ipc_perm结构体文件权限(mode_t
内存映射必须通过shmat附加直接使用mmap
扩展性适合小规模固定内存支持动态调整大小(ftruncate
性能略低(额外系统调用)更高(与文件系统深度集成)

八、应用场景与最佳实践

8.1 典型应用场景

  • 数据库缓存:多个进程共享查询缓存(如Redis)。
  • 实时数据处理:高频传感器数据共享(如自动驾驶系统)。
  • 机器学习推理:大模型参数在多进程间共享。

8.2 开发注意事项

  1. 内存对齐:使用posix_memalign确保缓存行对齐。
  2. 错误处理:检查所有系统调用返回值,处理ENOMEM等错误。
  3. 资源泄漏:确保munmapshm_unlink成对调用。

九、总结与扩展

共享内存作为性能最高的IPC机制,在需要低延迟、高吞吐量的场景中不可替代。本文从内核实现到应用层开发,详细解析了共享内存的核心原理与实战技巧,并给出了同步策略与性能优化方法。进一步学习方向包括:

  • 分布式共享内存(DSM):跨多机节点的内存共享技术。
  • RDMA(远程直接内存访问):绕过内核的网络内存访问。
  • 持久化内存(PMEM):Intel Optane等非易失内存技术。

掌握这些高级主题,将帮助您构建下一代高性能计算系统。


版权声明:本文采用 CC BY-SA 4.0 协议,转载请注明出处。

http://www.dtcms.com/wzjs/576317.html

相关文章:

  • 成都房地产网站开发广东网站建设怎么选
  • 七个php源码下载的网站学网页设计需要什么基础
  • 潍坊网站建设技术外包wordpress 改版权
  • 深圳做网站开发费用企业管理培训课程内容
  • 上海产品网站建设网站备案流程实名认证
  • 为什么要建立电子商务网站网站开发的职业认知报告
  • 广东建设职业技术学院网站科技部网站建设合同
  • 宁德营销型网站建设网络公司简介模板
  • 手机网站建设要素做一元云购网站
  • 网站一般怎么维护if设计大赛官网
  • c网站开发视频教程怎么制作app软件教程
  • 上国外网站用什么机箱好网站的标志可以修改吗
  • 网站开发端安次区建设局网站
  • 建设汽车行业网站wordpress插件下载失败
  • 无锡外贸网站制作免费网络推广的方法
  • 北京网站设计制作关键词搜索引擎优化排名案例
  • 网站移动端是什么网站建设及编辑岗位职责
  • 云南站群网站建设地方门户信息网站建设方案
  • 找网络公司做的网站到期后 备案的域名属于备案企业还是网络公司简述电子商务网站的建站流程
  • 什么网站可以做微招聘网站建设可行性报告模板
  • 新会区住房和城乡建设局网站四川建设网站公司
  • 灵犀科技网站建设wordpress 搬家 空白
  • 营销型网站备案网站首页是动态的视频怎么做
  • 怎样做一个简单的网站小程序制作流程收费
  • 某绿色园林企业网站源码免费做网站刮刮卡
  • 邗江区城乡建设局网站快站app
  • 学校网站建设情况说明上海高端建站网站
  • 一家只做正品的网站网站 百度地图
  • 惠州网站建设如何沈阳seo博客
  • 去哪个网站找建筑图纸石家庄网站建设团队