操作系统

注意:括号中为八股在每次面试中出现的概率

线程和进程的区别?(628/1759=35.7%)

线程和进程是操作系统资源调度和任务执行的核心概念,一个进程可以包含多个线程,它们主要有4个区别。

第一个是资源分配与独立性上的区别,

首先,进程是操作系统资源分配的基本单位。每个进程拥有独立的内存空间(如堆、栈、代码段)、文件句柄等系统资源,进程之间相互隔离,一个进程崩溃不会直接影响其他进程。

然而,线程是CPU调度的基本单位,属于进程内部的执行流。同一进程下的多个线程共享进程的内存和资源(如全局变量、文件描述符),这使得线程间通信更高效,但也需要开发者处理同步问题。

第二个是创建与切换的开销上的区别,

首先,进程的创建和销毁开销较大,因为需要分配或回收独立的内存、资源,上下文切换时需要保存和恢复整个进程的状态(如内存页表、寄存器)。

然而,线程的创建和切换更轻量,因为线程共享进程的资源,上下文切换仅需保存线程私有数据(如栈、寄存器),因此多线程更适合需要频繁切换任务的场景。

第三个是通信与同步机制上的区别,

首先,进程间通信(IPC)需要复杂机制,例如管道、消息队列、共享内存等,由操作系统提供支持,通信效率较低。

然而,线程间通信直接通过共享内存(如同一个进程的全局变量),但需通过锁(如synchronized)、信号量等机制保证同步,避免数据竞争。

第四个是容错与并发性上的区别,

首先,进程的独立性提高了系统稳定性,一个进程的崩溃通常不会影响其他进程,适合需要高可靠性的场景(例如浏览器多标签页使用多进程)。

然而,线程的共享特性更适合高并发任务,例如Web服务器同时处理多个请求,但一个线程的错误可能导致整个进程终止。

如何记忆:

1.口诀记忆

口诀:

进(进程)独占资源,线(线程)共享内存。进(进程)切换昂贵,线(线程)切换轻。进(进程)通信困难,线(线程)共享快。进(进程)崩溃独立,线(线程)互相牵。

解释:

口诀将四个核心区别(资源、切换、通信、稳定性)对称归纳

2.谐音记忆

谐音:

进程 = 进(资源)+ 城(独立),线程 = 线(联系)+ 连(共享)

解释:

进程:像一个独立的城(城堡),有自己的护城河(独立资源),进城需要关卡验证(进程间通信复杂)。

线程:像一根连接的线(绳索),多个线绑在一起形成一股绳(线程共享资源),但要小心打结(同步问题)。

拓展:

1.进程调度策略

先来先服务(FCFS),它按照进程到达就绪队列的时间顺序进行调度,不会抢占已经运行的进程。这种方式实现简单,但可能会导致“护航效应”,即短作业需要等待长作业执行完毕。此外,它的平均等待时间波动较大,对I/O密集型进程不够友好,因为I/O密集型进程通常需要频繁等待,而FCFS无法让它们尽快获得CPU。

短作业优先(SJF)是一种基于贪心算法的策略,它优先调度执行时间短的进程,以提高系统吞吐量,并且理论上能够保证最小的平均等待时间。然而,这种策略可能导致长作业出现“饥饿”现象,特别是在短作业不断进入系统的情况下,长作业可能长时间得不到调度,从而影响系统的公平性。

优先级调度(Priority)是一种根据进程优先级决定调度顺序的策略,优先级可以是静态的,也可以是动态调整的。静态优先级通常基于进程类型,例如实时进程优先级最高,而动态优先级可以根据资源占用、等待时间或I/O行为进行调整。为了防止低优先级进程长期得不到调度,通常会使用老化技术(Aging),即随着等待时间的增加逐步提升优先级,从而避免“饥饿”现象。

