当前位置: 首页 > news >正文

做网站实现登陆功能2022网站快速收录技术

做网站实现登陆功能,2022网站快速收录技术,网站建设搭建是什么意思,哪些网站可以做go注释第一章#xff1a;温故而知新 过度优化的问题#xff1a; 我们知道volatile关键字可以阻止过度优化#xff0c;因为它可以完成两件事#xff1a; 阻止编译器为了提高速度将一个变量缓存到寄存器而不写回阻止编译器调整操作volatile变量的指令顺序 然而#xff0c;在优…第一章温故而知新 过度优化的问题 我们知道volatile关键字可以阻止过度优化因为它可以完成两件事 阻止编译器为了提高速度将一个变量缓存到寄存器而不写回阻止编译器调整操作volatile变量的指令顺序 然而在优化这一块不仅编译器会做优化CPU也会做优化。volatile就管不着了CPU了。 经典的例子当然是单例模式。单例模式有一种常规的解决方案是DCL也就是双重检查锁但是在C中new的步骤有是分为三个步骤分配内存调用构造函数将内存地址用指针保存下来。CPU就要来搞怪将第二步第三步乱个序。 一种解决方案是调用CPU提供的barrier指令阻止将barrier指令之前的代码交换到barrier之后。但是这种方案不具有可移植性。部分实现代码如下 if(!pInst){lock();if(!pInst){T* temp new T;barrier();pInst temp;}unlock(); }线程 是程序执行流的最小单元。通常意义上一个进程由多个线程组成各个线程之间共享程序的内部空间包括代码段数据段堆等及一些进程级的资源如打开文件和信号 线程的访问权限 线程调度与优先级 运行(Running)此时线程正在执行就绪(Ready):此时线程可以立刻运行但CPU已经被占用等待(Waiting):此时线程正在等待某一件事件发生无法执行 可抢占线程和不可抢占线程 线程在用尽时间片之后会被强制剥夺继续执行的权利而进入就绪状态这个过程叫做抢占即之后执行的别的线程抢占了当前线程。 在早期的一些系统中线程是不可抢占的。线程必须手动发出一个放弃执行的命令才能让其他的线程得到执行。可以避免一些因为抢占式线程里调度时机不确定而产生的问题。非抢占式线程已经十分少见 写时复制(Copy on Write,COW) 指的是两个任务可以同时自由地读取内存担任一一个任务试图对内存进行修改时内存就会复制一份提供给修改方单独使用 线程安全 信号量 一个初始值为N的信号量允许N个线程并发访问。线程访问资源的时候首先获取信号量进行一下操作 最后一条应该是错了应该是信号量不小于1唤醒一个等待中的线程  可重入(Reentrant)与线程安全 静态链接第二章编译与链接 被隐藏了的过程 通常将编译和链接合并到一起的过程称为构建Build 一个程序从代码到可以运行经过了四个步骤预处理Prepressing编译Compilation汇编Assembly链接Linking.c - .i - .s -.o - .exe 预编译 预编译过程主要处理那些源代码文件中的以“#”开始的预编译指令。比如“#include”“#define”等 编译 编译过程就是把预处理完的文件进行一系列词法分析语法分析语义分析及优化后生产相应的汇编代码文件。 实际上 gcc 这个命令只是后台程序的包装它会根据不同的参数要求调用预编译编译程序 cc1汇编器 as链接器 ld 词法分析  首先源代码程序被输入到扫描器进行简单的词法分析运用一种类似于有限状态机的算法将源代码的字符序列分割成一系列的记号一般有关键字标识符字面量特殊符号 语法分析 语法分析器将对由扫描器产生的记号进行语法分析产生语法树采用了上下文无关语法的分析手段。 语义分析 ​​​​​​编译器所能分析的语义是静态语义所谓静态语义是指在编译器可以确定的语义与之对应的动态语义就是只有在运行期才能确定的语义 主要检查声明和定义类型转换是否出错等。做完这一步之后语法树的每个节点都会有对应的类型。这一步还会对符号表里的符号进行更新。 中间语言生成  图中26被优化成 8 目标代码生成与优化 主要是生成汇编代码以及对汇编代码的优化。比如说在优化这个阶段可能导致指令重排序这就引发了单例的一些问题。 汇编 汇编器是将汇编代码转变成机器可以执行的指令每一个汇编语句几乎都对应一条机器指令。 到这一步为止输出的是目标文件Object File 链接 编译器前端负责生成和机器无关的中间代码后端负责将中间代码转化为机器目标代码。这样对于一些可跨平台的编译器而言他们可以针对不同的平台使用相同的前端而针对不同的机器平台有数个后端。 链接是这本书的主题。语言的发展是从编写一个代码文件到多个模块文件编写的因此要让各个模块协同工作就需要使用链接器。重要的一点是在未链接之前目标文件中的一些变量、函数地址是未决的或者说可以这么理解编译一个文件可能有些变量、函数的地址确定不了是个待定值链接器就是来干这个事的把一些指令对其他符号地址的引用加以修正。主要包括地址和空间分配、符号决议和重定位。 静态链接第三章目标文件里有什么 目标文件的格式 可执行文件Windows下的PE、Linux下的ELF动态链接库Windows的.dllLinux的.os静态链接库Windows的.libLinux的.aELF文件类型分类1.可重定位文件2.可执行文件3.共享目标文件4.核心转储文件已初始化的全局变量和局部变量数据经常放在数据段.data未初始化的全局变量和局部静态变量放在.bss段编译后的机器指令经常放在代码段.code或.text.rodata段存放的是只读数据一般是程序里面的只读变量和字符串常量。.bss段只是为未初始化的全局变量和局部静态变量预留位置而已int a0会放在.bss段。总体来说程序源代码被编译以后主要分成两种段程序指令和程序数据。代码段属于程序指令而数据段和.bss段属于程序数据 6.ELF文件头包含ELF魔数魔数--用来确认文件的类型操作系统在加载可执行文件的时候会确认魔数是否正确如果不正确会拒绝加载、文件机器字节长度、段表的位置、程序头入口和长度、段的数量、文件是否可执行、目标硬件、目标操作系统等 7.数据和指令分段的好处 不同段可以设置读写权限可以防止程序被有意或者无意的修改提高CPU的缓存命中率当系统中存在多个该程序的副本他们的指令都一样那么内存中只需保存一份该程序的指令 8.段表描述文件中各个段的数组放置段的名称、段的长度、段类型、段在文件中的偏移位置、读写权限、段的属性等。编译器链接器和装载器都是依靠段表来定位和访问各个段的属性的 9.重定位表在处理目标文件时必须要对目标文件中某些部位进行重定位即代码段和数据段中那些对绝对地址的引用的位置。这些重定位信息都记录在ELF文件的重定位表里面。比如说数据的重定位表对应.rel.data 10.字符串表因为字符串长度往往是不定的固定结构存储较为困难。所以字符串表就是解决这个问题使用字符串在表中的偏移来引用字符串。 11.链接过程的本质就是把多个不同的目标文件之间相互”粘“到一起实际上拼合的是目标文件之间对地址的引用即对函数和变量的地址的引用。我们可以将符号看作是链接中的粘合剂整个连接过程正式基于符号才能够正确完成。每一个目标文件都有一个相应的符号表这个表里面记录了目标文件中所用的所有符号。每个定义的符号有一个对应的值叫做符号值。对于变量和函数来说符号之就是它们的地址。 12.对符号进行分类全局符号、局部符号、外部符号、段名、行号。链接只关注全局符号。 13.符号表中存放的内容有编号、值、内存大小、类型、作用域、符号所属段、符号名字 14.特殊符号一些内置的符号比如_executable_start表示程序起始地址 15.函数签名函数名、参数类型、所在类和名称空间。GCC的名称修饰方法就是_Z N(如果是嵌套)n(后面的字符串长度)strE(结尾)比如N::C::func(int)经过名字修饰之后变成_ZN1N1C4funcEi。由于不同编译器采用不同的名字修饰方法必然导致由不同编译器编译产生的目标文件无法正常相互链接这是导致不同编译器之间不能互操作的主要原因之一。 16.对于C/C语言来说编译器默认函数和初始化了的全局变量为强符号未初始化的全局变量为弱符号。 17.针对强弱符号的概念编译器就会按如下规则处理与选择多次定义的全局符号 不允许强符号被多次定义如果一个符号在某个目标文件中是强符号在其他文件中是弱符号那么选择强符号如果在多个文件中都是弱符号那么选择其中占用空间最大的一个   第四章静态链接 空间与地址分配 对于多个输入目标文件链接器如何将它们的各个段合并到输出文件或者说输出文件中的空间如何分配给输入文件 按序叠加 最蠢的做法是顺序叠加多个目标文件的段但是会存在内存对齐导致输出文件过大的情况所以大多数做法是采用相似段合并的策略。 相似段合并 将相同性质的段合并到一起比如将所有输入文件的.text合并到输出文件的.text段 “链接器为目标文件分配地址和空间”这句话中的“地址和空间”有两个含义第一个是在输出的可执行文件中的空间第二个是在装载后的虚拟地址中的虚拟地址空间 两步链接 第一步 空间与地址分配  扫描所有的输入目标文件并且获得他们的各个段的长度属性和位置并且将输入目标文件中的符号表中所有的符号定义和符号引用收集起来统一放到一个全局符号表。这一步中链接器将能够获得所有输入目标文件的段长度并且将它们合并计算出输出文件中各个段合并后的长度与位置并建立映射关系 第二步  符号解析与重定位 使用上面第一步中收集到的所有信息读取输入文件中段的数据重定位信息并且进行符号解析与重定位调整代码中的地址等。事实上第二步是链接过程的核心特别是重定位过程 符号解析与重定位 1.在未链接之前目标文件中使用的其他编译单元的变量的地址未定义会用0来给他占位并且将这个未定义变量放进重定位表专门用来保存与重定位相关的信息中。 2.目前的链接器本身并不支持符号的类型即变量类型对于链接器来说是透明的它只知道一个符号的名字并不知道类型是否一致。这就会导致由多个弱符号出现的时候的一些问题。COMMOM块来解决这些问题当不同的目标文件需要的COMMON块空间大小不一致时以最大的那块为准。 3.C中模板导致的问题一个模板在一个编译单元内进行了实例化在另外一个单元可能也进行了实例化当这两个单元链接的时候就会出现重复代码进而导致空间浪费、地址出错、指令运行效率低的问题。一个比较有效的做法是将每个模板的实例化代码都单独存放在一个段里每个段包含一个模板实例。同理对于虚函数内联函数默认构造函数默认拷贝构造函数也会存在这样的问题解决方案都差不多。 4.main函数之前执行全局构造对应汇编代码.init段main函数之后执行全局析构对应汇编代码.fint段 5.ABIApplication Binary Interfacd对应API层次不同ABI主要内容是符号修饰标准、变量内存布局、函数调用方式等内容。C一直被人诟病的一大原因是它的二进制兼容性不好。 静态库链接 一个静态库可以简单地看成是一组目标文件的集合即很多目标文件经过压缩打包后形成的一个文件。但事实上也是这样比如libc.a就是由许多.o文件打包而成的。 链接器一般都提供多种控制整个链接过程的方法以用来产生用户所需要的文件。一般链接器有以下三种方法 ld命令行指定参数之前使用的 ld 的 -o-e 参数就属于这类目标文件中放置指令链接控制脚本 BFD库是一个GNU项目它的目标是希望通过一种统一的接口来处理不同的目标文件格式。 参考文章《程序员的自我修养》笔记_程序员的自我修养 写时复制-CSDN博客
http://www.pierceye.com/news/441599/

