首页 > 编程知识 正文

面试一般问什么问题(面试 优点)

时间:2023-05-05 18:16:46 阅读:77175 作者:2903

写在前面:

找工作告一段落,其间经历了很多,思考了很多问题,最后得到了沉重的——增长和阿里、百度、京东(sp )、华为等工厂的报价。 幸运的是,一切都回到了轨道上,接下来必须好好总结这个经验。 在此过程中,我们将发布笔者的笔试/面试心得、干货,与大家分享。 在此特别感谢CSDN和很多朋友的支持。 我坚持记录和分享自己学到的、想到的、理解的东西。 中央将不惜各位领导,提出意见和建议,以期提高共同探讨。

摘要:

这篇文章整理和总结了面试/笔试过程中常见的操作系统相关问题。 一方面方便了自己的温故知新,另一方面也希望能为找工作的学生们提供复习参考。 关于对该内容的初步理解和总体把握,建议您读读《操作系统概念》 (高等教育版)的书。

版权声明:

本文原创作者: ldfjRico

作者博客地址: http://blog.csdn.net/just love you _ /

1、进程和线程以及它们的区别

流程是运行时程序的封装,是系统调度和分配资源的基本单元,实现了操作系统的并行运行;

线程是进程的子任务,是CPU调度和调度的基本单元,用于保证程序的实时性,实现进程内部的并发;

程序至少有一个进程,进程至少有一个线程,线程依赖于进程存在;

进程在运行时具有独立的内存单元,多个线程共享进程的内存。

有关操作系统历史及进程/线程由来的详细信息,请参阅笔者博文《Java 并发:并发背景》。

2、进程间的通信的几种方式

管道(pipe )和命名管道(named pipe )可用于管道有血缘关系的父子进程之间的通信,有名的管道除了管道具有的功能外,还允许无血缘关系的进程之间的通信;

“信号”(signal )信号是一种相对复杂的通信方法,用于通知接收进程事件已发生。

消息队列)消息队列是消息的链表,克服了上述两种通信方式信号量有限的缺点,具有写入权限的过程可以根据一定的规则向消息队列添加新的信息; 对消息队列具有读取权限的进程可以从消息队列读取信息。

共享内存:这可以说是最有用的进程间通信方式。 这样,多个进程可以访问同一内存区域,而不同进程可以立即看到共享内存中的数据已在对方进程中更新。 这种方式需要依赖互斥锁和信号量等同步操作

信号量:主要作为进程之间以及同一进程的不同线程之间的同步和互斥的手段

套接字:这是一种更常见的进程间通信机制,可用于网络中不同机器之间的进程间通信,使用非常广泛。

3、线程同步的方式

独占同步/锁定:采用独占对象机制,只允许具有独占对象的线程访问公共资源。 由于只有一个互斥对象,因此可以防止多个线程同时访问公共资源

信号Semphare允许同时多个线程访问同一资源,但必须控制同时访问此资源的最大线程数

通过事件(信号)、等待/通告(Wait/Notify )通知操作保持多线程同步,也可以轻松实现多线程优先级比较操作

4、什么是死锁?死锁产生的条件?

1 ) .死锁的概念

在多个并发进程中,如果每个进程拥有一个资源,而其他进程正在等待释放它,或者当前拥有的资源正在等待释放,则该进程组在状态改变之前无法前进,因此称为发生了死锁通常,两个或多个进程无限期阻止,并且处于相互等待的状态。

2 )死锁发生的四个必要条件

互斥:至少一个资源必须属于非共享模式。 这意味着一次只能在一个进程中使用。 其他申请使用该资源的,申请程序应当等待该资源释放;

占用等待:一个进程至少需要占用一个资源,等待另一个资源,该资源由其他进程占用;

抢占:无法抢占进程。 也就是说,资源只有在任务完成后才自愿释放

循环等待:几个过程之间形成头尾相连的环状等待资源关系

3 )死锁的处理基本策略和一般方法

解决死锁的基本方法主要有预防死锁、避免死锁、检测死锁、解除死锁、鸵鸟策略等。

(1) .死锁预防

预防死锁的基本想法是,只要防止死锁发生所需的四个条件中的至少一个不成立,就防止死锁的发生。 具体方法如下。

打破互斥条件:允许进程同时访问某些资源。 但是,这种方法通常没有实用价值,因为某些资源不能由多个进程共享,这些进程由资源本身的属性决定。

