Linux·知识点常见问题

2. select、poll、epoll?
这三个都是多路复用方面的技术,而多路复用指的是多个 socket 复用同一个线程


3. epoll的两种触发模式?
level 模式:该模式就是只要还有没有处理的事件就会一直通知
edge 模式:该模式是当状态发生变化时才会通知

4. TCP三次握手过程,有什么状态,状态机如何变化?
客户端主动向服务端握手:
一开始客户端为 CLOSED 状态,服务端为 LISTEN 状态
首先客户端发送 SYN 报文,将 seq 置为 x,此时客户端状态转为 SYN_SENT
服务端收到后 SYN 抱文后返回 SYN+ACK 报文,将 seq 置为 y,ack 置为 x+1,此时服务器状态转为 SYN_RCVD
客户端收到 SYN+ACK报文,此时客户端已经知道双方的收发都没有问题,但为了让服务端知道故返回 ACK 报文,将 ack 置为 y+1,此时客户端状态为 ESTABLISHED,并可以发送数据
服务端收到 ACK报文,此时服务端已经知道双方的收发都没有问题,此时服务端状态为 ESTABLISHED
至此连接建立成功

5. TCP握手的目的有哪些?
确认双方的收发能力都没有问题,初始化序列号,确认窗口大小即 MSS 等信息

6. 什么是 TIME_WAIT 状态,为什么需要 TIME_WAIT 状态?时间是多久,为什么?
四次挥手客户端接受到服务端 FIN 报文后返回 ACK 报文的状态
可以防止 ACK 报文丢失,服务器没有收到会重复发 FIN 报文
而 TIME_WAIT 的长度为 2*MSL 这样 ACK 丢失了,FIN 再次发送,在这时间里客户端还能收到 FIN 报文

7. TCP 和 UDP 的区别?

8. TCP 拥塞控制?慢启动的时候窗口在什么情况下会增长?为什么会呈指数增长?
TCP 拥塞控制由三部分组成 

慢启动:每次收到一个 ACK 报文将拥塞窗口(cwnd)加上一个 MSS,从 1 开始成指数级增长
拥塞避免:当 cwnd ≥ 慢启动阈值(sstresh)时,窗口按线性增长,当收到三个连续的冗余 ACK 后,进入快重启
快重启:sstresh=cwnd, cwnd = sstresh + 3*MSS(三次冗余的)并发送丢失的报文,每次收到冗余的就指数级增长直到收到新的 ACK,进入拥塞避免或者超时进入慢重启

9. Linux 中一个进程的虚拟内存分布长什么样?内核空间+用户空间(6 种不同的内存段)。
.init:程序初始化的引导
.text:已编译的机器代码
.rodata:只读数据,存放字符串字面量,全局常量以及 switch 跳转表之类
.data:存放已经初始化的全局和静态变量
.bss:存放未初始化或初始化为 0 的全局和静态变量,仅仅是占位符,不占空间,名称可以理解为 Better Save Space(实际起源并不是这个)

 

10. 为什么要用虚拟内存?
将主存当作辅存的高速缓存,经常活动的东西放在主存中,就像 GTA5 几十 GB 大的东西都放主存中是放不下的,因此可以高效利用主存
每个进程地址空间都一样,方便管理
避免进程破坏其他进程的地址空间
ps:思考虚拟内存和交换空间的区别?

11. 虚拟地址映射为物理地址的过程?
❶ 直接映射

❷ 使用页表缓存映射

❸ 使用 TLB 映射

 

12. 进程和线程的区别?哪些资源是线程共享的,哪些是线程独占的?


