IO模型

PCB

socket



1进程打开的文件,socket等都会由pcb记录到文件描述符
2 socket的操作有系统调用来完成,返回给应用程序描述符
3tcp socket在创建时操作系统都会给它分配一个读缓冲区和写缓冲区,获得响应数据就从读缓冲区拷贝,发送数据则写到写缓冲区
4如何解决读的时候缓冲区无数据,写的时候缓冲区没有空间

多路复用


linux的select,
缺点:
1 每次只能监听1024个
2遍历所有集合浪费cpu

epool:https://blog.csdn.net/wlf_go/article/details/81736933
1 epoll_create 相当于申请内存用于存放你关注的socket fd上发生了哪些事件
2 epoll_ctl 用于控制某个epoll文件描述符上的事件,可以注册事件,修改事件,删除事件。可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修 改、EPOLL_CTL_DEL 删除
3 epoll_wait 等侍注册在epfd上的socket fd的事件的发生,如果发生则将发生的sokct fd和事件类型放入到events数组中


1 epoll在进行读写的时候可能发生频繁的挂起,这就需要频繁的保存现场再恢复现场
2 由于goroutine拥有自己的栈,保存现场恢复现场都很方便,所以将一个fd交给goroutine来负责,



select

配合case用于channel

1.Go的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前groutine。

2.select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。

3.select语句中除default外,每个case操作一个channel,要么读要么写

4.select语句中除default外,各case执行顺序是随机的

5.select语句中如果没有default语句,则会阻塞等待任一case