基础知识

 
tcp接收窗口和拥塞窗口
  • 接收窗口与拥塞窗口共同决定发送的窗口大小, 取小者
  • 滑动窗口表明socket两端数据处理能力, 拥塞窗口表明链路的传输能力
  • 滑动窗口由接收端主导, 指导发送端调节发送数据大小;拥塞窗口, 发送端主导,自行计算调节大小
 
什么时候会向对端传窗口大小
接收端会向发送端传递滑动窗口大小;
 
extern C的意义
告知编译器以C语言风格对函数进行编译, 主要用于重载场景
 
连续发送两次http请求,会得到两次结果吗?可能第二次比第一次快吗?
正常来说, 开启了304的服务端在第二次请求时会直接读取浏览器缓存;第二次比第一次快是可能发生的。两次报文传输的路径不一定完全一致;即使一致,ttl 也可能会有波动
 
TCP包头阻塞
TCP数据包是有序传输,中间一个数据包丢失,会等待该数据包重传,造成后面的数据包的阻塞。
 
服务器状态502 503 504什么问题
502(错误网关)服务器作为网关或代理,从上游服务器收到无效响应。服务端脚本执行超时
503(服务不可用)服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求,请求下游失败
sql:三句查询,要求建立索引来优化查询
 
linuxIO模型,区别在哪
 
线程独立拥有哪些资源
堆栈寄存器 + 局部变量
 
协程和线程有什么差别,优势呢?
协程运行在用户态, 由用户自行控制, 不经过操作系统调度;CPU 开销小;
 
get和post有什么差别
幂等性, 请求方式,性能等
 
sendfile的优势在哪?
零拷贝, 减少数据在内核和用户之间的拷贝;提升IO效率
 
 
C/C++内存问题有哪些,尽量说
 
free和delete在具体实现上的差异
 
free之后的指针使用有什么问题
free后, 指针指向的内存不变。 但是内存已经回归操作系统, 操作系统会随时分配给新的对象
 
如何检查/处理越界
 
野指针和悬空指针分别是什么
野指针: 未初始化的指针,没有指向具体的对象
悬空指针:指向被释放的内存 
 
试图使用野指针有什么问题
野指针指向的内容可能是随机的, 可能是个空指针, 可能是个其他内存;会非预期修改其他内存数据;或者导致core
 
智能指针
对指针进行封装, 利用变量的生存周期及引用技术机制对指针进行管理(类在离开作用域后会自动执行析构)
shared_ptr讲一下,怎么实现的,unique_ptr呢?
 
是不是所有要用指针的地方都应该用智能指针,有什么问题和不足?
不是, 智能指针需要更多的存储空间;共享指针容易产生循环引用的问题;
 
这些缺陷,在不用shared_ptr的前提下有减少成本的策略吗
 
include,头文件里面一般放了些什么
变量/类/依赖文件
 
声明和实现要写在一起吗?是不是一定要分开写?
没有规定。 模板一般写在一起;其他场景建议分开
 
写在一起和分开对最后的代码有什么影响,怎么确认
便于维护
 
gdb怎么查看一个函数的地址?
符号表
 
你在Linux使用经常哪些指令
 
如何探查CPU负载情况
top 看load sys user 的状态
 
 
在什么时候CPU被认为是繁忙/空闲的?
多种手段, 可以看看位于内核态的时间占比
或者看处于idle + wait 状态的时间占比, 越低,越繁忙
 
多线程服务器和nginx在工作方式有什么不一样的地方
Nginx为多个进程 master 进程和worker 进程
 
nginx怎么处理请求
 
进程唤醒(惊群问题)的额外成本主要在哪
会导致多个进程同时被内核唤醒,造成性能波动;
 
nginx的负载均衡
轮询调度, 加权轮询, 一致性哈希, 最小连接数
 
为什么它要用多进程,优势在哪,劣势在哪
一个进程挂了, 不会影响其他进程; 
可以热重启;
劣势:进程对比线程消耗更多的资源,需要完整的运行环境
 
多线程怎么应付同样的问题,能够解决吗,讲一讲方案
多线程可以用双buffer 实现热启动reload(参考redis 的渐进式哈希)
 
http缓存机制了解吗?
 
http长连接
区分 tcp 保活, http keepalive
 TCP的keep alive是检查当前TCP连接是否活着;HTTP的Keep-alive是要让一个TCP连接活久点    
 
你对redis怎么理解的?
 
redis的总体结构
 
