面试准备

1.int(*s[10])(int)表示什么意思?
int (*s[10])(int)表示s是一个数组,含有10个元素,每个元素都是一个函数指针(参数为int,返回值为int)。
2.函数指针和指针函数区别
指针函数就是返回值是一个指针,它是一个普通函数。如int* abc(int a){return &b;}
函数指针就是一个指针,该指针指向函数。如: int (*abc)(int a);abc可指向一个返回int,参数为int的函数;用法:int cc(int abc){};abc=cc; b=(*)abc(d);
全排列:让每个元素做一次头元素,然后全排列其后的所有元素。
3.结构体大小,字节对齐
1.结构体每个成员相对于首地址的偏移量必须是该元素大小整数倍
2.结构体总大小必须是其中最大元素的整数倍。
4.__thread修饰的变量的用途?
表示这个变量在每个线程中都有一份独立实体,各线程互不干扰,相当于线程内的全局变量
5.stl 
1.value_type是什么?
容器所盛数据的类型,如vector<int> x; vector<int>::value_type y;y是一个int类型数据
2.vector的reserve和resize区别?
reserve只是预留了空间,但没有元素。resize即创建空间有添加了元素


如 struct aa{char a;short b;char c} 大小为6 struct bb{char a;char b;short c} 大小为4
粘包问题解决?
定义包头和包体,包头长度固定,其中加入包头长度
shutdown和close区别?
shutdown只是关闭读写,连接还保持着,close是关闭连接
如果一个描述符在多进程中使用,shutdown可关闭多进程中关闭读写,close只能关闭本进程的读写
服务器中存在大量time_wait,是什么原因造成的,有什么危害?如何避免?
大量time_wait,是由于服务端主动关闭socket,发送ack后,为了避免ack未被客户端收到而处于此种状态。
危害:需要等待2msl时长,才能释放描述符,高并发下可能导致句柄耗尽
避免:设置在/etc/sysctl.conf中设置msl时长,开启time_wait socket重用,开启time_wait快速回收等系统参数
为什么time_wait要设置2msl?
可以保证网络中旧连接的数据包会因为超时(msl)而消失,新连接不会接受到旧连接的数据包
服务器中存在大量close_wait句柄,是什么原因造成的?
close_wait是对端关闭,但服务器未做检测,未释放资源,代码中服务器在连接失效后,未close
如何查看tcp连接状态?
netstat -n|awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'

服务端如何关闭?
1.强制关闭,l_linger为0,直接发RST,丢弃未读数据。关闭sockt,释放资源
2.优雅关闭,l_linger为1,丢弃未读数据,将发送缓冲区数据放送完,发fin,进入4次挥手,如l_linger超时,强制关闭
发RST和FIN区别?
服务端发RST,会立刻关闭socket并释放资源,不会再等待接受客户端ack。
客户端收到RST,调用read,会返回RST错误,调用write会产生SIGPIPE信号,客户端不忽略,会直接退出

读写缓冲区
readv()称为散布读,即将文件中若干连续的数据块读入内存分散的缓冲区中。writev()称为聚集写,即收集内存中分散的若干缓冲区中的数据写至文件的连续区域中。
#include <sys/uio.h>
ssize_t readv(int fildes, const struct iovec *iov, int iovcnt);
ssize_t writev(int fildes, const struct iovec *iov, int iovcnt);
参数fildes是文件描述字。iov是一个结构数组,它的每个元素指明存储器中的一个缓冲区。结构类型iovec有下述成员,分别给出缓冲区的起始地址和字节数:
struct iovec {
    void   *iov_base   /* 数据区的起始地址 */
    size_t  iov_len     /* 数据区的大小 */
}
参数iovcnt指出数组iov的元素个数,元素个数至多不超过IOV_MAX。Linux中定义IOV_MAX的值为1024。








防火墙应用层开放
多进程:web过滤,应用控制,ips检测,waf,流量控制,日志,


防护如url,弱密码,防盗链,黑白名单,以及一些规则库引擎等:每种防护是一个个模块,采用注册的方法加入到任务队列(函数指针数组)中,
采用单进程多线程,事件监听线程和任务线程,事件监听线程负责监听事件(连接事件,页面请求事件,线程状态事件),如果是连接事件就采用一致性hash算法分配连接到任务线程中。当某个线程挂掉的话,就将该线程的连接根据一致性hash算法迁移到其他线程中,然后再起一个新的线程


在多线程中,如何采用负载均衡分配连接?(muduo和nginx如何做)


连接如何缓存,快速查询和频繁修改?红黑树


内存结构:
连接:连接连接对象 socket对象,数据指针,协议类型。
连接对象存储在红黑树中
每个线程中
如果页面修改配置,就修改任务列表,
每个线程负责维护一组连接队列,每个连接采用


一致性hash算法:就对原目的IP及端口,协议做hash运算md5
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值