操作系统进程和线程——针对实习面试

目录

  • 操作系统进程和线程
    • 什么是进程和线程?
    • 进程和线程的区别?
    • 进程有哪些状态?
    • 什么是线程安全?如何实现线程安全?
      • 什么是线程安全?
      • 如何实现线程安全?
    • 进程间的通信有哪几种方式?
    • 什么是僵尸进程和孤儿进程?它们的区别是什么?
    • 进程是怎么调度的?说说常见的调度算法

操作系统进程和线程

在这里插入图片描述

什么是进程和线程?

进程和线程是操作系统中的基本概念,它们描述了程序在计算机上的执行实体

进程(Process)
进程是操作系统进行资源分配和调度的一个独立单位。它是应用程序运行的实例,拥有独立的内存空间。以下是进程的一些关键特点:

  1. 独立性:进程是独立运行的,拥有自己的一套独立的地址空间。
  2. 动态性:进程是动态创建和销毁的,它有生命周期,包括创建、就绪、运行、阻塞和结束等状态。
  3. 并发性:多个进程可以在单个CPU上交替执行,形成并发执行
  4. 拥有资源:进程是拥有资源的单位,它拥有独立的内存空间和系统资源,如文件句柄、I/O设备等。
  5. 进程通信:进程间通信(IPC)需要特定的机制,如管道、消息队列、共享内存等。

线程(Thread)
线程是进程中的一个实体,是CPU调度和分派的基本单位。线程自身不拥有系统资源,只拥有一点在运行中必不可少的资源(如执行栈),但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。以下是线程的一些关键特点:

  1. 轻量级线程比进程更小的能独立运行的基本单位,开销更小
  2. 共享性:同一进程下的线程共享进程的资源,如内存空间、文件句柄等。
  3. 独立执行:线程可以独立执行,拥有自己的程序计数器、寄存器集合和栈。
  4. 并行性:同一进程内的多个线程可以并行执行,尤其是在多核处理器上。
  5. 线程通信:线程间可以直接读写共享变量来进行通信,但需要同步机制来避免竞态条件。

进程与线程的关系

  • 一个进程可以包含多个线程,这些线程共享进程的资源
  • 线程是进程的一部分一个进程至少有一个线程,即主线程
  • 线程的创建和销毁的开销比进程小,切换也更快。
  • 线程之间的通信更简单,因为它们共享相同的内存空间,但这也意味着需要处理同步问题。

简而言之,进程是程序独立运行的实例,而线程是进程中的实际执行单元,它们共同构成了操作系统中程序运行的基本框架。

进程和线程的区别?

  1. 资源管理

    • 进程:进程是资源分配的基本单位,每个进程都有自己的一套独立的地址空间,这意味着进程间的资源是不共享的。
    • 线程:线程是CPU调度和执行的单位,同一进程内的线程共享进程的地址空间和资源,如内存、文件句柄等。
  2. 创建和管理开销

    • 进程:创建和管理进程的开销相对较大,因为涉及到独立的内存空间分配和进程控制块的创建。
    • 线程:线程的创建和管理开销较小,因为它们可以利用进程中已有的资源。
  3. 通信方式

    • 进程:进程间通信(IPC)需要特定的机制,如管道、消息队列、共享内存等。
    • 线程:线程间可以直接读写共享变量来进行通信,无需额外的通信机制。
  4. 独立性

    • 进程:进程是独立运行的实体,一个进程的崩溃不会直接影响到其他进程。
    • 线程:线程之间是相互依赖的,同一进程下的一个线程崩溃可能会影响到其他线程。
  5. 上下文切换

    • 进程:进程间的上下文切换涉及到整个进程状态的保存和恢复,包括寄存器、内存等。
    • 线程:线程间的上下文切换只涉及到线程私有数据的保存和恢复,因为它们共享进程的地址空间。
  6. 执行流

    • 进程每个进程至少有一个执行流,即线程(主线程)。
    • 线程线程是进程中的一个执行流,可以有多个线程并行执行。

