Cloud Native Foundation - Go IO
|Word Count:202|Reading Time:1mins
阻塞 IO
阻塞:
等待数据就绪
阻塞 + 同步
非阻塞 IO
非阻塞:
等待数据就绪
轮询:效率不高
非阻塞 + 同步
IO 多路复用
(集中线程)阻塞 + 同步
当数据就绪后,集中线程会
唤醒其他线程,阻塞的仅仅只是一个线程
select / poll
通过
传参的形式来轮询fd 列表,长度有上限(1024)
epoll
通过
mmap将用户态的内存和内核态的内存进行共享,不再需要传参,解决了 fd 长度受限的问题
基于
事件侦听,而非轮询
wq:wait queue, rdlist:ready list, rbr:red black tree
Go HTTP:
goroutine 与 fd 绑定
异步 IO
非阻塞 + 异步
异步:
拷贝数据(Socket 缓冲区->应用缓冲区)的过程也是由Kernel来完成
Author: zhongmingmao
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles

2023-05-10
Go Engineering - CLI
应用框架 命令行参数解析 - Pflag 配置文件解析 - Viper 应用的命令行框架 - Cobra 命令需要具备 help 功能 命令需要能够解析命令行参数和配置文件 命令需要能够初始化业务代码,并最终启动业务进程 Pflag 命令行参数解析工具 - Kubernetes / Istio / Helm / Docker / Etcd / … Flag 一个命令行参数会被解析成一个 Flag 类型的变量 1234567891011121314// A Flag represents the state of a flag.type Flag struct { Name string // name as it appears on command line Shorthand string // one-letter abbreviated flag Usage string ...

2022-05-03
Go Engineering - Foundation - CLI
CLI Cobra 很好地集成了 Pflag 和 Viper 工具包 用途 Pflag 命令行参数解析 Viper 配置文件解析 Cobra 命令行框架 Pflag Pflag 通过创建 Flag 和 FlagSet 来使用,使用 Pflag 的开源项目:Kubernetes、Istio、Helm、Docker、Etcd Flag 一个命令行参数会被解析成一个 Flag 类型的变量 1234567891011121314// A Flag represents the state of a flag.type Flag struct { Name string // name as it appears on command line Shorthand string // one-letter abbreviated flag Usage string // help message ...

2022-02-04
Cloud Native Foundation - Go Features
特点 可以高效编译、支持高并发、面向垃圾回收 秒级完成大型程序的单节点编译 依赖管理清晰 不支持继承 支持垃圾回收、支持并发执行、支持多线程通讯 对多核计算机支持友好 特性来源 环境变量 Env Desc Value GOARCH The architecture, or processor, for which to compile code. amd64 GOBIN The directory where ‘go install’ will install a command. GOCACHE The directory where the go command will store cached information for reuse in future builds. ~/Library/Caches/go-build GOMODCACHE The directory where the go command will store downloaded modules. ~/go/pkg/mod ...

2022-03-14
Go Engineering - IAM
概述 IAM:Identity and Access Management 用途:在特定条件下,用户能够对哪些资源做哪些操作 工作流程 3 种平台资源:User、Secret、Policy 系统架构 核心功能 创建平台资源 用户通过 iam-webconsole 或者 iamctl 请求 iam-apiserver,完成 User、Secret、Policy 的 CRUD iam-apiserver 将这些资源持久化到 MySQL 中 请求 API 完成资源授权 用户通过 iam-authz-server 的 /v1/authz 接口进行资源授权 请求 /v1/authz 接口需要通过密钥认证,认证通过后会查询授权策略,从而决定资源是否被允许 为了提高 /v1/authz 接口的性能,iam-authz-server 将密钥和策略缓存在内存中 iam-authz-server 通过 gRPC 调用 iam-apiserver,将密钥和策略缓存到内存中 为了保证数据的一致性,借助 Redis Channel 当 iam-ap...

2022-12-11
Go - Design Philosophy
简单 语言特性始终保持少且足够的水平,不走语言融合的道路,简单的设计哲学是 Go 生产力的源泉 仅有 25 个关键字,主流编程语言最少 内置 GC,降低开发人员内存管理的心智负担 首字母大小写决定可见性,无需通过额外关键字修饰 变量初始为类型零值,避免以随机值作为初值的问题 内置数组边界检查,极大减少越界访问带来的安全隐患 内置并发支持,简化并发程序设计 内置接口类型,为组合的设计哲学奠定基础 原生提供完善的工具链,开箱即用 显式 Go - 程序员应该明确知道在做什么;C - 信任程序员 Go 不允许不同类型的变量进行混合计算,也不会进行隐式自动转换 Go 采用基于值比较的错误处理方案 函数或方法的错误会通过 return 语句显式地返回,并且调用者通常不能忽略对返回的错误的处理 组合 组合是构建 Go 程序骨架的主要方式,可以大幅度降低程序元素间的耦合,提高程序的可扩展性和灵活性 在 Go 中,找不到经典的 OOP 语法元素、类型体系和继承机制,Go 推崇的是组合的设计哲学 提供正交的语法元素,以供后续组合使用 包之间相对独立,没有子包的概念 没有类型层次体系,各类型之间互相独...

2022-02-12
Cloud Native Foundation - Go Memory Management
堆内存管理Linux 进程 管理过程 Allocator 的职责:通过系统调用向 OS 申请内存(MB/GB);响应 Mutator(即应用) 的内存申请(KB) Collector:交还给 Allocator,再由 Allocator 决定是否释放并归还给 OS 初始化连续内存块为堆 在内存申请的时候,Allocator 从堆内存的未分配区域分割小内存块 用链表将已分配内存连接起来 需要信息描述每个内存块的元数据(对象头):大小、是否使用、下一个内存块的地址 Example: Ruby allocates memory from the memory allocator, which in turn allocates from the kernel 面临挑战 内存分配需要系统调用,在频繁分配内存的时候,系统性能较低 C 的每次 malloc 是需要系统调用的 Java 的 Allocator 可以直接一次性申请大内存,然后在用户态再慢慢分配 多线程共享相同的内存空间,同时申请内存,需要加锁,或者采用类似 JVM 中的 TLAB 来缓解竞争 经过不断地内存分配和回收,...
Announcement
Things are always unexpected!











