2021_6_20杂文

端口号只有65535,如何做到百万并发量?
每一个socket都对应着一个五元组。
(remote ip, remote port, local ip, local port, proto(TCP/UDP));
而65535只是local port的数量,其他的客户端的remote ip 和 remote port都有很多。

如何实现多个客户端来连接服务器?
1VS多一请求多线程的方式(比较少的客户端的情况可以实现)
弊端:并发量上不去(上百并发量)
io多路复用:select/poll/epoll (检测IO是否可操作,相对应recv send)
IO多路复用的作用:IO复用使得程序能够同时监听多个文件描述符,提高性能。
(1)客户端程序要同时处理多个socket。非阻塞的connect技术。
errno == EINPROGRESS:发生在非阻塞的socket调用connect,而连接又没有立即建立时。这个时候可以用select、poll等函数来监听这个连接错误的socket的可写事件。等待返回,再利用getsockopt来读取错误码并清除该socket上的错误。
(2)客户端要同时处理多个用户输入和网络连接。
(3)TCP服务器要同时处理监听socket和连接socket。
(4)服务器要同时处理TCP请求和UDP请求。
bind系统调用来看,一个socket只能和一个socket地址绑定,即一个socket只能用来监听一个端口。因此服务器要同时的监听多个端口,就必须将他们分别的绑定到各自的端口上。这样服务器就要同时的管理多个监听的socket。
IO复用技术。
(5)服务器要同时监听多个端口,或者处理多种服务。

所有的socket分为分为两类:
(1)listenfd --> accept
(2)clientfd -->recv/send

单线程:
epoll
redis

epoll如何和多线程结合?
(1)epoll + /线程池
memcached

epoll如何和多进程结合?
epoll+
epoll_wait()
nginx

线程用户态和内核态?
用户态的线程就是把内核态的线程在用户态实现了一边,目的是更加的轻量化(更少的内存占用、更少的隔离、更快的调度)和更高的可控性(可以自己控制调度器)。用户态所有的东西内核态都看得见,只是对于内核态而言用户态线程只是一堆内存数据而已。
在操作系统层面的线程是内核态线程;用户态线程比较的多样化,只要能满足在同一个内核线程上执行多个任务的都算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值