Java学习之——操作系统(背诵版)

面试问题原出处

1.简述一下什么是操作系统
  • 操作系统是管理计算机硬件和软件资源的计算机程序,提供一个计算机用户与计算机硬件系统之间的接口。
  • 向上对用户程序提供接口,向下接管硬件资源。
  • 操作系统本质上也是一个软件,作为最接近硬件的系统软件,负责处理器管理、存储器管理、设备管理、文件管理和提供用户接口。
2.操作系统有哪些分类
  • 操作系统常规可分为批处理操作系统、分时操作系统、实时操作系统、嵌入式操作系统、分布式操作系统。
  • 若一个操作系统兼顾批操作和分时的功能,则称该系统为通用操作系统。
  • 常见的通用操作系统有:Windows、Linux、MacOS等。

计算机操作系统的分类有哪些? (baidu.com)

3.什么是内核态和用户态

为了避免操作系统和关键数据被用户程序破坏,将处理器的执行状态分为内核态和用户态。

内核态是操作系统管理程序执行时所处的状态,能够执行包含特权指令在内的一切指令,能够访问系统内所有的存储空间。

用户态是用户程序执行时处理器所处的状态,不能执行特权指令,只能访问用户地址空间。

用户程序运行在用户态,操作系统内核运行在内核态。

4.如何实现内核态和用户态的切换

处理器从用户态切换到内核态的方法有三种:系统调用、异常和外部中断。

系统调用:系统调用机制是使用了操作系统为用户特别开放的一个中断来实现,是操作系统提供的用户接口,系统调用本身是一种软中断。

异常,如果当前进程运行在用户态,这个时候发生了异常事件(如文件损坏、缺页故障),会触发由当前运行进程切换到处理此异常的内核相关进程中

外部中断,外围设备完成用户请求的操作之后,会向CPU发出中断信号,这时CPU会转去处理对应的中断处理程序,是硬中断。

5.并发与并行的区别

并发:宏观上看起来两个程序在同时运行,比如说在单核cpu上的多任务。但是从微观上看两个程序的指令是交织着运行的,指令之间交错执行,在单个周期内只运行了一个指令

并行:严格物理意义上的同时运行,比如多核cpu,两个程序分别运行在两个核上,两者之间互不影响,单个周期内每个程序都运行了自己的指令,也就是运行了两条指令。这样说来并行的确提高了计算机的效率。

6.什么是进程

正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。进程是资源分配的基本单位,是独立运行的基本单位。

7.进程的状态和转换

进程在运行时有三种基本状态:就绪态、运行态和阻塞态。

  1. 运行(running)态:进程占有处理器正在运行的状态。进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态; 在多处理机系统中,则有多个进程处于执行状态。
  2. 就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行的状态。 当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
  3. 阻塞(wait)态:又称等待态或睡眠态,指进程不具备运行条件,正在等待某个时间完成的状态。

各状态之间的转换:

  1. 就绪→执行 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
  2. 执行→就绪 处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
  3. 执行→阻塞 正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
  4. 阻塞→就绪 处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。

img

8.简述进程间通信的方式

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

进程间的通信方式包括

管道:只能在有亲缘关系的进程之间传输,半双工,数据只能单向流动

命名管道:允许无亲缘关系的任意两个进程之间传输,也是半双工

消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问

信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段

套接字:可以使不在同一台计算机而通过网络连接的不同计算机上的进程进行通信。

**信号:**用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身.

9.进程如何通过管道进行通信

管道(pipe)是一种最基本的进程间通信机制(IPC),作用于有血缘关系的进程之间,完成数据传递。调用管道系统函数即可

创建一个管道。有如下特质:

  1. 其本质是一个伪文件(实为内核缓冲区)
  2. 由两个文件描述符引用,一个表示读端,一个表示写端。
  3. 规定数据从管道的写端流入管道,从读端流出。

管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区实现。

管道的局限性:

  1. 数据自己读不能自己写。
  2. 数据一旦被读走,便不在管道中存在,不可反复读取。
  3. 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。
  4. 只能在有公共祖先的进程间使用管道。
