计算机操作系统常见面试题整理

编程入门 行业动态 更新时间:2024-10-12 03:19:56

计算机操作系统常见<a href=https://www.elefans.com/category/jswz/34/1769418.html style=面试题整理"/>

计算机操作系统常见面试题整理

操作系统

操作系统(OS)是管理计算机硬件和软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络、管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

进程管理;内存管理;文件管理;输入/输出管理

进程与线程的关系以及区别

定义:

  • 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
  • 线程是进程的一个实体,是CPU调度和分配的基本单位,它是比进程更小的能独立运行的基本单位。

关系以及区别:

  • 进程是资源分配的最小单位;线程是CPU调度的最小单位,处理机分配给线程,即真正在处理机上运行的是线程。
  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
  • 资源分配给进程,同一进程中的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
  • 进程有自己的独立地址空间,线程没有。
  • 进程和线程通信方式不同。线程之间的通信比较方便,同一进程下的线程共享资源(比如全局变量、静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。
  • 一个进程挂掉了不会影响其他进程(保护模式下),而线程挂掉了会影响其他线程

进程的常见状态以及各种状态之间的转换条件

就绪:进程已处于准备好运行的状态,即进程已分配到除CPU外的所有必要资源后,只要再获得CPU,便可立即执行

执行:进程已经获得CPU,程序正在执行状态

阻塞:正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态

就绪->运行:处于就绪的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变为执行状态。

执行->就绪:处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变为就绪状态。

执行->阻塞:正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。

阻塞->就绪:处于阻塞状态的进程,若其等待的事件已经发生,那么进程就从阻塞状态转变为就绪状态。

线程状态变化转换图

线程在一定条件下,状态会发生变化。线程一共有以下几种状态:

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):在就绪状态的线程除CPU之外,其它的运行所需资源都已全部获得。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

阻塞的情况分三种:

