杂(知识点整理)

**https://www.cnblogs.com/my_life/articles/5174585.html
http://blog.csdn.net/le119126/article/details/49279855
https://huoding.com/2016/01/19/488

面试重点
close_wait 原因
fin_wait 的时间
time_wait 不能使用
http://blog.csdn.net/luomoshusheng/article/details/52029358 systl优化linux网络
https://www.cnblogs.com/diegodu/p/3998471.html so reuseaddr
https://www.cnblogs.com/diegodu/p/3998471.html so reuseaddr
https://www.cnblogs.com/popduke/p/5823801.html
select中使用的poll函数的功能‘
(*f_op->poll)会返回当前设备fd的状态(比如是否可读可写),根据这个状态,do_select()接着做出不同的动作
如果设备fd的状态与主程序的感兴趣的I/O事件匹配,则记录下来,do_select()退出循环体,并把结果返回给上层主程序。
如果不匹配,do_select()发现timeout已经到了或者进程有signal信号打断,也会退出循环,只是返回空的结果给上层应用。
但如果do_select()发现当前没有事件发生,又还没到timeout,更没signal打扰,内核会在这个循环体里面永远地轮询下去吗?
select()把全部fd检测一轮之后如果没有可用I/O事件,会让当前进程去休眠一段时间,等待fd设备或定时器来唤醒自己,
然后再继续循环体看看哪些fd可用,以此提高效率。
select每次都需要重新拷贝到集合中,让后冲向拷贝到内核中,并且采用位域保存限制过多一般是1024;
poll函数主要有两个功能(select和poll中)一个调用poll_wait 函数,第二个返回文件设备当前的状态。
poll_wait 函数 可以看到,
poll_wait()其实就是只是直接调用了struct poll_table_struct结构里绑定的函数指针。
我们得找到struct poll_table_struct初始化的地方。在poll_init 初始化的地方将__poll_wait 函数付给这个结构体
add_wait_queue()把当前进程添加到设备的等待队列wait_queue_head_t中去。并添加其他的一些重要信息。
select()系统调用会创建一个poll_wqueues结构体,用来记录相关I/O设备的等待队列;当select()退出循环体返回时,
它要把当前进程从全部等待队列中移除——这些设备再也不用着去唤醒当前队列了。
总结起来 首先轮询一边如果有事件发生就直接记录返回,如果没有判断定时器时间或者是不是触发如果没有调用timeout函数睡眠
设置可以被唤醒,然后等待队列上的唤醒函数唤醒进程。
poll和这个类似。
time_wait 状态的处理修改参数或者调用系统调用端口重用
net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
accept惊群和epoll惊群现象

我也知道为什么内核2.6没有在处理accept惊群时立即处理epoll惊群,因为accept的惊群很单一,
一个新套接字来了,本来就只能被一个进程所连接,因为socket是一对一的。
而epoll不是,epoll除了可以添加accept套接字意外,还可以关注io事件,
而这个io事件是可以给多个进程同时处理的,所以如果直接将epoll也改成想accept一样
只唤醒一个进程的话,是不合理的。 但是在linux4.5之后添加了一个EPOLLEXCLUSIVE这个标志,
可以解决这个问题。具体查看epollwait部分代码进行理解。

http://www.citi.umich.edu/projects/linux-scalability/reports/accept.html accpet惊群现象的解决(独占)

https://github.com/torvalds/linux/commit/df0108c5da561c66c333bb46bfe3c1fc65905898 epoll惊群现象的解决
作者:Oscarwin
链接:https://www.zhihu.com/question/34574154/answer/253165162
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
今年刚找完工作的应届生来答一发,校招主要考察基础和思维,主要涉及C++语言基础,数据结构与算法,TCP/IP协议,网络编程,Linux。
虽然面试技巧和心态也很重要,但这里只有24K纯技术干货。点赞后,收藏吧!
C和C++语言基础
参考书籍:《C++ primer》,《effective C++》,《STL源码解析》,《深度搜索C++对象模型》
C++多态性与虚函数表
C++多态的实现?
虚函数的作用?
虚函数用于实现多态,这点大家都能答上来但是虚函数在设计上还具有封装和抽象的作用。比如抽象工厂模式。
动态绑定是如何实现的?
静态多态和动态多态。静态多态是指通过模板技术或者函数重载技术实现的多态,其在编译器确定行为。动态多态是指通过虚函数技术实现在运行期动态绑定的技术。
虚函数表
虚函数表是针对类的还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的?
编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表。
纯虚函数如何定义,为什么对于存在虚函数的类中析构函数要定义成虚函数
析构函数能抛出异常吗
构造函数和析构函数中调用虚函数吗?
指针和引用的区别
指针与数组千丝万缕的联系
智能指针是怎么实现的?什么时候改变引用计数?
构造函数中计数初始化为1;
拷贝构造函数中计数值加1;
赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一;
析构函数中引用计数减一;
在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。
share_prt与weak_ptr的区别?
C++四种类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast
内存对齐的原则
内联函数有什么优点?内联函数与宏定义的区别?
C++内存管理
STL里的内存池实现
STL里set和map是基于什么实现的。红黑树的特点?
STL里的其他数据结构和算法实现也要清楚
这个问题,把STL源码剖析好好看看,不仅面试不慌,自己对STL的使用也会上升一个层次。
必须在构造函数初始化式里进行初始化的数据成员有哪些
模板特化
定位内存泄露
(1)在windows平台下通过CRT中的库函数进行检测;
(2)在可能泄漏的调用前后生成块的快照,比较前后的状态,定位泄漏的位置
(3)Linux下通过工具valgrind检测
手写strcpy,memcpy,strcat,strcmp等函数
数据结构与算法
这一块考察范围太广,主要靠多刷题吧,牛客网,剑指OFFER,LeetCode等。
Hash表
Hash表实现(拉链和分散地址)
Hash策略常见的有哪些?
STL中hash_map扩容发生什么?
(1) 创建一个新桶,该桶是原来桶两倍大最接近的质数(判断n是不是质数的方法:用n除2到sqrt(n)范围内的数) ;
(2) 将原来桶里的数通过指针的转换,插入到新桶中(注意STL这里做的很精细,没有直接将数据从旧桶遍历拷贝数据插入到新桶,而是通过指针转换)
(3) 通过swap函数将新桶和旧桶交换,销毁新桶。

