Java面试之操作系统知识总结

导读:本篇文章讲解 Java面试之操作系统知识总结,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

什么是操作系统?

操作系统提供了哪些功能?

什么是内核?

什么是用户态和内核态?

用户态和内核态的切换过程?

进程和线程的区别?

协程和线程的区别?

进程与线程间的切换?

进程间的通信方式?

上下文切换?

进程有哪些状态?

什么是分页?

什么是分段?

分页和分段的区别?

进程调度算法?进程调度策略?

并发和并行的区别?

线程同步的方式有哪些?

IO多路复用?


什么是操作系统?

操作系统是管理硬件和软件的一种应用程序。操作系统是运行在计算机上最重要的一种软件,它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层,使应用软件和硬件进行分离,让我们无需关注硬件的实现,把关注点更多放在软件应用上。

操作系统提供了哪些功能?

进程管理: 进程管理的主要作用就是任务调度,在单核处理器下,操作系统会为每个进程分配一个任务,进程管理的工作十分简单;而在多核处理器下,操作系统除了要为进程分配任务外,还要解决处理器的调度、分配和回收等问题

内存管理:内存管理主要是操作系统负责管理内存的分配、回收,在进程需要时分配内存以及在进程完成时回收内存,协调内存资源,通过合理的页面置换算法进行页面的换入换出

设备管理:根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面。

文件管理:有效地管理文件的存储空间,合理地组织和管理文件系统,为文件访问和文件保护提供更有效的方法及手段。

提供用户接口:操作系统提供了访问应用程序和硬件的接口,使用户能够通过应用程序发起系统调用从而操纵硬件,实现想要的功能

什么是内核?

在计算机中,内核是一个计算机程序,它是操作系统的核心,可以控制操作系统中所有的内容。内核通常是在 boot loader 装载程序之前加载的第一个程序。

什么是用户态和内核态?

用户态和内核态是操作系统的两种运行状态。

内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般处于特权级 0 的状态我们称之为内核态。

用户态:处于用户态的 CPU 只能受限的访问内存,并且不允许访问外围设备,用户态下的 CPU 不允许独占,也就是说 CPU 能够被其他程序获取。

用户态和内核态的切换过程?

系统调用

这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使 用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户 特别开放的一个中断来实现,例如Linux的int 80h中断。

外围设备的中断

硬件中断,进程执行过程中,好比说用户点击了什么按钮,触发了按键中断,要赶紧去处理这个中断啊,保存进程上下文,切换到中断处理流程,处理完了,恢复进程上下文,返回用户态(返回之前可能会进行进程调度,选择一个更值得运行的进程投入运行态),进程继续执行

异常

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

进程和线程的区别?

基本意义:进程:操作系统分配资源(内存空间等)的基本单位,系统中正在运行的一个应用程序,程序一旦运行就是进程。线程:是进程的一条执行路径,操作系统CPU独立调度执行的基本单位

包含关系:线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

空间使用:每个进程有独立的代码区和内存空间;,系统不会为线程分配内存,不同线程共享所在进程的内存空间,不同线程共用堆,但是不同线程有各自的栈。

开销:1. 创建和终止进程耗时,消耗内存资源更多,线程更少。2. 程序之间的上下文切换会有较大的开销时间和内存,同一类线程共享代码和数据空间,线程之间切换的开销小,因为不需要切换地址空间。

相互影响:进程之间不会相互影响,而多线程之间影响较大。一个进程挂了对其他进程没影响,而一个线程挂了,则数据很可能出错,也很可能整个进程就挂了。进程之间相互独立,而不同线程之间更多是协作关系。

协程和线程的区别?

包含: 一个线程可以多个协程,一个进程也可以单独拥有多个协程
资源:占用资源很少。比如CPU起一个线程就要占用1M,而协程起一个只需要几K
调度策略:用户空间决定,调度策略由应用层代码定义。而线程调度策略只能操作系统来确定。

适合在并发量高IO高并发模型,较短的计算任务上。

进程与线程间的切换?

进程切换分两步:

1、切换页表以使用新的地址空间,因为每个进程都有自己的虚拟地址空间,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。 进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,也就是每个进程拥有自己的页表。在页表中查找,有可能还有多级页表。进程一切换,页表就要跟着切换,因为要做虚拟地址到物理地址的映射。页表占的空间也不小,所以进程的切换就更加耗时。

