【进程与线程】程序和进程在内存中的表现

news2025/1/16 3:03:33

在计算机系统中,程序和进程是两个密切相关但又有本质区别的概念,尤其在内存中的表现上有显著不同:
程序与进程
在这张图中可以直观地看出程序和进程在内存中的结构区别。

基本定义

程序

程序 是一个 静态实体,表示一组写好的指令和数据的集合,一般存储在磁盘上(如 .exe.out 文件)。程序本身不占用运行时的系统资源(如 CPU、内存等),它是一个静态文件,它仅包含代码和数据的固定内容,表示完成某种任务的一组指令集合。

  • 程序的特性:
    • 静态性:程序只是存储在磁盘中的文件,不会动态变化(程序是静态的文件,不占用运行时资源)。
    • 无运行环境:程序没有运行时需要的栈、堆、寄存器等概念(程序没有运行时动态分配的内存(如堆和栈))。
    • 程序本身不包含对操作系统资源(如 CPU、内存)的使用能力。
进程
  • 进程是程序运行后的动态实例,是操作系统分配资源的基本单元;进程是程序的一次执行实例,是一个动态实体
  • 进程是程序运行后的产物,程序一旦被加载到内存并运行,就变成了进程。
  • 进程需要操作系统的支持,每个进程都有独立的虚拟地址空间,并占用实际的运行时资源(如内存、CPU、文件描述符等)。

程序是静态代码,进程是动态运行的程序实例。 一个程序可以对应多个进程(如多次运行同一个程序)。

程序和进程在内存中的区别

程序的内存布局:一个程序在磁盘上是静态的,存储的内容包括:

  1. 代码段
    • 包含程序的指令集(如函数实现、逻辑代码)。
    • 代码段是只读的,防止运行时修改。
    • 多个进程可以共享同一份代码段,节省内存资源。
  2. 数据段
    • 包含程序中的全局变量和静态变量的初始值。
    • 数据段是可写的,但内容固定,程序编译时就固定下来,程序静态存在时不会动态变化。

进程的内存布局
当程序运行后,进程会被加载到内存中,成为一个动态实体。操作系统为每个进程分配一个独立的虚拟地址空间,通常包括以下部分(如图所示):

  1. 代码段
    • 与程序中的代码段一致,存储程序的指令集(通常是只读的)。
    • 多个运行同一程序的进程可以共享该段,节省内存。
  2. 数据段
    • 存储进程运行时的全局变量和静态变量。
    • 每个进程的这部分独立存在,不同进程之间互不影响。
  3. 堆区
    • 堆是运行时动态分配的内存区域,通过 malloc 或 new 等函数分配。
    • 堆区是进程运行时动态分配的,大小不固定。
    • 堆的大小可以动态增长或缩减,主要用于存储动态对象或数据。
  4. 栈区
    • 栈用于存储函数调用的局部变量、返回地址以及函数调用的上下文信息。
    • 栈的大小在运行时动态变化(通常从高地址向低地址增长)。
  5. 内核空间
    • 进程虚拟地址空间的高地址部分通常保留给操作系统内核使用(如图中 1GB:内核空间位于进程的虚拟地址空间的高地址部分)。
    • 用于存储操作系统内核的数据和代码,用户进程无法直接访问内核空间,必须通过系统调用与内核交互。

图示中已经表明了二者的关键区别:

  • 程序
    • 静态结构,存储在磁盘中。
    • 没有动态分配的堆和栈。
    • 包含固定的代码段和数据段。
    • 程序是进程的模板,只有加载到内存并运行后,程序才变成进程。
  • 进程
    • 动态结构,在内存中运行。
    • 包含动态分配的堆和栈,用于运行时的内存管理。
    • 进程的每一部分(如堆、栈、数据段)都是独立的,其他进程访问不到。
    • 有操作系统分配的虚拟地址空间(如 4GB),包括用户空间和内核空间。
