面经

  • 进程和线程的区别?(进程是资源分配的基本单位,线程是 CPU 调度的基本单位)
  • 进程和线程的开销有没有差异?(进程切换时要切换更完整的上下文,线程切换通常更轻量)
  • 协程了解过嘛?(协程是用户态线程,是程序员自己进行切换)
  • 在应用程序中读文件涉及进程的切换嘛?(读文件一定会发生 用户态到内核态的切换;是否发生进程/线程切换,要看会不会 阻塞
  • 为什么要切换进程?(CPU 是并发处理操作系统的任务的,当前进程阻塞,就需要让出 CPU 去做其他事情)
  • 为什么不在当前进程内直接读而是切换到其他进程?(为了提高 CPU 利用率)
  • 什么 IO 会阻塞当前线程?(同步阻塞 IO
  • 访问磁盘的时是直接访问到硬件还是用过一些系统的转换?(DMA 请求过程)
  • 虚拟内存的概念?(虚拟内存 就是操作系统给每个进程看到的一套 “虚拟的、连续的内存空间”
  • 如果把换页交给应用进程可以嘛?
    • 理论上应用进程可以参与内存管理策略,但不能把换页完全交给应用进程。
    • 因为 换页 需要了解整个系统的内存使用情况,还涉及 页表修改物理页分配缺页异常处理,这些都属于 内核权限
  • 内存管理 交给操作系统的目的是?
    • 用全局视角 统一分配内存隔离进程提高内存利用率,并通过 虚拟内存机制 给应用提供安全且易用的内存抽象。
  • IO 涉及到用户态和内核态的转换嘛?(一般涉及两次切换)
  • 不停 read 几千个字节,循环 read 是不是涉及很多次用户态和内核态的转换?(是的,每次 read 都会涉及 用户态到内核态、再返回用户态的切换
  • buffer 是有上限的,如果文件到达了很多 mb,那还会有很多次用户态和内核态的切换吗?
    • 会触发多次切换,但不代表每次都访问了磁盘,因为数据可能已经在 PageCache
  • 除了 IO 多路复用,是否了解其他解决 读效率问题 的方法?
    • IO 多路复用主要解决的是 “一个线程高效管理多个 fd,不直接等于 “单次读取更快”
    • 减少系统调用次数(增大单次 read 的大小/用户态缓冲 fread/批量读 readv
    • 利用预读机制 readahead(提前读取后续的块)
    • 减少拷贝的次数(mmap/sendfile
    • 利用异步I/Oio_uring
  • 在浏览器输入一个 url 会经历那些网络的概念?(DNS/Https/Http/Tcp/IP/MAC
  • TcpUdp 的区别?(概念)
  • 面向连接中的 连接 是什么概念?(通信双方在内核里建立起了一种 可持续通信的状态关系
  • 连接 占用的是什么资源?(主要占用的是 内核资源
    • 每个连接在内核里都要维护 socketTCP 状态信息;
    • 还会占用 发送缓冲区接收缓冲区文件描述符,以及 半连接队列全连接队列 中的表项;
  • 连接 占用的内存具体指什么?(如上)
  • http 2.0http 3.0 的区别?(解决 tcp 层的队头阻塞,更快的连接,网络无缝切换)
  • http 3.0 的方案变化与现存的物理链路变化有关吗?为什么舍弃掉 tcp?(不直接相关,同上)