操作系统面试总结

本文深入探讨了操作系统中的并发和并行概念,阐述了进程与线程的区别与联系,解释了为何需要线程以提高系统效率。详细介绍了进程的状态转换、调度算法和通信方式,如管道、消息队列、信号量和共享内存。同时,讨论了用户态和内核态的切换以及同步、异步、阻塞和非阻塞的概念。此外,还涉及死锁、内存管理和线程同步等关键主题。
摘要由CSDN通过智能技术生成

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

  • 并发是指两个或多个事件在同一时间间隔发生,宏观上是一起发生的,微观上是交替进行的
  • 并发是在同一实体上的多个事件;

e.g单核CPU同一时刻只能执行一个程序,各程序之间是并发进行的

  • 并行是指两个或者多个事件在同一时刻发生;
  • 并行是在不同实体上的多个事件,

e.g.多核CPU同一时刻就可以执行多个程序,多个程序并行进行

1. 进程和线程

进程:进程是系统进行资源分配和调度的一个独立单位,是系统中的并发执行的单位。

线程:线程是进程的一个实体,也是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时又被称为轻权进程或轻量级进程。

进程与线程的区别(8)

  1. 进程是资源分配的最小单位,而线程是 CPU 调度的最小单位;

  2. 创建进程或撤销进程,系统都要为之分配或回收资源,操作系统开销远大于创建或撤销线程时的开销;

  3. 不同进程地址空间相互独立,同一进程内的线程共享同一地址空间。一个进程的线程在另一个进程内是不可见的;

  4. 进程间不会相互影响,而一个线程挂掉将可能导致整个进程挂掉;

进程与线程的联系

1、一个进程可以有多个线程,但至少有一个线程;而一个线程只能在一个进程的地址空间内活动。
2、资源分配给进程,同一个进程的所有线程共享该进程所有资源。
3、CPU分配给线程,即真正在处理器运行的是线程。
4、线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。

为什么有了进程,还要有线程呢?

进程可以使多个程序并发执行,以提高资源的利用率和系统的吞吐量,但是其带来了一些缺点:

进程在同一时间只能干一件事情;
进程在执行的过程中如果阻塞,整个进程就会被挂起,即使进程中有些工作不依赖与等待的资源,仍然不会执行。

基于以上的缺点,操作系统引入了比进程粒度更小的线程,作为并发执行的基本单位,从而减少程序在并发执行时所付出的时间和空间开销,提高并发性能。

进程的状态

就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源;
运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数;
阻塞状态: 进程等待某种条件,在条件满足之前无法执行;

就绪 —> 执行:对就绪状态的进程,当进程调度程序按一种选定的策略从中选中一个就绪进程,为之分配了处理机后,该进程便由就绪状态变为执行状态;

执行 —> 阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如进程提出输入/输出请求而变成等待外部设备传输信息的状态,进程申请资源(主存空间或外部设备)得不到满足时变成等待资源状态,进程运行中出现了故障(程序出错或主存储器读写错等)变成等待干预状态等等;

阻塞 —> 就绪:处于阻塞状态的进程,在其等待的事件已经发生,如输入/输出完成,资源得到满足或错误处理完毕时,处于等待状态的进程并不马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时候将该进程转为执行状态;

执行 —> 就绪:正在执行的进程,因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。

4.进程间通信方式,用途2

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC 的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams 等。其中 Socket 和 Streams 支持不同主机上的两个进程 IPC。

管道

  1. 它是半双工的,具有固定的读端和写端;

  2. 它只能用于父子进程或者兄弟进程之间的进程的通信;

  3. 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

命名管道

  1. FIFO 可以在无关的进程之间交换数据,与无名管道不同;
  2. FIFO 有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

消息队列

  1. 消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符 ID 来标识;

  2. 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级;

  3. 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除;

  4. 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

信号量

  1. 信号量(semaphore)是一个计数器。用于实现进程间的互斥与同步,而不是用于存储进程间通信数据;

  2. 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存;

  3. 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作;

  4. 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数;

  5. 支持信号量组。

共享内存

  1. 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区;

  2. 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。

进程的调度算法有哪些?