单线程的优势和缺点
 
redis的事件分发 :
文件事件, 时间事件
 
讲一讲文件事件有哪些:读事件, 写事件, 连接事件(syn, FIN)
 
时间事件(serverCron函数)
 
serverCron做了什么
 
redis所有事情都只有一个单线程吗?
 
bgsave讲一下,为什么要fork一个进程来做
FORK: 可以复制父进程的内存空间, 同时支持cow, 写时复制
 
interrupt与signal有什么差别
信号是一种特殊的中断;中断分为内中断(缺页, 除0)外中断(kill - 9, io等)
 
interrupt的发起和接受者是谁
中断:可以由进程发起, io 驱动发起,也可以是cpu 本身发起(内中断);接受者一般是cpu, 用于从用户态切换到内核态
 
操作系统在interrupt中发挥了什么作用
操作系统可以主动发起中断, 比如我们在代码中调用write/fork 程序;操作系统会代替我们向cpu 发起中断请求
 
signal呢,发起者又是谁,接收者呢?
进程与进程
 
ack什么时候发送,丢失了会怎么样?
收到对端的报文后, 正常会发送ack确认;
收到乱序报文后, 会多次次发送;
通告本端的接收窗口时会通过ack 发送, ack 报文不需要对端确认
丢失会导致产生死锁(窗口通告通过ack 报文传送, 丢失时会导致发送方等待对端通告发送窗口,接收方等待对端发送数据 );
 
sack了解吗?选择性ack, 用于告知对端已经收到的报文。减少不必要的报文重传
 
重传ack的时机只有ack超时吗?
Tcp 只会对连续的最后一报文段进行确认,接收端收到P1, P2, P4, P5报文时会连续发送三个对P2 报文的确认报文ACK;故收到乱序的报文时也会重传ack;
 
重复报文被接收会发生什么?
三个重复的ack 会迫使对端重传报文;会使得发送端认为发生了网络拥塞, 开启拥塞算法(拥塞门限减半, 执行快恢复算法)
 
拥塞窗口要不要把自己的大小发给接收方,意义何在?
如果链路稳定,比如在一个局域网内, 可以不发送拥塞窗口;如果跨路由等, 可以通告拥塞窗口;用于指导对端控制发送数据的大小(TCP 是全双工的, 一个会话连接中, 双方都有可能传递大的数据, 而同一个会话中, 请求报文和回复报文的路由路径可能不一致, 拥塞窗口可以避免某次交互中因为一端的数据过大而产生拥塞)
 
延迟ACK的意义在哪?
解决糊涂窗口综合征,提供带宽利用率;
为什么不能每次都直接发大的窗口?
链路拥塞
 
进程地址空间布局讲一下
 
 
BSS为什么要叫这个名字?
Block of symbol :  存储未初始化的静态变量和全局变量, 未初始化的静态变量和全局变量不占空间, 只是一个符号
 
static关键字有什么作用,如果用来修饰函数呢?
修饰变量, 修饰函数:
1 静态变量只能初始化1次;存储在静态存储区, 伴随进程的声命周期;
2 修饰函数:限制函数在编译结束后的属性(static 修饰的函数默认为内部链接),不会出现在导出符号表中;
 
多个线程使用static数据会开启多个副本吗?
不会, 静态变量存储在静态存储区, 多个线程共享; 在执行main 之前进行初始化;
 
Main 函数执行前会执行什么?
全局对象的构造函数会在main 函数执行前进行;环境变量的设置也会在main 之前设置
全局的析构会在main 函数之后执行
 
time_WAIT 过多会怎样?
导致链接资源无法快速释放, 新来的需求无法用原有的四元组建立链接;
1 可以调整time_wait 持续时间
2 可以scoket 中配置so_reuseaddr
 
析构函数是否可以抛出异常?
析构函数可以抛出异常, 但必须要自己能够捕获, 如果不能捕获会被系统终止,导致非正常退出
 
对象内存分布
C/C++ 内存分布
内核空间
用户空间
堆栈
自由存储区
静态存储区(全局存储区)(c 中分为已初始化和未初始化)
常量区
 
 
多重继承怎么实现
 
虚拟继承怎么实现
 
对于函数寻址在时间成本上有什么差异?
多继承了解这个东西就好了.  单继承的 bug  已经修不完了. 
 
 

posted on 2020-11-14 17:05  我是某某某是我  阅读(137)  评论(0编辑  收藏  举报

导航