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

2022-03-27
Go Engineering - Specification - Life Cycle
生命周期管理 研发模式瀑布模式 按照预先规划好的研发阶段来推进研发进度,串行执行(在每个阶段完美完成后,才会进入到下一阶段) 迭代模式 研发任务被切成一系列轮次,每一个轮次是一个迭代,每一次迭代都是从设计到实现的完整过程 不要求每个阶段的任务都做到最完美,先把主要功能搭建起来,然后再通过客户的反馈信息不断完善 缺点:比较专注于开发过程,很少从项目管理的视角去加速和优化项目开发过程 敏捷模式 将一个大的需求分成多个、可分阶段完成的小迭代,在开发过程中,软件一直处于可用状态! 敏捷模式需要高频地开发、构建、测试、发布和部署,进而催生了 CICD 技术 CICD CICD 通过自动化的手段,快速执行代码检查、测试、构建、部署等任务,解决敏捷模式带来的弊端 CI:Continuous Integration 频繁地将开发者的代码合并到主干上 流程 开发人员完成代码开发,push 到 git 仓库 CI 工具对代码进行扫描、单元测试和构建,并将结果反馈给开发者 CI 通过后会将代码合并到主干 CI 可以让问题在开发阶段暴露,CI 执行很频繁,需要自动化工具支撑 CD:Continuous ...

2023-05-05
Go Engineering - Makefile
基础语法 https://github.com/seisman/how-to-write-makefile 规则语法 伪目标 变量赋值 特殊变量 自动化变量 功能设计Target Target Desc gen Generate all necessary files, such as error code files. format Gofmt (reformat) package sources (exclude vendor dir if existed). lint Check syntax and styling of go sources. test Run unit test. cover Run unit test and get test coverage. build Build source code for host platform. build.multiarch Build source code for multiple platforms. See option PLATFORMS. image Build docker im...

2023-05-06
Go Engineering - Lint
golangci-lint 使用最多 优点 Advantage Desc 速度快 基于 gometalinter 开发,但比 gometalinter 快 5 倍原因:并行检查 + 复用 go build 缓存 + 缓存分析结果 可配置 支持 YAML 格式的配置文件 IDE 集成 Goland / VS Code linter 聚合器 不需要单独安装 最少误报数 调整了所集成 linter 的默认配置,大幅度减少误报 良好的输出 颜色、行号等 迭代快 不断有新的 linter 被集成到 golangci-lint 中 选项 配置 同时出现 - 命令行选项 / 配置文件 bool/string/int - 命令行选项 slice - 合并 命令行选项 golangci-lint run -h Flag Desc –print-issued-lines Print lines of code with issue (default true) –print-linter-name Print lin...

2022-04-23
Go Engineering - Foundation - Makefile
使用 先编写 Makefile 文件,指定整个项目的编译规则,然后通过 Linux make 命令来解析该 Makefile 文件,实现自动化 默认情况下,make 命令会在当前目录下,按照 GNUmakefile、makefile、Makefile(推荐)的顺序查找 make -f golang.mk 或者 make --file golang.mk 规则 规则一般由目标、依赖和命令组成,用来指定源文件编译的先后顺序 Makefile 规则可以自动判断是否需要重新编译某个目标,从而确保目标仅在需要时编译 规则语法 主要包括:target、prerequisites 和 command 1234target ...: prerequisites ... command ... ... target 可以是一个 object file,也可以是一个执行文件,还可以是一个标签 可以使用通配符,当有多个目标时,使用空格分隔 prerequisites:代表生成该 target 所需要的依赖项,当有多个依赖项时,使用空格分隔 command:代表该 target ...

2022-04-16
Go Engineering - Foundation - API - RESTful
概述 REST:Representational state transfer REST 只是一种软件架构风格,是一组架构约束条件和原则,而不是技术框架 REST 有一系列规范,满足这些规范的 API 均可称为 RESTful API REST 规范把所有内容都视为资源,对资源的操作对应 HTTP 协议提供的 GET、POST、PUT 和 DELETE 方法 由于 REST 与 HTTP 协议相辅相成,因此 HTTP 协议已经成为 RESTful API 的事实标准 特点 以资源为中心,一切都可以抽象成资源,所有行为都是对资源的 CRUD 资源对应着面向对象范式里面的对象 资源使用 URI 标识,每个资源实例都有一个唯一的 URI 标识 资源是有状态的,使用 JSON/XML 等在 HTTP Body 里表征资源的状态 客户端通过 HTTP Method 对资源进行操作,实现 REST 无状态:每个 RESTful API 请求都包含了所有足够完成本次操作的信息,服务器无需保持 Session 无状态对于服务端的弹性扩容是很重要的 设计原则 RESTful API 的核心是规...

2022-03-26
Go Engineering - Specification - Directory
平铺式 主要用在 Go 包(框架、库)中,相对来说比较简单,如 glog 12# lsLICENSE README.md glog.go glog_file.go glog_test.go go.mod 结构化 主要用在 Go 应用中,相对来说比较复杂,事实规范:project-layout 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485├── api│ ├── openapi│ └── swagger├── build│ ├── ci│ ├── docker│ │ ├── iam-apiserver│ │ ├── iam-authz-server│ │ └── iam-pump│ ├── package├── CHANGELOG├── cmd│ ├...
Announcement
Things are always unexpected!











