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来负责,
配合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
6.select语句中读操作要判断是否成功读取,关闭的channel也可以读取 作者:地鼠文档 https://www.bilibili.com/read/cv10128860/ 出处:bilibili