【计算机原理】程序执行过程

本章主要介绍程序执行过程中操作系统、CPU都干了什么

运行前

程序在运行前,只是在硬盘上待着,此时就是一堆二进制代码而已,没有任何作用。

程序只有进入了内存才能运行,但是要进入内存,则需要服从操作系统的调度。

一个程序在运行的时候可能需要很大的空间,比如3G,但是操作系统不可能为每个程序都分配那么大,因为同时加载入内存的程序可能很多。

所以操作系统想了个办法,它和CPU一起“欺骗”了程序,它可以把硬盘的部分空间当作内存展示给程序,这就是虚拟内存技术,这种欺骗手段能实现的原因在于,程序的局部性原理,也就是程序不会同时运行所有的代码。

虚拟内存是一种内存管理技术,使得应用程序认为它拥有连续的可用的内存。

实际上可能并不是这样,它通常是被分隔成多个物理内存碎片,还有可能暂时存储在外部磁盘存储器上,

这种做法最核心的问题就在于调度。我们可以把程序切分成若干块,也就是页面,然后分页装入内存中。这样,之后暂时用不到的页面就可以置换到硬盘上呢。

装载

在程序运行之前,操作系统会进行程序的装载,也就是创建一个进程结构,它会有自己的一套虚拟地址、页表等结构。

但是装载器不会把代码装载到物理内存中,而是用一个页表把代码在硬盘上的位置记录下来,只有在真正运行的时候才会加载到内存里面。

最后,装载器会找到程序的入口地址,执行的时候,从入口地址开始读第一条指令。

运行

下载程序虽然还在硬盘里面,但是操作系统已经建立了一个进程,它有一套自己的虚拟地址、页表等高级数据结构。

操作系统进行进程的调度,当轮到这个进程来的时候,才从装载器返回的入口点开始执行。

CPU从程序入口处取出指令,但是这是一个虚拟地址,需要转换为物理地址。那么怎么转换呢?CPU会去查看页表,可以这个页表现在还指向的是硬盘中的地址,所以CPU会执行缺页中断处理程序

最后CPU会从硬盘里面把代码加载入内存,之后CPU当然得把页表修改一下,这样才能反映数据已经进入内存呢。

随着程序的执行,越来越多的数据和代码被加载到物理内存,而且这些加载到内存中的不是连续的,他会安插在内存的不同位置去。

值得注意的是,在内存中的只是进程的一个实例而已,可以相当于程序的一个化身

CPU会不断的读数据、写数据,时间片到了,就把进程挂起来,也就是说进程其实不是独占CPU的,只是因为进程切换得非常快,从人类的角度来看,以为程序在同时执行一样。

最后进程运行结束,内存中的数据会清理,覆盖。

操作系统为什么要这么做

操作系统为什么要那么麻烦的搞出什么内存映射、虚拟内存来,还不是因为资源有限,内存就那么大,程序又那么多,为了让更多的程序运行起来,有效的利用内存和CPU,只能使用这种方法了。

参考

本文由操作系统是个大骗子?改编过来的

原文地址:https://www.cnblogs.com/dy2903/p/8453660.html

时间: 2024-10-23 23:36:59

【计算机原理】程序执行过程的相关文章

java程序执行过程&基本数据类型

1. 程序load到内存. 2. 找到程序入口方法(main())开始执行. 3. 程序在内存中的存放 3.1 代码段(code segment)--------存放代码 3.2 数据段(data segment)--------存放静态变量,字符串常量 3.3 栈(stack)                ----------存放局部变量 3.4 堆(heap)                -----------存放new出来的东西 ----------------------------

MFC学习之程序执行过程梳理

