程序在计算机中的运行是一个涉及硬件、操作系统和软件协同工作的复杂过程。我们可以将其分解为几个关键阶段来理解:

1. 程序的诞生:从源代码到可执行文件

  • 编写代码:程序员使用高级编程语言(如C、Python、Java)编写源代码。
  • 翻译成机器语言:如上一节所述,源代码需要通过编译器(生成可执行文件)或解释器/虚拟机(生成字节码或直接解释)转换成计算机能够理解的指令。最终,这些指令会以机器码(二进制形式)存储在可执行文件或内存中。

2. 程序的加载:从磁盘到内存

  • 用户启动:当你双击一个程序图标或在命令行输入程序名时,操作系统(OS)开始介入。
  • 创建进程:操作系统为这个程序创建一个进程 (Process)。进程是程序运行的一个实例,操作系统会为它分配一个唯一的进程ID(PID)。
  • 分配内存空间:操作系统为新进程在物理内存(RAM)中分配一块独立的、受保护的地址空间。这块空间通常包含几个关键区域:
    • 代码段 (Text Segment):存放程序的机器指令(即编译后的代码)。
    • 数据段 (Data Segment):存放程序中已初始化的全局变量和静态变量。
    • BSS段 (Block Started by Symbol):存放未初始化的全局变量和静态变量,程序启动时通常被清零。
    • 堆 (Heap):用于程序运行时动态分配内存(如C语言的malloc,C++的new)。堆的大小可以动态增长和缩小。
    • 栈 (Stack):用于函数调用时存储局部变量、函数参数、返回地址等。栈遵循“后进先出”(LIFO)原则,由编译器自动管理,增长方向通常与堆相反。
  • 加载内容:操作系统将可执行文件中的代码段、数据段等内容从硬盘加载到内存中为该进程分配的相应区域。

3. 程序的执行:CPU的指令循环

  • CPU介入:一旦程序被加载到内存,中央处理器(CPU)就可以开始执行它了。
  • 程序计数器 (PC):CPU内部有一个特殊的寄存器叫做程序计数器(或指令指针),它存储着下一条将要执行的指令在内存中的地址。
  • 指令执行循环:CPU不断地重复以下三个基本步骤,这个循环称为取指-译码-执行 (Fetch-Decode-Execute) 循环
    1. 取指 (Fetch):CPU根据程序计数器(PC)的值,从内存中读取下一条指令。
    2. 译码 (Decode):CPU的控制单元对取出的指令进行解码,确定这条指令要执行什么操作(如加法、跳转、读内存等)以及操作数在哪里。
    3. 执行 (Execute):CPU的算术逻辑单元(ALU)或其他部件执行解码后的操作。这可能涉及:
      • 进行算术或逻辑运算。
      • 从内存读取数据或将数据写入内存(访问堆、栈、数据段)。
      • 修改程序计数器的值,实现跳转(如if语句、for循环、函数调用)。
  • 更新PC:正常情况下,执行完一条指令后,程序计数器会自动指向下一条指令的地址(通常是当前地址加指令长度)。如果遇到跳转指令(如goto, call, return),PC会被设置为新的目标地址。

4. 程序的交互与资源管理

  • 系统调用 (System Calls):程序不能直接操作硬件(如读写文件、打印、获取网络数据)。当程序需要这些服务时,它会通过系统调用向操作系统发出请求。操作系统内核负责执行这些底层操作,然后将结果返回给程序。这保证了系统的安全性和稳定性。
  • 内存管理:操作系统和CPU的内存管理单元(MMU)协同工作,确保每个进程只能访问自己的内存空间,防止一个程序破坏另一个程序或操作系统本身的数据。虚拟内存技术允许程序使用比物理内存更大的地址空间。
  • I/O操作:程序通过系统调用与外部设备(键盘、鼠标、显示器、硬盘、网络)进行输入/输出交互。

