epoll
2020-06-17 17:19:11 0 举报
epoll
作者其他创作
大纲/内容
kafkajvm
T传参fd
硬中断
mmap1G
客户端
cpu需要主动遍历是否有客户端发数据
cpu
kernel
socket = fd5bind 8090listen fd5accept fd5 = fd6 接收客户端连接 发生阻塞read recvfrom fd6
客户端2
segment1G
微信
磁盘
8fd5fdfdfd...
问题:1. 线程太多了,创建线程多了,系统调用多2. 线程消耗内存资源(栈独立3. 线程很多的时候,cpu切换浪费时间根本问题在 阻塞 blocking -- 导致需要多线程
C10k每循环内有O(n)复杂度的系统调用但实际上只有少数客户端发数据了
3
客户端1
事件驱动
2
每个线程对应一个client(客户端连接)BIO
文件列表(fd)123..
5
T2recvfromfd6
内核空间
systemcall内核提供用户空间程序与内核空间进行交互的一套标准接口,这些接口让用户态程序能受限访问硬件设备,比如申请系统资源,操作设备读写,创建新进程等。
1
每次传递很多的数据
NIO
headdata
回调,读取数据
网易云音乐
内存
fd7
mmap一种内存映射文件的方法打通用户空间和内核空间并直接对磁盘空间产生映射
recvfrom
网卡
...
4
客户端可以随时连接进来
T1recvfromfd6
每隔一段时间过来执行一次recvfrom每次循环会有多个fd传递过来
recvfrom同步读写
sendfile
fd6
数据存储
零拷贝前提是数据不需要加工(因此可以不通过用户空间)
....
system kernelno blocking
多路复用返回的是状态程序自己发生读写读写是同步的
在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。
程序
DMA直接内存访问
systemcall
用户空间
注册GDT全局描述符表用来划分内存空间(区分内核和其他空间)保护模式,阻止程序修改内核
p
6
fd5fdfdfd
select(fds)O(1)
app libNIONEW
成本:程序访问io一定要调内核
程序调用走软中断硬中断:硬件操作(比如敲键盘)电信号产生中断
硬盘
硬件
中断
1. 编写好的应用程序存储在硬盘,程序运行时由硬盘加载到内存2. 开机之后加载到内存的第一个程序是kernel - 内核3. 程序不能直接访问硬件,内核可以直接访问硬件4. 为了防止程序修改内核数据,内核提供syscall(系统调用,软中断)5. systemcall在内核当中,程序不能直接调用,因此要走中断6. 中断作用在cpu
0 条评论
下一页