二叉树结构,二叉查找树实现;
二叉树的六种遍历;
二叉树的按层遍历;
递归是解决二叉树相关问题的神级方法;
树的各种常见算法题(http://blog.csdn.net/xiajun07061225/article/details/12760493);
什么是红黑树?
红黑树与AVL树的区别
Trie树(字典树)
链表
链表和插入和删除,单向和双向链表都要会
链表的问题考虑多个指针和递归
(1) 反向打印链表(递归)
(2) 打印倒数第K个节点(前后指针)
(3) 链表是否有环(快慢指针)等等。
栈和队列
队列和栈的区别?(从实现,应用,自身特点多个方面来阐述,不要只说一个先入先出,先入后出,这个你会别人也会,要展现出你比别人掌握的更深)
典型的应用场景
海量数据问题
十亿整数(随机生成,可重复)中前K最大的数
十亿整数(随机生成,可重复)中出现频率最高的一千个
排序算法
排序算法当然是基础内容了,必须至少能快速写出,快排,建堆,和归并
每种算法的时间空间复杂度,最好最差平均情况
位运算
布隆过滤器
几十亿个数经常要查找某一个数在不在里面,使用布隆过滤器,布隆过滤器的原理。布隆过滤器可能出现误判,怎么保证无误差?
网络与TCP/IP
参考书籍:《图解TCP/IP》,《TCP/IP详解 卷一》,《图解HTTP》,《HTTP权威指南》
TCP与UDP之间的区别
(1) IP首部,TCP首部,UDP首部
(2) TCP和UDP区别
(3) TCP和UDP应用场景
(4) 如何实现可靠的UDP
TCP三次握手与四次挥手
详细说明TCP状态迁移过程
(1) 三次握手和四次挥手状态变化;
(2) 2MSL是什么状态?作用是什么?
(3)三次握手为什么不是两次或者四次?
TCP相关技术
TCP重发机制,Nagle算法
TCP的拥塞控制使用的算法和具体过程
TCP的窗口滑动
TCP客户与服务器模型,用到哪些函数
UDP客户与服务器模型,用到哪些函数
域名解析过程,ARP的机制,RARP的实现
Ping和TraceRoute实现原理
https://www.cnblogs.com/xiezhw3/p/4354601.html const static 变量的初始化 类似于类外定义,类内初始化
HTTP 和 TCP 有什么关系
TCP 的三次握手过程
TCP 的四次挥手过程(附加)
TCP 和 UDP 的区别
TCP 包为什么需要 Seq
包为什么会乱序
说说 HTTP 协议
HTTP 1.0 和 HTTP 1.1 的差别
HTTP 头部有哪些字段
为什么 HTTP 是无连接的
有没有保持长连接的 HTTP
作者:NeverLea
链接:https://www.jianshu.com/p/28bcbe3b37b6
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
内存对齐的主要作用是:
1、 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、 性能原因:经过内存对齐后,CPU的内存访问速度大大提升。具体原因稍后解释。
SSL工作方式
client_hello 包含浏览器支持的算法 其他的信息
server_hello 服务器选择一个算法,ca证书(服务器的公钥(客户端拿到公钥))
客户端拿到公钥后采用服务器回复的加密算法进行加密生成密钥。服务器只能通过私钥进行解密
linux 网卡配置。init 加参数
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式(文本模式,工作中最常使用的模式)
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启
1、进程和线程的区别?
解析:(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
(6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
https://www.linuxidc.com/Linux/2015-02/113981.htm物理内存管理和虚拟内存管理。
http://blog.csdn.net/tengxy_cloud/article/details/53067396
TCP与UDP区别总结:

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
UDP如何实现可靠传输
由于在传输层UDP已经是不可靠的连接,那就要在应用层自己实现一些保障可靠传输的机制
简单来讲,要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的
超时重传(定时器)
有序接受 (添加包序号)
应答确认 (Seq/Ack应答机制)
滑动窗口流量控制等机制 (滑动窗口协议)
等于说要在传输层的上一层(或者直接在应用层)实现TCP协议的可靠数据传输机制,比如使用UDP数据包+序列号,UDP数据包+时间戳等方法。
目前已经有一些实现UDP可靠传输的机制,比如
UDT(UDP-based Data Transfer Protocol)
基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。 顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。 由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。**

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值