返回顶部
首页 > 资讯 > 精选 >hello程序是如何运行的
  • 811
分享到

hello程序是如何运行的

2023-06-19 09:06:33 811人浏览 八月长安
摘要

这篇文章主要介绍“hello程序是如何运行的”,在日常操作中,相信很多人在hello程序是如何运行的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”hello程序是如何运行的”的疑惑有所帮助!接下来,请跟着小编

这篇文章主要介绍“hello程序是如何运行的”,在日常操作中,相信很多人在hello程序是如何运行的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”hello程序是如何运行的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在开始之前,我们先看一个最常见的程序:

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

本文就从上面这个最简单的hello程序展开,沿着它的生命周期展开学习.

程序的保存格式

上面的hello程序其实就是一个由值 0 和 1 组成的位(即比特)序列,8个位成一组,称为字节。我们输入文本hello.c文件中的字符即用每个字节来表示(大部分计算机系统都是用ASCII标准来表示字符,即把字节转为整数值)。

总结: 信息=位+上下文

程序是如何运行的

hello程序的诞生使用C语言来编写的,好处是人可以读懂,但是为了在系统上运行,还是得转化为一系列低级的机器语言指令。

在Unix系统上,从源文件到目标文件的转化得靠编译器, 下面记录编译过程:

hello程序是如何运行的

  1. hello.c需要经过预处理器读取系统头文件内容并且插入到程序文本中得到一个新的C程序,一般以.i作为扩展名;

  2. 然后编译器将文本文件hello.i 翻译成汇编语言文本文件hello.s

  3. 接下来,就该汇编器登场,将汇编语言翻译成机器语言指令,并保存到hello.o文件中,此时它是一个二进制文件了

  4. 最后链接阶段,将程序中调用的c标准库的函数合并到我们的hello.o程序中,结果就是一个可执行文件,可以被加载到内存中,由系统执行。

系统的硬件组成

要真正了解程序时如何运行的,首先要对系统的硬件组成有一个了解:

  1. 总线:贯穿整个系统的电子管道,可以理解为所有的数据设备以及系统之间的数据流转都要接到总线上。

  2. I/O设备:系统与外部世界的联系通道;比如键盘、鼠标、磁盘、显示器等;

    所有的I/O设置都要通过一个控制器或者适配器与I/O总线相连;

  3. 主存:也就是我们常说的内存,这是一个临时存储设备,在处理器执行程序时,用来存放程序和处理的数据;

  4. 处理器:也就是我们常说的CPU,是解释存储在主存中指令的引擎;其核心是一个大小为一个字(定长的字节,根据系统不同确定)的寄存器,称为程序计数器(PC)。在程序运行的过程中,PC都是指向主存中的一条机器语言指令。

    从系统通电开始,直到系统断电,处理器一直在不断的执行PC指向的指令,在更新PC,使其指向下一条指令;

    下面列举几个CPU在指令要求下可能执行的操作:

    处理器看上去是它的指令集架构的简单实现,但是现代处理器采用非常复杂的机制来加速程序的运行。因此我们在理解的时候要将处理器的指令集架构 和处理器的 微体系结构分来:指令集架构描述的是每条机器代码指令的效果;微体系结构描述的是处理器的实现;

    • 加载:从主存复制一个字到寄存器,已覆盖原有寄存器的内容;

    • 存储:从寄存器复制一个字到主存的某个位置,以覆盖这个位置的原有值;

    • 操作:把两个寄存器的内容复制到ALU(算数/逻辑单元),ALU对这两个字做算数运算,并将结果存放到一个寄存器中覆盖原有的内容;

    • 跳转:从指令本身抽取一个字,并将这个字复制到PC中,以覆盖PC中原来的值;

运行程序

当我们在执行 ./hello 后,其实发生的过程是:

刚开始,shell程序执行它的指令,等待我们输入一个命令,当我们输入./hello 后,shell程序将字符读入寄存器,在把它存放到内存中;

当你在敲回车时,shell程序就知道我们已经结束了命令的输入,然后shell执行一系列指令来加载可执行文件,将目前文件的代码和数据复制到主存。注:利用直接存储器(DMA)技术,数据可以不到处理器直接从磁盘到主存。

一旦加载到内存中,处理器就开始执行程序的main机器指令,这些指令将“hello,world\n” 字符串中字节从主存复制到寄存器文件。再从寄存器文件复制到显示设备,最终展示在屏幕上。

hello程序是如何运行的

高速缓存

从上面的例子,我们可以总结出,hello程序经历了从开始在磁盘上,加载时被复制到主存,处理器运行时又从主存复制到处理器,最后又从处理器复制到显示器。

这里从我们程序员角度讲,这些复制就是开销,那么问题来了,如何减小开销提高处理器效率呢???

从机械原理角度来看,存储设备越大运行越慢;处理器读磁盘比读内存开销大1000万倍,而寄存器文件的读取速度又比内存块几乎100倍,加快处理器的运行速度比加快主存运行速度要容器的多。

