1.写文件时进程宕机,数据会丢失吗
背景:stdio库,这些函数都是带stdio 缓冲区(用户空间) ,setbuf可以自定义缓冲区的大小;stdio缓冲区:作用是减少系统调用;page cache(内核高速缓冲区)作用:减少磁盘IO次数,提高性能,缺点:用户层无法优化page cache 使用策略,这也就是数据库要维护一个page管理;page cache->磁盘方法:fsync (一个文件刷新)sync(所有打开文件全部刷新)
两种磁盘IO方式:缓存文件IO (上图)中间会有一个page cache;直接文件IO(O_direct)stdio缓冲区直接到磁盘中不经过page cache。什么时候使用缓存文件IO什么时候使用直接文件IO:大数据的时候使用直接文件IO,小数据使用缓存文件IO。
情况1:写文件,还没调用fflush(write) 数据丢失
情况2:调用了write,只要系统不关闭,数据不会丢失
情况3:假设进程宕机后系统关闭了,系统关闭前调用了write,如果使用的是直接文件IO 数据不丢失,如果使用的是缓存文件IO 数据丢失; 若没有调用write 不管什么IO方式数据一定会丢失。
2.define和const的区别是什么
编译阶段:define是在编译预处理阶段进行简单的文本替换,const是在编译阶段确定其值
安全性:define定义的宏常量没有数据类型,只是进行简单的替换,不会进行类型安全检查;const定义的常量是有类型的,是要进行类型判断的
内存占用:define定义的宏常量,在程序中使用多少次就会进行多少次替换,内存中有多个备份,占用的是代码段的内存;const定义常量占用静态存储区域的空间,程序运行过程中只有一份
调试:define定义的宏常量不能调试,因为在预编译阶段就已经进行替换了;const定义的常量是可以进行调试的。
3.程序运行的步骤是什么
预编译(处理):将头文件编译,进行宏替换,输出.i文件
编译:将其转化为汇编语言文件,主要做词法分析,语义分析以及检查错误,检查无误后将代码翻译成汇编语言,生成.s文件
汇编:汇编器将汇编语言文件翻译成机器语言,生成.o文件
链接:将目标文件和库链接到一起,生成可执行文件.exe
4.锁的底层原理是什么
锁的底层是通过CAS,atomic 机制实现。
CAS机制:全称为Compare And Swap(比较相同再交换)可以将比较和交换操作转换为原子操作,CAS操作依赖于三个值:内存中的值V,旧的预估值X,要修改的新值B,如果旧的预估值X等于内存中的值V,就将新的值B保存在内存之中。(就是每一个线程从主内存复制一个变量副本后,进行操作,然后对其进行修改,修改完后,再刷新回主内存前。再取一次主内存的值,看拿到的主内存的新值与当初保存的快照值,是否一样,如果不一样,说明有其他线程修改,本次修改放弃,重试。)