面试突击复习

1 协程, 线程, 进程

1 进程

进程是系统资源分配的最小单位, 系统由一个个进程(程序)组成 一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。 文本区域存储处理器执行的代码 数据区域存储变量和进程执行期间使用的动态分配的内存; 堆栈区域存储着活动过程调用的指令和本地变量。

2 线程

线程属于进程 线程共享进程的内存地址空间 线程几乎不占有系统资源 通信问题:   进程相当于一个容器,而线程而是运行在容器里面的,因此对于容器内的东西,线程是共同享有的,因此线程间的通信可以直接通过全局变量进行通信,但是由此带来的例如多个线程读写同一个地址变量的时候则将带来不可预期的后果,因此这时候引入了各种锁的作用,例如互斥锁等。

3 协程

协程是属于线程的。协程程序是在线程里面跑的,因此协程又称微线程和纤程等 协没有线程的上下文切换消耗。协程的调度切换是用户(程序员)手动切换的,因此更加灵活,因此又叫用户空间线程. 原子操作性。由于协程是用户调度的,所以不会出现执行一半的代码片段被强制中断了,因此无需原子操作锁

2 Python 和 Golang 的垃圾回收

python 使用引用计数的方法 golang 三色标记法,主要流程如下:

所有对象最开始都是白色。 从 root 开始找到所有可达对象,标记为灰色,放入待处理队列。 遍历灰色对象队列,将其引用对象标记为灰色放入待处理队列,自身标记为黑色。 处理完灰色对象队列,执行清扫工作。

3 Close-WAIT and Time-Wait

常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。

TIME_WAIT

TIME_WAIT 是主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。 由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接

CLOSE_WAIT CLOSE_WAIT是被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。

4 洗牌算法

做七牛笔试题看到的题,一开始没想通是什么后来才意识到这就是个洗牌算法,果然太菜

解法Fisher and Yates 传统方法:

1. 写下从 1 到 N 的数字
2. 取一个从 1 到剩下的数字(包括这个数字)的随机数 k
3. 从低位开始,得到第 k 个数字(这个数字还没有被取出),把它写在独立的一个列表的最后一位
4. 重复第 2 步,直到所有的数字都被取出
5. 第 3 步写出的这个序列,现在就是原始数字的随机排列

现代方法:

这里的方法是在每次迭代时交换这个被取出的数字到原始列表的最后。这样就将时间复杂度从 O(n^2) 减小到了 O(n)。算法的伪代码如下:

for i from n−1 downto 1 do
     j ← random integer such that 0 ≤ j ≤ i
     exchange a[j] and a[i]

python 实现:

def shuffle(nums):
    for x in range(len(nums)-1):
        j = random.randint(0,x):
            nums[x],num[j] = nums[j], nums[x]