• golang Io模型,socket,select


    IO模型

    d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAY2hhcmxpZV93YW5nMDA3,size_17,color_FFFFFF,t_70,g_se,x_16)

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    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

    6.select语句中读操作要判断是否成功读取,关闭的channel也可以读取 作者:地鼠文档 https://www.bilibili.com/read/cv10128860/ 出处:bilibili

    在这里插入图片描述

  • 相关阅读:
    面试准备-软件工程
    【网络】- 计算机网络体系结构 - OSI七层模型、TCP/IP四层(五层)协议
    【信号去噪】基于卡尔曼滤波实现信号去噪附matlab代码
    eclipse中tomcat部署路径
    Linux用户和权限之二
    发布自己的npm包注意事项
    C++学习笔记(三十六)
    java中方法引用
    网络基础(了解网络知识的前提)
    同一个线程池执行不同类型的任务
  • 原文地址:https://blog.csdn.net/weixin_41479678/article/details/125498835