1、并行和并发有什么区别?
并发就是在一段时间内,多个任务都会被处理;但在某一时刻,只有一个任务在执行。单核处理器做到的并发,其实是利用时间片的轮转,例如有两个进程 A 和 B,A 运行一个时间片之后,切换到 B,B 运行一个时间片之后又切换到 A。因为切换速度足够快,所以宏观上表现为在一段时间内能同时运行多个程序。
并行就是在同一时刻,有多个任务在执行。这个需要多核处理器才能实现,在微观上就能同时执行多条指令,不同的程序被放到不同的处理器上运行,这个是物理上的多个进程同时进行。
2、进程有哪些状态?
当一个进程开始运行时,它可能会经历下面这几种状态:
上图中各个状态的意义:
- 运⾏状态(Runing):该时刻进程占⽤ CPU;
- 就绪状态(Ready):可运⾏,由于其他进程处于运⾏状态⽽暂时停⽌运⾏;
- 阻塞状态(Blocked):该进程正在等待某⼀事件发⽣(如等待输⼊/输出操作的完成)⽽暂时停⽌运⾏,这时,即使给它 CPU 控制权,它也⽆法运⾏;
当然,进程还有另外两个基本状态:
- 创建状态(new):进程正在被创建时的状态;
- 结束状态(Exit):进程正在从系统中消失时的状态;
3、进程有哪些调度算法?
进程调度是操作系统中的核心功能之一,它负责决定哪些进程在何时使用 CPU。这一决定基于系统中的进程调度算法。
①、先来先服务
这是最简单的调度算法,也称为先进先出(FIFO)。进程按照请求 CPU 的顺序进行调度。这种方式易于实现,但可能会导致较短的进程等待较长进程执行完成,从而产生“饥饿”现象。
三分恶面渣逆袭:先来先服务
②、短作业优先
选择预计运行时间最短的进程优先执行。这种方式可以减少平均等待时间和响应时间,但缺点是很难准确预知进程的执行时间,并且可能因为短作业一直在执行,导致长作业持续被推迟执行。
三分恶面渣逆袭:短作业优先
③、优先级调度
在这种调度方式中,每个进程都被分配一个优先级。CPU 首先分配给优先级最高的进程。优先级调度可以是非抢占式的或抢占式的。在非抢占式优先级调度中,进程一旦开始执行将一直运行直到完成;在抢占式优先级调度中,更高优先级的进程可以中断正在执行的低优先级进程。
三分恶面渣逆袭:优先级调度
④、时间片轮转
时间片轮转调度为每个进程分配一个固定的时间段,称为时间片,进程可以在这个时间片内运行。如果进程在时间片结束时还没有完成,它将被放回队列的末尾。时间片轮转是公平的调度方式,可以保证所有进程得到公平的 CPU 时间,适用于共享系统。
三分恶面渣逆袭:时间片轮转
⑤、最短剩余时间优先
这是短作业优先的一种改进形式,它是抢占式的。即如果一个新进程的预计执行时间比当前运行进程的剩余时间短,调度器将暂停当前的进程,并切换到新进程。这种方法也可以最小化平均等待时间,但同样面临预测执行时间的困难。
⑥ 多级反馈队列
一个进程需要执行100 哥时间片,如果采用时间片轮转调度算法,那么需要交互 100 次。
多级队列就是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列的时间片大小不同,比如 2,4,6,8······。进程在第一个队列没执行完,就会被移到下一个队列。
这种方式下,之前的进程只需要交换 7 次就可以了。每个队列优先权不一样,最上面的队列优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
可以将这种调度算法看成是时间片轮转调度算法与优先级调度算法的结合。
DIDA-lJ-多级反馈队列
4、进程和线程的联系和区别
进程是一个正在执行的程序的实例。每个进程有自己独立的地址空间、全局变量、堆栈、和文件描述符等资源。
线程是进程中的一个执行单元。一个进程可以包含多个线程,它们共享进程的地址空间和资源。
每个进程在独立的地址空间中运行,不会直接影响其他进程。线程共享同一个进程的内存空间、全局变量和文件描述符。
进程切换需要保存和恢复大量的上下文信息,代价较高。线程切换相对较轻量,因为线程共享进程的地址空间,只需要保存和恢复线程私有的数据。
线程的生命周期由进程控制,进程终止时,其所有线程也会终止。
特性 | 进程 | 线程 |
---|---|---|
地址空间 | 独立 | 共享 |
内存开销 | 高 | 低 |
上下文切换 | 慢,开销大 | 快,开销小 |
通信 | 需要 IPC 机制,开销较大 | 共享内存,直接通信 |
创建销毁 | 开销大,较慢 | 开销小,较快 |
并发性 | 低 | 高 |
崩溃影响 | 一个进程崩溃不会影响其他进程 | 一个线程崩溃可能导致整个进程崩溃 |
5、线程上下文切换了解吗?
这还得看线程是不是属于同⼀个进程:
-
当两个线程不是属于同⼀个进程,则切换的过程就跟进程上下⽂切换⼀样;
-
当两个线程是属于同⼀个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据;
所以,线程的上下⽂切换相⽐进程,开销要⼩很多
6、什么是进程的上下文切换?
上下文切换是操作系统在多任务处理环境中,将 CPU 从一个进程切换到另一个进程的过程。通过让多个进程共享 CPU 资源,使系统能够并发执行多个任务。
进程上下文切换通畅包含以下几个步骤:
- 保存当前进程的上下文:操作系统保存当前进程的 CPU 寄存器,程序状态等关键信息。
- 选择下一个进程:调度程序选择下一个要执行的进程。
- 恢复上一个进程的上下文。
- 切换到下一个进程。