Golang のプロセス間通信で共有メモリを実装する方法
Go言語では、共有メモリを利用することでプロセス間通信を行うことができます。代表的な方法は以下のとおりです。
- システムコール
- shmopen
import "syscall"
// 打开共享内存对象
fd, err := syscall.ShmOpen("my_shared_memory", syscall.O_RDWR|syscall.O_CREAT, 0666)
if err != nil {
panic(err)
}
- システムコール
- ファイル切り捨て
// 设置共享内存的大小
err = syscall.Ftruncate(fd, size)
if err != nil {
panic(err)
}
- システムコール
- mmap
// 将共享内存映射到进程的地址空间中
addr, err := syscall.Mmap(fd, 0, size, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
if err != nil {
panic(err)
}
- プロセス間の通信には共有メモリーの読み書き機能を使用することもできます。
// 写入数据到共享内存
data := []byte("Hello, shared memory!")
copy(addr, data)
// 读取共享内存中的数据
receivedData := make([]byte, len(data))
copy(receivedData, addr)
fmt.Println(string(receivedData))
- システムコール
- マンプ
- システムコール
- それだけで十分です。
// 解除共享内存的映射
err = syscall.Munmap(addr)
if err != nil {
panic(err)
}
// 关闭共享内存对象
err = syscall.Close(fd)
if err != nil {
panic(err)
}
共有メモリの具体的な実装方法はOSによって異なる場合があるため、OSに合わせて実装を調整する必要があります。また、共有メモリは複数のプロセスが同一のメモリ領域にアクセスするため、データの不整合を避けるために同期と排他制御の問題に注意する必要があります。