这些区别体现了进程和线程在资源管理、开销、通信、独立性、上下文切换和执行流方面的不同,它们在操作系统中扮演着不同的角色,并适用于不同的应用场景。

进程有哪些状态?

进程在其生命周期中会经历几种不同的状态,这些状态描述了进程的执行和调度情况。以下是进程的几种常见状态:

  1. 创建状态(New)

    • 进程刚刚被创建,还没有被放入进程调度队列中。
  2. 就绪状态(Ready)

    • 进程已准备好执行,等待被调度器分配CPU时间。它需要等待分配到CPU资源。
  3. 运行状态(Running)

    • 进程正在CPU上执行。在单核系统中,同一时刻只能有一个进程处于运行状态。
  4. 阻塞状态(Blocked or Waiting)

    • 进程因为等待某些事件(如I/O操作、获取资源等)而暂停执行。在等待特定条件满足之前,它不能继续执行。
  5. 终止状态(Terminated)

    • 进程执行完成或因错误、异常而被终止。一旦进程终止,它将释放所有资源,并从系统中消失。
  6. 挂起状态(Suspended)

    • 进程被暂时挂起,通常是为了节省资源或响应用户请求。挂起状态的进程不会占用CPU时间,但仍然保持在内存中。

    挂起状态可以进一步细分为:

    • 挂起就绪状态(Ready Suspended):进程已经准备好执行,但被挂起。
    • 挂起阻塞状态(Blocked Suspended):进程在阻塞状态时被挂起。
  7. 新创建阻塞状态(New and Blocked)

    • 进程被创建后直接进入阻塞状态,例如,创建后立即请求某些资源,但在资源可用之前进程不能运行。

这些状态之间的转换由操作系统的调度器和进程的执行逻辑控制。进程状态的转换对于操作系统的调度策略和资源管理至关重要。

什么是线程安全?如何实现线程安全?

什么是线程安全?

线程安全(Thread Safety)是指在多线程环境中,当多个线程访问某个类的实例时,不需要额外的同步措施,该类的实例就能保证数据的完整性和一致性。简而言之,就是当多个线程同时访问某个共享资源时,如果每个线程都能正确地执行,那么程序的运行结果将是正确的。

线程安全问题通常发生在多个线程访问共享数据时,如果没有适当的同步措施,可能会导致数据竞争(Race Condition),从而产生不可预测的结果,比如数据损坏程序崩溃等。

如何实现线程安全?

实现线程安全有多种方法,以下是一些常见的策略:

  1. 互斥锁(Mutex)

    • 使用互斥锁(Mutex)是确保同一时间只有一个线程可以访问共享资源的常用方法。当一个线程获取了互斥锁,其他线程必须等待直到锁被释放。
  2. 读写锁(Read-Write Locks)

    • 读写锁允许多个读操作同时进行,但写操作是互斥的。这适用于读操作远多于写操作的场景,可以提高性能。
  3. 信号量(Semaphores)

    • 信号量用于控制对共享资源的访问数量,可以限制同时访问资源的线程数。
  4. 原子操作(Atomic Operations)

    • 原子操作是指不可分割的操作,要么完全执行,要么完全不执行。现代编程语言和硬件通常提供了原子操作的支持,用于保证操作的原子性。
  5. 条件变量(Condition Variables)

    • 条件变量用于线程间的同步,允许线程在某个条件不满足时挂起,并在条件满足时被唤醒。
  6. 避免共享状态

    • 设计无状态或局部状态的程序,避免共享状态,从而避免线程安全问题。
  7. 不可变对象

    • 不可变对象(Immutable Objects)一旦创建就不能被修改,因此它们天然是线程安全的。
  8. 线程局部存储(Thread-Local Storage, TLS)

    • 每个线程都有自己的数据副本,因此不存在共享数据的竞争问题。
  9. 使用线程安全的类和库

    • 许多编程语言提供了线程安全的类和库,可以直接使用这些工具来简化线程安全的实现。
  10. 同步代码块(Synchronized Blocks)

    • 在Java等语言中,可以使用synchronized关键字来同步代码块或方法,确保同一时间只有一个线程可以执行。

