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

操作系统中,进程与线程的定义与区别

一、定义

1. 进程 (Process)

定义进程是程序的一次执行过程。它是操作系统进行资源分配和调度的基本独立单位。

通俗理解

  • 把一个程序(比如 Chrome 浏览器的一个可执行文件 chrome.exe)比作一张菜谱

  • 那么一个进程就是按照这个菜谱真正开始做饭的过程。这个过程需要占用厨房(CPU)、厨具(IO设备)、食材(数据)等资源。

  • 同时运行两个 Chrome 窗口?那就是两个独立的进程

关键点:每个进程都拥有自己独立的内存空间(代码段、数据段、堆栈等)和系统资源(如打开的文件)。

2. 线程 (Thread)

定义线程是进程中的一个执行流,是CPU调度和执行的基本单位。一个进程可以包含多个线程。

通俗理解

  • 继续用做饭的比喻。一个进程(做饭过程)中可以有多条线程

  • 比如,一条线程负责洗菜,另一条线程负责切菜,第三条线程负责炒菜

  • 它们共享同一个厨房(进程资源),但各自完成不同的任务(执行流)。

关键点:同一进程下的多个线程共享进程的内存空间和资源,但每个线程有自己独立的程序计数器


二、核心区别对比

特性进程 (Process)线程 (Thread)
基本性质资源分配的基本单位CPU调度和执行的基本单位
内存与资源拥有独立的地址空间和资源共享其所属进程的地址空间和资源
开销。创建、销毁、切换需要分配/回收独立内存,开销大。。创建、销毁、切换只需很少开销,因为资源共享。
独立性。一个进程崩溃后,在保护模式下不会影响其他进程。。一个线程崩溃会导致整个进程崩溃(因为它共享进程资源)。
通信机制复杂,需要进程间通信(IPC),如管道、消息队列、共享内存等。简单,可直接读写共享的进程数据来进行通信。
并发性进程之间可以并发执行。线程之间不仅可以并发执行,甚至可以实现并行(在多核CPU上)。
包含关系一个进程可以包含多个线程。线程是进程的一部分,必须依赖于进程而存在。

三、一个生动的比喻:公司与员工

为了更好地理解,我们可以用一个公司来比喻:

  • 进程 = 一个独立的公司

    • 这家公司有自己独立的办公场地、预算、打印机等资源(独立的内存空间和系统资源)。

    • 一家公司倒闭了,不会直接影响另一家公司(进程间相互独立,一个崩溃不影响另一个)。

    • 两家公司要合作,需要打电话、发传真、签合同(进程间通信IPC),过程比较复杂。

  • 线程 = 公司里的员工

    • 所有员工共享公司的办公场地、预算和打印机(共享进程资源)。

    • 员工之间协作非常方便,可以直接面对面交谈、传递文件(线程间通信简单,通过共享内存)。

    • 如果一个员工犯了严重错误(比如切断了整个公司的电源),可能导致整个公司无法运营(一个线程崩溃导致整个进程崩溃)。

    • 雇佣新员工(创建线程)或解雇员工(销毁线程)的成本很低,比开一家新公司(创建进程)要快得多。

  • CPU = 一个工作者(单核)

    • 这个工作者一段时间内只能做一件事。他可以在A公司(进程)工作一会儿,然后切换到B公司(进程)工作,这就是进程并发

    • 他在A公司工作时,可以一会儿做设计(线程1),一会儿写代码(线程2),一会儿开会(线程3),这就是线程并发

  • 多核CPU = 多个工作者

    • 此时,多个工作者可以同时在不同公司的不同岗位上工作,实现真正的并行


四、为什么要有线程?(线程的优势)

既然进程已经可以实现并发,为什么还需要线程?

  1. 更高效的并发:创建和切换线程的代价远小于进程。这使得频繁的并发任务(如Web服务器处理大量请求)效率更高。

  2. 资源共享与通信简便:线程间共享内存使得数据交换非常高效,无需借助复杂的IPC机制。

  3. 改善响应性:对于一个应用程序(一个进程),可以使用多线程。例如:

    • GUI程序:一个线程处理用户界面交互(保持响应),另一个线程在后台执行耗时的计算任务,防止界面“卡死”。

    • Web服务器:一个主线程监听请求,每当有新请求到来,就创建一个新线程去处理它,从而实现高并发。

总结

概念核心思想关键比喻
进程“资源分配的边界”一个独立的公司,拥有自己的所有资源。
线程“执行流的单位”公司里的员工,共享公司资源,负责具体执行任务。

简单来说:

  • 进程 使操作系统的并发成为可能。

  • 线程 使同一个进程内部的并发成为可能,并且大大提升了并发效率。

http://www.dtcms.com/a/350545.html

相关文章:

  • 雷卯针对香橙派Orange 4G-IOT开发板防雷防静电方案
  • `lock()` 和 `unlock()` 线程同步函数
  • THM Bricks Heist靶机
  • Java 学习笔记(基础篇10)
  • HTML应用指南:利用POST请求获取全国三星门店位置信息
  • 【目标跟踪】《FastTracker: Real-Time and Accurate Visual Tracking》论文阅读笔记
  • 目前城投债
  • MySQL常见报错分析及解决方案总结(1)---Can‘t connect to MySQL server on ‘localhost‘(10061)
  • Docker:技巧汇总
  • 利用matlab实现CST超表面阵列的自动建模
  • 数据结构:单链表(详解)
  • SSL移动接入方案和移动资源发布
  • 【学习笔记】怎么解决/dev/sda3: clean, XXX files, XXX blocks
  • 【Wrangler(Cloudflare 的官方 CLI)和 npm/npx 的区别一次讲清】
  • SpringCloud微服务技术自用笔记
  • day52_2025-08-25
  • 【猿人学】web第一届 第13题 入门级 cookie
  • 【动态规划】卡特兰数
  • 文件读取结束的判定方法:正确使用feof函数避免文件读取错误
  • CAN总线详解(四)CANFD报文结构
  • 小红书链接uid等批量转换,界面软件工具
  • 【COMSOL】COMSOL帮助文档无法打开的解决办法
  • 智能专网升级:4G与5G混合组网加速企业数字化转型
  • leetcode算法刷题的第十七天
  • 房地产模式的运行逻辑与内在风险
  • Acrobat DC 中的条件格式化
  • 失眠——记录安东尼威廉饮食习惯的250天
  • 推三返一链动模式裂变图解
  • 用Python的Requests+BeautifulSoup爬取微博热搜榜及话题内容
  • SSM从入门到实战:3.1 SpringMVC框架概述与工作原理