相关文章:

  • 公司设计网站推荐做网站用注册公司吗
  • 机房建设 网站建设工程标准在线网站
  • 网站建设是属于软件开发费吗Wordpress有用么
  • 上海 网站备案商务网站规划与建设课程设计
  • 网站 首页 栏目 内容网业设计
  • 用vs与dw做网站什么做电子书下载网站好
  • 网站建设发布教程网页设计师收费标准
  • 徐州哪里做网站好农林网站建设公司
  • 可以做直播卖产品的网站专业产品画册设计公司
  • wp网站开发个人小程序开发流程
  • 网站制作报价大约重庆招聘网站建设
  • 网站开发 资质网站开发价格评估
  • 泰州网站关键词优化谷歌建站
  • 门户网站风格企业网站建设的成本
  • 一站式外贸综合服务平台社区网站推广方案
  • 宁波网络公司网站建设项目怎么破解别人做的付费网站
  • 做创意小视频的网站centos 7.4 wordpress
  • 免费建立单位的网站适合个人做的跨境电商
  • 沈阳军成网站建设17网站一起做网店
  • 哪些cms做同城网站比较好上海建设工程协会网站
  • 潍坊企业自助建站系统seo博客网站
  • 做啤酒最全的网站鱼台县建设局网站
  • 网站开发转行进入衍生领域wordpress qaengine
  • 公司内部网站模板快速建网站的软件
  • 被骗去国外做网站网站推广网站的运营推广方案
  • 北京汽车业务网站开发公司桂林旅游攻略必去景点
  • 个人网站开发是学什么语言wordpress打造cms
  • 网站建设与维护的重要性岳阳建设厅网站
  • 惠州网站开发公司wordpress简单
  • 外贸网站 免费模板 使用 zencart如何购买域名和备案