进程和线程之间的区别和联系

简介: 进程和线程之间的区别和联系


1. 什么是进程

       我们说, 躺着的一个.exe文件就是一个未被执行的程序, 是一个可执行文件, 当它被执行的时候就成了一个进程.

       进程是正在运行的程序的实例, 同时进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

       进程是一个实体, 每一个进程都有它自己的地址空间, 一般情况下, 包括文本区域, 数据区域, 和堆栈. 文本区域用来存储处理器执行的代码. 数据区域存储变量和进程执行期间使用的动态分配的内存, 堆栈区域存储着活动过程调用的指令和本地变量. 其次, 进程是一个"执行中的程序", 程序是一个没有生命的实体, 只有处理器赋予程序生命时(被操作系统执行), 它才能成为一个活动的实体, 也就能被称之为进程.

2. 什么是线程

       在这个效率和质量并存的时代,首先, "并发编程" 成为 "刚需".

       单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU资源. 有些任务场景需要 "等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程.

       就比如一个人为了节约出时间来看手机, 那么他肯定会在吃饭的时候去看或者是休息的时候去看会手机等等.

3. 区别与联系

       上次我们所讲的进程, 是一个比较重量级别的的概念, 因为进程消耗的资源多, 执行的速度慢, 无论是创建一个进程还是销毁, 调度一个进程, 其成本都比较高. 多进程编程可以解决高并发的问题, 但不是一个高效的选择.

为什么进程这么"重量"? 主要是体现在 资源的分配上, 资源分配是需要花时间的, 它是一个很耗时的操作, 比如系统要给一个进程分配内存,系统就需要遍历自己的空闲内存的表(一种特定的数据结构),找到一个空间大小合适的内存来进行分配. 其二, 有很多个进程在向系统申请内存. 多进程编程的成本高就是体现在资源这块上.

相比于进程, 线程是一个轻量级别的概念, 他是如何解决这种资源分配的问题呢? 其实就是把申请资源的过程简化. 一个进程中可以包含多个线程, 多个线程每个线程都是独立可以调度的"执行流", 这些执行流之间本身就是并发的, 这些线程共用同一份进程的内存资源, 这就意味着对于线程而言, 内存资源是分配好的, 创建线程就省下了分配资源的开销.

多线程之间, 可能是在多个CPU上执行, 也可能是一个CPU核心上, 通过调度来进行运行. 操作系统在调度的时候, 其实在调度的线程, 而不是进程. 线程是操作系统 调度运行的基本单位.

一个进程中的多个线程之间, 共用同一份系统资源, 也就是 :

  1. 内存空间
  2. 文件描述符表

只有在进程启动,创建第一个线程的时候, 需要花成本去申请系统资源, 一旦第一个线程创建完毕, 后续在创建的线程将会申请更少的空间, 于是创建/销毁的效率就提高了许多.

总结

  1. 进程包含线程
  2. 进程有自己独立的内存空间和文件描述符表, 同一个进程中的多个线程之间, 共享同一份地址空间和文件描述符表
  3. 进程是操作系统资源分配的基本单位, 线程操作系统调度执行的基本单位
  4. 进程之间具有独立性, 一个进程挂了, 不会影响到另外一个进程, 同一个进程里的多个线程之间, 一个线程挂了有可能会把整个进程挂掉, 同时也会影响到其他进程\
  5. 进程和线程都可以并发和并行

    6. 其次, 虽然多进程也能实现 并发编程, 但是线程比进程更轻量.

  • 创建线程比创建进程更快.
  • 销毁线程比销毁进程更快.
  • 调度线程比调度进程更快.


目录
相关文章
|
4天前
|
存储 调度 C++
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
25 1
|
7天前
|
分布式计算 JavaScript 前端开发
多线程、多进程、协程的概念、区别与联系
多线程、多进程、协程的概念、区别与联系
18 1
|
5天前
|
安全 Java Python
GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。
【6月更文挑战第20天】GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。线程池通过预创建线程池来管理资源,减少线程创建销毁开销,提高效率。示例展示了如何使用Python实现一个简单的线程池,用于执行多个耗时任务。
18 6
|
1天前
|
算法 API 调度
|
7天前
|
Java 程序员
Java多线程编程是指在一个进程中创建并运行多个线程,每个线程执行不同的任务,并行地工作,以达到提高效率的目的
【6月更文挑战第18天】Java多线程提升效率,通过synchronized关键字、Lock接口和原子变量实现同步互斥。synchronized控制共享资源访问,基于对象内置锁。Lock接口提供更灵活的锁管理,需手动解锁。原子变量类(如AtomicInteger)支持无锁的原子操作,减少性能影响。
18 3
|
7天前
|
数据采集 自然语言处理 调度
【干货】python多进程和多线程谁更快
【干货】python多进程和多线程谁更快
12 2
|
8天前
|
调度
进程与线程的区别与联系
进程与线程的区别与联系
|
3天前
|
存储 Linux Shell
Linux进程概念(上)
冯·诺依曼体系结构概述,包括存储程序概念,程序控制及五大组件(运算器、控制器、存储器、输入设备、输出设备)。程序和数据混合存储,通过内存执行指令。现代计算机以此为基础,但面临速度瓶颈问题,如缓存层次结构解决内存访问速度问题。操作系统作为核心管理软件,负责资源分配,包括进程、内存、文件和驱动管理。进程是程序执行实例,拥有进程控制块(PCB),如Linux中的task_struct。创建和管理进程涉及系统调用,如fork()用于创建新进程。
16 3
Linux进程概念(上)
|
3天前
|
缓存 监控 安全
Linux top命令详解:持续监听进程运行状态
Linux top命令详解:持续监听进程运行状态
14 3
|
7天前
|
Linux 数据处理
深入了解Linux命令kill:终止进程的艺术
**Linux的`kill`命令详解:高效管理进程的工具** `kill`命令在Linux中用于向进程发送信号,如SIGTERM(默认)和SIGKILL,以终止或影响进程行为。它通过进程ID(PID)操作,支持多种信号和选项,如`-l`列出信号,`-9`强制杀进程。例如,`kill 1234`发送TERM信号,`kill -9 1234`发送KILL信号。使用时注意,SIGKILL是不可忽视的,可能导致数据丢失。配合`pgrep`和`pkill`能更灵活管理进程。了解进程依赖和使用其他命令如`ps`和`top`可优化系统资源管理。