程序在計算機中的運行方式

程序在計算機中的運行是一個涉及硬件、操作系統和軟件協同工作的復雜過程。我們可以將其分解為幾個關鍵階段來理解:

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;廣泛用于工業控制、智能終端、嵌入式車載系統等領…