实现线程安全需要根据具体的应用场景和需求来选择合适的策略。在设计和实现多线程程序时,考虑线程安全是非常重要的,以确保程序的正确性和稳定性。

进程间的通信有哪几种方式?

进程间通信(Inter-Process Communication,IPC)是多任务操作系统中不同进程之间传递数据和信号的机制。以下是一些常见的进程间通信方式:

  1. 管道(Pipes)

    • 管道是一种最基本的IPC形式,允许一个进程的输出直接成为另一个进程的输入。有名管道(Named Pipes)允许不相关的进程进行通信。
  2. 消息队列(Message Queues)

    • 消息队列允许进程以消息的形式交换数据,消息被存储在队列中,直到被接收。
  3. 信号(Signals)

    • 信号是一种由操作系统提供的软件中断,用于通知进程某个事件已经发生。
  4. 共享内存(Shared Memory)

    • 共享内存是一种效率很高的IPC方式,它允许两个或多个进程共享一个给定的存储区。进程可以直接读写这块内存,无需数据的拷贝。
  5. 信号量(Semaphores)

    • 信号量是一种计数器,用于控制对共享资源的访问,常用于实现进程间的同步。
  6. 事件(Events)

    • 事件是一种同步机制,允许一个进程通知另一个进程某个特定事件已经发生。
  7. 屏障(Barriers)

    • 屏障是一种同步机制,用于等待多个进程到达一个共同点后再继续执行。

这些IPC方式各有优缺点,适用于不同的场景和需求。在实际应用中,开发者需要根据具体的应用场景和性能要求选择合适的进程间通信方式。

什么是僵尸进程和孤儿进程?它们的区别是什么?

僵尸进程(Zombie Process)

僵尸进程是指一个进程已经完成其执行,但还没有被其父进程回收其资源(特别是进程描述符)的进程。在操作系统中,当一个子进程结束运行后,它会保留其进程信息(包括进程ID、终止状态等),等待其父进程通过wait()waitpid()系统调用来读取。如果父进程没有调用这些系统调用,那么子进程的这些信息就不会被释放,这个子进程就成为了一个僵尸进程。

特点

  • 僵尸进程不占用CPU资源,因为它已经不再运行
  • 僵尸进程仍然保留在系统中,直到父进程调用wait()waitpid()来清理。
  • 僵尸进程的主要问题是它们占用进程ID和其他资源,可能导致系统资源耗尽。

孤儿进程(Orphan Process)

孤儿进程是指一个父进程在子进程结束之前已经结束运行的进程。当一个进程创建了一个子进程,然后自己结束了,而没有等待子进程结束,那么这个子进程就成为了孤儿进程。

特点

  • 孤儿进程会被操作系统的init进程(进程ID为1)收养,init进程成为它们的新父进程。
  • init进程会等待孤儿进程结束,并回收它们的资源。
  • 孤儿进程不会变成僵尸进程,因为它们被init进程管理。

僵尸进程和孤儿进程的区别

  1. 状态不同

    • 僵尸进程是已经结束但尚未被父进程回收资源的进程。
    • 孤儿进程是父进程已经结束而子进程还在运行的进程。
  2. 处理方式不同

    • 僵尸进程需要父进程调用wait()waitpid()来清理。
    • 孤儿进程由init进程自动收养并处理。
  3. 资源占用

    • 僵尸进程占用系统资源,直到父进程进行清理。
    • 孤儿进程不会占用额外资源,因为它们被init进程管理。
  4. 存在时间

    • 僵尸进程可能长时间存在,直到父进程清理。
    • 孤儿进程一旦结束,就会被init进程清理。

理解僵尸进程和孤儿进程的概念和区别,有助于更好地管理和优化多进程程序的资源使用和进程控制。

进程是怎么调度的?说说常见的调度算法

