您的位置:首页 > 职场人生

面试准备

2018-01-16 23:49 148 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: