当前位置: 首页 > article >正文

20250115面试鸭特训营第23天

更多特训营笔记详见个人主页【面试鸭特训营】专栏

250115

1. 线程和进程有什么区别?

属性进程线程
定义进程是操作系统进行资源分配和调度的最小独立单位,是应用程序运行的实例,是一个动态的实体。CPU 调度的基本单位,属于进程,一个进程中可以包含多个线程。
空间具有独立的内存空间和资源。每个线程有自己独立的栈和寄存器。
资源分配拥有独立的资源,如内存、文件描述符等。同一进程中的多个线程共享内存和资源。
开销创建、销毁和切换进程的开销较大。进程上下文切换需要保存和恢复更多的信息,开销较大。创建和销毁线程的开销较小,线程切换的开销远小于进程切换。线程上下文切换只需保存少量信息,开销较小。
通信方式由于每个进程都有属于自己的地址空间,进程间通信需要使用IPC(管道、消息队列、共享内存等)。同一进程内线程共享内存空间,内存共享,线程可以直接读写内存,但可能竞争资源,注意避免同步机制导致的数据错误

2. 进程之间的通信方式有哪些?

  • 管道:单向通信方式,用于在 父进程和子进程之间同一主机上的不同进程 之间传递数据。

    • 匿名管道
      • 特点:单向通信,数据从一端写入,另一端读取,且只能在具有亲缘关系的进程(如父子进程、兄弟进程)之间使用。
      • 优点:实现简单,开销小。
      • 缺点:通信方向单一,数据只能以流的形式进行传递。
    • 命名管道
      • 特点:双向通信,不强制进程间有亲缘关系,是一种存在于文件系统中的特殊文件,通过管道名称可以进行读写操作。
      • 优点:适用于在无关系的进程间进行通信。
      • 缺点:需要创建命名文件,使用不如匿名管道方便。
  • 消息队列:消息队列允许一个进程向另一个进程发送消息,消息在队列中按顺序存储,并且接收方可以按需接收。

    • 特点:通过消息队列在进程间传递消息,允许一对多或多对多通信。
    • 优点:数据有结构化,支持优先级,且消息不需要实时消费,可暂存于队列。
    • 缺点:队列容量有限,可能造成阻塞,且实现稍复杂,需要额外管理队列。
  • 共享内存:共享内存允许多个进程访问同一块内存区域,从而实现快速的数据交换。但需要注意同步问题,以避免竞态条件和数据一致性问题。

    • 特点:多个进程可以访问同一块内存区域来交换数据。

    • 优点: 通信效率最高,数据直接读写无需复制,且适合频繁、大量数据的通信。

    • 缺点: 需要额外的同步机制(如信号量)来避免竞争和数据不一致。

    • 共享内存虽然能提供最快速的通信方式, 但存在并发读写的问题,需要使用同步机制来控制

      • 信号量:用于对共享内存进行访问控制,防止多个进程同时读写时出现数据不一致。
      • 互斥锁和读写锁:用于解决多线程对共享资源的互斥访问问题,互斥锁确保只有一个进程可以访问共享资源,读写锁则允许多个进程进行读操作,但在写操作时需要排他锁。
  • 信号量:信号量是一种同步原语,用于管理对共享资源的访问,它可以用于实现进程间的互斥访问和同步操作。

    • 特点:主要用于进程间的同步,而非大量数据传递。
    • 优点: 能有效解决临界区问题。
    • 缺点: 不适合复杂的数据交换,仅限于控制同步。
  • 信号:信号是一种异步通信方式,用于通知目标进程发生了某个事件。信号常用于进程之间发送中断或终止指令。

    • 特点:用于通知进程某些事件的发生。

    • 优点: 简单高效,适用于轻量级事件通知。

    • 缺点: 信号携带的信息有限,通常只能通知特定事件。

      • 信号是操作系统提供的一种通知机制,用于在进程间传递简单的通知信息。

      • 信号是一种异步事件,进程无需主动等待信号到来,可以在任意时刻被信号中断。

      • 接收进程可以通过信号处理函数(Signal Handler)来处理接收到的信号。

      • 常见信号包括 SIGKILL (强制终止进程)、SIGTERM (请求终止进程)、SIGUSR1hSIGUSR2 (用户自定义信号)等。

      • 在多进程服务中,可以通过信号来实现进程的优雅退出,或在调试进程过程中通过向进程发送信号来暂停、继续执行。

  • 套接字:套接字允许在网络上的不同主机上的进程进行通信,是实现网络通信的基础。

    • 特点:不仅适用于本地进程间通信,也适用于分布式系统中不同机器上的进程通信。

    • 优点: 功能强大,支持网络通信,且可用于无亲缘关系的进程之间通信。

    • 缺点: 相较于其他方式,编程复杂度较高。

      • 本地套接字(UNIX域套接字):用于同一台计算机上的进程通信,速度快切无需通过网络协议,是替代管道的更灵活的方式,适合需要传输大量数据的本地进程通信。
      • 网络套接字(TCP/UDP):用于不同计算机上的进程通信,通过网络协议传输数据。
        • TCP 套接字提供可靠的、面向连接的通信,保证数据包的顺序和完整性,适合文件传输、Web服务等场景。
        • UDP 套接字适合需要低延迟的场景,如实时音视频传输,但不保证数据的可靠性。
  • 文件:进程可以通过读写文件来进行通信,这种方式通常用于进程之间的间接通信,例如使用临时文件或者共享文件。

  • 特点:进程通过读写共享的文件进行通信。

  • 优点: 简单易用,适合大数据量的持久化通信。

  • 缺点: 效率低,需频繁进行磁盘读写。

表格对比总结

通信方式无亲缘关系进程通信效率适用场景
匿名管道不支持中等简单、轻量级的数据传输
命名管道支持中等简单、轻量级的数据传输
消息队列支持中等结构化消息传递,任务队列
共享内存支持高速大数据传输
信号量支持同步控制
信号支持异步事件通知
套接字支持中等分布式和网络通信
文件支持持久化数据传输,日志记录

3. 进程的调度算法你知道吗?

先来先服务(First-Come, First-Served, FCFS)

  • 描述:按照进程到达就绪队列的顺序进行调度,先到达的进程先执行。
  • 特点
    • 非抢占式
    • 实现简单
    • 不公平性(“长任务霸占”问题):长时间运行的进程会导致短作业等待过久。
  • 适用场景:作业到达频率较低、执行时间较短的系统。

短作业优先(Shortest Job Next, SJN)

  • 描述:优先调度执行时间最短的进程,能减少平均等待时间。
  • 特点
    • 可抢占或非抢占。
    • 平均等待时间最短(理论上),但需要知道每个作业的执行时间(通常通过估计)。
    • 饥饿问题:长时间作业可能长期得不到调度。
  • 适用场景:批处理系统,不适用于交互式系统。

优先级调度(Priority Scheduling)

  • 描述:根据进程的优先级决定调度顺序,优先级高的进程先执行。
  • 特点
    • 可抢占或非抢占。
    • 饥饿问题:低优先级进程可能永远得不到执行。
    • 解决方案:采用优先级老化(逐渐提高等待进程的优先级)。
  • 适用场景:需要对任务赋予不同重要性的场合。

时间片轮转(Round Robin, RR)

  • 描述:每个进程按照时间片的长度轮流执行,时间片用完后切换到下一个进程。
    • 时间片越短,系统响应性越好,但上下文切换的次数增加,可能导致调度开销增大。
    • 时间片太长则会退化为先来先服务。
  • 特点
    • 抢占式。
    • 平均响应时间较短,提升系统响应性。
    • 时间片的选择非常重要
      • 时间片太短:频繁切换导致开销增加。
      • 时间片太长:响应时间变长,类似FCFS。
  • 适用场景:交互式或实时系统,如桌面系统和移动设备操作系统。

