9:40起床
11:00学习-12:10
2:10学习
https://share.weiyun.com/bTE3z98B 密码:3q5xk8
链接
网络编程
信号驱动IO
询问时通过信号返回
有数据时发送信号给应用层
异步IO
询问和拷贝时都不阻塞
Windows:IOCP
LINUX:io_uring
如何区分同步IO和异步IO?
select/poll/epoll
都是同步IO,都是上层用户层程序进行拷贝,拷贝时,应用层依然会阻塞
区分点:
拷贝是由应用拷贝还是内核拷贝?应用拷贝必然要阻塞,所以是同步IO。
网络相关的问题
惊群效应
一般发生在多个进程同时阻塞等待一事件的时候,该事件的发生唤醒了多个进程,但只有一个进程获得“控制权”,造成大量因为无效唤醒产生的性能浪费。
Linux惊群效应详解(最详细的了吧)_羊群效应 惊群效应 ectd_sinat_35297665的博客-CSDN博客
c10k问题
服务器如何支持10k个并发连接?最初的服务器都是基于进程/线程模型的,新到来一个TCP连接,就需要分配1个进程(或者线程)。进程又是操作系统最昂贵的资源,一台机器无法创建很多进程。如果是C10K,就要创建1万个进程,那么就单机而言,操作系统是无法承受的(往往出现效率低下、甚至完全瘫痪)。如果是采用分布式系统,维持1亿用户在线需要10万台服务器,成本巨大
C10K问题,本质上是操作系统的问题。对于Web1.0/2.0时代的操作系统而言, 传统的同步阻塞I/O模型都是一样的,处理的方式都是requests per second,并发10K和100的区别关键在于CPU。
创建的进程、线程多了,数据拷贝频繁(缓存I/O、内核将数据拷贝到用户进程空间、阻塞), 进程/线程上下文切换消耗大, 导致操作系统崩溃,这就是C10K问题的本质!
主流网络模型的介绍(涉及设计模式)
有哪些模型?
thread-based架构模型
Single-Reactor单线程模型
Single-Reactor多线程模型
Muti-Reactor多线程模型
Muti-Reactor多进程模型
Thread-based架构模型
每多一个client连接,就创建一个线程
每个线程独自完成读取、解码、处理、编程、发送回去,5个步骤
场景:
并发量不大的情况
缺点:
线程创建、销毁开销大
创建线程需要一定资源
线程切换需要资源
一个进程可以开启的线程数量有限
单Reactor单线程模型
单Reactor指的是什么?
一个Reactor就是一个epoll对象
步骤:
所有的client建立连接,处理业务逻辑都在一个线程里。
一个数据的处理时间会影响未处理数据的时间
缺点:
业务逻辑处理十分耗时,会大大降低IO处理效率,甚至会影响新的client的连接
单Reactor线程池模型
改进点:
把IO和业务逻辑处理进行剥离
单Reactor只用负责新client的连接,读和发送
引入线程池来处理业务逻辑。
不足:
当面临百万连接、高并发和大数据时,单Reactor处理不过来。
多Reactor多线程模型(和多线程模型)
改进:(主从结构)
(把新client的添加和 对client发来的读、写操作分离
mainReactor将负责新client的添加,引入子Reactor进行读、写操作
多进程VS多线程
资源分配:
主从之间涉及资源竞争时,多线程需要锁保证同步,多进程则需要进程间通信。
资源利用:
单进程多线程,资源利用率稍低
多个进程,资源利用更充分
编程难度:
单进程多线程比较容易,都在一个进程
多进程需要对进程间通信进行控制
各开源组件模型的选择
网络框架源码剖析
陈硕网络编程
简单的、非并发
TTCP:tcp性能测试工具
Round-trip:测试2台机器的时间差,,udp
x5J8tXj._6z2RdB
Netcat:网络编程的瑞士军刀
SLOW sink/sourse:慢速的收发的工具(从应用层模拟)
并发网络编程
SOCKS proxy server(中继2个tcp)
Sudoku solver
Simple memcached
Broadcasting to multiple TCP peers