🚩操作系统的四个特性?
- 并发:同一段时间内多个程序执行
- 共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
- 虚拟:通过分时复用(如分时系统)以及空分复用(如虚拟内存)技术把一个物理实体虚拟为多个
- 异步:系统进程用一种走走停停的方式执行,(并不是一下子走完),进程什么时候以怎样的速度向前推进是不可预知的
🚩线程和进程的区别?
进程是一段运行着的程序,线程是执行程序代码的一个执行单,也是进程的一个实体。
- 进程是资源分配的基本单位,线程是资源调度的基本单位
- 进程之间资源不共享,同一个进程的多个线程共享进程的资源
- 线程之间可以通过进程的共享资源进行通信,而进程之间通信更加困难
- 线程之间上下文切换要比进程之间快,因为只需要保存线程的少量寄存器内容,开销较小
🚩什么是上下文切换?
CPU通过时间片分配的算法执行任务,每一个任务会被分配一个时间片,在这个时间片之内,可以执行当前任务,时间片用完后就会切换执行下一个任务,并且保存上一个任务的状态,以便下次切换回这个任务时可以再次加载。所以任务从保存到再次加载的一个过程就称之为上下文切换
🚩使用多线程的好处有哪些?
多线程相比於单线程的好处有:
- 使用多线程减少了程序的响应时间,对于一些需要等待的操作可以专门派发给一个线程执行
- 在多CPU或多核计算机上使用多线程提高CPU的利用率
- 与进程相比,线程的创建和切换的开销更小
- 便于程序的理解和维护,使用多线程可以简化程序结构,将一个复杂的任务分解到不同的线程执行
🚩多线程一定快吗?
不一定,使用多线程时增加了线程的创建和上下文切换时的一系列开销,也可能会产生死锁问题,所以并不是多线程就一定更快。在一些简单程序中反而比单线程要慢。
🚩并发和并行的区别?
并发是在单核CPU中多线程通过上下文切换的调度方式使得多个程序在同一时间段内发生,给用户的感觉就是同时运行
并行是多核CPU在同一时刻运行着不同的程序
🚩进程的状态?
进程又三种状态,分别是:
- 就绪状态(ready):等待被调度
- 运行状态(running)
- 阻塞状态(waiting):等待资源
就绪态通过调度算法从而获取CPU,运行态如果CPU的时间片用完会重回到就绪态等待调度,如果缺少资源就会转化成阻塞态
🚩进程的调度算法有哪些?
不同环境下会有不同的调度算法,对于批处理系统来说没有太多的用户操作,调度算法目标是保证吞吐量和周转时间,有以下几种:
- 先来先服务 first-come first-serverd(FCFS)
非抢占式调度算法,有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。 - 短作业优先 shortest job first(SJF)
非抢占式调度算法,有利于短作业,不利于长作业,会使长作业产生饥饿现象,处于一直等待短作业执行完毕的状态。如果一直有短作业到来,那么长作业永远得不到调度。 - 最短剩余时间优先 shortest remaining time next(SRTN)
抢占式调度算法,最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。
对于交互式系统,有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。基于此有以下的调度算法:
- 时间片轮转
将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程 - 优先级调度
为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级 - 多级反馈队列
可以看作是时间片轮转调度算法和优先级调度算法的结合。它设置了多个队列,每个队列时间片大小都不同。进程在第一个队列没执行完,就会被移到下一个队列。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
🚩进程间如何通信呢?
- 进程间通信的方式有:
(1)管道:只支持半双工通信(单向交替传输);只能在父子进程或者兄弟进程中使用,
(2)FIFO:也称为命名管道,去除了管道只能在父子进程中使用的限制,常用于客户-服务器应用程序中
(3)消息队列:消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。
(4)信号量:它是一个计数器,用于为多个进程提供对共享数据对象的访问
(5)共享内存:允许多个进程共享一个给定的存储区,多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。
(6)Socket:可用于不同机器间的进程通信。
🚩线程间如何通信呢?
- 线程间通信的方式有:
(1)在Java中可使用JVM提供的API,比如wait()、notify()、notifyAll() 等方法
(2)线程间还可以通过共享的主内存来进行值的传递
🚩死锁出现的四个必要条件?
- 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
- 占有和等待:已经得到了某个资源的进程可以再请求新的资源。
- 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
- 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。
🚩如何处理死锁问题?
处理死锁有以下策略:
- 死锁忽略:因为解决死锁问题的代价太高,而且死锁的发生概率很低或对用户影响很小,所以大多操作系统采取死锁忽略,不做任何反应
- 死锁预防:通过破坏之前死锁的必要条件来预防死锁发生
(1)破坏占有和等待:一次申请所有需要的资源,但这样会造成资源的浪费
(2)破坏环路等待:给资源统一编号,进程只能按编号顺序来请求资源。 - 死锁避免:在程序运行时避免发生死锁,常用算法有银行家算法,当进程申请资源时,首先判断分配资源后会否造成死锁,如果不会造成才分配资源
- 死锁检测与恢复:发现系统中出现死锁后,选择死锁中的一个进程进行释放资源(杀死进程、回滚进程、被其它进程抢占),让其它进程继续执行
🚩什么是虚拟内存?
虚拟内存的目的就是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。在程序装入时,只装入一部分在内存,程序执行期间,当访问的信息不再内存中时,操作系统将需要的部分数据调入内存,把不使用的内存换到外存中。
虚拟内存时计算机系统内存管理的一种技术,它使得程序认为它拥有连续可用的内存,而实际上通常是被分割成多个内存碎片,还有部分暂存在外存上,等待交换。
🚩了解哪些页面置换算法?
当需要从外存中加载信息,而内存又满了时,就要选择将内存中的页面置换出去,具体的置换方式有:
- 最佳置换算法(OPT, Optimal replacement algorithm):所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。但由于无法预知将来是否会被访问,所以是一个理论算法
- 最久未使用(LRU, Least Recently Used):选择最长时间没有被使用的页面置换出去
- 先进先出(FIFO,First In First Out):选择换出的页面是最先进入的页面。但是该算法可能会将那些经常被访问的页面换出,导致缺页率升高。
- 最少使用算法:选择使用次数最少的页面进行置换
- 时钟算法:页面设置访问位,将页面链接为一个环形列表,页面被访问的时候访问位设为1。页面置换的时候,如果当前指针的访问位为0,置换,否则将这个值置为0,循环直到遇到访问位为0的页面。