计算机系统原理之程序是怎么运行的

article/2025/9/29 22:46:54

计算机的组成

          计算机是由硬件和软件组成的,这两个部分共同协作完成程序的运行。这两部分如何协作完成程序的运行,是本系列的重点。

 

信息的表示

          信息的表示说到底就是位加上下文。举个小例子,比如11011101这一串二进制,在表示整数的时候它表示221,但是如果放在JAVA的class文件当中,它可能代表一个JVM的指令。

 

程序的编译

          对于一个简单的C语言程序来说,一般要经过预处理器、编译器、汇编器和链接器的处理,才能被翻译成一段可执行的二进制文件。

          比如对于一个简单的C语言程序,如下。

#include <stdio.h>
int main()
{
printf("hello,world\n");    
}

          我们保存在hello.c当中,那么它的翻译过程如下。

程序的运行 

          程序的运行由解释器负责,它将逐个解释最终生成的二进制文件并执行。

 

计算机的硬件组成

          首先,我们来看下计算机中硬件的大致分布,如下图。

           其中有几个非常重要的部分,一一看下都是什么作用。

           总线贯穿整个系统的是一组电子管道(其实就是传输数据的线路),也就是总线。总线传送的是字,字的大小与系统相关,比如在32位操作系统当中,一个字是4个字节。

           I/O设备I/O设备是系统与外部联系的通道。I/O设备(键盘、鼠标、显示器等)由控制器(USB控制器)或者适配器(图形适配器,也就是显卡)与I/O总线相连,两者的区别在于一个是主板上的芯片组,一个是主板插槽上的卡。

           主存它是计算机中的一个临时存储设备,在处理器执行程序的时候,主存就是临时存放数据的地方。物理上来说,它是由动态随即存取存储器芯片组成,逻辑上来说,它是一组连续的字节数组,每一个字节都有唯一的地址。

           处理器全称中央处理单元,是解释存储在主存中指令的引擎。处理器的核心是一个程序计数器,它在整个计算机运行的期间都会指向一个主存中的一个内存地址,而地址当中则是一个计算机指令。处理器所做的,就是不停的执行程序计数器所指向的每一条指令。处理器所做的操作是围绕主存、寄存器文件以及算术/逻辑单元进行的,这里面处理器做的最多的动作就是加载(从主存将数据复制到寄存器)、存储(从寄存器将数据复制到主存)、操作(将两个寄存器的内容复制到算术/逻辑单元进行操作,结果会再次复制到寄存器)以及跳转(改变程序计数器当中的内容)。

           处理器当中提到的是指令集结构,不过实际当中指令集的实现是非常复杂的,这么做的目的是为了加速CPU的运算速度。我们可以这样去区分指令集机构以及微体系结构,指令集结构是指令集的抽象描述,而微体系结构则是这个抽象描述的某一个具体实现,类似于JAVA虚拟机与JAVA虚拟机实现的关系。

 

总结 :计算机是由软件与硬件组成的,而硬件又包括了总线、I/O设备、主存以及处理器,其中信息是由位以及上下文表示的,而信息则是从I/O设备以位的形式通过总线进入主存,然后由处理器从主存将信息取出处理。

           一个程序的执行,是经历了预处理器、编译器、汇编器以及链接器的处理之后,才最终成为可执行的文件。当程序成为可执行文件时就已经保存在了磁盘上,具体的执行过程在下一章再总结。

 

Hello world的执行

           我们以linux系统为例,当我们执行一个简单的打印字符串的C程序时,我们需要在命令行输入./hello以及回车去执行该程序。在整个执行过程中,计算机主要做了三件事,或者说经历了三个阶段来完成程序的运行。

 

1、linux的外壳扫描用户输入的字符

           当我们在键盘输入./hello时,linux的外壳程序(也就是命令行)会扫描我们输入的字符,将这些字符一一读入到寄存器当中,然后再一一放入主存。换句话说,./hello这几个字符是经过了CPU中的寄存器从而到达了主存。下面LZ将这一过程的图示画出来。

 

2、加载hello文件的代码以及数据到主存

            这一过程的触发是在我们按下回车的那一刻,此时系统会将存储在磁盘上的hello文件加载到主存,而此过程会利用一种叫做存储器存取的技术,使得数据不通过寄存器直接到达主存。下图是这一过程的图示。

 

 