打破占用等待条件:可以执行资源预分配策略(流程在运行前一次性向系统申请其所需的所有资源,如果所需的所有资源都没有满足,则不分配任何资源,该流程暂时不运行; 只有在系统能够满足当前进程所需的所有资源时,才会将申请的资源一次性分配给该线程)或进程

没有占用资源时才可以申请资源(一个进程可申请一些资源并使用它们,但是在当前进程申请更多资源之前,它必须全部释放当前所占有的资源)。但是这种策略也存在一些缺点:在很多情况下,无法预知一个进程执行前所需的全部资源,因为进程是动态执行的,不可预知的;同时,会降低资源利用率,导致降低了进程的并发性。

打破非抢占条件:允许进程强行从占有者哪里夺取某些资源。也就是说,但一个进程占有了一部分资源,在其申请新的资源且得不到满足时,它必须释放所有占有的资源以便让其它线程使用。这种预防死锁的方式实现起来困难,会降低系统性能。

打破循环等待条件:实行资源有序分配策略。对所有资源排序编号,所有进程对资源的请求必须严格按资源序号递增的顺序提出,即只有占用了小号资源才能申请大号资源,这样就不回产生环路,预防死锁的发生。

  (2). 死锁避免的基本思想
  
  死锁避免的基本思想是动态地检测资源分配状态,以确保循环等待条件不成立,从而确保系统处于安全状态。所谓安全状态是指:如果系统能按某个顺序为每个进程分配资源(不超过其最大值),那么系统状态是安全的,换句话说就是,如果存在一个安全序列,那么系统处于安全状态。资源分配图算法和银行家算法是两种经典的死锁避免的算法,其可以确保系统始终处于安全状态。其中,资源分配图算法应用场景为每种资源类型只有一个实例(申请边,分配边,需求边,不形成环才允许分配),而银行家算法应用于每种资源类型可以有多个实例的场景。

  (3). 死锁解除

  死锁解除的常用两种方法为进程终止和资源抢占。所谓进程终止是指简单地终止一个或多个进程以打破循环等待,包括两种方式:终止所有死锁进程和一次只终止一个进程直到取消死锁循环为止;所谓资源抢占是指从一个或多个死锁进程那里抢占一个或多个资源,此时必须考虑三个问题:

  (I). 选择一个牺牲品
  (II). 回滚:回滚到安全状态
  (III). 饥饿(在代价因素中加上回滚次数,回滚的越多则越不可能继续被作为牺牲品,避免一个进程总是被回滚)

5、进程有哪几种状态?

就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源;

运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数;

阻塞状态: 进程等待某种条件,在条件满足之前无法执行;

               

6、线程有几种状态?

  在 Java虚拟机 中,线程从最初的创建到最终的消亡,要经历若干个状态:创建(new)、就绪(runnable/start)、运行(running)、阻塞(blocked)、等待(waiting)、时间等待(time waiting) 和 消亡(dead/terminated)。在给定的时间点上,一个线程只能处于一种状态,各状态的含义如下图所示:

          

  线程各状态之间的转换如下:

             

  更多关于 线程状态及其转化 的相关叙述,请见笔者博文《 Java 并发:Thread 类深度解析》。

7、分页和分段有什么区别(内存管理)?

  段式存储管理是一种符合用户视角的内存分配管理方案。在段式存储管理中,将程序的地址空间划分为若干段(segment),如代码段,数据段,堆栈段;这样每个进程有一个二维地址空间,相互独立,互不干扰。段式管理的优点是:没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片)

  页式存储管理方案是一种用户视角内存与物理内存相分离的内存分配管理方案。在页式存储管理中,将程序的逻辑地址划分为固定大小的页(page),而物理内存划分为同样大小的帧,程序加载时,可以将任意一页放入内存中任意一个帧,这些帧不必连续,从而实现了离散分离。页式存储管理的优点是:没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满)。

两者的不同点:

目的不同:分页是由于系统管理的需要而不是用户的需要,它是信息的物理单位;分段的目的是为了能更好地满足用户的需要,它是信息的逻辑单位,它含有一组其意义相对完整的信息;

大小不同:页的大小固定且由系统决定,而段的长度却不固定,由其所完成的功能决定;

地址空间不同: 段向用户提供二维地址空间;页向用户提供的是一维地址空间;

信息共享:段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制;

内存碎片:页式存储管理的优点是没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满);而段式管理的优点是没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片)。

