epoll的两种触发模式分别是ET(edge trigger)边缘触发和LT(level triggered)水平触发。
epoll的默认触发模式是LT,select、poll都是LT触发。
LT
缓冲区只要有数据未读就会导致epoll_wait返回。
上次读数据未读完仍会导致epoll_wait返回。
水平触发模式下阻塞和非阻塞并没有什么区别,因为没有可读时间就绪的话epoll_wait不会返回。
ET
缓冲区出现新未读数据才会导致epoll_wait返回。
上次读数据未读完不会导致epoll_wait返回。
非阻塞模式
边缘触发模式下事件就绪只会通知一次,为了保证数据成功被读取或写入,在非阻塞模式下,采用循环的方式进行读写,直到完成或出现异常时退出。
阻塞模式
如果不采用循环的方式进行读写,就会造成数据读/写不完的情况,因为下一次再调用epoll_wait就不会再通知了,所以职能采用循环的方式进行读写。但是如果尝试采用循环的方式进行读写,则会造成永久阻塞。
造成阻塞的原因只有没有数据可读/可写,在非阻塞模式下出现没有数据可读/可写可以返回相应的错误信息设置errno(EWOULDBLOCK),但是阻塞模式就会进入阻塞状态,而处理的该fd永远也不可能再有可读数据了,所以就被永久阻塞了
epoll作为Linux下高性能网络服务器的必备技能至关重要,nginx、Redix、Skynet和大多数游戏服务器都使用到这一个多路复用技术。
网卡会把接收到的数据写入内存——>通过硬件传输,网卡接收的数据存放到内存中,操作系统就可以去读取它们
操作系统中有许多进程,但是我们的软件进程中如果建有一个工作队列,但是当我们接收到许多的socket数据的时候,我们就不知道哪一个socket去请求数据,从而导致操作系统和应用程序之间的操作不能很好兼容和同事操作,
内核态和用户态之间的不能够很好的兼容,从而导致不能够很好的兼容
fd对象,我们把socket对应的fd复制一份告诉给kernal,然后将所有的fd 进行检测哪一个socket需要进行数据操作,
epoll_create,epoll_ctl,epoll_wait等等场景操作
LT支持阻塞和非阻塞套,ET模式只支持非阻塞套接字,其效率要高于LT模式,并且LT模式更加安全。
https://blog.csdn.net/lqy971966/article/details/89217648?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-89217648-blog-129318558.235%5Ev28%5Epc_relevant_default_base1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-89217648-blog-129318558.235%5Ev28%5Epc_relevant_default_base1&utm_relevant_index=2
https://www.cnblogs.com/lojunren/p/3856290.htm
哈希面试题目:https://blog.csdn.net/ych9527/article/details/117741170
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表
。散列算法是一种将任意长度输入转换为固定长度输出的算法,输出的结果就是散列值。基于散列算法实现的散列表,可以实现快速查找元素的特性