面试题汇总(更新至3.23) --- 操作系统篇 - 阿V

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.  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZW游戏制造

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值