科大讯飞一面解答

面试题来自牛客网

科大讯飞一面 web服务器项目: 1、用正则与状态机解析http请求的什么报文? 2、正则的时候效率并不高,有没有想过用别的方法替代正则? 3、有限状态自动机是什么? 4、除了get和post还有哪些? 5、怎么理解IO多路复用?

6、什么是进程上下文?什么是中断上下文?分别举个例子 7、你知道哪些socket? 8、你知道哪些字符串匹配算法? 9、链表和数组有什么区别?使用场景? 10、CPU的cache缓存,是怎么换入换出的,用的什么算法? (时间片轮转是CPU调度) 11、我们两之间的这个视频对话,在计算机网络里面用到了哪些协议,都分别是怎么工作的? 这些层怎么封装?怎么解封装? 12、我们之间通过以太网进行传输,这中间有个协议叫ARP协议,说一下什么是ARP协议? 13、广播和单播的区别? 14、路由器和交换机的工作原理? 15、linux是由内核和文件系统组成的,你知道哪些文件系统? 16、windows和linux系统是怎么启动的?启动过程知道吗?

解答

1、用正则与状态机解析http请求的什么报文?

没太理解题意,查了下资料,问的是HTTP下的状态机吧。基本上是判断回车符,判断流程中收到的字符串是否被中断,流程分为检测拉取请求行(请求头),解析,解析请求内容,读取换行符结束。重复过程。

这个要专门背诵,web方向可能是八股文内容,具体的需要在网上搜,我个人不想贴图。。

2、正则的时候效率并不高,有没有想过用别的方法替代正则?

正则确实会引起效率的降低,所以,在使用正则完成简单要求的时候可以用语言的字符串的函数做相关替代,譬如匹配,替换,或者用C++手写常用的匹配项,或者用简单的KMP方法手写。(仅在特殊场景使用)如果限定语言,手写函数吧。。

3、有限状态自动机是什么?

有限状态自动机是图灵老爷子写的论文内容,是计算机的基础底层。我们的冯诺依曼架构就是一种复杂的有限状态自动机。

有限状态自动机有起始,输入,状态变更,循环,和终止。在每个不同的阶段接受不同的信号,返回不同的下一步状态,其结果是有限的,并且可以将复杂问题转换成简单的状态机输入问题。

4、除了get和post还有哪些?

还有put,delete,trace ,patch,head等,状态动词比较少,有些时候rest不方便做映射。

5、怎么理解IO多路复用?

一种返回请求时候同步,实际内部io在后端为异步的方式。

目前最新的进入内核的是io_uring 为5.1 版本进入内核。优势是完全支持异步io,同时支持各式的io读写,传统的LInux AIO需要代码额外支持,并且限制io读写方式。其次,支持完全内核态和用户态无损切换共享(后面又问上下文切换)减少了IO调用深度等等,还有减少io的拷贝时间。

BTW,eBPF也使用了事件驱动的模式,加快数据过防火墙的速度。

6、什么是进程上下文?什么是中断上下文?分别举个例子

进程上下文就是进程中使用的进程块,线程块,相关硬件地址,等内部的内容状态,上下文指的是在这一个状态下,上文表示的是状态之前的进程的基础状态,下文表示这一状态之后的进程状态。

中断上下文,指操作系统将这个进程暂时冻结的时候,需要保存的进程相关内容,以及什么时候进程可以重新恢复。我们认为,保存进程的中止现场便于下次恢复。

举例子???我们的CPU在出现io_wait的时候,就是一种典型的中断上下文。

我们在使用KVM虚拟化的时候,Linux和Ring级别,Ring级别的上下文切换就是进程上下文。

7、你知道哪些socket?

网络编程没怎么学。。TCP形式socket ,udp形式socket ,raw socket,链路层socket。

8、你知道哪些字符串匹配算法?

简单匹配,,KMP。。看下还有BM,不熟悉。。后面大多是408的知识,注意了。

9、链表和数组有什么区别?使用场景?

数据结构,,,,说下结构,插入特点,不同的使用场景。

不想写。。。各位翻书吧。。

10、CPU的cache缓存,是怎么换入换出的,用的什么算法?

这个是开放题,面试官本来是想问内存页淘汰算法,如果能回答更深更好。这个其实在AMD进入打桩机时代后cpu的cache算法两家就开始不一样了。更别提arm和risc-v了。

而且淘汰算法非常复杂,由于x86的指令现在是乱序发射和四路发射(intel目前5路吧好像,可能记错了),cache的算法还要考虑不同环境下的命中,cache aside的情况,L1 L2 L3 和共享缓存内存屏障的写法等,我自己也记得不清楚。。以前看过微型计算机的CPU的Ryzen/Intel 的cache策略,没有详细看。。