3、根据主存中代码的指令执行程序

            在代码以及程序所需要的数据加载到主存后,CPU就开始从main函数的起始位置,依次执行代码中的指令。由于我们的代码只是简单的输出“hello world”这样的字符串,因此系统只是将这个字符串依次加载到寄存器,然后传输到显示器终端显示。这个过程如下图。

 

总结 :本章只是简单的介绍了一下hello程序的执行过程,我们可以简单的这么理解,hello程序的执行,其实就是将数据和代码加载到主存,并由CPU从主存获取指令从而执行的过程。

 

原文链接:http://www.cnblogs.com/zuoxiaolong/archive/2013/09/20/computer1.html


http://chatgpt.dhexx.cn/article/ILZ6WSLr.shtml

相关文章

软件设计师(2)--->操作系统基本原理

目录 操作系统基本原理 一、进程&#xff08;PCB&#xff09; 1、进程的基本状态 2、 前驱图 3、进程的同步与互斥 4、信号量机制 5、PV操作 6、死锁问题 7、银行家算法 二、存储管理 1、分区存储组织 2、分页存储管理方式 3、分段存储管理方式 4、段页式存储管理…

操作系统原理是什么

操作系统是管理计算机硬件资源&#xff0c;控制其他程序运行并为用户提供交互操作界面的系统软件的集合&#xff0c;是通过计算机语言编写程序让计算机执行。那么操作系统原理是什么呢?下面小编就跟大家分享下操作系统原理。 工具/原料 系统版本&#xff1a;windows10系统 品牌…

oneinstack的网站https证书到期后手动续期

由于各种原因&#xff0c;oneinstack并不一定能自动续期网站脚本&#xff0c;导致https证书过期&#xff0c;此时可以手动执行更新脚本。 一、先把oneinstack的证书申请脚本更新 cd oneinstack/ ./upgrade.sh二、手动执行脚本 /root/.acme.sh/acme.sh --cron --home /root/.a…

跟着未名学Office - 高效笔记OneNote

了解OneNote 2016年12月22日 19:57 OneNote Summary 理解OneNote中的笔记本、分区、页的概念 编写人&#xff1a;未名 感谢秦大: http://www.zloffice.net/ 基本操作(17) 2016年12月22日 20:24 页面模板 插入-->页面模板 使用模板 创建模板 用于当前分区新页的…

Onenote如何快速实现首行缩进的功能。

因为Onenote定位的是笔记本&#xff0c;所以本身并不带有首行缩进功能。下面来介绍如何用其它辅助手段来实现这个功能。楼主现在用的是onenote2016&#xff0c;其它版本未测试过这个方法&#xff0c;不过应该是可行的。 首先下载和安装Onetastic这个插件&#xff0c;这个插件目…

关于onenote2016遇到的页面大片空白无法正常收缩的bug

问题示意 解决办法1&#xff1a; 将页面中的信息复制到新的一页后 恢复正常 简单 高效 省事 解决办法2&#xff1a; 这个办法有点麻烦&#xff0c;但是本质是对原来的页面的修复&#xff0c;不需要创建新页面&#xff0c;然后把旧页面的内容搬到新页面。 那么旧页面到底发生了…

简单有效解决onenote无法设置或修改默认的英文字体“Calibri”(简单实用)

onenote中只能设置中文字体&#xff0c;英文字体只能用默认的“Calibri”&#xff0c;中英文和数字混排时&#xff0c;效果极差&#xff0c;极其烦人。是否有办法同时或分别设置onenote中、英文字体呢&#xff1f;办法是有的。 中文字体的设置在文件–>选项中&#xff0c;设…

NAntpad 不免费了

NAntpad是一个很好的创建NAnt Build文件的工具&#xff0c;前一段时间试过它的0.4 Beta版&#xff0c;感觉很不错&#xff1b;今天收到Email通知&#xff0c;0.5 Beta已经发布了&#xff0c;很高兴的把新版本下载回来&#xff08;下载的时候还要再次输入email地址&#xff09;&…

js清空本地存储_详解onenote保存与同步④:本地笔记奇葩的丢失经历

&#xff08;此文介绍的是我遇到过的&#xff0c;极其奇葩的&#xff0c;丢失onenote本地笔记的惨痛经历。不论是否具有普遍性&#xff0c;对进一步理解缓存还是很有帮助的。大家若有其他丢失经历&#xff0c;可以交流。&#xff09; 对于onenote本地笔记本而言&#xff0c;由于…

