亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go語言共享內存讀寫實例分析

2020-04-01 19:19:04
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Go語言共享內存讀寫方法,實例分析了共享內存的原理與讀寫技巧,具有一定參考借鑒價值,需要的朋友可以參考下
 

本文實例分析了Go語言共享內存讀寫的方法。分享給大家供大家參考。具體分析如下:

前面分析了Go語言指針運算和內嵌C代碼的方法,做了一個Go語言共享內存讀寫的實驗。

先大概說下什么是共享內存。我們知道不同進程見的內存是互相獨立的,沒辦法直接互相操作對方內的數據,而共享內存則是靠操作系統提供的內存映射機制,讓不同進程的一塊地址空間映射到同一個虛擬內存區域上,使不同的進程可以操作到一塊共用的內存塊。共享內存是效率最高的進程間通訊機制,因為數據不需要在內核和程序之間復制。

共享內存用到的是系統提供的mmap函數,它可以將一個文件映射到虛擬內存的一個區域中,程序使用指針引用這個區域,對這個內存區域的操作會被回寫到文件上,Go內置的syscall包中有mmap函數,但是它是經過封裝的,返回的是[]byte,沒辦法做我需求的指針運算,所以我還是用cgo來調用原生的mmap。

實驗分為讀和寫兩個程序,這樣我們可以觀察到讀進程可以讀到寫進程寫入共享內存的信息。

下面是shm_writer.go的代碼:

復制代碼代碼如下:
package main
/*
#cgo linux LDFLAGS: -lrt
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int my_shm_new(char *name) {
    shm_unlink(name);
    return shm_open(name, O_RDWR|O_CREAT|O_EXCL, FILE_MODE);
}
*/
import "C"
import (
    "fmt"
    "unsafe"
)
const SHM_NAME = "my_shm"
const SHM_SIZE = 4 * 1000 * 1000 * 1000
type MyData struct {
    Col1 int
    Col2 int
    Col3 int
}
func main() {
    fd, err := C.my_shm_new(C.CString(SHM_NAME))
    if err != nil {
        fmt.Println(err)
        return
    }
    C.ftruncate(fd, SHM_SIZE)
    ptr, err := C.mmap(nil, SHM_SIZE, C.PROT_READ|C.PROT_WRITE, C.MAP_SHARED, fd, 0)
    if err != nil {
        fmt.Println(err)
        return
    }
    C.close(fd)
    data := (*MyData)(unsafe.Pointer(ptr))
    data.Col1 = 100
    data.Col2 = 876
    data.Col3 = 8021
}

 

下面是shm_reader.go的代碼:

復制代碼代碼如下:
package main
/*
#cgo linux LDFLAGS: -lrt
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int my_shm_open(char *name) {
    return shm_open(name, O_RDWR);
}
*/
import "C"
import (
    "fmt"
    "unsafe"
)
const SHM_NAME = "my_shm"
const SHM_SIZE = 4 * 1000 * 1000 * 1000
type MyData struct {
    Col1 int
    Col2 int
    Col3 int
}
func main() {
    fd, err := C.my_shm_open(C.CString(SHM_NAME))
    if err != nil {
        fmt.Println(err)
        return
    }
    ptr, err := C.mmap(nil, SHM_SIZE, C.PROT_READ|C.PROT_WRITE, C.MAP_SHARED, fd, 0)
    if err != nil {
        fmt.Println(err)
        return
    }
    C.close(fd)
    data := (*MyData)(unsafe.Pointer(ptr))
    fmt.Println(data)
}

 

上面的程序映射了一塊4G的虛擬內存,用來證明mmap沒有實際占用4G內存,而是用到了虛擬內存。

shm_writer創建好共享內存以后,往內存區域寫入了一個結構體,shm_reader則讀出一個結構體。

內嵌的C代碼中有一行 :

復制代碼代碼如下:
#cgo linux LDFLAGS: -lrt

因為mmap在Mac上不需要連接librt,在linux上則需要,所以做了一個條件鏈接,這是cgo提供的功能。

 

上面代碼中還用到一個cgo的技巧,像shm_open和mmap函數在錯誤時會返回errno,如果我們在go中使用多返回值語法,cgo會自己把錯誤碼轉換成錯誤信息,很方便的功能。