*首先利用全局变量对象theApp启动应用程序.这是由于这个全局对象,基类CWinApp中this的指针才干指向这个对象.假设没有这个全局对象,程序在编译时不会出错,但在执行时就会出错. *调用全局应用程序对象的构造函数,从而就会先调用其基类CWinApp的构造函数.后者完毕应用程序的一些初始化工作,并将应用程序对象的指针保存起来. *进入WinMain函数.在AfxWinMain函数中能够获取子类(对Test程序来说就是CTestApp类)的指针,利用此指针调用虚函数:InitInstance

MFC程序执行过程剖析

一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数.而在MFC程序当中我们不在能找到类似WinMain这样的程序入口,取而代之的是一系列派生类的声明和定义以及一个冲CWinApp类派生而来的类的全局对象.CWinApp类被称之为应用程序对象,在一个MFC程序当中只允许有一个应用程序对象.由于CWinApp的派生对象是全局的,因此这个对

Windows程序执行过程

Windows应用程序: WinMain函数(入口函数): 1. 设计窗体类,注冊窗体类.WNDCLASS 2. 创建窗体,显示及更新窗体. 3. 消息循环. 窗体过程函数(回调函数):WindowProc PS:Dos程序入口函数为main,Windows程序入口为WinMain,都是由系统直接调用. windows程序执行过程 #include<windows.h> #include<stdio.h> LRESULT CALLBACK WinSunProc( //窗体过程函数(

浅谈Java前奏,背景,JRE,JVM以及程序执行过程

好久没学习Java了,来复习一遍java的第一章吧. 一.特征--跨平台原理 1.语言的分类 1)机器语言  优点:直接运行,速度快   缺点:不能跨平台 2)c.c++等编译型语言 使用特定的编译器针对特定的平台,将代码一次性的翻译成该平台所能识别的机器指令,并包装为该平台所能识别的文件,可以脱离开发环境运行 优点:高效   缺点:可移植性不强 3)perl,basic等解释型语言 使用专门的解释器,针对特定的平台,解释成该平台所能识别的机器码指令,解释一条执行一条 优点:可移植性好   缺点

面向对象编程(三)——程序执行过程中内存分析

阅读目录 内存分析(SxtStu.java)对于java 和内存之间的注意事项 内存分析(SxtStu.java) Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性.所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提.  一个完整的Java程序运行过程会涉及以下内存区域: 寄存器: JVM内部虚拟寄存器,存取速度非常快,程序不可控制. 栈: 保存局部变量

python\java\c\解释性语言\编译性语言 程序执行过程

c时纯粹的编译性语言,执行过程如下图: 可以看出c是通过预处理器.编译器.汇编器和链接器生成可执行的二进制目标文件,然后直接运行(编译性语言的本质).  Java和python是解释性语言,但并不是纯粹的解释性语言,准确来说是源文件被解释器加载或者显式地进行字节码编译之后,生成字节码文件,运行时字节码文件直接在解释器上边解释边运行(解释性语言的本质). java执行过程: a.java(源文件)----->a.class(字节码文件)----->解释器上直接运行 python执行过程 a.py

C++小结(2)——程序执行过程

一个程序从编写到最后得到运行结果要经历以下一些步骤. 1.用C++语言编写程序 用高级语言编写的程序称为"源程序"(source program).C++的源程序是以.cpp作为后缀的(cpp是c plus plus 的缩写). 2.对源程序进行编译 为了使计算机能执行高级语言源程序,必须先用一种称为"编译器(complier)"的软件(也称编译程序或编译系统),把源程序翻译成二进制形式的"目标程序(object program)". 编译是以源

MapReduce的原理及执行过程

MapReduce简介 MapReduce是一种分布式计算模型,是Google提出的,主要用于搜索领域,解决海量数据的计算问题. MR有两个阶段组成:Map和Reduce,用户只需实现map()和reduce()两个函数,即可实现分布式计算. MapReduce执行流程  MapReduce原理  MapReduce的执行步骤: 1.Map任务处理 1.1 读取HDFS中的文件.每一行解析成一个<k,v>.每一个键值对调用一次map函数.                <0,hello