调度算法:根据系统的资源分配策略所规定的资源分配算法。常用的调度算法有:先来先服务调度算法、时间片轮转调度算法、短作业优先调度算法、最短剩余时间优先调度算法、高响应比优先调度算法、优先级调度算法
等。

  • 先来先服务
  • 时间片轮转
  • 短作业优先
  • 最短剩余时间优先
  • 高响应比优先
  • 优先级
  1. 什么是线程同步?

  2. 线程如何进行通信?

  3. 线程共享部分?私有部分

  4. 讲一下线程池

  5. 线程同步的几种方式的区别?应用场景?

  6. 信号通信用在什么地方

  7. 算法题:: 写一个多线程程序,一个线程对变量一直++,但不能超过100,一个线程对变量一直–,但不能小于0

  8. 操作系统通信

  9. Servlet生命周期

  10. 哪些方法可以获取Servlet的参数

  11. 知道哪些设计模式

  12. 有没有在项目中用过单例模式

  13. 阻塞队列

  14. 如何用阻塞队列解决生产者消费者问题

  15. 生产者消费者是用于解决什么问题的

  16. wait/notify、await/signal

  17. 内存置换

  18. 算法

  19. 页面

  20. 线程

  21. 进程

  22. 死锁5

  23. 死锁的条件6

  24. 如何解决、避免死锁 6

  25. synchornized锁的底层原理,膨胀机制等

  26. wait sleep 区别

    • wait notify notifyAll
  27. 线程状态, 转换条件

  28. 创建线程池的各个参数的含义: 核心线程数, 拒绝策略, 等待队列等

  29. 访问堆时的并发问题

  30. 内存

  31. 虚拟内存是什么 怎么实现

  32. 找TOPK的数

  33. 堆栈的区别

  34. 垃圾回收 算法 以及优缺点

  35. linux和windows分别属于哪种类型的操作系统

  36. .多进程,多线程,协程 聊聊看法

同步、异步、阻塞、非阻塞的概念

同步:当一个同步调用发出后,调用者要一直等待返回结果。通知后,才能进行后续的执行。

异步:当一个异步过程调用发出后,调用者不能立刻得到返回结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

阻塞:是指调用结果返回前,当前线程会被挂起,即阻塞。

非阻塞:是指即使调用结果没返回,也不会阻塞当前线程。

  1. 什么是死锁?

  2. 产生死锁的原因?

  3. 死锁产生的必要条件?

  4. 解决死锁的基本方法?

  5. 怎么预防死锁?

  6. 怎么避免死锁?

  7. 怎么解除死锁?

  8. 什么是缓冲区溢出?有什么危害?

  9. 分页与分段的区别?

  10. 物理地址、逻辑地址、虚拟内存的概念

  11. 页面置换算法有哪些?

  12. 谈谈你对动态链接库和静态链接库的理解?

  13. 外中断和异常有什么区别?

  14. 一个程序从开始运行到结束的完整过程,你能说出来多少?

什么是用户态和内核态

用户态和核心态是操作系统运行的两种状态。主要是为了访问能力的限制。用户态的权限低,核心态的权限高。

  • 在内核态,程序运行的是内核程序(可以访问计算机的任何数据和资源,不受限制,可以访问外围设备,如网线、网卡、硬盘等。),可以执行特权指令

在用户态,程序运行的是应用程序(只能受限的访问内存,能直接取读用户程序数据),只能执行非特权指令

用户态和内核态是如何切换的?

(1. 为什么切换?)
(2. 通过什么方式切换?)
(3. 切换场景)

  1. 用户程序是在用户态下的,但有时遇到一些操作需要较高的权限,比如申请内存等,这时要转换到内核态
  • 内核态–>用户态:执行一条特权指令,改变PSW(程序状态寄存器)标志位,操作系统将主动让出CPU使用权
  • 用户态–>内核态:发生”中断“硬件自动完成变态过程,触发中断信号意味着操作系统强行夺回CPU使用权
  1. 用户态切换到内核态主要有3种方式:系统调用,异常和外围设备中断。

其中系统调用可以被认为是用户进程主动发起的,异常外围设备中断则是被动的。

  • 系统调用:用户态进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请使用操作系统提供服务程序来完成工作。(系统调用的核心机制还是使用了操作系统为用户特别开放的一个”中断“来实现)
  • 异常:当CPU在执行运行用户状态下的程序时,发生了事先不可知的异常,这时触发由当前进程切换到处理此异常的内核相关程序种,也就转换到了内核态,比如缺页异常
  • 外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出响应的中断信号,这时CPU会暂停执行下一条即将要执行的指令而转去执行中断信号对应的处理程序。如果前面执行的指令是用户态下的程序,那么这个转换过程就是由用户态转换成内核态。比如硬盘读写操作的完成,操作系统会切换到硬盘读写中断处理程序中执行后续操作等。
  1. 进程终止的方式

  2. 守护进程、僵尸进程和孤儿进程

  3. 如何避免僵尸进程?

  4. 介绍一下几种典型的锁?

  5. 常见内存分配内存错误

  6. 内存交换中,被换出的进程保存在哪里?

  7. 原子操作的是如何实现的

  8. 抖动你知道是什么吗?它也叫颠簸现象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值