针对处理器与主存之间的差异,系统设计采用了更小更快的存储设备,称之为高速缓存,存放处理器近期可能会需要的信息。这个其实和我们平时开发程序是一样的,采用多级缓存,存放热点数据,提高系统处理能力。 这里的原理是利用程序具有访问局部区域里的数据和代码的趋势,所以高速缓存中存放了可能经常访问的数据,这样大部分操作就能在告诉缓存中完成。

请看下面的存储器层次的结构,相信你会一目了然:

hello程序是如何运行的

如图所示,上一层存储器是下一层的高速缓存。

操作系统管理硬件

我们写的程序,没有直接访问键盘、显示器、磁盘等硬件,而是依赖操作系统提供的服务,所以可以把操作系统看成是应用程序和硬件之间一层软件。

hello程序是如何运行的

操作系统有两大功能:

  1. 防止硬件被滥用;

  2. 对应用程序屏蔽底层复杂而通常又大不相同的硬件设备,提供简单一致的机制;

操作系统通常抽象出几个概念:进程、虚拟内存、文件;

进程

进程是操作系统对一个正在运行的应用程序的抽象,一个系统可以同时运行多个进程。

单核处理器一个时刻只能执行一个程序,而目前的多核处理器能同时执行多个程序。无论单核还是多核,一个CPU看上去都是在并发执行多个进程,这是通过处理器在进程间切换来实现的,这种切换被称为 上下文切换

进程之间的切换是由操作系统内核管理的,内核是操作系统常驻主存的部分。当应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条系统调用指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。 注意,内核不是一个独立的进程,它是系统管理所有进程所用代码和数据结构集合

线程

一个进程实际上是由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

优点:比进程之间更容易共享数据;一般来讲也比进程更高效;

虚拟内存

这是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在单独使用主存,每个进程看到的内存都是一致的,称为虚拟地址空间,如下图所示,地址是从小往上增大的:

hello程序是如何运行的

文件

文件就是字节序列,所有的I/O设备,甚至网络都可以看成是文件;

并发

多核处理器是将多个CPU集成到一个集成电路芯片上。多核处理器组织架构如下:

hello程序是如何运行的

超线程:称为同时多线程,允许一个CPU同时执行多个并发流的技术。Intel Core i7 处理器可以让每个核执行两个线程。

计算机系统中的抽象

在处理里,指令集架构提供了对实际处理器硬件的抽象,使用这个抽象,机器代码表现的好像运行在一个一次只执行一条指令的处理器上。不管底层多复杂精细,哪怕可以并发的执行多条指令,担又总是与那个简单有序的模型保持一致。只要模型一样,不同的处理器实现也能执行同样的机器代码,而又提供不同的开销和性能。这种抽象思想简直太重要了,在整个计算机科学中也随处可见,比如java类的生命和C语言的函数原型,以及计算机网络的分层。

hello程序是如何运行的

看了上面这副图可以总结为:

  1. 文件是对I/O设置的抽象;

  2. 虚拟内存是对主存和磁盘的抽象;

  3. 进程是对处理器、主存和I/O设备的抽象;

至此,本章的学习就结束了,主要对计算机系统的组成和程序运行有了大框架的认知,后续继续进行深入学习。

扩展问题

  1. 信息=位+上下文,什么是上下文?工作中有哪些例子?

每一段程序都有很多外部变量。只有像Add这种简单的函数才是没有外部变量的。一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行。你为了使他们运行,就要给所有的外部变量一个一个写一些值进去。这些值的集合就叫上下文。 比如:c++的lambda表达式里面,[写在这里的就是上下文](int a, int b){ ... }

  1. RISC指令集和CISC指令集有什么区别,它们的典型CPU有哪些?

  • CSIC(Complex Instruction Set Computer) 复杂指令集的CPU; CISC体系的设计理念是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂、工艺复杂,但好处是编译器好设计。CISC出现较早,至今Intel还一直采用CISC设计;

  • RSIC(Reduced Instruction Set Computer) 精简指令集的CPU; RISC的设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集,即:指令集中指令的数量相对很少。这种设计理念相对于CISC的设计理念,CPU的设计和工艺简单了,但是编译器的设计变复杂了

  • 典型CPU: 一般典型CISC的CPU指令数在300条左右。ARM的CPU(作为典型的RISC的CPU)常用指令数在30条左右。 一般来说,CISC的CPU的功耗更高,一般用在PC机和笔记本电脑中。相对来说,RISC的CPU的功耗更低,一般用在嵌入式领域。

  1. 基于栈的CPU和基于寄存器的CPU有什么区别?

这个问题可以将JVM看成是一个基于栈的CPU,它在运行程序的时候都是用栈,代码必须使用这些指令来移动变量(即push和pop);

到此,关于“hello程序是如何运行的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: hello程序是如何运行的