8、操作系统中进程调度策略有哪几种?

FCFS(先来先服务,队列实现,非抢占的):先请求CPU的进程先分配到CPU

SJF(最短作业优先调度算法):平均等待时间最短,但难以知道下一个CPU区间长度

优先级调度算法(可以是抢占的,也可以是非抢占的):优先级越高越先分配到CPU,相同优先级先到先服务,存在的主要问题是:低优先级进程无穷等待CPU,会导致无穷阻塞或饥饿;解决方案:老化

时间片轮转调度算法(可抢占的):队列中没有进程被分配超过一个时间片的CPU时间,除非它是唯一可运行的进程。如果进程的CPU区间超过了一个时间片,那么该进程就被抢占并放回就绪队列。

多级队列调度算法:将就绪队列分成多个独立的队列,每个队列都有自己的调度算法,队列之间采用固定优先级抢占调度。其中,一个进程根据自身属性被永久地分配到一个队列中。

多级反馈队列调度算法:与多级队列调度算法相比,其允许进程在队列之间移动:若进程使用过多CPU时间,那么它会被转移到更低的优先级队列;在较低优先级队列等待时间过长的进程会被转移到更高优先级队列,以防止饥饿发生。

9、说一说进程同步有哪几种机制

  原子操作、信号量机制、自旋锁管程、会合、分布式系统

10、什么是虚拟内存?

1).内存的发展历程

  没有内存抽象(单进程,除去操作系统所用的内存之外,全部给用户程序使用) —> 有内存抽象(多进程,进程独立的地址空间,交换技术(内存大小不可能容纳下所有并发执行的进程)
)—> 连续内存分配(固定大小分区(多道程序的程度受限),可变分区(首次适应,最佳适应,最差适应),碎片) —> 不连续内存分配(分段,分页,段页式,虚拟内存)

2).虚拟内存

  虚拟内存允许执行进程不必完全在内存中。虚拟内存的基本思想是:每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页(Page),每个页都是一段连续的地址。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻进行必要的映射;当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。这样,对于进程而言,逻辑上似乎有很大的内存空间,实际上其中一部分对应物理内存上的一块(称为帧,通常页和帧大小相等),还有一些没加载在内存中的对应在硬盘上,如图5所示。
注意,请求分页系统、请求分段系统和请求段页式系统都是针对虚拟内存的,通过请求实现内存与外存的信息置换。

                   

  由图5可以看出,虚拟内存实际上可以比物理内存大。当访问虚拟内存时,会访问MMU(内存管理单元)去匹配对应的物理地址(比如图5的0,1,2)。如果虚拟内存的页并不存在于物理内存中(如图5的3,4),会产生缺页中断,从磁盘中取得缺的页放入内存,如果内存已满,还会根据某种算法将磁盘中的页换出。

3). 页面置换算法

FIFO先进先出算法:在操作系统中经常被用到,比如作业调度(主要实现简单,很容易想到);

LRU(Least recently use)最近最少使用算法:根据使用时间到现在的长短来判断;

LFU(Least frequently use)最少使用次数算法:根据使用次数来判断;

OPT(Optimal replacement)最优置换算法:理论的最优,理论;就是要保证置换出去的是不再被使用的页,或者是在实际内存中最晚使用的算法。

4). 虚拟内存的应用与优点

  虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。虚拟内存的使用可以带来以下好处:

在内存中可以保留多个进程,系统并发度提高

解除了用户与内存之间的紧密约束,进程可以比内存的全部空间还大

11、颠簸

  颠簸本质上是指频繁的页调度行为,具体来讲,进程发生缺页中断,这时,必须置换某一页。然而,其他所有的页都在使用,它置换一个页,但又立刻再次需要这个页。因此,会不断产生缺页中断,导致整个系统的效率急剧下降,这种现象称为颠簸(抖动)。

  内存颠簸的解决策略包括:

如果是因为页面替换策略失误,可以修改替换算法来解决这个问题;

如果是因为运行的程序太多,造成程序无法同时将所有频繁访问的页面调入内存,则要降低多道程序的数量;

否则,还剩下两个办法:终止该进程或增加物理内存容量。

12、局部性原理

(1). 时间上的局部性:最近被访问的页在不久的将来还会被访问;

(2). 空间上的局部性:内存中被访问的页周围的页也很可能被访问。

引用

分段和分页内存管理
BAT面试之操作系统内存详解

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。