(1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,

(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

进程间通信有哪些方式?以及之间的区别

IPC方式:7种

  • (匿名)管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在有血缘关系的进程(父子进程)间使用。只能实现本地机器上两个进程之间的通信,而不能实现跨网络的通信。
  • 命名管道(named pipe):也是半双工的通信方式,但是它允许无亲缘关系关系进程间通信。命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信。
  • 信号(signal):是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。
  • 信号量(semophere):信号量是一个计数器,可用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 消息队列(message queue):消息队列是由消息组成的链表,存放在内核中,并由消息队列标识符标识。消息队列克服了信号传递消息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 共享内存(shared memory):就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量等配合使用,来实现进程间的同步和通信。
  • 套接字(socket):套接口也是进程间的通信机制,与其他通信机制不同的是它可用于不同机器间的进程通信。

几种方式的比较:

  • 管道:速度慢、容量有限
  • 信号量:不能传递复杂信息,只能用来同步。
  • 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
  • 共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全。

为什么要线程通信?

多个线程并发执行时,在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮助我们达到多线程共同操作一份数据。如果没有使用线程通信来多线程共同操作同一份数据的话,虽然可以实现,但是在很大程度上会造成多线程之间对同一共享变量的争夺,那样的话会造成很多错误和损失。

所以,多线程之间的通信能够避免对同一共享变量的争夺。

线程通信就是帮助解决线程之间对同一变量的使用或操作,避免对同一共享变量的争夺。

线程之间的通信方式(线程同步)

1.临界区

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

2.事件(CEvent)

事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。比如在某些网络应用程序中,一个线程如A负责侦听通信端口,另外一个线程B负责更新用户数据,利用事件机制,则线程A可以通知线程B何时更新用户数据。

3.互斥量(CMutex)

互斥对象和临界区对象非常相似,但是其允许在进程间使用,而临界区只限制与同一进程的各个线程之间使用,临界区对象更节省资源,更有效率,原因是它不用陷入内核态。

4.信号量(CSemphore)

当需要一个计数器来限制可以使用某共享资源的线程数目时,可以使用“信号量”对象。CSemaphore类对象保存了对当前访问某一个指定资源的线程的计数值,该计数值是当前还可以使用该资源的线程数目。如果这个计数达到了零,则所有对这个CSemaphore类对象所控制的资源的访问尝试都被放入到一个队列中等待,直到超时或计数值不为零为止。

临界资源

在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必要资源)。但对于某些资源来说,其在同一时间只能被同一进程所占用。这些一次只能被一个进程所占用的资源就是所谓的临界资源。典型的临界资源比如物理上的打印机,或是存在硬盘或内存中被多个进程共享的一些变量和数据等(如果这类资源不被看作临界资源加以保护,那么很有可能造成丢失数据的问题)。

对于临界资源的访问,必须是互斥进行。也就是当临界资源被占用时,另一个申请临界资源的进程会被阻塞,直到其所申请的临界资源被释放。而进程内访问临界资源的代码称为临界区。

信号量

信号量就是一个资源计数器,对信号量有两个操作来达到互斥,分别是P和V操作。

一般情况是这样进行临界访问或互斥访问的:

设信号量值为1,

当一个进程1运行时,使用资源,进行P操作,即对信号量值减1,也就是资源数少了1个。这时信号量值为0。系统中规定当信号量值为0时,必须等待,直到信号量值不为零才能继续操作。

这时如果进程2想要运行,那么也必须进行P操作,但是此时信号量为0,所以无法减1,即不能P操作,也就阻塞。这样就达到了进程1排他访问。

当进程1运行结束后,释放资源,进行V操作。资源数重新加1,这时信号量的值变为1.

这时进程2发现资源数不为0,信号量能进行P操作了,立即执行P操作。信号量值又变为0.此时进程2占有资源,排他访问资源。

这就是信号量来控制互斥的原理。

线程安全

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

进程调度

调度种类:

  • 高级调度:又称作业调度,它决定把后备作业调入内存运行
  • 低级调度:又称进程调度,它决定把就绪队列的某进程获得CPU
  • 中级调度:又称为在虚拟存储器中引入,在内、外存对换区进行进程切换

非抢占式调度与抢占式调度

  • 非抢占式:分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生进程调度进程调度某事件而阻塞时,才把处理机分配给另一个进程。
  • 抢占式:操作系统将正在运行的进程强行暂停,由调度程序将CPU分配给其他就绪进程的调度方式。

调度策略的设计

  • 响应时间: 从用户输入到产生反应的时间
  • 周转时间: 从任务开始到任务结束的时间

CPU任务可以分为交互式任务和批处理任务,调度最终的目标是合理的使用CPU,使得交互式任务的响应时间尽可能短,用户不至于感到延迟,同时使得批处理任务的周转时间尽可能短,减少用户等待的时间。

进程的调度算法有哪些?

  • 先来先服务(FCFS):此算法的原则是按照作业到达后备作业队列(或进程进入就绪队列)的先后次序选择作业(或进程);公平、简单、非抢占、不适合交互式;未考虑任务特性,平均等待时间可以缩短。
  • 短作业优先(SJF:Shortest Process First):这种算法主要用于作业调度,它从作业后备序列中挑选所需运行时间最短的作业进入主存运行。
  • 时间片轮转调度算法:当某个进程执行的时间片用完时,调度程序便终止该进程的执行,并将它送到就绪队列的末尾,等待分配下一时间片再执行。然后把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证队列中的所有进程,在已给定的时间内,均能获得一时间片处理机执行时间。
  • 高响应比优先:按照高响应比(已等待时间+要求运行时间)/要求运行时间 优先的原则,在每次选择作业投入运行时,先计算此时后备作业队列中每个作业的响应比RP。选择最大的作业投入运行。
  • 优先权调度算法:按照进程的优先权大小来调度。使高优先权进程得到优先处理的调度策略称为优先权调度算法。注意:优先数越多,优先权越小。
  • 多级队列调度算法:多队列调度是根据作业的性质和类型的不同,将就绪队列再分为若干个队列,所有的作业(进程)按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法。

更多推荐

计算机操作系统常见面试题整理

本文发布于:2024-02-24 15:59:39,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1695851.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:面试题   操作系统   常见   计算机

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!