10.进程如何通过共享内存通信

单独开一个共享线程,它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

特点:

  1. 共享内存是最快的一种IPC,因为进程是直接对内存进行操作来实现通信,避免了数据在用户空间和内核空间来回拷贝。

  2. 因为多个进程可以同时操作,所以需要进行同步处理。

  3. 信号量和共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

11.什么是信号

一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件。

发送信号:内核通过更新目的进程上下文中的某个状态,发送(递送)一个信号给目的进程。发送信号可以有如下两种原因:

  • 内核检测到一个系统事件,比如除零错误或者子进程终止。

  • —个进程调用了kill 函数, 显式地要求内核发送一个信号给目的进程。

  • 一个进程可以发送信号给它自己。

接收信号:当目的进程被内核强迫以某种方式对信号的发送做出反应时,它就接收了信号。进程可以忽略这个信号,终止或者通过执行一个称为信号处理程序(signal handler)的用户层函数捕获这个信号。

12.进程调度的时机

进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机。进程调度与切换的时机分为两种情况,一种是当前运行的进程主动放弃处理机,还有一种是当前运行的进程被动放弃处理机。

主动放弃:

  1. 进程正常终止。
  2. 运行过程中发生异常而终止。(如 内中断)
  3. 进程主动请求阻塞。(如 请求使用打印机)

被动放弃:

  1. 分时系统中,分配给该进程的时间片用完。
  2. 有更紧急的事情要处理。(如 外中断)
  3. 在使用抢占调度的系统中,有更高优先级的进程进入就绪队列。
13.不能进行进程调度的情况
  1. 在中断处理程序执行时。
  2. 在操作系统的内核程序临界区内。
  3. 其它需要完全屏蔽中断的原子操作过程中。
14.进程的调度策略

先到先服务调度算法

短作业优先调度算法

最高响应比优先调度算法

时间片轮转调度算法

优先级调度算法

多级队列调度算法

多级反馈队列调度算法

详细

多级队列和多级反馈队列

15.进度调度策略的基本设计指标
  1. CPU利用率
  2. 系统吞吐率,即单位时间内CPU完成的作业的数量。
  3. 响应时间。
  4. 周转时间。是指作业从提交到完成的时间间隔。从每个作业的角度看,完成每个作业的时间也是很关键
  • 平均周转时间
  • 带权周转时间
  • 平均带权周转时间
16.什么是孤儿进程?僵尸进程?

孤儿进程: 父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init进程(1号进程)所收养,并由init进程对他们完成状态收集工作。

僵尸进程: 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

17.什么是线程
  1. 是进程划分的任务,是一个进程内可调度的实体,是CPU调度的基本单位,用于保证程序的实时性,实现进程内部的并发
  2. 线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。
  3. 每个线程完成不同的任务,但是属于同一个进程的不同线程之间共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内核资源。
18.为什么需要线程
  1. 从资源上来讲,开辟一个线程所需要的资源要远小于一个进程。
  2. 从切换效率上来讲,线程间彼此切换所需时间也远远小于进程间切换所需要的时间(这种时间的差异主要由于缓存的大量未命中导致)
  3. 从通信机制上来讲,线程间方便的通信机制。线程间属于同一个进程的不同线程之间共享同一地址空间,所以一个线程的数据可以被其它线程感知,线程间可以直接读写进程数据段(如全局变量)来进行通信(需要一些同步措施)
19.简述线程和进程的区别

重点:从属关系,最小单元,独立的地址空间,稳定性,上下文切换

  1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是依赖于进程而存在。
  2. 进程是资源分配的最小单位,线程是CPU调度的最小单位。
  3. 进程在执行过程中拥有独立的地址空间,而多个线程共享进程的地址空间。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
  4. 通信难度不一样。由于同一进程中的多个线程具有相同的地址空间,使它们之间的同步和通信的实现,也变得比较容易。进程间通信 IPC ,线程间可以直接读写进程数据段(如全局变量)来进行通信(需要一些同步方法,以保证数据的一致性)。
  5. 进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。
  6. 线程上下文切换开销小,适用于处理并发。
  7. 进程间不会相互影响;一个进程内某个线程挂掉将导致整个进程挂掉。
