-
编译
-
编译器: 将源码转成二进制的机器码. 比如gcc, javac
-
预处理: 替换宏定义和头文件地址
-
编译: 转为汇编
-
汇编: 转为二进制机器码, 此步将产生目标文件
-
链接: 分为静态链接与动态连接
-
静态连接: 载入代码时就会确定代码地址, 将库一起打包入可执行文件, 因此可执行文件很大, 不方便库升级, 不共享库, 耗内存.
-
动态链接: 调用时才确定代码地址, 共享库, 内存占用低, 初始化快, 执行慢.
-
-
-
复杂项目的编译分成三部分:
-
configure: 由autoconf产生, 包含配置信息, 会产生makefile, 即编译顺序文件
-
make: 编译
-
make install: 安装
-
-
-
内存
-
相关问题
-
内存碎片: 不能供进程使用的内存里的小分区
-
内部碎片: 已分配且未使用
-
外部碎片: 未分配且不宜使用
-
-
内存溢出: 程序要求分配的内存超出系统能给的
-
内存泄露: 程序在申请内存后未释放已申请的内存, 一次没问题, 但是多了会造成内存泄露堆积, 最终导致内存溢出.
-
-
分页
-
一个进程被分为若干固定大小的区域, 被称为页. 内存分为若干个物理块, 称为"块"或"页框"
-
页和页框大小相等, 由操作系统控制分割
-
分页是为了实现存储的非连续, 避免内存碎片(外部碎片)
-
页是信息的物理单位, 页大小固定
-
页表: 每个进程会有一个页表, 指明该进程中某页对应在内存中的页框. 页表第一列为页号, 第二列为页框号. 处理器会将程序的逻辑地址(页号+偏移量), 转为内存的物理地址(页框号+偏移量)
-
-
分段
-
一个进程被分为若干大小不等的区域, 被称为段.
-
每段存储一组在逻辑上相对完整的信息, 由编译器控制分割.
-
分段是为了更好的共享, 多个进程可以共享一个段, 相比分页有较高的内存利用率
-
段是信息的逻辑单位, 段大小随机
-
段表: 类似于页表
-
-
虚拟内存
-
具有置换功能, 能在逻辑上对内存扩充的一种存储系统
-
内存置换算法:
-
先进先出
-
最近最久未使用 (LRU)
-
clock算法
-
-
-
-
并发控制
-
并发执行下, 为保证隔离性, 多事务间不互相影响.
-
一般并发控制指的就是数据库的并发控制, 实现并发控制主要分为乐观锁与悲观锁.
-
悲观锁
-
使用读锁/写锁, 最好需要依靠数据库提供的锁机制, 也只有数据库提供了锁机制, 才能保证其不被外部系统所修改, 因为即使本系统实现了锁, 外部系统仍可修改.
-
适合数据争用激烈的情况
-
悲观锁可能会导致死锁
-
-
乐观锁
-
在数据提交更新时, 才对数据检测是否冲突, 一般通过数据版本或CAS实现.
-
适合数据争用少的情况
-
-