基本的包括 常见的策略有三种:

  • 先进先出策略 FIFO(First In,First Out)
  • 少使 用策略 LFU(Least Frequently Used)
  • 近少使用策略 LRU(Least Recently Used)。

面试官估计想问LRU。。。

11、我们两之间的这个视频对话,在计算机网络里面用到了哪些协议,都分别是怎么工作的?这些层怎么封装?怎么解封装?

唔,这个常规的是TCP和UDP,再考虑出现中断的回退。实际上多是udp配上kcp的内部协议或者TCP的修订版后添加的RTSP,RTMP等改了tag值实现的标准协议,大厂会在上面魔改。然后在表示层使用常用的流媒体协议。流传输协议是RTSP,RTP,UDP,RTMP,HLS。HLS用的也挺多的,当我们抓视频看到ts文件时候,多就是HLS协议了。

然后视频流涉及到编解码和封包。常见的视频流编解码器有avc,H264,H265(HEVC),H266,VP8,VP9,VP10,AV1。其他的目前基本不用在在线视频流了(是的视频通话用的也是这些压缩算法).然后详见的封包有mp4,webm,ts,m4v等等。这里不赘述。

当然,这只是这一问的一部分,面试重点是看TCPIP协议的掌握程度,底层当然是udp为主,然后丢包多可能回退到tcp拉,如果不会退就是走udp+kcp这类的fec的路子。

封包拆包就是涉及协议头的部分,协议栈解析协议就好了,UDP的头里面有数据报的长度,TCP复杂些需要长度加上MSS分包。然后可能会有粘包需要拆包等等,(如果是使用https协议直接视频的话就是TCP了哟,看情况回答。)

12、我们之间通过以太网进行传输,这中间有个协议叫ARP协议,说一下什么是ARP协议?

划水,,不想写了,没钱途。ARP,MAC和IP的桥梁,有三种协议。在同一广播域中不需要路由和三层,直接二层链路就可以完成了。减轻路由负担。

13、广播和单播的区别?

偷懒。。。。

单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议。 组播(multicast): 也叫多播, 多点广播或群播。 指把信息同时传递给一组目的地址。它使用策略是最高效的,因为消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制。 广播(broadcast):是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域”。 任播(anycast):是一种网络寻址和路由的策略,使得资料可以根据路由拓朴来决定送到“最近”或“最好”的目的地。

在Linux运行ifconfig, 如果网卡信息中包含UP BROADCAST RUNNING MULTICAST,则支持广播和组播。

以前有面试官问过anycast哟。。

广播在统一广播域。单播定点。

14、路由器和交换机的工作原理?

划水。。。路由三层,交换机二层,也有三层的。。路由涉及ip转发,需要重写三层的包头,解二层包转发。(发到非自己的广播域时候走路由)编译过openwrt的版本,了解相关搭建的配置。

交换机直接靠ARP协议解析IP和MAC关系,不管三层的包头,直接按照IP对应的mac传递包头。 交换机的工作上将传统的软件开发的东西固化到硬件上了,用的FPGA测试后转芯片。

然后还有vlan划分,数据包混杂模式等等,可以提一提。

15、linux是由内核和文件系统组成的,你知道哪些文件系统?

那我知道的可就多了。。。

作为服务器的文件系统,ext2,ext3,ext4,xfs,btrfs,raiserfs,zfs。

手机用的操作系统,进入了内核,f2fs,flash 优化。

嵌入式用的操作系统 squashfs

windows 下的refs,mac的hfs

可插拔的fat32,exfat,fat16

然后还有fuse下的文件系统,例如mergefs,SnapRAID

此外分布式的文件系统也有很多CephFS等。。

各自都有特点哟。。。都玩过,

16、windows和linux系统是怎么启动的?启动过程知道吗?

这个408考过,但是windows内部的启动流程不是很清楚,估计还是先启动一个ramfs再载入吧。可能是微型环境再启动完整环境。

而且x86的启动方式和arm的不相同,arm使用了uboot和spi。

简单说说,完整的看别人的博客。

先是服务器开电自检,可以进入ipmi管理界面操作基本内容。

开机命令发出后,BIOS按照启动顺序启动,查MBR或者查GPT下的EFI。

linux在grub2下找对应盘符。识别后加载基础initramfs。

/sbin/init 初始化,按照linux下的启动顺序依次启动,然后不同的操作系统目前的启动方式不同,rc,sysV,等等,我没太关注。然后初始化各个组件,如网络,存储,daemon等等。

arm下的类似,spi存储基础bios,uboot相当于系统,但是内部有专门的dtb设备树,也是启动initramfs,校验启动。


我要刷题,我要学习,不想写面经。。。