自用操作系统面试题总结,题目来源各个论坛与面经,答案来源我自己的总结和相关书籍。
1.进程和线程的区别与联系
- 进程是分配系统资源的最小单元,线程是CPU调度的基本单元,进程下的线程共享进程的资源
2.进程间通信的方式
- 管道:单向流动、父子进程或兄弟进程间,命名管道可以不在父子进程间
- 信号量:用于实现进程间互斥与同步的计数器
- 消息队列:一个消息链表,存放在内核中,消息队列独立于发送与接收进程,发送进程终止时,消息队列及其内容并不会被删除
- 共享内存:直接通信,速度最快,将同一个物理内存区域映射到多个进程内存地址空间,这段共享内存可由多个进程访问,但需要信号量来保证数据的互斥与同步
- 套接字:socket用于不同机器之间的进程交互
3.缓存算法
- LRU算法:在缓存已满时,清楚掉最近最久未访问过的缓存数据
- FIFO算法:在缓存已满时,清除掉最早进入缓存的数据
- LFU算法:记录缓存内每个数据的访问频率,在缓存已满时清除掉访问频率最低的数据
4.什么是死锁?死锁的原因?如何预防死锁?
当两个或多个线程竞争资源或互相访问导致无法自行停止的阻塞的现象
死锁的原因:
- 互斥使用:一个资源同时只能有一个线程持有,其他申请资源的线程阻塞
- 不可抢占:不可以强制线程释放自己持有的资源,是否释放资源只由线程自己决定
- 请求并等待:线程申请资源时不会释放已持有的资源
- 环形等待:在发生死锁时,必然存在一个进程–资源的环形链,比如P1申请P2的资源,P2申请P3的资源,P3申请P1的资源
预防死锁:
- 银行家算法:提前判断是否会造成死锁
- 一次性申请所有资源
- 按序申请资源
5.线程同步方式
- sychornized同步
- volatile修饰变量
- 并发包可重入锁
- 阻塞队列
7.虚拟内存
- 虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。
- 为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。
- 从上面的描述中可以看出,虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。例如有一台计算机可以产生
16 位地址,那么一个程序的地址空间范围是 0~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K
大小的程序。
8.线程的状态转换
9.