我的 OneNote 入门心得

Microsoft OneNote 是老牌笔记类软件&#xff0c;在如今百花齐放的笔记类市场仍然有众多死忠粉的拥护&#xff0c;比如我。也试过其它笔记类软件&#xff0c;近年推出的 Notion 就不错&#xff0c;但仍然无法取代 OneNote 在我的笔记体系中的核心地位。 本文介绍笔者对 OneNote…

onenote CAS总结⑦:异常“强大”的搜索机制(转载)

转载地址http://cas01.com/7335.html onenote CAS总结⑦&#xff1a;异常“强大”的搜索机制 原创 小斯 2021-02-06 18:10 onenote的中文搜索&#xff0c;相当尴尬&#xff0c;可以说是功能最强和最垃圾的混合体&#xff01;至少在我用过的软件中&#xff0c;没有哪个的搜…

VisualStudio如何进行OneNote插件开发?

文章目录 0.引言1.工具和数据准备2.创建工程3.创建ribbon配置文件4.编写功能代码5.安装和部署6.OneNote插件展示 0.引言 在OneNote做笔记很方便&#xff0c;但笔者用久后&#xff0c;就觉得OneNote缺少自己想要的一些功能&#xff0c;希望通过二次开发实现不断增长的需求。起初…

如何卸载Onetastic

Looking for an effective solution to uninstall Onetastic (64-Bit)? Download professional uninstaller to get rid of it now! Download Onetastic (64-Bit) Removal Tool Tested Malware & Virus Free by McAfee™ Failed to uninstall Onetastic (64-Bit) through …

onenote运用onetastic和notehighlight插件

一、两个免费插件 插件1&#xff1a;onetastic 查件2&#xff1a;notehighlight 或(github) 其中onetastic可以添加宏(自定义或下载宏)&#xff0c;便于快捷操作。如改变文本字体和字体大小、插入时间、横线、快速查找、替换等。notehighlight可以添加代码样式、主题(noteh…

VUE上传大文件的三种解决方案

最近遇见一个需要上传超大大文件的需求&#xff0c;调研了七牛和腾讯云的切片分段上传功能&#xff0c;因此在此整理前端大文件上传相关功能的实现。 在某些业务中&#xff0c;大文件上传是一个比较重要的交互场景&#xff0c;如上传入库比较大的Excel表格数据、上传影音文件等…

大文件怎样实现快速上传?

前言 大文件快速上传的方案&#xff0c;相信你也有过了解&#xff0c;其实无非就是将 文件变小&#xff0c;也就是通过 压缩文件资源 或者 文件资源分块 后再上传。 本文只介绍资源分块上传的方式&#xff0c;并且会通过 前端&#xff08;vue3 vite&#xff09; 和 服务端&…

大文件夹上传

目前没有这样的标准&#xff0c;可以把文件夹打包上传大文件。 webkitdirectory Booleanwebkitdirectory属性&#xff08;如果存在&#xff09;指示用户在文件选择器界面中只能选择目录。有关HTMLInputElement.webkitdirectory其他详细信息和示例&#xff0c;请参阅。 虽然最初…

往GitHub上传大文件

1.下载Git Git - Downloads 2.下载GitLFS https://git-lfs.github.com/ 3.复制URL 4.在本地创建文件夹&#xff0c;右键Git Bash Here 5.粘贴URL进行下载--下载到本地 git clone URL 6.转到克隆到本地的文件夹内&#xff0c;运行git lfs track--进行文件定位 若要查找所有…

上传大文件的解决方案

上传大文件的解决方案 需求&#xff1a;项目要支持大文件上传功能&#xff0c;经过讨论&#xff0c;初步将文件上传大小控制在500M内&#xff0c;因此自己需要在项目中进行文件上传部分的调整和配置&#xff0c;自己将大小都以501M来进行限制。 第一步&#xff1a; 前端修改 由…

大文件上传解决方案

之前仿造uploadify写了一个HTML5版的文件上传插件&#xff0c;没看过的朋友可以点此先看一下~得到了不少朋友的好评&#xff0c;我自己也用在了项目中&#xff0c;不论是用户头像上传&#xff0c;还是各种媒体文件的上传&#xff0c;以及各种个性的业务需求&#xff0c;都能得到…