内存分布的对比
内存区域程序(静态)进程(动态)
代码段包含程序的指令集,内容固定。包含程序的指令集,可能被多个进程共享。
数据段包含全局变量和静态变量的初始值,固定。包含全局变量和静态变量的实际值,独立分配。
堆区无堆区。动态分配的内存区域,大小运行时变化。
栈区无栈区。存储局部变量、函数调用信息,动态变化。
内核空间无操作系统内核相关内容。包含与操作系统交互的内核数据。

特性区别:

特性程序进程
静态/动态静态实体,存储在磁盘中动态实体,是程序在运行时的实例
文件类型可执行文件(如 .exe、.out)运行时的实例,操作系统分配 ID(PID)标识
内存结构只包含代码段和数据段包含代码段、数据段、堆、栈和内核空间
资源使用不占用系统资源占用内存、CPU、文件描述符等运行时资源
并发性程序本身不可并发一个程序可以对应多个进程(不同的运行实例)
生命周期静态存储在磁盘上,永久存在动态创建和销毁,随运行状态变化
共享性所有进程共享同一个程序文件每个进程有独立的虚拟地址空间

实际代码:假设有一个程序 example.c

#include <stdio.h>
#include <stdlib.h>

int global_var = 10; // 全局变量

int main() {
    int local_var = 20; // 局部变量
    int *dynamic_var = malloc(sizeof(int)); // 动态分配的变量
    *dynamic_var = 30;

    printf("global_var: %d\n", global_var);
    printf("local_var: %d\n", local_var);
    printf("dynamic_var: %d\n", *dynamic_var);

    free(dynamic_var);
    return 0;
}

程序的内存结构:
当程序编译完成后,生成一个可执行文件 example.out,它在磁盘上的结构如下:

  1. 代码段:包含 main 函数和 printf 的指令。
  2. 数据段:包含 global_var 的初始值 10。

进程的内存结构:
当运行 ./example.out 时,操作系统为其创建一个进程,分配内存结构如下:

  1. 代码段:包含 main 函数的指令,多个进程共享该段。
  2. 数据段:存储 global_var 的值 10,每个进程有独立的副本。
  3. 堆区:malloc 分配的内存,存储 dynamic_var 的值 30。
  4. 栈区:存储局部变量 local_var 的值 20 和函数调用信息。
  5. 内核空间:包含内核相关的信息(如文件描述符、上下文切换等)。

程序和进程的区别进一步体现了两者的动态行为在内存使用的表现上:
程序的运行流程

  1. 程序最初是存储在磁盘上的静态文件(如 example.out)。
  2. 操作系统将程序加载到内存,分配代码段和数据段。
  3. 程序在未运行时,不涉及堆和栈的动态分配。

进程的运行流程

  1. 操作系统为进程分配独立的虚拟地址空间(如 4GB 空间)。
  2. 代码段加载到内存中,多个进程可以共享代码段。
  3. 数据段初始化全局变量和静态变量。
  4. 运行时,进程会动态请求堆内存(如 malloc)。
  5. 每次函数调用时,进程为局部变量和返回地址分配栈空间。
程序和进程的运行流程

程序的生命周期

  1. 编写源代码(.c 文件)。
  2. 编译生成可执行文件(如 .out)。
  3. 程序静态存储在磁盘中,等待被加载运行。

进程的生命周期

  1. 创建:程序被加载到内存中,操作系统分配 PCB(进程控制块)(想了解这个东西详细查看文章:进程控制块)和 虚拟地址空间。
  2. 运行:进程获得 CPU 执行权,进入运行状态。
  3. 等待:进程可能因 I/O 操作或资源不足进入等待状态。
  4. 销毁:进程执行完毕或被操作系统终止,释放资源。

简单的记忆:

  • 程序是静态的文件,存储在磁盘上,不占用运行时资源。
  • 进程是程序运行时的实例,有独立的虚拟内存空间,包含动态分配的堆、栈和运行时上下文。
  • 内存结构
    • 程序只包含代码段和数据段。
    • 进程包含代码段、数据段、堆、栈和内核空间。

