【C++八股文】操作系统篇
阻塞IO与非阻塞IO
• 阻塞IO:文件描述符处于阻塞模式时,读写操作会一直等待直到完成。
• 非阻塞IO:文件描述符处于非阻塞模式时,读写操作立即返回,若数据未就绪则返回错误。
同步IO与异步IO
• 同步IO:
• 用户线程主动发起IO请求并等待完成。
• 通知事件:IO就绪(如select/poll/epoll)。
• 数据拷贝:由用户线程完成。
• 异步IO:
• 用户线程发起IO请求后立即返回,内核负责完成IO操作。
• 通知事件:IO完成(如Linux的aio_*接口)。
• 数据拷贝:由内核完成。
完整C++后端八股文:>> C++八股文(完整版)<<
事件处理模式
1. Reactor模式
• 主线程监听文件描述符事件(如读/写就绪)。
• 事件触发后,将事件分发到工作线程处理。
• 适用场景:同步IO模型(如epoll)。
2. Proactor模式
• 主线程直接处理IO操作(内核完成数据读写)。
• 工作线程仅处理业务逻辑。
• 适用场景:异步IO模型(如Windows的IOCP)。
Reactor模式工作流程
1. 主线程注册socket的读就绪事件到epoll。
2. 主线程调用epoll_wait等待事件。
3. 数据到达时,epoll_wait触发读事件,主线程将socket加入请求队列。
4. 工作线程读取数据并处理请求,注册socket的写就绪事件。
5. 数据处理完成后,主线程调用epoll_wait等待写事件。
6. 写事件触发后,主线程将socket加入写队列。
7. 工作线程写入响应数据。
并发模式
1. 半同步半异步模式
• 主线程:处理IO事件(Reactor模式),将请求封装为任务对象插入队列。
• 工作线程:从队列取出任务并处理业务逻辑。
• 特点:主线程负责IO,工作线程负责计算,需通过锁保护共享队列。
• 潜在问题:主线程与工作线程共享请求队列需加锁;工作线程较少时可能产生任务堆积。
2. 领导者-追随者模式
• 线程池中有一个领导者线程负责监听事件,其他线程为追随者。
• 领导者处理事件后变为工作者,原工作者退化为追随者。
• 优势:减少线程切换开销,适用于高并发场景。
虚拟地址空间
• 作用:通过MMU页表实现进程地址隔离,保护物理内存。
• 映射机制:虚拟地址→物理地址的动态映射,支持内存保护和共享。
进程与线程
进程
• 定义:资源分配的基本单位,包含代码段、数据段、PCB(进程控制块)。
• 状态:创建、就绪、运行、阻塞、终止。
• 通信:管道、信号、共享内存、消息队列、Socket等。
线程
• 定义:CPU调度的基本单位,共享进程资源(内存、文件描述符)。
• 优势:上下文切换成本低,通信高效(共享内存)。
• 资源独享:栈空间、寄存器、线程ID、errno变量。
进程间通信(IPC)
1. 管道(Pipe):半双工,仅限有血缘关系进程。
2. FIFO(命名管道):支持无血缘关系进程。
3. 共享内存:直接映射物理内存,高效通信。
4. 信号(Signal):异步通知机制(如SIGKILL、SIGSEGV)。
5. 消息队列:消息传递,支持优先级。
6. 信号量(Semaphore):同步与互斥。
7. Socket:跨网络通信(TCP/IP协议)。
线程同步机制
1. 互斥锁(Mutex):保护临界区。
2. 读写锁(RWLock):允许多读单写。
3. 条件变量(Condition Variable):线程间同步等待。
4. 自旋锁(Spinlock):忙等待锁,适用于短临界区。
线程共享与独享资源
• 共享:
• 内存地址空间、文件描述符、信号处理函数、当前工作目录。
• 独享:
• 线程栈、寄存器、线程ID、errno、信号屏蔽字。
进程调度
• 调度算法:
a. 先来先服务(FCFS)
b. 短作业优先(SJF)
c. 优先级调度
d. 时间片轮转(RR)
e. 高响应比优先(HRRN)
网络编程基础
Socket函数
• 服务端:socket() → bind() → listen() → accept()
• 客户端:socket() → connect()
IO模型
1. 阻塞IO:默认行为,等待数据就绪。
2. 非阻塞IO:立即返回,需轮询。
3. IO多路复用:select/poll/epoll(高效监听多socket)。
4. 信号驱动IO:通过信号通知数据就绪。
5. 异步IO:内核完成IO后通知用户。
epoll细节
• 水平触发(LT):缓冲区有数据即触发,适合简单场景。
• 边沿触发(ET):仅在数据到达时触发一次,需配合非阻塞IO使用。
其他要点
• 死锁:需破坏四个必要条件(互斥、占有并等待、无抢占、循环等待)。
• 僵尸进程:子进程退出后未被waitpid回收。
• 孤儿进程:父进程退出后被init接管。