LRU怎么实现的?
LRU:(Least Recently Used)最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。
原理:使用双向链表和哈希表实现LRU算法,
- 双向链表用于保存key-value,队头的元素表示最近一次被访问的元素,队尾的元素表示最近最久未使用的元素
- 哈希表提供key到key对应节点在双向链表中的位置的映射。
进程和线程的联系和区别
进程是表示资源分配的基本单位,线程是进程中执行运算和调度的最小单位。
一个线程只能属于一个进程,而一个进程可以拥有多个线程。
资源分配给进程,同一进程的所有线程共享该进程的所有资源。
进程拥有独立的地址空间,进程都是建立在虚拟内存的基础上,而线程没有独立的地址空间。
进程比线程健壮,一个进程崩溃不会影响其他进程,而一个线程崩溃会导致整个进程崩溃。
进程执行开销大,而线程依附于进程,执行开销小。
什么是死锁?死锁产生的条件?如何解除死锁?
死锁:在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其他进程释放它们保持的资源,从而导致进程无法继续进行,称为死锁。简单的来说,就是两个及以上进程无限期阻塞、相互等待的一种状态。
死锁产生的四个必要条件:
互斥:至少有一个资源是非共享的。
占有并等待:进程保持某种资源又同时申请其他资源(该资源被其他进程占有)。
非抢占:进程不能被抢占,资源只能被进程主动释放。
循环等待:若干个进程之间形成一种头尾相接的环形等待资源关系。
如何预防死锁:
死锁预防(将四个必要条件至少一个条件打破,就能预防死锁):
a. 打破互斥条件:使资源共享。
b. 打破占有并等待:实行资源预先分配策略
c. 打破非抢占式条件:允许进程抢夺其他进程资源。
d. 打破循环等待条件:实现资源有序分配策略。
死锁解除
a. 进程终止。
b. 资源抢占。
进程有哪几种状态?
1. 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源。
2. 运行状态:占用处理机资源运行。
3. 阻塞状态:等待某种资源或条件导致进程无法继续运行。
分页和分段有什么区别(内存管理)?
段式存储:将程序的地址空间划分为若干段,每一段存储相同意义的信息。
页式存储:将程序的逻辑地址划分为固定大小的页,物理内存也划分同样大小的帧。
区别:
- 目的不同:分页服务于系统管理,分段服务于用户,段内数据是一组有意义且相对完整的信息。
- 大小不同:页的大小固定,段长度由功能决定。
- 地址空间不同:段向用户提供二维地址空间,页向用户提供一维地址空间。
- 信息共享:段是信息的逻辑单位,便于存储保护和信息共享,页的保护和共享受到限制。
- 内存碎片:页式存储没有外碎片,但会有内碎片;段无内碎片,但会产生外碎片。
操作系统中进程调度策略有哪几种?
FCFS(先来先服务,队列实现,非抢占):所有进程平等,缺点:无法让紧急进程优先
SJF(最短作业优先):缺点:难以找到哪个进程最短
优先级调度算法(可抢占):优先级越高越先分配,相同优先级先来先服务。缺点:会出现饥饿现象。
时间片轮转调度算法(可抢占):每个进程分配一个时间片的CPU时间,进程CPU超过时间片,则被抢占并放回队列。
多级队列调度算法:将就绪队列分成多个独立队列,每个队列有各自的调度算法,队列之间采用固定优先级抢占调度。进程被永久分配在一个队列里。
多级反馈队列调度算法:与多级队列调度算法相比,进程可以在队列之间移动。可以防止饥饿现象。
什么是虚拟内存?
虚拟内存:每个进程拥有独立地址空间,空间被分为许多相同大小的页,运行部分在物理内存中,未运行部分在外存中,那部分缺少,就从外存调入物理内存运行。而对进程而言,逻辑上有很大的内存空间。
IO多路复用
单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力。
I/O模型 目前Linux系统中提供了5种IO处理模型
阻塞IO
非阻塞IO
IO多路复用 IO多路复用在Linux下包括了三种,select、poll、epoll,抽象来看,他们功能是类似的,但具体细节各有不同:首先都会对一组文件描述符进行相关事件的注册,然后阻塞等待某些事件的发生或等待超时。更多细节详见下面的 “具体怎么用”。IO多路复用都可以关注多个文件描述符,但对于这三种机制而言,不同数量级文件描述符对性能的影响是不同的
解决方案总览: Linux: select、poll、epoll MacOS/FreeBSD: kqueue Windows/Solaris: IOCP
信号驱动IO
异步IO