面试准备内容
操作系统:进程和线程
1.进程是资源分配最小单位,线程是程序执行最小单位。
2.进程有自己的独立地址空间,每启动一个进程,系统就要为他分配地址空间,建立数据表来维护代码段,数据段,堆栈段,这种操作非常昂贵。
线程共享进程中的数据,使用相同的地址空间,所以切换线程和创建线程的花销小很多。
3.线程之间通信更方便,因为他们共享全局变量,静态变量等数据。而进程间通信则需要IPC进行通讯。IPC主要是管道,socket,系统IPC(消息队列,信号,共享存储)三种。
4.多进程程序更健壮,因为进程间相互独立。而多线程程序,如果一个线程崩溃,那么进程就会崩溃。
操作系统:实现LRU的缓存数据结构
简单暴力就撸个平衡树/使用 c++ 的set
或者撸个堆/ 使用c++的优先队列
复杂度都能保证logn
操作系统:用户态和内核态
操作系统对程序的执行权限进行分级,分为用户态和内核态
用户态相较于内核态有较低的执行权限,因为要避免用户程序崩溃导致系统崩溃
内核态相当于介于硬件与应用之间的层,可以执行任何cpu指令,也可以引用任何内存地址,包括外围设备, 例如硬盘, 网卡,权限等级最高。
用户态权利有限。比如内存分配中部分内存是仅为内核态使用的,用户态应用不允许访问那些内存,只能访问自己申请到的内存
状态抓换:
...
计组:一个现代的处理器1s能执行多少次简单的mov指令
一个mov指令消耗一个时钟周期,简单来讲,执行次数与cpu的主频有关
数据库:mysql数据如何恢复到任意时间点
恢复到任意时间点以做定时的全量备份,以及备份增量的binlog为前提
恢复到任意时间点首先将全量备份恢复之后,再在此基础上回访增加的binlog直至特定的时间点
计网:三次握手和四次挥手
三次握手:
1.client:我要连接
2.server:我知道你要连接了。我要连接
3.client:我也知道你要连接了。双方都建立连接
四次挥手:
1.client:我没话说了
2.server:我知道你没话说了,听爹说话
3.server:爹也没话说了
4.client:爹知道了,断吧
问:为什么要三次握手?为什么要四次挥手?
三次握手的必要:
一个场景,client发的数据包滞留,很久之后 到达server,server建立连接等待client发数据,client不理他,浪费server资源
四次挥手必要:
关闭双向通道,缺少最后一次挥手会导致如果第三次挥手的数据包丢失,client一直等待关闭,而又了第四次挥手,server一直收不到第四次挥手的数据包,就会重新发第三次挥手,直至对方成功收到
c++的一些特性:
nullptr代替NULL,区分NULL和0,不然会引起重载特性混乱
auto,foreach不多说
lambda表达式,用于匿名函数
11的线程库?
算法:平衡树,堆,快排
我们课内学的平衡树是AVL,保证左右子树高度差不超过1
自己平时喜欢写treap/splay,没用过拓展库里的平衡树,据说很好用,略
堆,课内新学了O(n)建堆的方法,但我自己喜欢用STL的优先队列,其他略
快排习惯用STL的sort,手写快排的话,O(1)额外空间的写法不太好记,我一般都写O(n)额外空间的写法,蠢但好理解
做过的项目:我寻思不会对django和ssm框架有兴趣,不如问web服务器的细节
实现的功能:
解析POST和GET方法+返回请求的资源页面(使用cgi完成动态交互)+处理几个错误
实现的很简陋,每有一个连接过来,就会fork一个子进程来处理这个连接,连接关闭后进程结束
解析方法,交互,处理错误,我全忘了
两个web框架真的仅限于用过了,一些开发工作?不太好考察?github上是团队项目也不好说
算法题:(Ali好像真的蛮喜欢链表的
1.给定一个数组和一个数,返回两个数组的索引,这两个索引指向的元素之和等于给定的数?
hashmap/手写hash,空间时间都是O(n)。没想到hashmap居然是O(n)的
2.逆序输出单链表
可能有环就快慢指针判环,然后直接递归
3.删除无环单向链表的倒数第n个元素,返回头指针
开个fistr指针先next个100次
开个second指针赋成原链表的表头
一起next,等first指到结尾,就把second的next的指针指向自己的next->next即可
其他内容:
c++的线程池
拥塞控制
编译原理