最高响应比优先(Highest Response Ratio Next, HRRN)

  • 描述:通过计算每个进程的响应比来决定哪个进程应该被优先调度。
    • 响应比 = (等待时间 + 服务时间) / 服务时间
    • 等待时间:进程在就绪队列中等待的时间。
    • 服务时间:进程预计的执行时间。
    • 响应比会随着等待时间的增加而提升。
  • 特点:
    • 非抢占式。
    • 公平性:对于短任务,其服务时间小,初始响应比就较高,容易被优先调度。对于长任务,随着等待时间的增加,响应比主键提升,最终也会被调度,避免了长任务的饥饿。
    • 较短的平均等待时间。
    • 避免饥饿:长作业的等待时间长会提高其响应比,最终能够得到执行。
    • 计算复杂性:HRRN 需要实时计算每个进程的响应比,这增加了调度的计算复杂度。
    • 无法提前知道执行时间:算法假设我们已经知道每个进程的执行时间,但实际上这一点在很多系统中是无法准确预测的,通常需要依赖估算。
  • 适用场景:兼顾公平性和效率的场合。

多级反馈队列(Multilevel Feedback Queue, MLFQ)

  • 描述

    • 由多个优先级不同的队列组成,高优先级队列时间片较短,低优先级队列时间片较长。

    • 新进程进入高优先级队列。

    • 允许进程在不同的队列之间动态调整优先级。

    • 时间片用完或等待时间较长的进程会降低优先级。

  • 特点

    • 抢占式。
    • 综合了时间片轮转和优先级调度的优点,能够灵活处理短任务和长任务,兼顾响应时间和吞吐量。
    • 算法设计复杂,实现难度大,需要根据应用场景调整参数。
  • 适用场景:多任务、多类型的操作系统。

对比总结

算法抢占式优点缺点适用场景
先来先服务 FCFS简单易实现长作业可能导致短作业等待过久批处理系统,作业少的场景
短作业优先 SJN可选平均等待时间最短饥饿问题批处理系统
优先级调度 Priority Scheduling可选按优先级执行饥饿问题,需解决低优先级等待问题任务优先级显著不同的场景
时间片轮转 RR响应时间短,适合交互式系统时间片选择影响性能交互式系统
最高响应比优先 HRRN权衡公平性和效率实现稍复杂批处理系统
多级反馈队列MLFQ适应性强,综合多种算法优点实现复杂多任务现代操作系统


http://www.kler.cn/a/504954.html

相关文章:

  • mysql-5.7.18保姆级详细安装教程
  • 汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮
  • Qt之http客户端类
  • 39.【4】CTFHUB web sql 布尔注入
  • 1Hive概览
  • 【Unity-Animator】通过 StateMachineBehaviour 实现回调
  • C++并发编程之线程间数据划分的原则与方法
  • ASP.NET Core 中,认证(Authentication)和授权(Authorization)
  • opengauss数据库的日常运维操作
  • Android JecPack组件之LifeCycles 使用详解
  • 【开源宝藏】blade-tool AOP请求日志打印
  • 电脑玩游戏出现彩色斑点怎么回事,如何解决
  • 业务幂等性技术架构体系之消息幂等深入剖析
  • flutter 安卓端打包
  • Java 如何只测试某个类或方法:Maven与IntelliJ IDEA的不同方法及注意事项
  • iOS - TLS(线程本地存储)
  • 40,【5】CTFHUB WEB SQL 时间盲注
  • 跨境電商防關聯指紋流覽器Linken Sphere使用教程
  • vscode配置opencv4.8环境
  • Open FPV VTX开源之嵌入式OSD配置
  • extends配置项详解
  • 深度学习中的模块复用原则(定义一次还是多次)
  • C语言数据结构编程练习-用指针创建顺序表,进行创销和增删改查操作
  • 屏幕轻触间:触摸交互从 “感知” 到 “智算” 的隐秘路径
  • 爬虫案例:python爬取京东商品数据||京东商品详情SKU价格
  • OpenSeaOtter使用手册-项目简介