进程调度是操作系统中一个重要的功能,它负责决定哪个进程应该获得CPU时间片以执行。进程调度算法决定了进程执行的顺序和时间,影响着系统的响应时间、吞吐量和公平性。以下是一些常见的进程调度算法:

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

    • 这是最简单的调度算法,按照进程到达就绪队列的顺序进行调度。先到达的进程先得到服务。
  2. 短作业优先(SJF, Shortest Job First)

    • 也称为最短作业优先,选择预计运行时间最短的进程进行调度。SJF有两个版本:非抢占式和抢占式(最短剩余时间优先SRTF)。
  3. 优先级调度(Priority Scheduling)

    • 每个进程被赋予一个优先级,调度器总是选择优先级最高的进程执行。可以结合时间片轮转使用,称为优先级时间片轮转。
  4. 时间片轮转(RR, Round-Robin)

    • 所有就绪队列中的进程被分配一个固定的时间片,称为时间片或量子。进程可以在其时间片内运行,时间片用完后,如果进程尚未完成,则被放回就绪队列的末尾。
  5. 多级反馈队列(MFQ, Multilevel Feedback Queue)

    • 结合了时间片轮转和优先级调度的特点,使用多个队列,每个队列有不同的优先级和时间片大小。

每种调度算法都有其特定的应用场景和优缺点。操作系统会根据系统的需求和目标选择合适的调度算法,以优化系统性能和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis——#{} 和 ${} 的区别和动态 SQL

1. #{} 和 ${} 的区别 为了方便,接下来使用注解方式来演示: #{} 的 SQL 语句中的参数是用过 ? 来起到类似于占位符的作用,而 ${} 是直接进行参数替换,这种直接替换的即时 SQL 就可能会出现一个问题 当传入一个字符串时&#xff…

图像处理 之 凸包和最小外围轮廓生成

“ 最小包围轮廓之美” 一起来欣赏图形之美~ 1.原始图片 男人牵着机器狗 2.轮廓提取 轮廓提取 3.最小包围轮廓 最小包围轮廓 4.凸包 凸包 5.凸包和最小包围轮廓的合照 凸包和最小包围轮廓的合照 上述图片中凸包、最小外围轮廓效果为作者实现算法生成。 图形几何之美系列&#…

美畅物联丨智能分析,安全管控:视频汇聚平台助力智慧工地建设

随着科技的持续发展,建筑行业正朝着智能化的方向迅猛迈进。智慧工地作为建筑行业智能化的关键体现形式,借助各类先进技术来提升工地的管理效率、安全性以及生产效益。在这个过程中,视频汇聚平台发挥着极为重要的作用。以畅联AIoT开放云平台为…

2024亚太杯数学建模C题【Development Analyses and Strategies for Pet Industry 】思路详解

C:宠物行业及相关产业的发展分析与战略 随着人们消费观念的发展,宠物行业作为一个新兴产业,正在全球范围内逐渐积聚势头,这得益于快速的经济发展和人均收入的提高。1992年,中国小动物保护协会成立,随后1993…

安装spark

spark依赖java和scale。所以先安装java,再安装scale,再是spark。 总体教程跟着这个链接 我跟着这个教程走安装java链接,但是有一些不同,原教程有一些错误,在环境变量设置的地方。 java 首先下载jdk。 先看自己的环境…

MACOS开发、使用常见问题汇总

MACOS常见问题 本文记录使用macos遇到的常见问题,后面会持续更新,觉得有用的可以收藏一下。 打不开xxx.app,因为它来自身份不明的开发者解决方法(开启任何来源) 打开终端(Terminal)程序 拷贝sudo spctl --master-di…

【MySQL实战45讲笔记】基础篇——深入浅出索引(上)

系列文章 基础篇——MySQL 的基础架构 基础篇——redo log 和 binlog 基础篇——事务隔离 目录 系列文章深入浅出索引(上)4.1 索引的常见模型4.2 InnoDB 的索引模型4.3 索引维护4.4 思考:为什么要重建索引以及如何做? 深入浅出索…

