【九月打卡】第20天 go的-TCP网络编程
2022/9/25 3:17:16
本文主要是介绍【九月打卡】第20天 go的-TCP网络编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
课程名称:深入Go底层原理,重写Redis中间件实战
课程章节:8-1,8-2
课程讲师:Moody
课程内容:
※socket
socket是系统底层对Tcp连接的抽象,
系统监听端口的socket[Listen]在进行三次握手后,会创建一个新的socket用来进行通信,简单的来说,就是当前的accept链接的socket创建了一个新的socket来委托建立的链接,他自己会空出来接受新的链接。
实际上,系统在没有进行三次握手之前,新的连接是阻塞在第一个socket里面的,直到该socket进行了accept,才会从缓存队列里拿出该链接。Listen状态的socket本身也有阈值,一旦排队等待accept的链接超过了阈值,Tcp就会拒接新的链接请求等待。
socket本身是一个文件,是因为linux下万物皆文件,这倒不是重点,重点是:socket实际上是存在于内存当中的,并不是硬盘上一个实际的文件。socket表述为文件描述符更为准确,文件描述符属于进程打开文件表,进程内可见。这都是linux上以及linux出现之前plan9贯彻的思想:一切皆文件。
※IO模型
IO模型其实就是说同时操作多个socket的方案
※阻塞型IO
同步读写SOCKET时候,线程陷入内核态。这时候就是阻塞,当前线程不处理其他问题,只在这里等待socket的数据返回
读写成功后,切换回用户态,继续执行
优点:开发难度小,代码简单
缺点:内核态切换开销大,多少个socket就要开多少个线程,非常浪费资源
※非阻塞IO
select ,poll 模型。
理论上只需要一个线程不停轮训所有的socket文件,看哪一个可以读写,就进行读写操作
暂时无法首发数据,就会返回错误
优点:不会陷入内核态,自由度高
缺点:轮训也是耗费资源的,不管有没有数据都会被轮训,且,该轮训也是单线程的,如果遇到一个socket有读写数据就会进行处理,多个socket有读写数据也只能一个个处理,不能并发处理。
缺点:如果socket数量特别多,每次轮训都将花费非常久的时间。
※多路复用
epoll实际上是event poll,事件池,socket会把自己的读写事件注册到事件池里。
系统轮训socket的event poll 事件池,当发现socket的事件被激活的时候,就唤醒对应的socket进行处理
优点:只轮训事件,而且是系统去轮训,事件是当前活跃socket注册进去的,可以屏蔽很多不活跃的socket
缺点:代码编写的难度升级,不容易实现
这篇关于【九月打卡】第20天 go的-TCP网络编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站