网易一面
问的很灵活, 八股文背了没用,大厂都是顺着问的需要深刻理解不是死板的考试题.
我觉得我对网络知道的太少, os还可以知道一些, 果然学过没学过就是不一样.
你的socket 发送是加密的吗? (不是, 以后可以做一做. )
是长连接吗? (我也不知道, )
怎么关闭连接? 关闭可能出现的问题? 怎么解决?
发一个请求, 按需发送,短连接可以吗? 会有什么问题?
比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
(这个好像很复杂, 没有这么简单, 值得研究 )
操作系统你会吗?学过哪些 , 我说了一堆科研相关的 .
讲讲物理地址和虚拟地址的映射? 你哪里有用到?
4kb , 2mb ., 大页表,
大页的优点
减少页表大小。每个Huge Page对应的是连续的2MB物理内存,这样12GB的物理内存只需要48KB的页表,与原来的24MB相比减少很多。
Huge Page内存只能锁定在物理内存中,不能被交换到交换区,避免了交换引起的性能影响。
由于页表数量的减少,使得CPU中的TLB(可理解为CPU对页表的CACHE)命中率大大提高。
Huge Page的页表在各进程之间可以共享,也降低了Page Table的大小。
减少页表大小。每个Huge Page对应的是连续的2MB物理内存,这样12GB的物理内存只需要48KB的页表,与原来的24MB相比减少很多。
Huge Page内存只能锁定在物理内存中,不能被交换到交换区,避免了交换引起的性能影响。
由于页表数量的减少,使得CPU中的TLB(可理解为CPU对页表的CACHE)命中率大大提高。
Huge Page的页表在各进程之间可以共享,也降低了Page Table的大小。
2. 大页的缺点
- 要预先分配
- 不够灵活,需要重启主机生效
- 如果分配过多,会造成浪费,不能被其他程序使用。
怎么看是不是大页表?(其实我不知道, 我看了csapp说 可以看/proc , 结果确实是 页表大小可以通过 /proc/meminfo 的 PageTables部分查看。)
/sys/
/proc 可以看进程状态, 怎么获得进程状态?
不知道, 查了查: Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运状态。这个目录中包含每个进程的状态信息。/proc文件系统是一种特殊的、由软件创建的文件系统,内核使用它向外界导出信息,/proc系统只存在内存当中,而不占用外存空间。/proc下面的每个文件都绑定于一个内核函数,用户读取文件时,该函数动态地生成文件的内容。也可以通过写/proc文件修改内核参数
函数式编程的优点? (其实我不知道 , 我说 缺点读起来太长了, 优点就是写起来快 直接写括号里面就可以了 ,我完全不懂, 我凉了 )
1. 代码简洁,开发快速
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
2. 接近自然语言,易于理解
函数式编程的自由度很高,可以写出很接近自然语言的代码。
最大的好处是用函数组合来拆分一个问题.
举例来说,下面代码中的print变量就是一个函数,可以作为另一个函数的参数。
var print = function(i){ console.log(i);};
[1,2,3].forEach(print);
[1,2,3].forEach(print);
不修改状态
上一点已经提到,函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点。
3. 更方便的代码管理
函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。
4. 易于"并发编程"
函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。
5. 代码的热升级
函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机
dfs的复杂度?
邻接表表示,查找所有顶点的邻接点所需时间为O(E),访问顶点的邻接点所花时间为O(V),此时,总的时间复杂度为O(V+E)。
邻接矩阵表示,查找每个顶点的邻接点所需时间为O(V),要查找整个矩阵,故总的时间度为O(V^2)。
(我脑子抽了, 想到AI去了, 怎么想到2的n次方去了)
他就给我个台阶下,问我 bfs用什么实现, 怎么实现
就用队列, 我想的都是树, 百度过来都是图的实现. 其实我可以把我知道的都说出来, 没必要愣在那里, 我愣在那里太傻了.
26分钟就结束了.
平台工程师, 内部监控产品, 监控游戏, 程序监控.