㈠ 计算机中的软件在运行时,系统会将其先加载到哪里
计算机正在运行的程序存放在RAM(内存)里。
RAM是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
它的组成是:内存是由内存芯片、电路板、金手指等部分组成的。
计算机运行程序:整个过程可以总结为编译、链接、装载、执行。
1、编译:编译过程又可以被分为两个阶段:编译、汇编。编译是指编译器读取字符流的源程序,对其进行词法与语法的分析,将高级语言指令转换为功能等效的汇编代码。汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。
2、链接:链接的主要内容是将各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。
3、装载:程序在经过链接后,得到了可执行文件,下一步就需要将可执行程序加载到内存中。由于现代操作系统均采用分页的方式来管理内存,所以操作系统只需要读取可执行文件的文件头,之后建立起可执行文件到虚拟内存的映射关系,而不需要真正的将程序载入内存。
4、运行:加载器将可执行目标文件中的代码和数据从磁盘复制到内存中,然后通过跳转到程序的第一条指令或入口点来运行程序。
㈡ C语言中的内存四区,是在运行内存中,还是在硬盘中
取决于操作系统的
一般是在内存中
但如果占用内存过多 有可能跑到硬盘中,比如windows的虚拟内存(pagefile), Linux的swap等等。
㈢ 编译时分配内存和运行时分配内存
编译其实只是一个扫描过程,进行词法语法检查,代码优化而已,编译程序越好,程序运行的时候越高效。
我想你说的“编译时分配内存”是指“编译时赋初值”,它只是形成一个文本,检查无错误,并没有分配内存空间。
当你运行时,系统才把程序导入内存。一个进程(即运行中的程序)在主要包括以下五个分区:
栈、堆、bss、data、code
代码(编译后的二进制代码)放在code区,代码中生成的各种变量、常量按不同类型分别存放在其它四个区。系统依照代码顺序执行,然后依照代码方案改变或调用数据,这就是一个程序的运行过程。
㈣ c++ 编译 链接是怎么回事
compile和link是大多数语言从原代码生成可执行程序的两个步骤。
之所有有这两个步骤因为几乎任何一个程序都不是用一个原文件写出来的。compile是先针对单独原文件进行处理。link是把compile处理的结果组合成一个完整的可执行文件。
其实C/C++完全也可以一步成型,不需要compile和link两个步骤,但是那样的后果就是:一,每次生成可执行程序,必须翻译全部源代码;二,C语言的执行库(printf, scanf这些)必须都以源代码形式存在。这怎么样也说不过去吧。
另外头文件不属于compile和link过程,头文件是预编译过程的文件。
C/C++语言的完整编译过程是
一、预编译
处理#define #if #include这类#开头的语句,这些称为预编译指令。这个过程中会把.h文件和.c/.cpp文件组合成最终交给compile过程的原文件。这个原文件是不包含任何#开头的语句的。所有#define定义的宏也会被替换。
二、编译
把上面那个原文件编译成.o或者VC里是.obj文件。这个文件保存了机器码化的函数、函数的描述、全局变量的描述、乃至段的描述等等。
三、连接
把可执行程序需要的所有的编译过程产生的.o或者.obj文件组合到一起。(这里也包括.lib文件,.lib文件件本质上就是打包的.obj文件集合)。另外连接过程还会组合一些其他数据,比如资源、可执行文件头等等。
㈤ 可执行程序为什么在内存中运行,而不是在硬盘上
呃,可执行程序的运行也不在内存上啊,而是在CPU上运行,内存只是存储器件而已。
一个程序会被保存在硬盘上,但硬盘的速度太慢了,如果CPU直接从硬盘调用程序,程序的响应速度会很差。所以在你调用某个程序时,该程序会将主进程加载入内存,以后CPU在对该程序进行操作时,就可以从内存中提取数据和指令,毕竟内存的速度远快于硬盘,就可以大幅提高程序的响应速度。
㈥ 程序编译后的机器码是在内存,还是硬盘
程序编译后,机器码是存在硬盘。
在执行时,机器码,被操作系统,读入内存。
㈦ 计算机正在运行的程序存放在
计算机正在运行的程序一般都会存放在RAM(内存中)里,但是如果运用虚拟存储器技术可能会有一部分程序驻留在磁盘中。
RAM是与CPU进行数据交换等一些列操作的重要部件。计算机中程序的运行都离不开内存,因此内存的的好坏在一定程度上决定了计算机的好坏。
它用于暂时存放CPU中的运算数据,与硬盘等外部存储器交换的数据。
(7)编译链接过程发生在磁盘还是内存扩展阅读:
内存的技术指标一般包括奇偶校验、引脚数、容量、速度等。引脚数可以归为内存的接口类型。
程序在计算机中运行经过的步骤:
1、编译:
编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析、语法分析、语义检查和中间代码生成、代码优化、目标代码生成。
2、链接:
把所有编译后得到的目标模块连接装配起来,再与函数库相连接成一个整体。
3、装载:
把程序装入内存的操作系统程序
4、运行:
将可执行目标文件中的代码和数据从磁盘复制到内存中,然后通过跳转到程序的第一条指令或入口点来运行程序。
参考资料来源:网络-计算机
㈧ 计算机是怎样运行程序的
为了使计算机程序得以运行,计算机需要加载代码,同时也要加载数据,然后由处理器执行指令。整个过程可以总结为编译、链接、装载、执行。
1、编译
编译过程又可以被分为两个阶段:编译、汇编。
编译是指编译器读取字符流的源程序,对其进行词法与语法的分析,将高级语言指令转换为功能等效的汇编代码。
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
2、链接
链接的主要内容是将各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。链接又分为静态链接和动态链接:
静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大;
动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。
3、装载
程序在经过链接后,得到了可执行文件,下一步就需要将可执行程序加载到内存中。
由于现代操作系统均采用分页的方式来管理内存,所以操作系统只需要读取可执行文件的文件头,之后建立起可执行文件到虚拟内存的映射关系,而不需要真正的将程序载入内存。
4、运行
加载器将可执行目标文件中的代码和数据从磁盘复制到内存中,然后通过跳转到程序的第一条指令或入口点来运行程序。
在程序的运行过程中,CPU发现有些内存页在物理内存中并不存在并因此触发缺页异常,此时CPU将控制权限转交给操作系统的异常处理函数,操作系统负责将此内存页的数据从磁盘上读取到物理内存中。
数据读取完毕之后,操作系统让CPU
jmp到触发了缺页异常的那条指令处继续执行,此时指令执行就不会再有缺页异常了。
(8)编译链接过程发生在磁盘还是内存扩展阅读
为使计算机按预定要求工作,首先要编制程序,无论是最早的操作系统还是现代操作系统,程序的运行都是计算机工作的本质。
早期计算机是单任务执行,由程序员直接编写操作系统可以识别的机器语言,到现在可以实现多道程序并行,并且程序的开发由更利于程序员理解的高级语言编写,源程序在经过一系列翻译过程,变成计算机理解的机器语言,再执行。
整个程序执行的过程,需要CPU、内存、程序代码、设备等配合,才能实现程序要表达的功能。
参考资料来源:网络-计算机
㈨ 程序运行的基本步骤
一、编译时与运行时的内存情况
1.编译时不分配内存
编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误。
2.运行时必分配内存
运行时程序是必须调到“内存”的。因为CPU(其中有多个寄存器)只与内存打交道的。程序在进入实际内存之前要首先分配物理内存。
3.编译过程
只能简单说一下,因为如果要详细的话,就是一本书了《编译原理》。编译器能够识别语法,数据类型等等。然后逐行逐句检查编译成二进制数据的obj文件,然后再由链接程序将其链接成一个EXE文件。此时的程序是以EXE文件的形式存放在磁盘上。
4.运行过程
当执行这个EXE文件以后,此程序就被加载到内存中,成为进程。此时一开始程序会初始化一些全局对象,然后找到入口函数(main()或者WinMain()),就开始按程序的执行语句开始执行。此时需要的内存只能在程序的堆上进行动态增加/释放了。
各区段功能说明:
1、程序代码区:存放函数体的二进制代码。
2、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。
3、文字常量区 :常量字符串就是放在这里的。 程序结束后由系统释放。
4、堆区(heap): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
5、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
㈩ C语言编译原理是什么
编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。
1、预处理阶段:
主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)
2、汇编阶段:
插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。
3、编译阶段:
将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。
4、链接阶段:
在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。