操作系统面试真题总结(六)

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

同步和异步有什么区别?

同步(Synchronous)操作是在一个操作完成之前,不进行下一个操作。

这是一种阻塞调用,也就是说,进行某项操作的过程中,不得不停下来等待,直到这个操作完成。

  • 例如,当你在核对大批量的数据时,你需要等待所有数据都加载完毕才能继续进行下一项操作,这就是同步

异步(Asynchronous)操作是不需要立刻得到结果,即使未完成也可进行其它操作。

这是一种非阻塞调用,也就是说,还没得到结果,就继续做别的事情,不会因为单一操作的等待而阻塞。

  • 例如,你去网上订一张火车票,由于网站服务器繁忙,订票需要一些时间,但是你不会就一直盯着屏幕等
    • 而是可以一边浏览新闻或者查看其他信息一边等待订票结果,这就是异步操作。

这两种方式各有利弊,选择使用同步还是异步,主要取决于具体的需求和场景。

说下你对并发和并行的理解?

并发(Concurrency)是指系统能够处理多个任务的能力,这并不意味着这些任务一定会同时进行。

  • 并发的任务可能会交错进行,因此并发可以在单核CPU上实现。

这是因为CPU可以通过时间片轮转或其他任务切换策略,在各个任务之间快速切换,给人以它们在同时进行的错觉。

并行(Parallelism)则是指系统同时执行多个任务的能力。

  • 并行显然需要硬件的支持,如多核心或多处理器。

在这种情况下,多个任务确实可以在同一时间内进行。

  • 例如,现代的多核CPU可以让我们在看电影的同时进行视频编码,每一个任务在不同的处理器核心上执行,这就是并行。

总的来说,如果你有两个线程在单核心的CPU上,那么可能会通过交错执行达到并发。

如果你的电脑有多个核心或处理器,你就可以在多个核心或处理器上同时执行多个线程,这是并行

谈一谈你对操作系统的理解?

操作系统的主要作用包括:

资源管理:

  • 操作系统负责管理计算机的硬件资源,如处理器、内存、硬盘和外部设备等,以便合理地分配和利用这些资源。
  • 它通过调度算法和资源分配机制,确保每个任务或进程都能得到适当的资源。

进程管理:

  • 操作系统能同时运行多个程序,通过进程管理,它可以控制程序的执行、调度和协作,以便提高计算机的整体效率。
  • 它负责创建、终止、挂起和恢复进程,以及管理进程之间的通信与同步。

文件管理:

  • 操作系统负责管理计算机的文件系统,方便用户存储和获取数据,确保数据的安全性和完整性。
  • 它提供了文件的创建、读写、删除和重命名等操作,以及文件的权限管理和保护。

用户界面:

  • 操作系统提供了与计算机交互的用户界面,可以是命令行界面或图形用户界面(GUI),使得用户可以方便地使用计算机。
  • 用户可以通过输入指令或点击图标进行操作和访问系统功能。

错误检测和恢复:

  • 操作系统能够监测和处理软件和硬件错误,提供错误检测和恢复的机制,以保证计算机的稳定性和可靠性。
  • 它可以监测和捕获程序的异常、处理硬件故障、提供备份和恢复机制等。

乐观锁和悲观锁有什么区别?

乐观锁和悲观锁是并发控制中两种不同的策略,用于处理多个线程对共享资源的并发访问问题。

它们的区别如下:

悲观锁(Pessimistic Locking):

  • 悲观锁的策略是在访问共享资源之前,假设会发生冲突并进行保护。
    • 在悲观锁机制下,如果一个线程要访问共享资源,它会假设其他线程可能会对该资源进行修改
      • 因此会将资源加锁,直到完成操作后才会释放锁。

