Windows 程序启动性能优化(先载入EXE,后载入DLL,只取有限的代码载入内存,将CPU的IP指向程序的入口点)

一、重定位
链接时重定位:
目标文件一般由多个节组成,编译器在编译每个目标文件时一般都是从0地址开始生成代码。当多个代码节合成一个代码段时,需要根据其在最终代码段中的位置做出调整。同时,链接器需要对已经解析的符号分配运行时地址。这个过程就是重定位。

加载时重定位:
程序中可能调用了DLL,由于EXE是最先被加载的,所以一般都能加载到其想要的内存地址上;而DLL的加载一般在EXE之后,就需要对DLL中的地址进行重定位了。

二、程序的启动过程
WIN32程序启动过程包括:

(1)操作系统把程序加载到内存,并建立相应的运行环境
(2)应用程序自身的初始化过程

备注:应用程序必须符合PE格式,主要包含:data(数据段),.text(代码段)。数据和代码加载到内存中后(内存中,应用程序的代码表现为一系列有序的指令集),CPU从程序入口处按顺序取出每一条指令并执行。

加载器:操作系统加载器的任务是,把磁盘中可执行程序的物理文件读入内存,并转换成程序在内存中的表示。

三、编译链接和启动
编译链接:

(1)预编译展开宏
(2)为每个.cxx文件生成一个.obj文件,目标文件至少包含数据段和代码段;目标文件还包含一个符号表,用于记录自己引用          的符号,以及提供给外部引用的符号。
(3)编译器合成这些目标文件成一个库文件(.lib),同时解析可以找到的符号引用
(4)链接器把目标库文件和所有需要引用的静态、动态库进行链接,生成最终的可执行文件。(首先需要把依赖的静态库合            成到可执行文件中,其次要保证依赖的动态库文件的符号都存在)可执行文件的符号表只需要记录导入符号表。

启动:
不依赖DLL的程序:

(1)操作系统创建进程并分配私有的进程空间;
(2)加载器把可执行文件的数据段和代码段映射到进程虚拟内存中;
(3)预取有限的代码段进入实际内存,把CPU的IP指向程序入口点,即可开始执行

依赖DLL的程序:

(1)同上,创建进程、映射虚拟内存;
(2)加载器读取可执行文件的导入符号表,由此找到依赖的DLL
(3)加载器对依赖的每个DLL调用LoadLibrary,LoadLibrary中处理的事情如下:

a,加载器为该DLL确定一个合适的基地址(地址重定位)

b,读取导入和导出符号表,比较应用程序的导入符号与DLL的导出符号是否匹配

c,通过DLL导入符号表确定该DLL所依赖的其他DLL,同样加载起来

d,调用DLL的初始化函数

(4)初始化应用程序的全局变量
(5)进入应用程序入口点函数开始执行

四、影响启动性能的因素:
(1) 程序冷启动的性能大部分取决于IO操作消耗的时间;
(2) DLL导出过多符号,会引起加载器耗费过多的CPU事件和IO来处理这个符号表;
(3) 磁盘碎片问题:理想状态下,顺序读取一个文件,不需要磁头寻道操作。但操作系统的文件系统,以块为单位管理物理磁盘空间,当磁盘经过不断的增删改操作后,可能不再具有连续的存储空间。导致一个逻辑上连续的文件,在磁盘上由很多不连续的碎片组成,导致执行IO时需要过多的寻道时间。

五、优化启动过程的方法:
(1) 减少动态库数量;
(2) 减小动态库的尺寸:可以通过编译优化选项;清除冗余代码;
(3) 优化可执行文件和库文件的代码布局:把库文件中的函数排的更紧密,从而达到减少IO的目的;
        步骤:获得函数调用的顺序文件(.PRF);把这些PRF传给链接器,链接器会自动按照PRF文件把文件在动态库中的位置重新排序(可以尝试一下)
(4)延迟初始化:可以把一些启动初期不需要的初始化工作延迟到启动后,增强启动体验;延迟的时机:可以在程序空闲时进行处理,在消息循环空闲时处理。
(5) 多线程化启动:具有以下特点,适合多线程化启动
        启动时需要加载大量动态库,引发大量IO操作;同时这些动态库初始化函数需要执行密集型操作,占用CPU时间。这时候可以将IO等待时间和CPU运行时间交错处理,缩短启动时间。

备注:IO的实现,是CPU发出命令后,由主板DMP完成,完成后触发中断,然后CPU继续处理,所以IO占用的CPU时间很少。

https://blog.csdn.net/hellokandy/article/details/70676563

原文地址:https://www.cnblogs.com/findumars/p/8734216.html

时间: 2024-08-02 21:51:34

Windows 程序启动性能优化(先载入EXE,后载入DLL,只取有限的代码载入内存,将CPU的IP指向程序的入口点)的相关文章

清算/报表/日终跑批程序之性能优化案例(一)

