浅谈mmap
mmap能将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系。普通文件在被映射到进程地址空间后,进程可以像访问普通内存一样访问文件,不必通过read()、write()等系统调用来访问文件。
mmap接口描述1234567891011121314151617#include <sys/mman.h>void *mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);// addr: 内存空间上的起始地址,一般为NULL,内核自动分配// length: 字节数// prot: 共享内存的访问权限/*PROT_READPROT_WRITEPROT_EXECPROT_NONE*/// flags:// fd: 文件描述符// offset: 偏移量// 返回值: 文件映射到进程空间的地址。
匿名映射匿名映射没有对应的文件。fork()得到的子进程会拷贝父进程映射后的空间,同时也继承了mmap()的返回地址,从而实现进程间 ...
go:并发
Go语言使用go语句开启一个新的运行期线程,即goroutine,以一个不同的、新创建的goroutine来执行一个函数。同一个程序中的所有goroutine共享一个地址空间。
123456789101112131415161718package main import ( "fmt" "time")func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) }}func main () { go say("world") say("hello")}// 该代码的运行结果不唯一,因为是两个goroutine在执行
通道通道是用来传递数据的数据结构
通道可用于两个goroutine之间通过传递一个指定类型的值来同步运行和通讯。操作符<-用 ...
go:方法与接口
7.1 接口的定义Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。
Go 语言中的接口是隐式实现的,也就是说,如果一个类型实现了一个接口定义的所有方法,那么它就自动地实现了该接口。因此,我们可以通过将接口作为参数来实现对不同类型的调用,从而实现多态。
12345type iface struct { tab *itab; data unsafe.Pointer }
7.2 接口使用实例12345678910111213141516171819202122232425262728293031323334package mainimport ( "fmt")type Phone interface { // 定义了一个接口Phone, 有方法call() call()}type NokiaPhone struct { // 接口P ...
go:数据
5.1 字符串string字符串是不可变字符序列
默认值为空串,而不是空指针。
遍历
12345678910111213func main() { s := 'Hello, world' // byte for i := 0; i < len(s); i++ { println("%d: [%c]\n", i, s[i]); } // rune for i, c := range s { println("%d ,[%c]\n", i, c); }}
5.2 数组5.2.1 数组的初始化1234567891011func main() { var a [4]int // 元素自动初始成0 b := [4]int{2, 5} // 剩余元素自动初始化成0 c := [4]int{5, 3:10}; // ...