乐观锁(Optimistic Locking):

  • 乐观锁的策略是在访问共享资源时不加锁,而是在更新操作时进行冲突检测。
    • 线程在读取共享资源时,不会对其加锁,而是记录下读取时的版本号或其他标识信息。
    • 在提交更新操作时,会再次检查共享资源是否被其他线程修改过。
      • 如果没有冲突,就执行更新操作
      • 如果有冲突,就放弃当前更新并重新尝试。

性能比较:

  • 悲观锁会在访问共享资源之前就加锁,即使没有实际的冲突,也会造成性能的损失。
    • 而乐观锁避免了大部分的锁竞争,提高了并发性能。
    • 但是,如果冲突频繁发生,乐观锁需要不断地进行重试,可能会导致性能下降。

悲观锁假设会有冲突发生,因此在访问共享资源前进行加锁

而乐观锁假设不会有冲突发生,在更新操作时进行冲突检测。

  • 选择哪种锁策略应根据具体场景和需求来决定。

什么是死锁?

死锁(Deadlock)是指在多任务环境下:

  • 当两个或更多的任务各自拥有一个资源并且等待获取另一个任务持有的资源时,就会发生的一种状态。

涉及的任务无法继续执行,因为每个任务都在等待其他任务释放资源,但是没有任务会释放它的资源,因为它们都在等待。

  • 这就形成了一个循环的等待状态,从而导致了死锁。

死锁的四个必要条件:

互斥条件:

  • 一个资源只能由一个任务拥有,在资源释放之前任何其他任务都无法请求到。

占有并等待:

  • 一个任务持有至少一个资源,但又申请新的资源,而新资源正被别的任务持有
    • 所以申请任务阻塞,但又对自己已获得的资源保持不放。

不可抢占:

  • 别的任务不能把已获得的资源从任务中强行回收,资源只能由获得它的任务自行释放。

循环等待:

  • 存在一种可能,即任务之间形成一种任务-资源的环形链,链中每个任务都占有下一个任务所需的资源。

只要这四个条件中的任意一个得不到满足,就不会发生死锁。

操作系统的设计者通过算法来破坏这些条件从而避免死锁。

  • 例如,可以采用资源按顺序分配策略来避免循环等待,通过设置资源申请超时来避免无限期的资源等待等方法。

解决死锁的基本方法?

解决死锁的主要方法可以归结为四类:

  • 预防、避免、检测和恢复。

死锁预防:

  • 预防策略的主要思想是破坏造成死锁的四个必要条件中的至少一个。
    • 例如,可以通过资源互斥访问的限制或者一次性请求所有所需资源的方式来阻止占有并等待的条件
      • 或者在任务请求资源时先检查这是否会引起循环等待,等等。
    • 这种策略的问题是可能会导致资源的低效使用。

死锁避免:

  • 死锁避免采取了一种更加精细的策略。
    • 它需要保持关于系统当前的哪些资源被哪些任务占用、哪些资源是空闲的、哪些任务正在等待资源等的信息。
    • 然后,操作系统在每次有资源请求时,都会先检查是否授予该资源可能导致系统进入不安全状态(即可能死锁)
      • 如果是,就不给任务分配资源。

死锁检测和恢复:

  • 有时,我们可能认为死锁可能发生得比较少,或者避免死锁的成本比较高
    • 所以我们愿意冒险,但是当检测到死锁时需要有一种恢复办法。
    • 这就需要一种检测死锁的算法。
    • 当检测到死锁后,通常的做法是中止一些任务或抢占一些资源,以解除死锁状态。

忽略死锁:

  • 这是一种鸵鸟算法–即忽略问题的存在。
    • 这种做法假定死锁很少发生,即使发生了,系统崩溃或重启可能对用户影响更小。
    • 尽管这种做法并不总是有用,但是在某些具体情况下
      • 特别是在一些非关键的用户交互式系统中,这可能是一种实用的方法。

总的来说,避免和预防死锁是一种权衡,需要在资源的有效利用和系统稳定性之间做出平衡。

在实际系统中,可能会使用多种策略与技术相结合的方式来处理死锁。

你可能感兴趣的:(面试,java,前端)