时间片轮转(RR)是一种抢占式调度策略,为每个进程分配固定的时间片,时间片用尽后切换到下一个进程,以确保所有进程都能公平获得CPU资源。时间片的选择需要权衡系统响应速度和上下文切换开销,过小会导致频繁切换降低吞吐量,过大则会退化为FCFS。

多级反馈队列(MLFQ)是一种动态调整的调度方式,进程最初进入最高优先级队列,若时间片用尽仍未完成,则逐级下降到低优先级队列,而I/O等待完成后可能提升优先级。为了避免低优先级进程长时间得不到调度,系统会定期提升所有进程的优先级,使其最终能获得CPU资源。MLFQ适用于不同类型的任务,既能兼顾短任务的响应速度,也能保证长任务最终得到执行。

2.线程调度策略

线程调度策略主要有时间切片式和抢占式两种方式,不同的调度方式会影响线程的执行顺序和资源分配。

时间切片式调度是一种公平调度策略,当一个进程中存在多个优先级相同的线程时,CPU会为每个线程分配固定的时间片,线程依次轮流执行。例如,线程1运行一段时间后挂起,CPU切换到线程2,再运行一段时间后切换到线程3,以此类推。这种方式可以保证所有线程都有机会获得CPU时间,但无法保证高优先级线程能立即执行。

抢占式调度则是基于优先级进行线程调度,优先级高的线程更容易获得CPU的执行权,但并不意味着一定会被最先执行。操作系统通常会根据线程的优先级、等待时间和系统负载来决定具体的执行顺序,因此高优先级线程只是相对更容易被调度,而不是绝对优先执行。抢占式调度能够更好地满足实时性需求,适用于对任务优先级有严格要求的场景。

3.进程间通信(IPC)方式

无名管道(Pipe):用于具有亲缘关系的进程间通信,数据采用先进先出(FIFO)的方式进行传输,通常用于父子进程或兄弟进程之间。

当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开,要关闭管道只需将这两个文件描述符关闭即可。单进程中的管道如下图:

有名管道(Named Pipe):区别于无名管道,有名管道允许不具备亲缘关系的进程通信,并且数据同样遵循FIFO原则。它以磁盘文件的形式存在,使得本机上的多个进程可以通过文件系统进行数据传输。

信号(Signal):用于异步通知进程发生特定事件,例如终止、暂停或用户定义的操作。信号机制较为简单,通常用于进程控制,而不是传输大量数据。

消息队列(Message Queue):允许进程以结构化消息的方式进行通信,消息存储在内核中,支持按类型读取,不局限于FIFO模式,因此比管道更灵活。消息队列还支持消息的随机查询和持久化存储,适用于需要更可靠的数据传输场景。

信号量(Semaphore):本质上是一个计数器,用于控制多个进程对共享资源的访问,以同步进程或避免竞争条件。信号量适用于并发控制,例如解决多个进程同时修改同一数据的问题。

共享内存(Shared Memory):允许多个进程映射到同一块物理内存,实现高速数据交换。由于数据直接存取,无需额外的拷贝和系统调用,因此是最快的进程间通信方式之一,但需要搭配信号量或互斥锁进行同步,以防止数据竞争。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

【神品八股】1759篇面经精华 文章被收录于专栏

神哥引路,稳稳起步!!早鸟特惠,仅剩177名额!晚了就涨到29.9了! 核心亮点: 1.数据驱动,精准高频:基于1759篇面经、24139道八股题,精准提炼真实高频八股。 2.科学记忆,高效掌握:融合科学记忆法和面试表达技巧,记得住,说得出。 3.提升思维,掌握财商:不仅可学习八股,更可教你变现,3个月赚不回购买价,全额退。 适宜人群: 在校生、社招求职者及自学者。

全部评论
只有三题吗,还是说没更新完
1 回复 分享
发布于 03-05 16:59 广东
神哥加油,还有计网了
1 回复 分享
发布于 03-04 14:00 河南

相关推荐

05-12 16:04
已编辑
江西财经大学 Java
点赞 评论 收藏
分享
评论
8
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务