当前位置:网站首页>程序员的自我修养
程序员的自我修养
2022-07-28 14:28:00 【飞天_】
直接将应用程序运行在物理内存上存在的问题:
1、 地址空间不隔离
2、 内存使用效率低
3、 程序运行地址不确定
MMU(内存管理单元)将虚拟内存映射到物理内存上
线程调度:不断在处理器上切换不同线程的行为称为线程调度
线程同样拥有至少三种状态:
运行
就绪
等待
处于运行中线程拥有一段可以执行的时间,这段时间称为时间片(Time Slice),当时间片用尽的时候,该进程将进入就绪状态。
Windows中原子操作的API
InterlockedExchange //原子地交换两个值
InterlockedDecrement //原子地减少一个值
InterlockedIncrement //原子地增加一个值
InterlockedXor //原子地进行异或操作
CPU乱序可能引发的问题:
单例模式中的双检锁
Volatile T* pInst = null;
T* GetInstance()
{
If(pInst == null)
{
Lock();
If(pInst == NULL)
{
pInst = new T;
}
unlock();
}
return pInst;
}
这样的代码,抛开逻辑是完全没有问题的,但实际上存在隐藏问题,问题的来源就是CPU的乱序执行导致的
C++里的new包含两个步骤:
1) 分配内存
2) 调用构造函数
所以这里的pInst = new T;包含了三个步骤
1) 分配内存
2) 在内存的位置上调用构造函数
3) 将内存的地址赋值给pInst
在这三个步骤中2和3是可以颠倒的。也就是说pInst已经分配好内存了,并且也赋值给了pInst,但是这个时候构造函数还没有执行完毕,就有另一个线程调用了,这时就会返回到构造函数没有执行完毕的pInst对象以提供给用户使用。这时候程序会不会崩溃就取决于这个类的设计如何了。
为了解决这个问题,可以使用CPU提供的一条指令,barrier()
Volatile T* pInst = null;
T* GetInstance()
{
If(pInst == null)
{
Lock();
If(pInst == NULL)
{
T* pTemp = new T;
Barrier()
pInst = pTemp;
}
unlock();
}
return pInst;
}
由于barrier的存在,对象的构造一定在barrier执行之前完成,因为当pInst被赋值时,返回的对象总是已经构造完成的。
预编译:
gcc -E hello.c -o hello.i
编译
gcc -S hello.i -o hello.s
汇编
gcc -c hello.s -o hello.o
在预编译阶段做了什么?
1、处理所有的预编译指令 #if #elif #else #endif #define #include
2、删除所有的注释
3、添加行号和文件名标识,以便与编译器能够提示错误或者警告的行号
4、保留所有的#pragma编译器指令
编译器过程就是把预处理完的文件进行一系列语法分析、语义分析及优化后生产相应的汇编代码文件。
汇编器是把汇编代码转换成机器之一执行的指令,每一个汇编语句几乎都对应一条机器指令。
编译器做了什么?
最直接的描述编译器就是将高级语言最终翻译成机器语言的一个工具。
编译过程一般可以分为6步:
扫描、语法分析、语义分析、源代码优化、代码生成、目标代码优化
扫描器
语法分析器:对扫描器产生的记号进行语法分析,产生语法树
语义分析器
源码级优化器
链接过程:
模块间依靠符号来通信类似于拼图版,定义符号的模块多出一块区域,引用该符号的模块刚好少了那一块区域,两者一拼接,刚好完美组合。这个模块的拼接过程就是链接(Linking)
静态链接过程就是将每个模块的源代码文件经过编译器编译成目标文件(object File一般扩展名为.o或.obj),目标文件和库(Library)一起链接形成最终可执行文件。
库其实就是一组目标文件的包,就是一些最常用的代码编译成目标文件后打包存放。
编译后的目标文件
编译器编译源代码后生成的文件叫做目标文件。目标文件从结构上讲,它是已经编译后的可执行文件格式,只是还没有经过链接的过程,其中可能有些符号或有些地址还没有被调整。其实它本身就是按照可执行文件格式存储的,只是跟真正的可执行文件在结构上稍有不同。
目标文件的格式:
windows下的PE(Portable Executable)
linux下的ELF(Executable Linkable Format)
目标文件就是源代码编译后但未进行链接的那些中间文件(windows的.obj和Linux下的.o),它跟可执行文件的内容与结构很相似,所以一般跟可执行文件格式一起采用一种格式存储。
边栏推荐
- Install MOSEK, license installation location search
- 每日一题(回溯)
- DataTables warning: table id=campaigntable - cannot reinitialize datatable. solve
- Compilation learning
- Encapsulate the unified return object messageresult
- 从thinkphp远程代码执行学php反射类
- 3511. Water pouring problem
- 汇编学习
- crmeb标准版附带的客服系统
- Understanding of entropy and cross entropy loss function
猜你喜欢

What functions will be added to crmeb Standard Version 4.4

Compilation learning

crmeb 标准版window+phpstudy8安装教程(三)

Ry-d1/1 voltage relay

Establish binary tree + C language code from preorder and middle order
Data synchronization of new version

What are the functions to be added in crmeb pro2.2?

day 7/12

Srtt-110vdc-4h-c time relay

2022年全球程序员平均薪资发布,中国排名很意外
随机推荐
20、通道分配任务实现
Here comes the full open source free customer service system
Compilation learning
Svg verification code recognition experience
About the reptile thing
8、实时数据备份和实时时钟功能实现
mysql 8.0常用(持续更新)
pyppeteer 遇到的问题
从thinkphp远程代码执行学php反射类
19、通道分配任务定义
Idea debugging burpsuit plug-in
Knowledge payment open source system
4519. Number of square arrays
crmeb pro2.2即将增加的功能都有哪些?
How to set some app application icons on the iPhone Apple phone that you don't want others to see? How to hide the app application settings on the mobile desktop so that they can be used normally afte
ERROR:bokeh.core.validation.check:E-1001 (BAD_COLUMN_NAME)
subst命令将一个文件夹镜像成本地的一个磁盘
volatile原理
PMP每日一练 | 考试不迷路-7.28(包含敏捷+多选)
Apple iPhone app icon hidden how to retrieve and restore the hidden app icon displayed on the iPhone iPhone desktop to the iPhone iPhone iPhone desktop?