2、切换内核栈和硬件上下文:保存进程指令和数据,在相关寄存器与堆栈

线程切换只需要第二步:

因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。只需要切换:栈、线程寄存器信息等不共享的线程私有的数据

进程间的通信方式?

管道:半双工,管道只允许单向通信,半双工,数据只能向一个方向流动,需要双方通信时,需要建立两个管道。一个进程写数据另一个进程读数据,并且按照先进先出的顺序。管道随进程,进程在管道在,进程消失管道对应的端口也关闭,两个进程都消失管道也消失。通常只在父子进程之间通信,速度慢。

消息队列:消息队列可以认为是一个消息链表,存储在内核中。 发送方把消息发送到消息队列,接收方从消息队列取消息。他与管道不同的是管道的队列存储在硬盘中访问速度慢,而消息队列的队列存放在内存中速度快。管道是数据流形式,而消息队列是数据块形式,类似与TCP和UDP。消息队列允许一个或多个进程向它写入与读取消息,所以需要唯一标识符来确定哪个。进程间通过消息队列通信,主要是:创建或打开消息队列,添加消息,读取消息和控制消息队列。容量受限。

共享内存:映射一段能被其他进程所访问的内存,这是最高效的进程间通信IPC方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。**但是这种方式需要依靠某种同步操作保证数据正确性,如锁和信号量等;**采用共享内存进行通信的一个主要好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝,对于像管道和消息队里等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次:一次从输入文件到共享内存区,另一次从共享内存到输出文件。和锁来配合使用。

信号量:信号量实质上就是一个标识可用资源数量的计数器,可以理解为一个简单的锁,不能传递复杂消息。一个共享资源中由一个信号量标识,当一个进程访问的时候,这个信号量就-1,变为0,这时其他进程就不能访问,当进程释放共享资源,信号量就+1,大于0,这时其他进程可以访问。他一般和共享内存配合使用实现数据的同步防止出现修改数据错误的问题。常作为一种锁机制

网络socket通信:以上都是单机不同进程通信,而socket指网络间不同计算机进程通信。任何进程间都能通讯,但速度慢;

上下文切换?

对于单核单线程 CPU 而言,在某一时刻只能执行一条 CPU 指令。上下文切换 (Context Switch) 是一种 将 CPU 资源从一个进程分配给另一个进程的机制。从用户角度看,计算机能够并行运行多个进程,这恰恰是操作系统通过快速上下文切换造成的结果。在切换的过程中,操作系统需要先存储当前进程的状态 (包括内存空间的指针,当前执行完的指令等等),再读入下一个进程的状态,然后执行此进程。

进程有哪些状态?

进程一共有5种状态,分别是创建、就绪、运行(执行)、终止、阻塞。

什么是分页?

把物理内存空间划分为大小相等且固定的块,作为基本单位。然后呢用户程序也划分为相同大小的块作为逻辑空间。

比如物理内存中分页4k,然后把程序页内存大小也分为4K。将物理内存的4K是不连续,可以前面一个后面一个,然后通过映射映射到逻辑内存,这个逻辑内存是连续的给用户程序使用。

Linux大多数情况下是分页存储管理

因为程序数据存储在不同的页面中,而页面又离散(不连续)的分布在物理内存中,因此需要一个页表来记录逻辑内存页与实际物理内存页的映射关系,比如下图页号1对应块号3。

访问分页系统中内存数据需要两次的内存访问 。因为页表存储在一快区域中。

一次是从内存中访问页表,从中找到指定的物理块号,加上页内偏移得到实际物理地址;

第二次就是根据物理地址访问实际内存取出数据。

Java面试之操作系统知识总结

什么是分段?

分页是为了提高内存利用率,而分段是为了满足程序员在编写代码的时候的一些逻辑需求,比如我要使用一整段连续物理内存,而不是几个页拼成的内存。

首先作业空间,看到的段都是从0开始编址。但是其中每个段的长度可以是不一样的。

因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。

段表存储段号,和段的长度,和基址(也就是实际地址)

在物理内存中,存放的是基址开始加段长的这样的内存空间。

Java面试之操作系统知识总结

分页和分段的区别?

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

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

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

