一个程序在电脑中的运行情况

转载 2016年05月31日 19:37:09

参考 http://my.oschina.net/u/180716/blog/52836

 程序先由程序员编辑创建并保存在硬盘上,源程序在机器上表现为01组成的位序列,8个位一个字节,每个字节表示一个文本字符,它是以ascii码的形式表示的。只由ascii字符组成的文件叫做文本文件,所有其他的叫做二进制文件。

       为了让机器能够识别并运行程序,每条语句必须被转为低级机器语言指令,然后将指令按照可执行目标程序的格式打包,并以二进制磁盘文件的形式存放起来。以c程序为例,转换过程大致分为预处理,编译,汇编,链接四个步骤。下面进行详细解释。

       预处理器根据以字符#开头的命令修改原始的c程序,比如#include<stdio.h>告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,将#define的变量替换等等,结果得到了另一个c程序,通常以.i作为文件扩展名。

       编译器将文本文件hello.i翻译成hello.s,它包含了一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切的描述一条低级机器语言指令。

       汇编器将汇编程序翻译为机器语言指令,把这些指令打包成可重定位目标程序(relocateble object program)的格式,并把结果保存在hello.o中。hello.o文件是二进制文件,因为他的字节编码是机器语言指令而不是ascii码。如果用文本编辑器打开hello.o会看到一堆乱码。

       链接阶段,比如hello中用到了printf函数,这是标准c库的函数,存在于一个名为printf.o的单独编译好的目标文件中,这个文件必须以某种方式合并到我们编译好的的目标文件中。链接器(ld)程序负责处理这种合并,结果得到hello文件,它是可执行目标文件,可以被加载到内存中,由系统执行。

       转换完成之后就是执行了。在unix系统中,shell是一个命令行解释器,输出一个提示符,等待用户输入然后执行命令。如果输入的第一个单词不是一个内置的shell命令,shell将其解释为可执行文件,比如输入./hello,它将加载并运行这个文件。hello在屏幕上输出信息,然后终止。shell输出一个提示符,等待下一个输入的命令行。具体的过程为:初始时,shell执行它的指令,等待输入。用户输入字符创“./hello”后,shell将字符逐一读入寄存器,然后存放到存储器中,敲回车键后,shell知道用户结束命令输入。然后shell执行一系列的指令来加载可执行的hello文件,将hello目标文件的代码和数据从磁盘复制到主存,数据包含输出的字符串"HELLO,WORLD\n"。一旦目标文件hello中的代码和数据被加载到主存,处理器开始执行main的机器语言指令,将字符串从主存拷贝到寄存器,并输出到屏幕上。

       由于涉及大量的主存,磁盘,寄存器通信,故产生了cache等缓冲提高速度的设备,减少通信阻塞。

        为了减少用户的负担,操作系统对计算机硬件资源进行了抽象,产生了进程,线程,虚拟地址等概念。进程是程序的一次执行,是操作系统分配资源的单位,多个进程是可以并发执行的,并发执行实际上每个时刻执行的还是一个进程,只不过进程间切换的速度比较快,给人的感觉是并发执行。操作系统为每个进程保存执行的状态信息,称为上下文,包括pc和寄存器文件当前值,主存内容等等。切换进程时,发生上下文切换。一个进程中可以有多个线程执行单元,每个线程都运行在进程的上下文中,共享同样的代码和数据,由于网络服务器等应用对并行处理的需求越来越大,多线程模型也越来越重要。虚拟地址为每个进程提供了一个假象,即每个进程都在独占主存,每个进程看到的是一致的存储器,称为虚拟地址空间。虚拟地址空间是由大量的准确定义的区构成,linux从低地址到高地址依次为:程序代码和数据;堆;共享库;栈;内核虚拟存储器。


一个程序在计算机中到底是如何运行的?

注:转载于C语言中文网高级部分。 在《载入内存,让程序运行起来》一节中讲到,程序是保存在硬盘中的,要载入内存才能运行,CPU也被设计为只能从内存中读取数据和指令。 对于CPU来说,内存仅仅是一...
  • czg13548930186
  • czg13548930186
  • 2016年09月22日 23:46
  • 3833

VC++实现程序只运行一个实例 .

原文地址:http://www.cctry.com/thread-8229-1-1.html                   http://www.vckbase.com/index.php/w...
  • zdhlwt2008
  • zdhlwt2008
  • 2015年08月14日 11:55
  • 1272

.Net平台下使应用程序只运行一个实例

摘要:   本文阐述了在基于.NET平台的应用程序开发中如何实现唯一应用程序运行实例,对几种实现方式进行分析测试比较,从而寻找一种合适的处理方式。单击此处才查看本文的示例代码。概述   在开发一些应用...
  • alpsboy
  • alpsboy
  • 2006年09月28日 18:14
  • 2436

C#中如何启动另一个应用程序或批处理程序

如果你要运行一个命令行程序,或者打开一个windows应用程序,或者打开默认的web浏览器或email客户端,..你应该如何在你的C#代码中实现这个功能呢?以下这些例子完成相同的任务,你可以使用Sys...
  • wen_fj
  • wen_fj
  • 2010年07月30日 09:45
  • 3417

汉字在计算机中的表示

英文属于单子节编码,   汉字属于多字节编码,国际标准多字结为UNICODE编码,标准之中定义了世界上大部分国家的代码页,一般代码为双字节,第一字节为前导字节表明语种,第二字节为代码页中对应的字符. ...
  • leeleo18
  • leeleo18
  • 2009年06月11日 10:17
  • 1916

VC++实现程序只运行一个实例

原文地址:http://www.cctry.com/thread-8229-1-1.html                   http://www.vckbase.com/index.php...
  • WUYUAN2011WOAINI
  • WUYUAN2011WOAINI
  • 2012年10月18日 23:09
  • 5701

程序只运行一个实例

作者:孙鑫 日期:2002-7-30 我们在使用《金山词霸》时发现,在《金山词霸》已经运行了的情况下,再次点击《金山词霸》的图标,那么它不会再运行另外一个《金山词霸》,而是将已有的《金山词霸》给激活,...
  • luheng2006
  • luheng2006
  • 2010年05月11日 14:04
  • 1899

在java中打开电脑中的相应程序

 java启动相应的windows程序来打开文件 开源中国 发表于 2014-08-27 22:27:43 这里有两种方法: 1.利用java运行时环境和windows...
  • qian_123456
  • qian_123456
  • 2015年01月21日 15:48
  • 987

在没有安装opencv的电脑中运行opencv程序

首先要明确在没有安装OpenCV的电脑上,要运行基于OpenCV库的程序,有两种方法: 一、将OpenCv安装目录下的bin目录下的*.dll文件 与应用程序一起打包发布。 二、将OpenCV库源...
  • guoxinian
  • guoxinian
  • 2016年02月24日 08:24
  • 736

计算机程序是怎样运行的

关于《深入理解计算机系统》 “这本书的中译名为“深入理解计算机系统”,我非常,十分,以及百分之一百二十地不满意。我这么说的原因在于这个译法完全扭曲了书的本意。如果直译原书名,应该是类似于“以程序...
  • dl0914791011
  • dl0914791011
  • 2014年04月11日 22:01
  • 28641
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个程序在电脑中的运行情况
举报原因:
原因补充:

(最多只允许输入30个字)