一、C/C++
(一)特性
1、继承、封装、多态
2、C++与C对比
(二)关键字
1、static、extern
2、const
3、volatile
(三)编译
1、C++源文件从文本到可执行文件经历的过程?
预编汇链
(1)预编译阶段:处理 #include、#define、 #if。包含头文件、替换宏、明确条件编译内容。生成预编译文件(.i),字符文件。
(2)编译阶段:编译预编译文件,生成汇编文件(.s),字符文件。
(3)汇编阶段:将编译文件转换成机器代码,生成目标文件(.o),机器代码。
(4)链接阶段:插入启动代码,将链接库文件和汇编后的目标文件链接为一个可执行文件(.exe/linux不确定)。
(四)内存管理
1、C++的内存管理
在C++中,虚拟内存空间分为:代码段、数据段、bass段、堆区、共享库的内存映射区、栈区。T-DB-HMS
(1)代码段(text):包括 文本区、只读存储区。文本区——存放程序机器代码,只读存储区——存放字符串常量。
(2)数据段(data):存放初始化的 全局变量、静态变量。在编译阶段已经分配好内存,占用编译好的文件的内存。
(3)bass段(bass):存放未初始化 / 初始化为0的 全局变量、静态变量。在运行阶段开始时才分配内存,不占用编译好的文件的内存。
(4)堆区(heap):在程序运行期间,通过 new / malloc 动态分配的内存。可以动态扩展或收缩,向上增长,向下收缩。
(5)共享库的内存映射区(memory mapping segment):存放共享的代码和数据,如C标准库,数学库,动态链接库。
(6)栈区(stack):又称用户栈,实现函数调用,调用时栈增长,返回时栈收缩。可以动态扩展或收缩,向下增长,向上收缩。linux可以通过 ulimit 命令来临时执行进程的栈的大小。
代码段(text)—— 只读代码和数据
数据段(data)、bass段 —— 可读可写数据
2、堆与栈的对比
(1)分配和回收
堆(heap):在程序运行期间,用户通过 new / malloc 动态分配的内存。需要用户使用 delete / free 主动释放。
栈(stack):在程序运行期间,编译器 在调用函数时 分配的内存,调用时栈增长,返回时栈收缩。保存函数调用信息,包括 函数的返回地址、局部变量、参数、返回值等。由编译器自动回收内存。
(2)动态增长
堆栈都可以在运行期间动态增长和收缩。栈,向下增长,向上收缩。堆,向上增长,向下收缩。
(3)执行效率
栈的分配和回收速率更快。堆使程序更加灵活。
3、new 和 malloc 的区别
(1)分配方式、返回值
new 通过 指定的数据类型 分配内存,分配了一个 动态对象,返回的是 动态对象的指针;
malloc 通过 指定的大小 分配内存,分配了一块 空类型内存,返回的是 泛型指针,因此一般需要类型转换。
(2)构造、析构
new 会调用构造函数,delele 时会调用析构函数。申请、销毁数组时,会多次调用构造、析构。
malloc、free 不会。
(3)函数本质
new 是一个操作符可以重载,malloc 是一个库函数。
(4)失败处理
new 如果分配失败了会抛出 bad_malloc 的异常,
malloc 失败了会返回 NULL。
(5)分配扩容
malloc 分配的内存不够的时候,可以用 realloc 扩容。扩容的原理?new没用这样操作。
4、malloc、calloc、realloc 的对比
(1)函数原型
void *malloc ( size_t size ); 总大小
void *calloc ( size_t num_elements, size_t element_size ); 数量 * 大小
void *realloc (void *ptr, size_t new_size ); 原地址,新大小。返回新地址
(2)分配方式
malloc 按 总需大小 直接分配。
calloc 按 元素数量、元素大小 进行分配,并且会对它初始化为0。
realloc 修改 已分配的内存块 的大小,可使内存块 扩大或缩小。
当传入空指针时,相当于 malloc。
当 新大小 比 原大小 小时,收缩内存块。
当 新大小 比 原大小 大时,扩大内存块。若不能在原来位置上扩容,则在其他位置重新分配一块内存。
5、如何避免内存泄漏 memory leak
(1)程序员要养成良好习惯,保证malloc/new和free/delete匹配,释放之后指针置空;
(2)在用户程序与运行库之间加了一层,用于记录内存分配情况。
6、如何处理内存泄漏
使用 varglind,mtrace 检测。
7、如何避免内存碎片的产生
(1)少使用动态分配。少用动态内存分配的函数(尽量使用栈空间)。
(2)少进行内存分割。不要反复申请小内存,尽量一次性申请较大的内存2的指数次幂大小的内存空间。
(3)使用内存池。也就是自己一次申请一块足够大的空间,然后自己来管理,用于大量频繁地 new / delete 操作。
(4)分配内存和释放的内存尽量在同一个函数中。
(五)STL库
二、操作系统
1、各种api
2、进程的状态
3、进程死锁、产生死锁的原因、处理死锁的方法
4、进程 / 线程,通信、同步
5、进程与线程的区别
6、操作系统的发展及其特点
单道批处理、多道批处理、分时系统、时时系统
7、锁:互斥锁、读写锁、自旋锁
三、数据库
1、概念:事务、视图、索引、约束、权限、角色、用户
2、连接:自连接、内连接、外连接、满连接
3、事务的基本特征:原子性、隔离性、一致性、持久性
4、事务的隔离级别:读未提交、读已提交、可重复读、串行读
5、数据不一致性:脏读、不可重复度、幻读
四、网络编程
1、select
2、poll
3、epoll
4、epoll 水平触发、边沿触发
5、TCP/IP三次握手、四次挥手、Timeout
6、TCP/IP如何保证可靠传输
7、TCP与UDP的对比
8、TCP特点
TCP所提供服务的主要特点:1.面向连接的传输;2.端到端的通信;3.高可靠性,确保传输数据的正确性,不出现丢失或乱序;4.全双工方式传输;5.采用字节流方式,即以字节为单位传输字节序列;6.紧急数据传送功能;
9、滑动窗口
10、应用层协议
基于TCP的应用层协议有:SMTP、TELNET、HTTP、FTP
基于UDP的应用层协议:DNS、TFTP(简单文件传输协议)、RIP(路由选择协议)、DHCP、BOOTP(是DHCP的前身)、IGMP(Internet组管理协议)