关于一次开源java spring快速开发平台项目RuoYi部署的记录

关于一次开源java spring快速开发平台项目RuoYi部署的记录 本次因为需要一些练习环境,想要快速搭建一个javaweb 项目作为练习环境,经过查询和实验找到一个文档详细,搭建简单,架构也相对比较新的开源项目RuoYi。 项目介绍&#xf…

Quartus+Nios II for eclipse问题合集

由于对于FPGANIOS II 的工作需要,对工作过程中遇到的问题进行记录,持续更新。 1、BSP directory does not exist: . Stop.Nios II使用过程中遇到的一些问题2_error executing nios2-bsp-generate-files --bsp-di-CSDN博客https://blog.csdn.net/qq_39485…

「OpenCV交叉编译」ubuntu to arm64

Ubuntu x86_64 交叉编译OpenCV 为 arm64OpenCV4.5.5、cmake version 3.16.3交叉编译器 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 可在arm或linaro官网下载所需版本,本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…

基于深度学习的点云分割网络及点云分割数据集

点云分割是根据空间、几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征。点云的有效分割是许多应用的前提,例如在三维重建领域,需要对场景内的物体首先进行分类处理,然后才能进行后期的识别和重建。 传统的点…

Excel - VLOOKUP函数将指定列替换为字典值

背景:在根据各种复杂的口径导出报表数据时,因为关联的表较多、数据量较大,一行数据往往会存在三个以上的字典数据。 为了保证导出数据的效率,博主选择了导出字典code值后,在Excel中处理匹配字典值。在查询百度之后&am…

硬件知识 cadence16.6 原理图输出为pdf 网络名下划线偏移 (ORCAD)

1. cadence原理图输出为PDF网络名下划线偏移 生这种情况的原因 1. 设计的原理图图纸大小比正常的 A4图纸大。 2. 打印为PDF 的时候,打印机的设置有问题。 2.cadence原理图输出为 PDF网络名下划线偏移的情况 可以看到上图,网络名往上漂移。 3. 解决办法 …

随机森林(Random Forest)详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

对原jar包解压后修改原class文件后重新打包为jar

文章目录 背景三种修改方式1.POM中移除原jar中依赖的历史版本2.原jar它不使用pom依赖而是直接放在源码中再编译使用JarEditor 插件对源码进行修改(推荐)使用java-decompiler反编译后修改源码覆盖原class(不好用-不推荐直接跳过)提醒 参考资料-推荐阅读拓…

PyQt6+pyqtgraph折线图绘制显示

1、实现效果 2、环境: 确认已经安装pyqtgraph的模块,如果没有安装,使用命令安装: pip install pyqtgraph 3、代码实现: 绘制折线函数: import sys import random from PySide6.QtWidgets import QAppl…

Altium Designer学习笔记 1-5 工程创建_元件库创建

基于Altium Designer 23学习版,四层板智能小车PCB 目录 1、工程组成 2、AD工程创建 3、元件库的阻容模型创建 4、IC类的元件库模型创建 5、排针类的元件库模型创建 1、工程组成 主要包括原理图库----原理图----PCB库----PCB 2、AD工程创建 新建工程项目 …

Video Duplicate Finder 快速识别并去除重复的视频和图像!

文章目录 下载 后续升级 Video Duplicate Finder(视频重复查找器)是一款开源的跨平台视频(以及图像)去重软件,通过对比文件内容和特征,快速识别出重复的视频和图像文件,即使是被压缩裁剪过、…

力扣力扣力:860柠檬水找零

860. 柠檬水找零 - 力扣(LeetCode) 需要注意的是,我们一开始是没有任何钱的,也就是说我们需要拿着顾客的钱去找零。如果第一位顾客上来就是要找零那么我们无法完成,只能返回false。 分析: 上来我们先不分…

开源许可协议

何同学推动了开源协议的认识,功不可没,第一次对开源有了清晰的认识,最宽松的MIT开源协议 源自OSC开源社区:何同学使用开源软件“翻车”,都别吵了!扯什么违反MIT