IPC[http://t.csdn.cn/xdMFv]
线程共享全局变量,独占局部变量 

13. 使用线程有哪些好处?
上下文切换代价小,通信方便

14. 使用线程有哪些坏处?
资源同步麻烦,容易出错

15. 进程有哪些同步的机制?
临界区、互斥、信号量、事件

16. 协程的实现原理?无栈协程和有栈协程?独立栈和共享栈?
协程本质是一个用户态的线程,通过跳转来实现

有栈协程把局部变量放在新开的空间上,无栈协程直接使用系统栈使得CPU cache局部性更好,同时也使得无栈协程的中断和函数返回几乎没有区别

通过独立栈实现的协程库中的每一个协程都有自己独立的栈空间,协程栈大小固定且互不干扰

通过共享栈实现的协程库中的每一个协程在运行时都使用一个公共的栈空间,当协程挂起时将自己的数据从共享栈拷贝到自己的独立栈,协程运行时又将数据从独立栈拷贝到共享栈运行

17. 什么是稳定排序?
利用关键词排序后,关键词相同的元素之间的相互顺序不变的排序算法


2. 进程有哪些状态?
就绪(Ready):程序等待执行

运行(Running):程序正在执行

堵塞(Blocked):进程执行了某些操作需要等待其运行,如:IO 操作

还有两种特殊的状态

初始(Initial):进程在创建时的状态

最终(Final):退出但没有清理,使得其他进程可以得取返回值

3. 进程的调度算法?
最短任务优先(SJF)

先来先出(FIFO)

高响应比优先(HRRN)

最短完成时间优先(STCF)

轮转(RR)

多级反馈队列(MLFQ)

4. 进程间的通信方式?
管道,信号量,共享内存,消息队列,套接字通信

5. 进程上下文切换做了哪些事?流程是怎么样的?
保存虚拟内存,栈,寄存器,程序计数器等

6. 进程在哪些场景会进行上下文切换?
时间片到了,IO 堵塞

7. 上下文切换为什么资源消耗会比较高?消耗在什么地方?
虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。

8. 上面哪个资源的切换效率更低?
虚拟内存

9. 为什么虚拟内存的切换效率更低?
因为切换后 TLB 无法被命中

10. 常见的排序算法?
参考大神解答

11. 堆排序原理?
将数组看成一个完美二叉树,先进行初始化,使得子节点都比跟节点小,每次取堆顶(0)放在最后,同时将数组大小减 1

12. 归并排序原理?
使用分治算法,将排序好的两边用归并的思想合并到 tmp 数组中,最后原地修改原数组

13. LRU缓存?为什么要链表?为什么要用哈希表?为什么要用双向链表?既然哈希表中已经存了 key,为什么链表中还要存 key 和 val 呢,只存 val 不就行吗?
链表插入时间复杂度为 \mathcal{O}(1)O(1),哈希表查找复杂度为 \mathcal{O}(1)O(1),双向链表删除复杂度为 \mathcal{O}(1)O(1),要删除节点时没有 key 就无法删除哈希表中的值

14. linux 命令,如何查看主机 CPU 核数?如何查看内存还剩多少?
cat /proc/cpuinfo

cat /proc/meminfo

15. 如何查看哪个进程正在监听 80 端口?
lsof -i:80

netstat -tunlp | grep 80

16. netstat -n 是什么意思?-a 是什么意思?-p 是什么意思?
a (all)显示所有选项,默认不显示LISTEN相关
p 显示建立相关链接的程序名
n 拒绝显示别名,能显示数字的全部转化成数字。
17. TCP 为什么要三次握手和四次挥手?
三次握手是为了确认双方的收发能力都没有问题,四次挥手是确保数据都发送完了才结束

18. 为什么 TCP 第二次握手的 SYN 和 ACK 要合并成一次?
分开两次发送,浪费资源

19. SYN Flood 的原理?有哪些防范的方法?
客户端发送三次握手的第一个 SYN 报文后收到服务器的报文却不回应,从而导致服务器的半开资源浪费直到超时释放

可以使用 SYN Cookie,即通过将源目地址及 IP 地址和端口号哈希为序列号,将返回的 ACK-1 得到原来的序列号判断是否正确,直到连接建立才分配资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值