通过程序和进程的对比,可以理解程序是代码逻辑的载体,而进程是操作系统管理的运行实体。两者结合才能实现计算任务的执行。更简单的说:程序是模板,进程是运行实例。 程序的静态结构在加载后被操作系统动态扩展为进程的完整内存结构。

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

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

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

相关文章

“多维像素”多模态雷视融合技术构建自动驾驶超级感知能力|上海昱感微电子创始人蒋宏GADS演讲预告

2025年1月14日&#xff0c;第四届全球自动驾驶峰会将在北京中关村国家自主创新示范区展示交易中心-会议中心举行。经过三年的发展&#xff0c;全球自动驾驶峰会已经成长为国内自动驾驶领域最具影响力、规模最大的产业峰会之一。昱感微电子创始人&CEO受到主办方邀请&#xf…

Linux创建server服务器实现多方信息收发

一&#xff0c;服务端 1.创建socket套接字&#xff0c;用于网络通信&#xff0c;同一台机器上的进程也可以通过本地套接字进行通信 //1.socket s_fd socket(AF_INET,SOCK_STREAM,0); if(s_fd -1){ perror("socket"); exit(-1); } //server address s_addr.sin_fami…

UML系列之Rational Rose笔记七:状态图

一、新建状态图 依旧是新建statechart diagram&#xff1b; 二、工作台介绍 接着就是一个状态的开始&#xff1a;开始黑点依旧可以从左边进行拖动放置&#xff1a; 这就是状态的开始&#xff0c;和活动图泳道图是一样的&#xff1b;只能有一个开始&#xff0c;但是可以有多个…

jsx语法中el-table-v2中cellRender如何使用动态绑定

答案&#xff1a;:attribute"xx"改为attribute{xx} 改写&#xff1a; const columns ref([{ key: index, dataKey: index, title: t(setting.index), width: 100 },{ key: no, dataKey: no, title: t(setting.key), width: 100 },{ key: name, dataKey: name, tit…

【初识扫盲】厚尾分布

厚尾分布&#xff08;Fat-tailed distribution&#xff09;是一种概率分布&#xff0c;其尾部比正态分布更“厚”&#xff0c;即尾部的概率密度更大&#xff0c;极端值出现的概率更高。 一、厚尾分布的特征 尾部概率大 在正态分布中&#xff0c;极端值&#xff08;如距离均值很…

EFK采集k8s日志

在 Kubernetes 集群中&#xff0c;需要全面了解各个 pod 应用运行状态、故障排查和性能分析。但由于 Pod 是动态创建和销毁的&#xff0c;其日志分散且存储不持久&#xff0c;因此需要通过集中式日志采集方案&#xff0c;将日志收集到统一的平台并配置日志可视化分析和监控告警…

HTML5教程(中)

HTML5 浏览器支持 HTML5 浏览器支持 目前市面上的浏览器有很多版本&#xff0c;你可以让一些较早的浏览器&#xff08;不支持HTML5&#xff09;支持 HTML5。 HTML5 浏览器支持 现代的浏览器都支持 HTML5。 此外&#xff0c;所有浏览器&#xff0c;包括旧的和最新的&#xff…

OpenCV实现彩色图像的直方图均衡化

1、直方图均衡化 在OpenCV中&#xff0c;equalizeHist函数用于直方图均衡化&#xff08;Histogram Equalization&#xff09;。这是一种图像处理技术&#xff0c;旨在增强图像的对比度&#xff0c;特别是在图像的灰度值集中于某个范围时非常有用。通过调整图像的灰度分布&…

速通nvm安装配置全程无废话

速通nvm安装配置全程无废话 1、安装包 通过网盘分享的文件&#xff1a;nvm-setup-1.1.11.zip等2个文件 链接: https://pan.baidu.com/s/1nk7pAFhhnHXDIIYRJLFqNw 提取码: niw8 --来自百度网盘超级会员v3的分享2、下载安装 nvm安装路径&#xff1a;D:\dev\nvm nodejs路径&am…

