操作系统
请简述什么是进程
运行中的程序(注不一定是运行态),包括执行代码、状态、数据、所需的资源。
PCB中有哪些信息
进程标识符
进程状态
进程计数器
寄存器集合(通用、段)
内存管理信息(内存区域、内存映射,页表、段表)
IO状态(打开的文件、设备请求队列)
CPU统计信息(时间)
优先级
调度策略
请简述为什么操作系统需要进程
- 资源分配
- 资源利用率
请简述阻塞、非阻塞、同步、异步
阻塞、非阻塞:程序在等待调用结果时的状态 同步、异步:消息通信的机制
五状态模型
请简述为什么进程会发生阻塞
一个进程会进入阻塞状态的情况有很多,比如等待 I/O 操作、等待某个进程的信号或等待资源等。 当一个进程需要等待一些操作完成或获得某些资源时,它就会进入阻塞状态。
请简述进程和线程的区别
基本单位、资源管理、并发性(切换成本->并发执行效率)、独立性、通信
请简述操作系统的内核态
- 进入内核空间
- 执行操作系统内核代码
- 访问内存所有数据
请简述进程什么时候会进入内核态
中断、异常、系统调用
什么是IO密集型任务
计算密集型与IO密集型区别
多线程对两者的影响
协程是什么?为什么需要协程?
用户级线程,没有进行上下文切换
调度、切换、管理更加轻量
内核无法感知协程的存在
多协程可以发挥多核CPU的优势吗?为什么?
不能,内核无法感知协程存在。
可运用在多IO的场景,比如高并发网络IO的接入
请简述什么是局部性原理?
CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中
存储器可以分为寄存器、主存、辅存?它们各解决了什么问题?
分离冷热数据,降低热点数据服务负载
请简述什么是虚拟内存
把程序使用内存划分,将部分暂时不使用的内存放置在辅存(局部性原理)
逻辑地址空间、物理地址空间
缺页中断
页面置换(高速缓存、主存)
大型游戏有几十G,在8G内存的计算机是怎么运行起来的?
虚拟内存
请简述操作系统中的缺页中断
页式存储管理
将进程的逻辑空间等分成若干多大小的页面
把物理内存空间分成与页面大小相同的物理块
以页为单位把进程空间装进物理内存中
缺点:如果一段连续的逻辑分布在多个页面,会影响性能
页表
进程逻辑空间与物理空间的映射
512B~8K, linux: 4K
段式存储管理
将进程的逻辑空间划分成若干段(非等分)
段的长度由连续逻辑的长度决定
段页式存储管理
段号+段内页号+页内地址
LRU算法、LFU算法
略,见编程八股
请简述死锁的必要条件
- 互斥
- 不可剥夺
- 请求与保持
- 循环等待
相关问题
银行家算法
请简述什么是死锁,为什么会产生死锁
相互等待
竞争资源,调度顺序不当
同步问题三大经典案例
生产者-消费者问题
读者-写者问题
读者-写者问题的哪些系统有涉及
mysql版本设计
redis缓存一致性
哲学家进餐问题
临界资源:缓冲区、读/写数据、筷子
请简述乐观锁/悲观锁/可重入锁
略
请简述轻量锁/重量锁/公平锁/非公平锁
偏向锁:同一个线程执行临界资源会自动获取资源
轻量级锁:没有获得资源的线程自旋等待锁释放
重量级锁:没有获得资源的线程阻塞等待唤醒
公平锁:都放入等待队列,对每个线程完全公平
非公平锁:插队自旋,获取锁失败后再进入等待队列排队
请简述互斥锁和自旋锁的区别
实现原理不同
互斥锁:阻塞
自旋锁:不会让出CPU,处于忙等
线程间有哪些同步的方式
- 互斥锁
- 自旋锁
- 读写锁
- 条件变量(等待,唤醒)
进程间有哪些同步方式
管道
消息队列
共享内存
信号
套接字
为什么进程间通信和线程间通信不同
因为进程是资源分配的基本单位,每个进程的资源不是共享的
管道与消息队列区别
管道仅文本,消息队列可以对数据序列化反序列化
共享内存
速度最快申请同一块物理地址空间,但是未提供同步机制
请简述无锁数据结构的原理
无锁队列:队尾插入,利用CAS
CAS是什么?请简述对CAS的理解
略
ABA问题是什么?如何解决?
你了解业界哪些分布式锁实现方式
redis: setnx key value, del key
zookeeper: 创建数据节点(znode), 注:如果是临时节点,客户端与集群断开连接会自动释放
mysql: 同一个KEY只有一个节点能插入成功
事务、表级锁、行级锁