服务端程序员常见面试问题整理

程序员的日常工作,就像搭积木,编程语言,数据库,常用开发框架等,都是积木的一块,程序员就是阅读说明书,把这些积木配合起来,做成一个软件,所以程序员经常自嘲为码农。 常见的面试问题,大多都偏理论,就像你会用积木搭建一栋房子,突然有人问你,你知道积木是怎么做的吗?此时一脸懵逼。很多时候,知道有那么回事儿,但是概念并不清晰,现在自己整理下自己遇见的面试问题,希望以后避免懵逼的尴尬。

  1. Python的GIL

    在python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL。所以,虽然CPython的线程库直接封装了系统的原生线程,但CPython整体作为一个进程,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态。这就造成了即使在多核CPU中,多线程也只是做着分时切换而已。这也是GIL饱受诟病的原因。

    Python 不适合开发 CPU 密集型的程序, Python 多线程的意义就是能让每条语句宏观上并发执行。对于 IO 密集型的程序,Python 多线程还是有很大作用的。然而 Python 3 引入的 asyncio 模块使得很多 IO 操作有了更好的方式去解决,这就非常类似 Node.js 了,都是没有多线程,而是采用 Event Loop 来处理耗时的 IO 操作。

    muiltprocessing库,也可以让多进程的python代码编写类似多线程。

  2. 进程、线程和协程的理解
    进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。

    线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。

    协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。如果使用封装好的,例如gevent等协程库,程序员就不必承担调度的责任。

    其他参考:
    进程,线程,协程与并行,并发
    进程线程协程的区别

  3. TCP与UDP区别总结
    1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
    2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
    3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
    UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
    4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
    5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
    6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

    1
    2
    3
    4
    5
    6
    tcp协议和udp协议的差别
    TCP UDP
    是否连接 面向连接 面向非连接
    传输可靠性 可靠 不可靠
    应用场合 传输大量数据 少量数据
    速度 慢 快
  4. 待续