前言 不知不觉,技术人生系列·我和数据中心的故事来到了第五期.小y又和大家见面了! 前几期主要发了一些TroubleShooting的案例分享,其实小y最擅长的是性能优化,所以从这期开始,小y会陆续的分享更多的数据库性能优化案例. 进入正题,如果您的日终跑批/清算/报表等程序时快时慢,或者从某一天以后就一直变慢,作为运维DBA或开发的您,会怎么下手?还有,除了解决问题外,你要如何解答领导最关心的一个问题,"为什么现在有问题,但是以前没有问题呢"! 小y今天要和大家分享的就是这样一个性能

程序的性能优化之代码上的细节优化

第一,避免无故的函数调用和重复计算,看下面的代码: for(int i=0;i<strlen(s);i++) { cout<<s[i]<<endl; } int l=strlen(s); for(int j=0;j<l;j++) { cout<<s[j]<<endl; } int k=0; while(s[k]!='\0') { cout<<s[k]<<endl; k++; } 由于字符串s的长度是固定的,对于第一个循环,

性能优化 - 查看 webpack 打包后所有的依赖关系(webpack 可视化工具)

查看 webpack 打包后所有组件与组件间的依赖关系,针对多余的包文件过大, 剔除首次影响加载的效率问题进行剔除修改,本次采用的是 ==webpack-bundle-analyzer(可视化视图查看器)== == 介绍1:webpack-bundle-analyzer(可视化)== 将捆绑内容表示为方便的交互式可缩放树形图 如下效果图: 模块功能: 意识到你的文件打包压缩后中真正的内容 找出哪些模块组成最大的大小 找到错误的模块 优化它! 最好的事情是它支持缩小捆绑!它解析它们以获得实际大小的

关于OD载入exe后的入口问题解决!!

在OD载入时,出现了入口地址出现问题.主要是调试设置里已设置第一次暂停于WinMain(若位置已知),但是没有效果,直接上图: 问题解决: 原因是StrongOD插件所造成的,由于StrongOD的option设置中勾选了 去掉勾选后,就正常了!!! 正常后的截图:

王爽《汇编》检测9.1(1) | 若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?

;监测点9.1(1) assume cs:code data segment db 8 dup(0) data ends code segment start: mov ax,data :这一段一定要补上 mov ds,ax mov bx,0 jmp word ptr [bx] mov ax,4c00h int 21h code ends end start 这里一开始无法理解题目的 ‘’   [bx+1]    “,是什么意思,然后自己还一根经的认为应该是 ” [bx] “(后来才知道这里都是

C++ 应用程序性能优化

C++ 应用程序性能优化 C++ 应用程序性能优化 [email protected] 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方程,以及非线性优化的一些算法,如BFGS,FRPR,PSO等等用于多元函数的极值求解,所以这些数值算法的性能直接影响系统的性能.软件的性能优化是计算机软件开发过程中需要一直关注的重要因素,因此有必要学习下C++应用程序性能优化的方法. 在网上寻找相关资料时,发现这方

Web程序性能优化

面试的时候经常会被问到的有关于前端性能优化这一块的问题,扯扯个人的理解 第一条:减少 HTTP 次数的请求 80%的最终用户响应时间花在前端程序上,而其大部分时间则花在各种页面元素, 如图像. 样式表. 脚本和 Flash 等,的下载上. 减少页面元素将会减少 HTTP 请求 次数.这是快速显示页面的关键所在. 一种减少页面元素个数的方法是简化页面设计. 但是否存在其他方式,能做到既有丰富内容,又能获得快速响应时间呢?以下是这样一些技术: Image maps 组合多个图片到一张图片中.总文件大

《c++应用程序性能优化》读书笔记 part1

我对C++有一定的了解,也写过一些C++的代码,所以我想看看这本书来加深我对C++的理解.打开书,它分为4篇,第一章介绍C++的程序优化基础,第二章介绍C++的内存使用优化,第三章介绍应用程序的启动性能优化,第四章介绍一些性能优化的工具. 因为时间原因,我本周看的是第一章.第一章上来先介绍了C++的程序占用内存区的方式.一般有5种:全局/静态数据.常量数据区.代码区.栈.堆.根据这五种类型,我们可以针对的设计优化的方法.一般来说,堆和栈的使用是必不可少的.例如:链表,当需要为链表新增节点时,就需

C++应用程序性能优化(一)——应用程序性能优化简介

C++应用程序性能优化(一)--应用程序性能优化简介 一.程序性能优化简介 1.程序性能优化简介 在计算机发展的早期阶段,硬件资源相对而言是非常昂贵的,CPU运行时间与内存容量给程序开发人员设置了极大限制.因此,早期的程序对运行性能和内存空间占用的要求是非常严格的,很多开发人员为了减少1%的CPU运行时间,为减少几十个甚至几个字节而不懈努力.随着计算机技术的快速发展,硬件资源变得相对便宜.但如果认为软件开发时,程序的性能优化不再重要,硬件将解决性能问题也是片面的.计算机硬件的发展解决了部分软件的