5. 程序的结束

  • 正常结束:程序执行完所有指令,或者遇到exit系统调用,会向操作系统返回一个退出状态码(通常0表示成功,非0表示错误)。
  • 异常结束:程序可能因为错误(如除以零、访问非法内存)而崩溃,操作系统会终止该进程。
  • 资源回收:无论程序如何结束,操作系统都会回收该进程占用的所有资源,包括释放其内存空间、关闭打开的文件句柄、网络连接等,并从进程表中移除该进程的信息。

总结流程

  1. 编写与编译:源代码 -> (编译器/解释器) -> 机器码/字节码。
  2. 启动与加载:用户启动 -> 操作系统创建进程 -> 分配内存 -> 加载代码和数据到内存。
  3. 执行:CPU根据程序计数器,循环执行“取指-译码-执行”。
  4. 交互:通过系统调用与操作系统和外部世界通信。
  5. 结束:程序完成或出错 -> 操作系统回收资源。

整个过程体现了计算机硬件(CPU、内存、硬盘、I/O设备)和软件(操作系统、程序)的精密协作。操作系统作为“大管家”,负责资源的分配、调度和保护,确保多个程序能够安全、高效地共享计算机资源。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟卡券管理平台详细设计文档

文章目录**1. 文档概述**1.1 目标1.2 核心能力**2. 业务场景分析**2.1 用户场景2.2 关键业务流程卡券核销流程:**3. 整体架构设计**3.1 技术栈3.2 微服务拆分**4. 功能模块详细设计**▶ 4.1 卡券生命周期管理**4.1.1 卡券类型设计****4.1.2 关键状态机**▶ 4.2 卡券…

Oracle参数Process

RDBMS: 19.28 参考文档: IF:How to determine an optimum value for PROCESSES parameter (Doc ID 2012693.1) All About the Initialization Parameter PROCESSES and the Related Issues (Doc ID 2673195.1) How to calculate the proper value from …

【数据结构入门】树

目录 1.树的概念 父子结点 根节点|叶节点 结点的度 叶子结点或终端结点 兄弟结点 树的度 结点的层次 树的高度或深度 结点的祖先 堂兄弟结点 子孙 森林 2. 树的结构定义 2.1 左孩子右兄弟结构 2.2 数组表示法 3.树&非树 1.树的概念 树是一种非线性的数据结…

手把手教你用 Flink + CDC 实现 MySQL 数据实时导入 StarRocks(干货)

手把手教你用 Flink CDC 实现 MySQL 数据实时导入 StarRocks(干货) 如何利用 Apache Flink 结合 CDC(Change Data Capture,变更数据捕获)技术,将 MySQL 的数据实时导入 StarRocks,打造高效的实…

Rust:anyhow 高效错误处理库核心用法详解

以下是 anyhow 库在 Rust 中的核心用法详解(结合最佳实践和示例): 🔰 一、anyhow 的核心价值 用于简化错误处理,尤其适合: 需要快速原型开发的应用需要丰富错误上下文(Context)的场…

阿里云服务linux安装单机版

一、单机安装Redis 阿里教程 下载地址:redis下载地址 1、首先需要安装Redis所需要的依赖: yum install -y gcc tcl 2、下载Redis 注:也可以自己下好然后上传到云服务 wget https://gitcode.net/weixin_44624117/software/-/raw/master/software/Li…

python之uv使用

文章目录安装与更新standalonepip 安装创建以及初始化项目依赖管理uv run直接在命令行运行python代码片段直接运行项目中可执行脚本文件运行python包中快捷指令uv项目本地运行调试细节vscode 中运行调试uv项目命令行运行深入理解 uv lock, uv sync, uv lockuv lock 行为解析:uv…

【CV 目标检测】①——目标检测概述

一、目标检测概述 1.目标检测 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标,并确定它们的类别(分类任务)和位置(回归任务) 目标检测中能检测出来的物体取决于当前任务&…

C#图形库SciChart与ScottPlot及LiveCharts2对比

一.概述 1.SciChart SciChart 是一个专为企业级应用设计的高性能数据可视化库,提供跨平台的图表解决方案,支持 .NET、JavaScript、iOS 和 Android 等多个平台。它以卓越的渲染性能、丰富的专业图表类型和强大的交互功能著称, 广泛应用于金…

