本地网站模板修改,网站开发大致需要哪些步骤,腾讯企业邮箱app下载,昆明网站建设博滇在计算机系统中#xff0c;程序和进程是两个密切相关但又有本质区别的概念#xff0c;尤其在内存中的表现上有显著不同#xff1a; 在这张图中可以直观地看出程序和进程在内存中的结构区别。
基本定义
程序
程序 是一个 静态实体#xff0c;表示一组写好的指令和数据的…在计算机系统中程序和进程是两个密切相关但又有本质区别的概念尤其在内存中的表现上有显著不同 在这张图中可以直观地看出程序和进程在内存中的结构区别。
基本定义
程序
程序 是一个 静态实体表示一组写好的指令和数据的集合一般存储在磁盘上如 .exe、.out 文件。程序本身不占用运行时的系统资源如 CPU、内存等它是一个静态文件它仅包含代码和数据的固定内容表示完成某种任务的一组指令集合。
程序的特性 静态性程序只是存储在磁盘中的文件不会动态变化程序是静态的文件不占用运行时资源。无运行环境程序没有运行时需要的栈、堆、寄存器等概念程序没有运行时动态分配的内存如堆和栈。程序本身不包含对操作系统资源如 CPU、内存的使用能力。
进程
进程是程序运行后的动态实例是操作系统分配资源的基本单元进程是程序的一次执行实例是一个动态实体。进程是程序运行后的产物程序一旦被加载到内存并运行就变成了进程。进程需要操作系统的支持每个进程都有独立的虚拟地址空间并占用实际的运行时资源如内存、CPU、文件描述符等。
程序是静态代码进程是动态运行的程序实例。 一个程序可以对应多个进程如多次运行同一个程序。
程序和进程在内存中的区别
程序的内存布局一个程序在磁盘上是静态的存储的内容包括
代码段 包含程序的指令集如函数实现、逻辑代码。代码段是只读的防止运行时修改。多个进程可以共享同一份代码段节省内存资源。 数据段 包含程序中的全局变量和静态变量的初始值。数据段是可写的但内容固定程序编译时就固定下来程序静态存在时不会动态变化。
进程的内存布局 当程序运行后进程会被加载到内存中成为一个动态实体。操作系统为每个进程分配一个独立的虚拟地址空间通常包括以下部分如图所示
代码段 与程序中的代码段一致存储程序的指令集通常是只读的。多个运行同一程序的进程可以共享该段节省内存。 数据段 存储进程运行时的全局变量和静态变量。每个进程的这部分独立存在不同进程之间互不影响。 堆区 堆是运行时动态分配的内存区域通过 malloc 或 new 等函数分配。堆区是进程运行时动态分配的大小不固定。堆的大小可以动态增长或缩减主要用于存储动态对象或数据。 栈区 栈用于存储函数调用的局部变量、返回地址以及函数调用的上下文信息。栈的大小在运行时动态变化通常从高地址向低地址增长。 内核空间 进程虚拟地址空间的高地址部分通常保留给操作系统内核使用如图中 1GB内核空间位于进程的虚拟地址空间的高地址部分。用于存储操作系统内核的数据和代码用户进程无法直接访问内核空间必须通过系统调用与内核交互。
图示中已经表明了二者的关键区别
程序 静态结构存储在磁盘中。没有动态分配的堆和栈。包含固定的代码段和数据段。程序是进程的模板只有加载到内存并运行后程序才变成进程。 进程 动态结构在内存中运行。包含动态分配的堆和栈用于运行时的内存管理。进程的每一部分如堆、栈、数据段都是独立的其他进程访问不到。有操作系统分配的虚拟地址空间如 4GB包括用户空间和内核空间。
内存分布的对比
内存区域程序静态进程动态代码段包含程序的指令集内容固定。包含程序的指令集可能被多个进程共享。数据段包含全局变量和静态变量的初始值固定。包含全局变量和静态变量的实际值独立分配。堆区无堆区。动态分配的内存区域大小运行时变化。栈区无栈区。存储局部变量、函数调用信息动态变化。内核空间无操作系统内核相关内容。包含与操作系统交互的内核数据。
特性区别
特性程序进程静态/动态静态实体存储在磁盘中动态实体是程序在运行时的实例文件类型可执行文件如 .exe、.out运行时的实例操作系统分配 IDPID标识内存结构只包含代码段和数据段包含代码段、数据段、堆、栈和内核空间资源使用不占用系统资源占用内存、CPU、文件描述符等运行时资源并发性程序本身不可并发一个程序可以对应多个进程不同的运行实例生命周期静态存储在磁盘上永久存在动态创建和销毁随运行状态变化共享性所有进程共享同一个程序文件每个进程有独立的虚拟地址空间
实际代码假设有一个程序 example.c
#include stdio.h
#include stdlib.hint 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它在磁盘上的结构如下
代码段包含 main 函数和 printf 的指令。数据段包含 global_var 的初始值 10。
进程的内存结构 当运行 ./example.out 时操作系统为其创建一个进程分配内存结构如下
代码段包含 main 函数的指令多个进程共享该段。数据段存储 global_var 的值 10每个进程有独立的副本。堆区malloc 分配的内存存储 dynamic_var 的值 30。栈区存储局部变量 local_var 的值 20 和函数调用信息。内核空间包含内核相关的信息如文件描述符、上下文切换等。
程序和进程的区别进一步体现了两者的动态行为在内存使用的表现上 程序的运行流程
程序最初是存储在磁盘上的静态文件如 example.out。操作系统将程序加载到内存分配代码段和数据段。程序在未运行时不涉及堆和栈的动态分配。
进程的运行流程
操作系统为进程分配独立的虚拟地址空间如 4GB 空间。代码段加载到内存中多个进程可以共享代码段。数据段初始化全局变量和静态变量。运行时进程会动态请求堆内存如 malloc。每次函数调用时进程为局部变量和返回地址分配栈空间。
程序和进程的运行流程
程序的生命周期
编写源代码.c 文件。编译生成可执行文件如 .out。程序静态存储在磁盘中等待被加载运行。
进程的生命周期
创建程序被加载到内存中操作系统分配 PCB进程控制块想了解这个东西详细查看文章进程控制块和 虚拟地址空间。运行进程获得 CPU 执行权进入运行状态。等待进程可能因 I/O 操作或资源不足进入等待状态。销毁进程执行完毕或被操作系统终止释放资源。
简单的记忆
程序是静态的文件存储在磁盘上不占用运行时资源。进程是程序运行时的实例有独立的虚拟内存空间包含动态分配的堆、栈和运行时上下文。内存结构 程序只包含代码段和数据段。进程包含代码段、数据段、堆、栈和内核空间。
通过程序和进程的对比可以理解程序是代码逻辑的载体而进程是操作系统管理的运行实体。两者结合才能实现计算任务的执行。更简单的说程序是模板进程是运行实例。 程序的静态结构在加载后被操作系统动态扩展为进程的完整内存结构。
以上。仅供学习与分享交流请勿用于商业用途转载需提前说明。
我是一个十分热爱技术的程序员希望这篇文章能够对您有帮助也希望认识更多热爱程序开发的小伙伴。 感谢