激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - Go語言共享內存讀寫實例分析

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

2020-04-18 11:29Go語言編程實例 Golang

這篇文章主要介紹了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語言程序設計有所幫助。

延伸 · 閱讀

精彩推薦
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 美乳在线观看 | 日韩黄色免费观看 | av电影手机在线看 | 亚洲性综合网 | 中文字幕一区在线观看视频 | 夏目友人帐第七季第一集 | 中文字幕欧美在线 | 欧美大逼网 | 亚洲一级毛片 | 黄网站在线免费看 | 日韩深夜视频 | 日韩大片在线永久观看视频网站免费 | 久久精品资源 | 国产日产精品一区四区介绍 | 一本一道久久久a久久久精品91 | 国产精品成人久久久久a级 男女无遮挡羞羞视频 | 久久99亚洲精品久久99果 | 国产精品一区在线观看 | 爱逼爱操综合网 | 男女隐私免费视频 | 国产精品jk白丝蜜臀av软件 | 91精品国产日韩91久久久久久360 | 成人做爽爽爽爽免费国产软件 | 天天看夜夜爽 | 久久久久久久午夜 | 精品一区二区在线播放 | 久久国产精品小视频 | 日本特级a一片免费观看 | 免费一级a毛片在线播放视 日日草夜夜操 | 亚洲影院在线 | 国产精品久久久久一区二区 | 爱射av| 国产一级一片免费播放 | 高清av在线 | 久久久tv| 日韩激情在线视频 | 中文字幕极速在线观看 | 精品国产一区二区三区久久久狼牙 | 在线观看国产 | 久久我不卡 | 久久久久国产一区二区三区不卡 |