头条面试题演练


a==b与a.equals(b)的区别(因为不会,所以面完搜了一下,发现应该是JAVA里的问题,本人学习的是C++)

equals是Object类的成员函数,Java中所有类都继承了Object, 在类中可以重写equals方法。在对对象使用a==b,如果没有重写euqals方法,那么表示判断地址是否相同。

&与&&的区别

&是逻辑与运算,&&是与

什么是多态

基类指针指向派生类,调用派生类重写基类虚函数。

简述堆和栈的区别

在C++语言中,堆比栈空间大得多。

堆申请出来的内存,需要手动释放。

从输入url到网页完全载入,都经历了哪些过程

DNS域名解析,TCP连接建立,HTTP请求,响应HTTP请求,解析HTTP内容。

扫描二维码关注公众号,回复: 6757949 查看本文章

用一条SQL语句查询出每门课都大于80分的学生

测试纸质水杯的质量

测量好几个水杯的质量在除以水杯个数。

用5升和6升的水壶取出3升的水
1、五升壶装满;
2、倒入六升壶(未满,内有5升);
3、再把五升壶装满;
4、倒入六升壶,六升壶满,五升壶剩4升;
5,六升壶倒空,
6、五升壶里剩余四升水倒入六升壶,此时六升壶内有四升水
7,五升壶装满;
8、倒入六升壶装满,此时五升壶内有三升水,完毕。

一个编程题,数组中出现次数超过一半的数字

摩尔投票法

组织活动,经常有人迟到,怎么办(实在是不知道咋办)

考虑一个m*n的方格,从左上角走到右下角,只能往右或者往下走,共有多少种走法(本来以为是个编程题,说用动态规划,但是面试官好像是想让说一个通用公式,并没有想到,如果有人会,可以回复一下)

排列组合

项目问题

socket可以调用哪些接口函数

描述一下time_wait状态与close_wait状态

怎么避免time_wait状态与close_wait状态

1. time_wait状态如何产生? 
由上面的变迁图,首先调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态。MSL值得是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。

2.time_wait状态产生的原因

1)为实现TCP全双工连接的可靠释放

2)为使旧的数据包在网络因过期而消失

3.time_wait状态如何避免

首先服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。
 

epoll的优势

当发生IO事件时,epoll能直接知道哪一个socket发生IO事件,同时不需要反复拷贝数组到内核中。

水平触发和边沿触发,什么情况下使用

Level_triggered(水平触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上没读写完的文件描述符上继续读写,当然如果你一直不去读写,它会一直通知你!!!如果系统中有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率!!!

Edge_triggered(边缘触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用epoll_wait()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符!!!

epoll是否开辟内核空间

epoll中的数据结构:

1.mmap:

epoll通过内核与用户空间mmap同一块内存。mmap将用户空间的一块地址和内核空间的一块地址同时映射到相同的一块物理内存地址,使得这块物理内存对内核和用户均可见,减少用户和内核态之间的数据交换。内核可以直接看到epoll监听的句柄,效率更高。

2.红黑树:

红黑树将存储epoll所监听的所有套接字。mmap出来的内存在epoll上采用红黑树去存储所有的套接字,当添加或者删除一个套接字时(epoll_ctl),都在红黑树上处理,时间复杂度O(logN)

3.rdlist链表:

通过epoll_ctl函数添加进来的事件都会被放到红黑树的某个节点内。当事件添加进来的时候,该事件都会与相应的设备(网卡)驱动程序建立回调关系,当相应的事件发生后,就会调用这个回调函数(ep_poll_callbac),这个回调函数其实就是把这个事件添加到rdlist这个双向链表中。一旦有事件发生,epoll就会将该事件添加到双向链表中。当调用epoll_wait时,epoll_wait只需要检查rdlist双向链表中是否存在注册事件。

dns解析的具体过程

①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了
②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如

, 并将这个主机名传送给DNS应用的客户端
③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)
④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址
⑤一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接

僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源

find命令

Linux find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

get和post的区别

1、url可见性:

get,参数url可见;

post,url参数不可见

2、数据传输上:

get,通过拼接url进行传递参数;

post,通过body体传输参数

3、缓存性:

get请求是可以缓存的

post请求不可以缓存

4、后退页面的反应

get请求页面后退时,不产生影响

post请求页面后退时,会重新提交请求

5、传输数据的大小

get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)

post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。

6、安全性

这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。安全性个人觉得是没多大区别的,防君子不防小人就是这个道理。对传递的参数进行加密,其实都一样。

dns容易被截获的原因

常用的排序算法及其时间复杂度

介绍一下堆排序的过程

一个编程题,对链表使用插入排序

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/94393569