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-04-01
Go Concurrency - Mutex Basic
基本概念临界区 临界区 - 共享资源 使用互斥锁,限定临界区只能同时由一个线程持有 当临界区被一个线程持有时,其它线程想进入,只能失败或者等待 直到持有的线程退出临界区后,其它等待的线程才有机会去竞争该临界区 在 Go 标准库中,使用 Mutex 来实现互斥锁 - 使用最为广泛的同步原语 同步原语:解决并发问题的基础数据结构 同步原语适用场景 共享资源 - Mutex / RWMutex 任务编排 - WaitGroup / Channel 消息传递 - Channel 基本用法Locker Locker 接口定义了锁同步原语的方法集 1234567package sync// A Locker represents an object that can be locked and unlocked.type Locker interface { Lock() Unlock()} Mutex12func (m *Mutex) Lock()func (m *Mutex) Unlock() 当一个 goroutine 通过 Lock...

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

2022-04-30
Go Engineering - Foundation - API Doc
Swagger Swagger 是一套围绕 OpenAPI 规范构建的开源工具,可以设计、构建、编写和使用 REST API Swagger 工具 Swagger Editor 基于浏览器的编辑器,可以在其中编写 OpenAPI 规范,并实时预览 API 文档 Swagger UI 将 OpenAPI 规范呈现为交互式的 API 文档,并可以在浏览器中尝试 API 调用 Swagger Codegen 根据 OpenAPI 规范,生成服务器存根和客户端代码库 Swagger vs OpenAPI OpenAPI 是一个 API 规范,前身也叫 Swagger 规范 通过定义一种用来描述 API 格式或者 API 定义的语言,来规范 RESTful 服务开发过程 目前最新的 OpenAPI 规范是 OpenAPI 3.0 (即 Swagger 2.0) OpenAPI 规范定义了一个 API 必须包含的基本信息 描述、路径和操作、输入输出参数、验证方法等 OpenAPI 是一个 API 规范,而 Swagger 是实现规范的工具 go-swagger特性 基于代码注释自动生...

2022-02-13
Cloud Native Foundation - Go Engineering
IO 模型 阻塞:等待数据报文就绪;同步:等待内核拷贝数据 阻塞 + 同步 非阻塞 + 同步轮询 轮询不是一个好的检查状态变更的方式,很难支撑高并发的场景 IO 多路复用 Go select channel 也是借鉴于此 select / poll 在用户态将关心的 fd 列表(限制为 1024)发送给 kernel epoll 不需要传递 fd 列表:通过 mmap,将用户态和内核态的内存共享 事件驱动 epoll_create:初始化 wq(wait queue)、rdlist(ready list)、rbr(red-black root) epoll_ctl:一个 socket 创建后会加入到红黑树进行管理 epoll_wait:当 socket 尚未就绪时,用户线程会阻塞 当收到数据报文后,触发中断处理程序 然后将对应的 epitem(对应一个 socket)移动到 rdlist,并且唤醒阻塞在该 socket 上的用户进程 支持高并发 非阻塞 + 异步 HTTP G 与 socket fd 绑定 当 socket fd 尚未就绪时,将对应的 G 设置为 ...

2022-12-19
Go - Go Module
添加依赖 github.com/google/uuid main.go1234567891011package mainimport ( "github.com/google/uuid" "github.com/sirupsen/logrus")func main() { logrus.Println("hello, gomodule mode") logrus.Println(uuid.NewString())} go.mod 里的 require 字段中,没有任何 Module 提供了包 github.com/google/uuid 123$ go buildmain.go:4:2: no required module provides package github.com/google/uuid; to add it: go get github.com/google/uuid 手动 go get,下载依赖到本地 Module 缓存...

2022-04-16
Go Engineering - Foundation - API - RPC
RPC Client 通过本地调用,调用 Client Stub Client Stub 将参数打包(Marshalling)成一个消息,然后发送这个消息 Client 所在的 OS 将消息发送给 Server Server 接收到消息后,将消息传递给 Server Stub(或者 Server Skeleton) Server Stub 将消息解包(Unmarshalling)后得到消息 Server Stub 调用服务端的子程序,处理完成后,将最终结果按照相反的步骤返回给 Client gRPC概述 gRPC:google Remote Procedure Call gRPC 是由 Google 开发的高性能、开源、跨语言的通用 RPC 框架,基于 HTTP 2.0,默认使用 Protocol Buffers 序列化 gRPC 的特点 支持多语言 基于 IDL(Interface Definition Language)文件定义服务 通过 proto3 生成指定语言的数据结构、服务端接口和客户端 Stub 通信协议基于标准的 HTTP/2,支持特性:双向流、消息头压缩、单 T...
Announcement
Things are always unexpected!











