• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

操作系统面试常见问题

开发技术 开发技术 4小时前 1次浏览

什么是操作系统?

操作系统是软件和硬件资源的管理者,它负责管理底层硬件层的一些复杂操作,比如进程的调度和执行,内存管理,文件系统的管理,IO设备的管理等等。

操作系统给程序员提供了一些抽象接口,屏蔽了这些硬件层复杂的实现细节。

什么是系统调用?

应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用。

应用程序执行系统调用后,操作系统+从用户态进入内核态完成所需的处理,例如进程控制,内存管理 等,之后将处理的结果返回给应用程序。

系统调用大致可以分为五大类:

  • 设备管理。完成设备的请求或释放,以及设备启动等功能。

  • 文件管理。完成文件的读、写、创建及删除等功能。

  • 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。

  • 进程通信。完成进程之间的消息传递或信号传递等功能。

  • 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。

进程和线程?

进程是什么?

进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。

线程是什么?

线程是操作系统进行运算调度的最小单位,是进程的实际运作单位。

进程和线程的关系?

一个进程包含一个或者多个线程,每个线程都是进程中的一个单一顺序的控制流,他们共享这个进程的资源,并行的执行不同的任务。

为什么会出现线程不安全?

当两个线程操作同一个内存资源时,一个线程对另一个线程操作的数据进行了覆盖,导致他期望的数据和实际操作的数据不一致,这就是线程不安全。

进程之间的通信方式?

  1. 管道/匿名管道(Pipes) :用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。

  2. 有名管道(Names Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。

  3. 信号(Signal) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;

  4. 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。

  5. 信号量(Semaphores) :信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。

  6. 共享内存(Shared memory) :使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。

  7. 套接字(Sockets) : 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

线程之间的同步?

什么线程同步?(Synchronization)

线程同步就是当一个线程在对内存进行操作的时候,其他的线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他的线程才能对这个内存地址进行访问。

线程同步的方式?

  1. 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。

  2. 信号量(Semphares) :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量

  3. 事件(Event) :Wait/Notify:通过通知操作的方式来保持多线程同步

进程的调度算法?

  1. 先到先服务(FCFS) : 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。

  2. 最短作业优先(SJF) : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。

  3. 时间片轮转 : 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称 RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。

  4. 最高优先级调度 : 为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。

  5. 多级反馈队列 :前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法

  • 设置了多个队列,赋予每个队列不同的优先级,每个队列优先级从高到低,同时优先级越高时间片越短

    • 新的进程会被放入到第一级队列的末尾,按先来先服务的原则排队等待被调度,如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成;

  • 当较高优先级的队列为空,才调度较低优先级的队列中的进程运行。如果进程运行时,有新进程进入较高优先级的队列,则停止当前运行的进程并将其移入到原队列末尾,接着让较高优先级的进程运行;

页面置换算法?

当出现缺页异常,并且内存已满无法调入新页面时,就使用页面置换算法选择将哪个页面换出。

  1. 最佳页面页面置换算法:置换未来最长时间不访问的页面,这是一种理想中的算法,常用来衡量算法的相率。

  2. 先进先出置换算法:选择在内存中驻留时间最长的页面进行置换。

  3. 最近最久未使用置换算法(LRU):选择最长时间没有被访问的页面进行置换。每次访问都需要更新链表,维护代价高。

  4. 时钟页面置换算法

  5. 最不常用置换算法(LFU):选择访问次数最小的页面进行置换。

磁盘调度算法?

磁盘中数据的读取是机械式的,一圈一圈的磁道将盘面划分成一个一个的扇区,磁头在磁道上滑动读取数据。

磁盘调度算法就是通过优化寻道的顺序,来提高磁盘的访问效率。

  1. 先来先服务

  2. 最短寻道时间优先(SSTF):

  3. 扫描算法(SCAN):先向一个方向扫描,处理这个方向的磁道上所有的请求,扫描到头后返回。这会造成中间的磁道占便宜。

  4. 循环扫描算法CSCAN):磁头只在同一个方向上扫描,到头后重头开始。

  5. LOOK 和 C-LOOK 算法

    针对 SCAN 算法的优化则叫 LOOK 算法,它的工作方式,磁头在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的最始端或最末端,反向移动的途中会响应请求

    而针 C-SCAN 算法的优化则叫 C-LOOK,它的工作方式,磁头在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的最始端或最末端,反向移动的途中不会响应请求

     

锁?

推荐阅读:

https://mp.weixin.qq.com/s?__biz=MzUxODAzNDg4NQ==&mid=2247485583&idx=1&sn=412546e55f9f5cf394bdda633fcc2b1c&chksm=f98e4c25cef9c53350fcfcae69d771298e535c3c15e77af2a0c241a4738766ff616354c3e3f3&scene=178&cur_album_id=1408057986861416450#rd

上下文切换?

一个线程在运行时,CPU的寄存器中会存储一些当前线程的中间数据,这就是当前线程的上下文,当发生线程切换的时候,需要把这些上下文信息保存在线程的线程控制块中然后退出CPU,并对下一个要运行的线程进行上下文的恢复,这个过程就是上下文的切换。

因为线程的切换往往非常频繁,所以上下文切换会带来额外的CPU开销。


程序员灯塔
转载请注明原文链接:操作系统面试常见问题
喜欢 (0)