本文链接: https://lsjlt.com/news/295234.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • hello程序是如何运行的
    这篇文章主要介绍“hello程序是如何运行的”,在日常操作中,相信很多人在hello程序是如何运行的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”hello程序是如何运行的”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-19
  • java程序是如何运行的
    本篇文章为大家展示了java程序是如何运行的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:有...
    99+
    2023-06-14
  • 从Hello World分析web程序运行机制
    这篇文章主要讲解了“从Hello World分析web程序运行机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“从Hello World分析web程序运行机...
    99+
    2024-04-02
  • python如何运行及运行程序
    python如何运行的 1.写完的py文件,首先被翻译成字节码文件(隐藏后缀pyc),然后在用PVM(虚拟机)把字节码自动编译,之后解释到硬件。 2.如果已经形成过pyc文件,那么你的py文件没有改动,机器重新解释的时候会跳过翻...
    99+
    2023-01-31
    程序 python
  • java程序如何运行
    这篇文章主要介绍“java程序如何运行”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java程序如何运行”文章能帮助大家解决问题。本教程操作环境:windows7系统、java10版,DELL G3...
    99+
    2023-06-30
  • php程序如何运行
    PHP程序的运行主要有以下几种方式:1. 通过命令行运行:在命令行中输入 "php 文件名.php" 即可运行 PHP 程序。这种方...
    99+
    2023-08-29
    php
  • eclipse如何运行java程序
    在Eclipse中运行Java程序可以通过以下步骤进行:1. 打开Eclipse并创建一个Java项目。可以选择“File”菜单,然...
    99+
    2023-09-27
    eclipse java
  • ubuntu如何运行c程序
    本文小编为大家详细介绍“ubuntu如何运行c程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“ubuntu如何运行c程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。ubuntu运行c程序的方法首先在test...
    99+
    2023-07-04
  • vps如何运行python程序
    要在VPS上运行Python程序,可以按照以下步骤进行操作:1. 登录到VPS上:使用ssh客户端连接到VPS服务器。您将需要VPS...
    99+
    2023-08-11
    vps python
  • tomcat如何运行Java程序
    要在Tomcat中运行Java程序,您可以创建一个动态Web项目,并将其部署到Tomcat服务器中。 以下是一些简单的步骤: 在E...
    99+
    2024-04-02
  • 程序运行时,是如何找到动态库的
    这篇文章主要介绍“程序运行时,是如何找到动态库的”,在日常操作中,相信很多人在程序运行时,是如何找到动态库的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”程序运行时,是如何找到动态库的”的疑惑有所帮助!接下来...
    99+
    2023-06-15
  • linux如何检查不是由你运行的程序
    小编给大家分享一下linux如何检查不是由你运行的程序,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!检查不是由你运行的程序应用程序:bash(译注:UNIX或者L...
    99+
    2023-06-27
  • eclipse写好的程序如何运行
    要运行Eclipse中写好的程序,您可以按照以下步骤操作:1. 打开Eclipse,并选择要运行的项目。2. 确保您已经设置好了运行...
    99+
    2023-09-26
    eclipse
  • java程序是怎样运行的
    程序运行流程:先把Java代码编译成字节码,也就是把“.java”类型的文件编译成“.class”类型的文件。这个过程的大致执行流程:Java源代码 -> 词法分析器 -> 语法分析器 -> 语义分析器 -> 字节码生成器 ->最终生成字...
    99+
    2016-04-20
    java入门 java 程序 运行
  • java程序是怎么运行的
    java程序执行过程分为两步,下图为流程示意图第一步:将java源码(.java文件)通过编译器(javac.exe)编译成JVM文件(.class文件)第二步:将JVM文件通过java.exe执行,输出结果 (推荐学...
    99+
    2019-06-19
    java入门 java
  • python如何重复运行程序
    在Python中,有多种方法可以重复运行程序。以下是其中几种常用的方法:1. 使用循环:可以使用循环结构(如`for`循环或`whi...
    99+
    2023-10-07
    python
  • Linux中如何运行DOS程序
    这篇文章主要为大家展示了“Linux中如何运行DOS程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中如何运行DOS程序”这篇文章吧。传统的 DOS 操作系统支持的许多非常优秀的应用...
    99+
    2023-06-27
  • windows10如何调出运行程序
    要调出运行程序,您可以按下Win + R键打开“运行”对话框。或者,您可以通过以下方法进行操作:1. 使用快捷键:按下Win键(Wi...
    99+
    2023-10-18
    windows10
  • tomcat中如何运行Java程序
    在Tomcat中运行Java程序,可以通过以下步骤: 将Java程序打包成war文件,war文件是一种Web应用程序的打包格式,...
    99+
    2023-10-25
    tomcat java
  • eclipse如何运行当前程序
    在Eclipse中运行当前程序,可以按照以下步骤操作:1. 在Eclipse的编辑器中打开你想要运行的程序文件。2. 点击菜单栏的“...
    99+
    2023-08-15
    eclipse
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作