进程、线程、协程

简介: 面试官:简单聊一下进程、线程、协程的区别吧。。。

进程

读书那会学linux时书本上都会写一句非常经典的话,进程是系统资源分配和调度的基本单位。也不理解啥意思,纯背概念,反正老师说考试会考。导致只对这一句话印象特别深刻。


程序是指令、数据及其组织形式的描述,进程是程序的载体。程序本身是没有生命周期的,只是存在于磁盘上的一些指令集合,但程序一旦被运行起来就是进程。启动后的进程会依赖操作系统的调度完成生命周期的转换。


无论操作系统是单核系统还是多核系统,看起来似乎一个CPU在并行的调度多个进程,其实只是操作系统背后的调度逻辑来通过切换上下文来实现的并发执行,本质上在某一时刻一个CPU只能执行一个进程。只不过切换时间片特别短让我们认为是在并行执行。


并发: 同一时刻只有一个进程/线程运行,其余都阻塞等待调度

并行: 同一时刻有多个进程/线程同时运行


线程

线程为程序调度的最小单位,也就是说一个进程中可以包含多个线程,线程状态也是交由操作系统调度。线程的状态分为新建状态、运行状态、阻塞状态、就绪状态、终止状态,线程之间的切换和进程一样也需要系统进行上下文切换完成。


各个语言的线程概念只是对操作对象中的线程做了一层封装,提供的各个api本质上也是对接操作系统api,由于线程的调度需要操作系统来进行上下文切换资源消耗比较猛。所以出现了更加轻量级的协程。


协程

协程是一种更加轻量级调度单位,协程不被操作系统内核所管理而完全是由程序所控制。

image.png

之所以轻量级也是因为避免操作系统频繁的从用户空间切换到内核空间进行调度的资源消耗,直接在用户空间的代码中管理协程的声明周期,适用于大量并发下的IO事件,这也是Golang风靡全球的原因之一。


总结

进程与线程对比

  1. 线程的创建或销毁的代价比进程小且上下文切换的速度比进程快,需要频繁创建、销毁或大量计算时应优先选用线程
  2. 线程在CPU上的使用效率更高,需要多核分布时优先选用线程,需要多机分布时优先选用进程
  3. 线程的安全性、稳定性没有进程好,需要更稳定安全时优先使用进程。


线程与协程对比

  1. 线程属于操作系统内核管理调度,而协程属于用户空间代码中自己管理的轻量级线程。
  2. 线程运行状态切换及上下文切换需要内核调度,会消耗系统资源;而协程完全由程序控制,状态切换及上下文切换不需要内核参与。





相关文章
|
18天前
|
UED 开发者 Python
探索操作系统的心脏:理解进程与线程
【8月更文挑战第31天】在数字世界的海洋中,操作系统犹如一艘巨轮,其稳定航行依赖于精密的进程与线程机制。本文将揭开这一机制的神秘面纱,通过深入浅出的语言和直观的代码示例,引领读者从理论到实践,体验进程与线程的魅力。我们将从基础概念出发,逐步深入到它们之间的联系与区别,最后探讨如何在编程实践中高效运用这些知识。无论你是初学者还是有经验的开发者,这篇文章都将为你的技术之旅增添新的航标。
|
4天前
|
开发者 Python
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第46天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将揭开进程与线程这两个核心概念的神秘面纱,通过生动的比喻和实际代码示例,带领读者理解它们的定义、区别以及如何在编程中运用这些知识来优化软件的性能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技巧。
|
11天前
|
存储 Java 数据处理
进程中的线程调度
进程是应用程序运行的基本单位,包括主线程、用户线程和守护线程。计算机由存储器和处理器协同操作,操作系统设计为分时和分任务模式。在个人PC普及后,基于用户的时间片异步任务操作系统确保了更好的体验和性能。线程作为进程的调度单元,通过覆写`Thread`类的`run`方法来处理任务数据,并由系统调度框架统一管理。微服务架构进一步将应用分解为多个子服务,在不同节点上执行,提高数据处理效率与容错性,特别是在大规模数据存储和处理中表现显著。例如,利用微服务框架可以优化算法,加速业务逻辑处理,并在不同区块间分配海量数据存储任务。
|
17天前
crash —— 输出属于同一个进程的所有线程
crash —— 输出属于同一个进程的所有线程
|
18天前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第31天】 本文将带你探索操作系统中的核心概念——进程与线程。通过浅显易懂的语言和实际代码示例,我们将一起理解它们的定义、区别以及在操作系统中的作用。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇了解计算机内部工作原理的新窗口。
|
18天前
|
C# 开发者 数据处理
WPF开发者必备秘籍:深度解析数据网格最佳实践,轻松玩转数据展示与编辑大揭秘!
【8月更文挑战第31天】数据网格控件是WPF应用程序中展示和编辑数据的关键组件,提供排序、筛选等功能,显著提升用户体验。本文探讨WPF中数据网格的最佳实践,通过DevExpress DataGrid示例介绍其集成方法,包括添加引用、定义数据模型及XAML配置。通过遵循数据绑定、性能优化、自定义列等最佳实践,可大幅提升数据处理效率和用户体验。
36 0
|
18天前
|
消息中间件 Unix Linux
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第31天】本文将带你一探操作系统中最为神秘的两个概念——进程和线程。我们将从基础的定义出发,逐步深入到它们在操作系统中的实现原理,并通过代码示例揭示它们在实际编程中的应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和理解。
|
18天前
|
开发者 Python
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第31天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将揭开进程与线程这两个核心概念的神秘面纱,通过生动的比喻和实际代码示例,带领读者理解它们的定义、区别以及如何在编程中运用这些知识来优化软件的性能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技巧。
|
19天前
|
Linux 调度 开发者
探索操作系统核心:进程与线程的管理
【8月更文挑战第30天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是计算机硬件与软件之间的桥梁,更是管理和调度计算资源的核心。本文将深入探讨操作系统中最为关键的两个概念:进程与线程。我们将从基本的定义出发,逐步揭示它们之间的区别、联系以及如何在操作系统中高效管理这些基础单位。通过实际代码示例,我们将进一步理解操作系统如何精确控制和优化进程与线程的运行,确保系统的稳定与高效。无论你是软件开发者还是系统管理员,这篇文章都将为你打开一扇了解操作系统深层工作机制的大门。
|
20天前
|
UED Python
深入理解操作系统:进程与线程的管理
【8月更文挑战第29天】本文将通过浅显的语言和生动的比喻,带你走进操作系统的核心世界,探索进程与线程的秘密。我们将从基础概念出发,逐步深入到它们在操作系统中的管理方式,以及如何影响计算机的性能和稳定性。文章旨在启发读者思考操作系统设计的哲学,同时提供实用的知识,帮助理解现代计算机系统的运作原理。

相关实验场景

更多