1. LRU怎么实现的?
LRU:(Least Recently Used)最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。
原理:使用双向链表和哈希表实现LRU算法,
1. 双向链表用于保存key-value,队头的元素表示最近一次被访问的元素,队尾的元素表示最近最久未使用的元素
2. 哈希表提供key到key对应节点在双向链表中的位置的映射。
代码详情:
class Solution {
private:
int capacity_; //缓存容量
list<int> list_; //存储key
unordered_map<int, pair<int, list<int>::iterator>> map_; //key存储key,value存储value和list的迭代器
public:
Solution(int capacity){
// write code here
capacity_ = capacity;
}
int get(int key) {
// write code here
if(!map_.count(key)){
return -1;
}
int value = map_[key].first;
set(key,value);
return value;
}
void set(int key, int value){
// write code here
if(map_.count(key)){
list<int>::iterator it = map_[key].second;
list_.erase(it);
}
if(list_.size() == capacity_){
map_.erase(*(--list_.end()));
list_.pop_back();
}
list_.push_front(key);
map_[key] = make_pair(value, list_.begin());
return;
}
};
2. 进程间通信方式有哪些?
1. 管道:半双工,只能在父子进程间
2. FIFO(命名管道):不相关的进程也能够进行数据交换
3. 消息队列:消息链表,存储在内核中,进程可以从中读写数据。
4. 信号量:一个计数器,提供一个不同进程访问同步的手段。
5. 共享内存:共享一个存储区
6. UNIX域套接字:仅复制数据
7. 网络套接字:利用网络进行通信
3. 线程间的通信方式
线程通信:线程间相互协调共同完成任务
通信方式:
1. 共享内存:线程之间共享程序的公共状态。
2. 消息传递:线程之间通过明确的发送信息来显示进行通信。
3. 管道流
4. 进程和线程的联系和区别
进程是表示资源分配的基本单位,线程是进程中执行运算和调度的最小单位。
1. 一个线程只能属于一个进程,而一个进程可以拥有多个线程。
2. 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
3. 进程拥有独立的地址空间,进程都是建立在虚拟内存的基础上,而线程没有独立的地址空间。
4. 进程比线程健壮,一个进程崩溃不会影响其他进程,而一个线程崩溃会导致整个进程崩溃。
5. 进程执行开销大,而线程依附于进程,执行开销小。
5. 什么是死锁?死锁产生的条件?如何解除死锁?
死锁:在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其他进程释放它们保持的资源,从而导致进程无法继续进行,称为死锁。简单的来说,就是两个及以上进程无限期阻塞、相互等待的一种状态。
死锁产生的四个必要条件:
1. 互斥:至少有一个资源是非共享的。
2. 占有并等待:进程保持某种资源又同时申请其他资源(该资源被其他进程占有)。
3. 非抢占:进程不能被抢占,资源只能被进程主动释放。
4. 循环等待:若干个进程之间形成一种头尾相接的环形等待资源关系。
如何预防死锁:
1. 死锁预防(将四个必要条件至少一个条件打破,就能预防死锁):
a. 打破互斥条件:使资源共享。
b. 打破占有并等待:实行资源预先分配策略
c. 打破非抢占式条件:允许进程抢夺其他进程资源。
d. 打破循环等待条件:实现资源有序分配策略。
2. 死锁解除
a. 进程终止。
b. 资源抢占。
6. 进程有哪几种状态?
1. 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源。
2. 运行状态:占用处理机资源运行。
3. 阻塞状态:等待某种资源或条件导致进程无法继续运行。
7. 分页和分段有什么区别(内存管理)?
段式存储:将程序的地址空间划分为若干段,每一段存储相同意义的信息。
页式存储:将程序的逻辑地址划分为固定大小的页,物理内存也划分同样大小的帧。
区别:
1. 目的不同:分页服务于系统管理,分段服务于用户,段内数据是一组有意义且相对完整的信息。
2. 大小不同:页的大小固定,段长度由功能决定。
3. 地址空间不同:段向用户提供二维地址空间,页向用户提供一维地址空间。
4. 信息共享:段是信息的逻辑单位,便于存储保护和信息共享,页的保护和共享受到限制。
5. 内存碎片:页式存储没有外碎片,但会有内碎片;段无内碎片,但会产生外碎片。
8. 操作系统中进程调度策略有哪几种?
1. FCFS(先来先服务,队列实现,非抢占):所有进程平等,缺点:无法让紧急进程优先
2. SJF(最短作业优先):缺点:难以找到哪个进程最短
3. 优先级调度算法(可抢占):优先级越高越先分配,相同优先级先来先服务。缺点:会出现饥饿现象。
4. 时间片轮转调度算法(可抢占):每个进程分配一个时间片的CPU时间,进程CPU超过时间片,则被抢占并放回队列。
5. 多级队列调度算法:将就绪队列分成多个独立队列,每个队列有各自的调度算法,队列之间采用固定优先级抢占调度。进程被永久分配在一个队列里。
6. 多级反馈队列调度算法:与多级队列调度算法相比,进程可以在队列之间移动。可以防止饥饿现象。
9. 什么是虚拟内存?
虚拟内存:每个进程拥有独立地址空间,空间被分为许多相同大小的页,运行部分在物理内存中,未运行部分在外存中,那部分缺少,就从外存调入物理内存运行。而对进程而言,逻辑上有很大的内存空间。
10. 线程同步的方式
1. 互斥量:
2. 信号量:
3. 信号:
11.