希望本文所述對大家的Go語言程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区玩具在线观看| 欧美一区二区三区艳史| 国产日韩精品在线| 久久精品久久久久久国产 免费| 国产一区二区动漫| 精品国模在线视频| 国产精品久在线观看| 亚洲美女动态图120秒| 久久久久久一区二区三区| 欧美精品少妇videofree| 成人福利网站在线观看11| 国产精品在线看| 亚洲欧美另类在线观看| 亚洲人成电影网站| 亚洲a成v人在线观看| 国产成人精品日本亚洲| 久久国内精品一国内精品| 亚洲成人网在线观看| 精品亚洲aⅴ在线观看| 国产精品视频一区二区高潮| 亚洲一区中文字幕在线观看| 成人h视频在线| 一区二区在线视频播放| 日韩中文理论片| 97视频网站入口| 成人黄在线观看| 91理论片午午论夜理片久久| 亚洲一区制服诱惑| 一个人看的www欧美| 亚洲韩国日本中文字幕| 一区二区国产精品视频| 亚洲一区二区三区香蕉| 不卡av电影院| 国产精品日日摸夜夜添夜夜av| 欧美视频免费在线| 九九热精品视频国产| 国产91对白在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 成人av电影天堂| 国产精品视频区1| 欧洲亚洲免费视频| 国模吧一区二区三区| 精品国产福利在线| 欧美电影免费播放| 亚洲免费视频在线观看| 日韩成人激情视频| 精品亚洲一区二区三区在线观看| 激情久久av一区av二区av三区| 亚洲毛片在线免费观看| 色综合色综合久久综合频道88| 国产成人精品在线观看| 91亚洲精品一区二区| 亚洲女同性videos| 97精品在线观看| 欧美大片免费观看| 国产在线观看91精品一区| 日韩av电影手机在线观看| 久久精品色欧美aⅴ一区二区| 黄色91在线观看| 性色av一区二区三区在线观看| 国产亚洲精品综合一区91| 欧美一区二区色| 久热精品视频在线观看一区| y97精品国产97久久久久久| 亚洲综合自拍一区| 岛国av一区二区三区| 欧美在线观看www| 91午夜在线播放| 97久久久免费福利网址| 久久夜色撩人精品| 久久视频这里只有精品| 97视频在线观看视频免费视频| 日韩av网站导航| 色999日韩欧美国产| 91国产高清在线| 日韩成人av在线播放| 色琪琪综合男人的天堂aⅴ视频| 热久久美女精品天天吊色| 久久久精品国产网站| 日韩中文字幕精品| 欧美色欧美亚洲高清在线视频| 日韩成人在线视频网站| 伊人亚洲福利一区二区三区| 日韩欧美成人精品| 97香蕉超级碰碰久久免费的优势| 国产极品精品在线观看| 国产精品成人免费电影| 中文字幕日韩精品有码视频| 亚洲国产精品嫩草影院久久| 亚洲国产小视频在线观看| 欧美成人精品不卡视频在线观看| 国产精品尤物福利片在线观看| 在线亚洲午夜片av大片| 亚洲乱亚洲乱妇无码| 色偷偷噜噜噜亚洲男人的天堂| 欧美日本高清一区| 久久久免费精品| 欧美乱大交xxxxx另类电影| 韩国三级日本三级少妇99| 国产成人亚洲综合青青| 在线视频中文亚洲| 国产精品久久久久久久久久新婚| 国产欧美在线观看| 97精品视频在线观看| 日韩视频一区在线| 黑人欧美xxxx| 热草久综合在线| 欧美性视频网站| 日韩av在线一区| 欧美大片第1页| 日韩精品免费看| 亚洲精品国产电影| 久久久成人的性感天堂| 久久久天堂国产精品女人| 最新国产精品亚洲| 国产综合视频在线观看| 成人精品视频久久久久| 色综合久综合久久综合久鬼88| 国产精品久久久久久久久久久久久| 国产做受高潮69| 欧美日韩免费在线| 亚洲欧美国产一区二区三区| 国产精品欧美一区二区三区奶水| 亚洲xxxxx| 亚洲电影av在线| 日韩精品免费在线观看| 日韩中文字幕国产精品| 久久久久日韩精品久久久男男| 精品国产一区av| 久久免费在线观看| 欧美午夜精品久久久久久浪潮| 成人福利在线观看| 国产精品一区久久| 黑人极品videos精品欧美裸| 日韩av手机在线观看| 国产精品成人av性教育| 国产成人一区二区在线| 国产日韩欧美黄色| 蜜月aⅴ免费一区二区三区| 亚洲xxxx妇黄裸体| 国自在线精品视频| 97欧美精品一区二区三区| 日韩av在线天堂网| 亚洲最大中文字幕| 久久91精品国产91久久久| 国产精品露脸自拍| 97不卡在线视频| 4p变态网欧美系列| 日韩国产高清污视频在线观看| 国产91网红主播在线观看| 亚洲精品免费一区二区三区| 国产在线精品自拍| 久久中国妇女中文字幕| 日韩色av导航| 国内成人精品一区| 国产精品第1页| 久久精品电影网站| 亚洲高清在线观看| 亚洲福利视频专区| www.亚洲男人天堂| 最近2019年日本中文免费字幕| 福利二区91精品bt7086| 福利一区视频在线观看| 亚洲天堂视频在线观看|