20.多线程模型

多对一模型。**将多个用户级线程映射到一个内核级线程上。**该模型下,线程在用户空间进行管理,效率较高。缺点就是一个线程阻塞,整个进程内的所有线程都会阻塞。几乎没有系统继续使用这个模型。

一对一模型。**将内核线程与用户线程一一对应。**优点是一个线程阻塞时,不会影响到其它线程的执行。该模型具有更好的并发性。缺点是内核线程数量一般有上限,会限制用户线程的数量。更多的内核线程数目也给线程切换带来额外的负担。linux和Windows操作系统家族都是使用一对一模型。

**多对多模型。**将多个用户级线程映射到多个内核级线程上。结合了多对一模型和一对一模型的特点。

21.进程同步的方法

当多个进程需要对同一个内核资源进行操作时,这些进程便是竞争的关系,操作系统必须协调各个进程对资源的占用,进程的互斥是解决进程间竞争关系的方法。 进程互斥指若干个进程要使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资源的进程必须等待,直到占有资源的进程释放该资源。
方法:互斥锁、自旋锁、读写锁、条件变量、信号量

22.线程同步的方式

操作系统中,属于同一进程的线程之间具有相同的地址空间,线程之间共享数据变得简单高效。遇到竞争的线程同时修改同一数据或是协作的线程设置同步点的问题时,需要使用一些线程同步的方法来解决

这些问题。同步的方法:互斥锁、读写锁、条件变量、信号量

23.互斥锁、自旋锁、读写锁、条件变量、信号量

互斥锁: 加锁后进入睡眠等待,睡眠时间到后解锁

自旋锁: 加锁后不进入睡眠,一直循环检测获得锁,获得后解锁

读写锁: 一个线程只能占用一个写锁但能占用多把读锁

条件变量: 用于自动阻塞一个线程,直到某种条件发生。常与互斥锁一起使用,睡眠等待某条件出现

信号量: 非负整数计数器,用于控制对公共资源的访问。大于0时可以访问反之不行。

屏障: 是一种同步机制。用户协调多个线程并行工作时,屏障用于让每个线程等待,直到所有线程的合作线程都到达某一个点时,然后从该点继续执行。

24.进程同步和线程同步之间的区别
  • 进程之间地址空间不同,不能感知对方的存在,同步时需要将锁放在多进程共享的空间。
  • 而线程之间共享同一地址空间,同步时把锁放在所属的同一进程空间即可。
25.死锁是怎样产生的

死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的下相互等待的现象。

死锁产生需要满足四个条件:

互斥条件: 进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源。

拥有请求条件: 当一个线程拥有了一个资源之后又试图请求另一个资源。

不可剥夺条件: 进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用后自己释放。

循环等待条件: 进程发生死锁后,必然存在一个进程-资源之间的环形链

26.如何解决死锁问题

破坏死锁的四大必要条件之一。1无法更改

  1. 资源一次性分配,这样就不会再有请求了,只要有一个资源得不到分配,也不给这个进程分配其他的资源。(破坏请求条件)
  2. 可剥夺资源:即当进程新的资源未得到满足时,释放已占有的资源,从而破坏不可剥夺的条件。
  3. 资源有序分配法:系统给每类资源赋予一个序号,每个进程按编号递增的请求资源,释放则相反,从而破坏环路等待的条件
27.什么是虚拟地址,什么是物理地址

虚拟地址:程序所操作地址

物理地址:物理地址是指处理器芯片发出,来进行地址空间寻址的地址,它与处理器地址引脚上发出的电信号相对应。

28.常见的页面置换算法

当访问一个内存中不存在的页,并且内存已满,则需要从内存中调出一个页或将数据送至磁盘对换区,替换一个页,这种现象叫做缺页置换。当前操作系统最常采用的缺页置换算法如下:

先进先出(FIFO)算法,最不常用算法,最近最少使用算法(LRU)

先进先出(FIFO)算法

思路:置换最先调入内存的页面,即置换在内存中驻留时间最久的页面。

实现:按照进入内存的先后次序排列成队列,从队尾进入,从队首删除。

特点:实现简单;性能较差,调出的页面可能是经常访问的

最不常用算法

思路:缺页时,置换访问次数最少的页面

实现:每个页面设置一个访问计数,访问页面时,访问计数加1,缺页时,置换计数最小的页面

特点:算法开销大,开始时频繁使用,但以后不使用的页面很难置换

最近最少使用算法

思路: 置换最近一段时间以来最长时间未访问过的页面。根据程序局部性原理,刚被访问的页面,可能马上又要被访问;而较长时间内没有被访问的页面,可能最近不会被访问。

实现:缺页时,计算内存中每个逻辑页面的上一次访问时间,选择上一次使用到当前时间最长的页面

特点:可能达到最优的效果,维护这样的访问链表开销比较大

29.什么是写时复制

如果多个调用方请求最初无法区分的资源,则可以为他们提供指向同一资源的指针。可以一直保持此功能,直到调用者尝试修改其资源的“副本”为止,此时将创建一个真正的私有副本,以防止其他所有人看到更改。所有这些对于呼叫者都是透明的。主要优点是,如果调用者从不进行任何修改,则无需创建私有副本。

写时复制的主要好处在于:如果进程从来就不需要修改资源,则不需要进行复制。尽量推迟代价高昂的操作,直到必要的时刻才会去执行。

30.实时操作系统的概念

实时操作系统(Real-time operating system, RTOS),又称即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。 实时操作系统与一般的操作系统相比,最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会马上(在较短时间内)执行该任务,不会有较长的延时。这种特性保证了各个任务的及时执行。

31.优先级反转是什么?怎么解决

优先级反转: 由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。

解决方法:

优先级继承: 将低优先级任务的优先级提升到等待它所占有的资源的最高优先级任务的优先级.当高优先级任务由于等待资源而被阻塞时,此时资源的拥有者的优先级将会自动被提升。

优先级天花板: 将申请某资源的任务的优先级提升到可能访问该资源的所有任务中最高优先级任务的优先级.(这个优先级称为该资源的优先级天花板)

32.线程与协程的区别

重点:从属关系,同步异步,状态保留,抢占式/非抢占式

  1. 一个线程可以多个协程,一个进程也可以单独拥有多个协程。
  2. 线程进程都是同步机制,而协程则是异步。
  3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。
  4. 线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
  5. 协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。
  6. 线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。
33.简述select,poll

select是一种多路复用技术。其收到所有输入的文件描述符,返回哪些文件有新数据。其可以设置为阻塞或者非阻塞状态,底层采用1024位bitmap做实现,因此有文件描述符上限数。

poll是一种多路复用技术。其收到所有输入的文件描述符,返回哪些文件有新数据。其通过链表代替了之前select的数据结构,使得其没有上限限制。

epoll是一种多路复用技术。其采用一个文件描述符管理多个输入的文件描述符,采用事件回调的方式,提高了程序运行效率。

34.BIO,NIO,AIO的区别?

BIO同步阻塞的IO:服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。应用场景:适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中,在JDK 1.4以前是唯一的I/O实现,但程序直观简单易理解。通俗理解为数据的读取写入必修阻塞在一个线程内,直到其完成。

NIO同步非阻塞IO:服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。应用场景:NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK 1.4开始支持。是传统I/O的升级版,客户端和服务端通过Channel(通道)通讯,实现了多路复用。NIO采用的是一种多路复用的机制,利用单线程轮询事件,高效定位就绪的Channel来决定做什么,只是Select阶段是阻塞式的,能有效避免大量连接数时,频繁线程的切换带来的性能或各种问题。

AIO异步非阻塞的IO:NIO的选择允许一个单独的线程来监视多个输入通道,可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入或选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。一个有效请求一个线程

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值