Win10电脑密码忘记如何进入操作系统

http://xq128.com/zj.htmlhttps://share.feijipan.com/s/LbFdbUKl下载后,准备一个空的U盘,大于4G。将U盘制作为PE盘。之后将制作好的PE盘插入到电脑中,启动待去除密码的电脑台式机,启动后一直按住F12,进入BIOS。选择下…

[免费]基于Python的网易云音乐热门歌单可视化大屏项目(flask+pandas+echarts+request库)【论文+源码+SQL脚本】

大家好,我是python222_小锋老师,看到一个不错的基于Python的网易云音乐热门歌单可视化大屏项目(flaskpandasechartsrequest库),分享下哈。 项目视频演示 【免费】基于Python的网易云音乐热门歌单可视化大屏项目(flaskpandasecharts爬虫) Py…

AR 智能眼镜:从入门到未来

从零看懂 AR 智能眼镜:未来 10 年技术演进与新手入门指南 在这个数字技术飞速迭代的时代,AR 智能眼镜正从科幻电影走进现实。从 2025 年重量不足 35 克的消费级产品,到 2030 年成为 “第二大脑” 的生活刚需,再到 2040 年进化为神经接口终端,AR 智能眼镜的发展将重塑人类…

初识Vue2及MVVM理解

1、什么是Vue Vue是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,可以高效地开发用户界面。 Vue.js是一套构建用户界面的渐进式框架,采用自底向上增量开发的设计&…

Rust:专业级错误处理工具 thiserror 详解

Rust:专业级错误处理工具 thiserror 详解 thiserror 是 Rust 中用于高效定义自定义错误类型的库,特别适合库开发。相比 anyhow 的应用级错误处理,thiserror 提供更精确的错误控制,让库用户能模式匹配具体错误。 📦 基…

Python网络爬虫(一) - 爬取静态网页

文章目录一、静态网页概述1. 静态网页介绍2. 静态网页爬取技术Requests介绍二、安装 Requests 库三、发送请求并获取响应1. 发送 GET 请求1.1 get() 方法介绍1.2 get() 方法签名介绍1.3 get() 方法参数介绍1.4 示例:发送get请求2. 发送 POST 请求2.1 post() 方法介绍…

.NET/C# webapi框架下给swagger的api文档中显示注释(可下载源码)

bg&#xff1a;.NET/C#真的是越来越凉了。用的是.net9&#xff0c;创建完自带一个天气预报api拿来测试就行 1、在Controllers中弄多几个&#xff0c;并写上注释 /// <summary> /// Post注释 /// </summary> /// <returns></returns> [HttpPost] publ…

2508C++,检测S模式

原文 可用Windows.System.Profile.WindowsIntegrityPolicy类检测S模式. //C# using Windows.System.Profile; if (WindowsIntegrityPolicy.IsEnabled) {//系统在S模式if (WindowsIntegrityPolicy.CanDisable) {//系统在S模式,但可退出S模式suggestCompanion true;} else {//系…

Coding Exercising Day 9 of “Code Ideas Record“:StackQueue part 01

文章目录1. Theoretical basisThe C standard library has multiple versions. To understand the implementation principles of stack and queue, we must know which STL version we are using.The stack and queue discussed next are data structures in *SGI STL*. Only …

Mysql数据仓库备份脚本

Mysql数据仓库备份脚本 #!/bin/bash# MySQL数据库完整备份脚本 # 功能: 查询所有数据库 -> 分别导出 -> 压缩打包# 配置区域 # MySQL连接信息 MYSQL_USER"root" MYSQL_PASSWORD"root" MYSQL_HOST"localhost" MYSQL_PORT"3306"…

基于嵌入式Linux RK3568 qt 车机系统开发

嵌入式系统、Qt/QML 与车机系统的发展趋势分析 1. RK3568 开发板与 OpenGL ES 3 支持&#xff0c;为图形应用打下坚实基础 RK3568 是瑞芯微&#xff08;Rockchip&#xff09;推出的一款高性能、低功耗的64位处理器&#xff0c;广泛用于工业控制、智能终端、嵌入式车载系统等领…