进程调度算法?进程调度策略?

批处理中的调度、交互系统中的调度、实时系统中的调度

批处理中:

最简单的非抢占式调度算法的设计就是 先来先服务(first-come,first-serverd)。使用此算法,将按照请求顺序为进程分配 CPU。最基本的,会有一个就绪进程的等待队列。当第一个任务从外部进入系统时,将会立即启动并允许运行任意长的时间。它不会因为运行时间太长而中断。当其他作业进入时,它们排到就绪队列尾部。当正在运行的进程阻塞,处于等待队列的第一个进程就开始运行。当一个阻塞的进程重新处于就绪态时,它会像一个新到达的任务,会排在队列的末尾,即排在所有进程最后。

       第二种调度算法是 最短作业优先(Shortest Job First),我们假设运行时间已知。例如,一家保险公司,因为每天要做类似的工作,所以人们可以相当精确地预测处理 1000 个索赔的一批作业需要多长时间。当输入队列中有若干个同等重要的作业被启动时,调度程序应使用最短优先作业算法

最短作业优先的抢占式版本被称作为 最短剩余时间优先(Shortest Remaining Time Next) 算法。使用这个算法,调度程序总是选择剩余运行时间最短的那个进程运行。当一个新作业到达时,其整个时间同当前进程的剩余时间做比较。如果新的进程比当前运行进程需要更少的时间,当前进程就被挂起,而运行新的进程。这种方式能够使短期作业获得良好的服务。

交互系统中的调度

一种最古老、最简单、最公平并且最广泛使用的算法就是 轮询算法(round-robin)。每个进程都会被分配一个时间段,称为时间片(quantum),在这个时间片内允许进程运行。如果时间片结束时进程还在运行的话,则抢占一个 CPU 并将其分配给另一个进程。如果进程在时间片结束前阻塞或结束,则 CPU 立即进行切换。轮询算法比较容易实现。

事实情况是不是所有的进程都是优先级相等的。例如,在一所大学中的等级制度,首先是院长,然后是教授、秘书、后勤人员,最后是学生。这种将外部情况考虑在内就实现了优先级调度(priority scheduling)

批处理系统

有一种既可以给出预测结果而又有一种比较简单的实现方式的算法,就是 彩票调度(lottery scheduling)算法。他的基本思想为进程提供各种系统资源的彩票。当做出一个调度决策的时候,就随机抽出一张彩票,拥有彩票的进程将获得资源。比如在 CPU 进行调度时,系统可以每秒持有 50 次抽奖,每个中奖进程会获得额外运行时间的奖励。

公平分享调度:如果用户 1 启动了 9 个进程,而用户 2 启动了一个进程,使用轮转或相同优先级调度算法,那么用户 1 将得到 90 % 的 CPU 时间,而用户 2 将之得到 10 % 的 CPU 时间。

为了阻止这种情况的出现,一些系统在调度前会把进程的拥有者考虑在内。在这种模型下,每个用户都会分配一些CPU 时间,而调度程序会选择进程并强制执行。因此如果两个用户每个都会有 50% 的 CPU 时间片保证,那么无论一个用户有多少个进程,都将获得相同的 CPU 份额。

并发和并行的区别?

并发就是在一段时间内,多个任务都会被处理;但在某一时刻,只有一个任务在执行。单核处理器可以做到并发。比如有两个进程A和B,A运行一个时间片之后,切换到B,B运行一个时间片之后又切换到A。因为切换速度足够快,所以宏观上表现为在一段时间内能同时运行多个程序。

并行就是在同一时刻,有多个任务在执行。这个需要多核处理器才能完成,在微观上就能同时执行多条指令,不同的程序被放到不同的处理器上运行,这个是物理上的多个进程同时进行。

线程同步的方式有哪些?

1、临界区:当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止,以此达到用原子方式操 作共享资源的目的。

2、事件:事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。

3、互斥量:互斥对象和临界区对象非常相似,只是其允许在进程间使用,而临界区只限制与同一进程的各个线程之间使用,但是更节省资源,更有效率。

4、信号量:当需要一个计数器来限制可以使用某共享资源的线程数目时,可以使用“信号量”对象。

IO多路复用?

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:

  • 当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。
  • 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。
  • 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
  • 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。
  • 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。
  • 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116532.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!