JUC Java并发编程 高级 学习大纲 动员

目录 口诀 锁 阿里巴巴开发规范 字节面试题 面试题 1 面试题 2 鼓舞 口诀 高内聚低耦合前提下 封装思想 线程 -- 操作 -- 资源类 判断、干活、通知防止虚假唤醒 &#xff0c;wait 方法要注意注意标志位 flag 可能是 volatile 的 锁 阿里巴巴开发规范 参考书 并发编程…

Unity 3D游戏开发从入门进阶到高级

本文精心整理了Unity3D游戏开发相关的学习资料&#xff0c;涵盖入门、进阶、性能优化、面试和书籍等多个维度&#xff0c;旨在为Unity开发者提供全方位、高含金量的学习指南.欢迎收藏。 学习社区 Unity3D开发者 这是一个专注于Unity引擎的开发者社区&#xff0c;汇聚了众多Un…

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章&#xff1a;Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具&#xff0c;放到C盘根目录&#xff0c; 2.1 打开windows Powershell&#xff08;WinX&#xff09;&#xff0c;下边那个最好。 输入两条指令&a…

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置&#xff1a; 1.1.集群规划 1.分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 2.每组是一主一从&#x…

数据结构(Java版)第八期:LinkedList与链表(三)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、链表中的经典面试题 1.1. 链表分割 1.2. 链表的回文结构 1.3. 相交链表 1.4. 环形链表 一、链表中的经典面试题 1.1. 链表分割 题目中要求不能改变原来的数据顺序&#xff0c;也就是如上图所示。…

flutter R库对图片资源进行自动管理

项目中对资源的使用是开发过程中再常见不过的一环。 一般我们在将资源导入到项目中后&#xff0c;会通过资源名称来访问。 但在很多情况下由于我们疏忽输入错了资源名称&#xff0c;从而导致资源无法访问。 所以&#xff0c;急需解决两个问题&#xff1a; 资源编译期可检查可方…

doc、pdf转markdown

国外的一个网站可以&#xff1a; Convert A File Word, PDF, JPG Online 这个网站免费的&#xff0c;算是非常厚道了&#xff0c;但是大文件上传多了之后会扛不住 国内的一个网站也不错&#xff1a; TextIn-AI智能文档处理-图像处理技术-大模型加速器-在线免费体验 https://…

计算机网络 (41)文件传送协议

前言 一、文件传送协议&#xff08;FTP&#xff09; 概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff09;是互联网上使用得最广泛的文件传送协议。FTP提供交互式的访问&#xff0c;允许客户指明文件的类型与格式&#xff08;如指明是否使用ASCII码&#xff0…

软件测试 —— 自动化测试(Selenium)

软件测试 —— 自动化测试&#xff08;Selenium&#xff09; 什么是SeleniumPython安装Selenium1.安装webdirver-manager2.安装Selenium 写一个简单用例CSS_SELECTOR和XPATH浏览器快速定位页面元素浏览器的前进&#xff08;forward&#xff09;&#xff0c;后退&#xff08;bac…

python识别图片中指定颜色的图案并保存为图片

示例代码&#xff1a; def chuli(color):import cv2import numpy as np# 定义颜色名称到HSV阈值范围的映射color_thresholds {red: ([0, 100, 100], [10, 255, 255], [160, 100, 100], [180, 255, 255]),yellow: ([20, 100, 100], [30, 255, 255]),blue: ([90, 100, 100], [1…

流浪猫流浪狗领养PHP网站源码

源码介绍 流浪猫流浪狗领养PHP网站源码&#xff0c;适合做猫狗宠物类的发信息发布。当然其他信息发布也是可以的。 导入数据库&#xff0c;修改数据库配置/application/database.php 设置TP伪静态&#xff0c;设置运行目录&#xff0c; 后台&#xff1a;/abcd.php/dashboard?…