变成语言和开发工具
C++新特性
自动类型推导 (auto): 自动推导变量的类型,减少显式类型声明的繁琐
范围 for 循环: 用于遍历容器或数组,简化代码。
nullptr: nullptr 取代 NULL,表示空指针,类型更明确。
lambda 表达式: 允许定义匿名函数,常用于 STL 算法或事件处理。
智能指针 (std::shared_ptr 和 std::unique_ptr): 引入了自动管理内存的智能指针,减少手动管理内存泄漏的风险
右值引用 (&&) 和移动语义: 移动语义允许资源的转移,而不是复制,提高了性能,特别是在容器操作中
线程支持 (<thread> 头文件): 引入了标准线程库,简化了多线程编程
数据结构与算法
数组
链表
队列
栈
排序
快速排序
冒泡排序
选择排序
设计模式
STL标准模板库
系统级编程
指针
内存管理
内存分配策略
静态分配:在编译期分配固定大小的内存
动态分配:运行时根据需要分配内存,如使用malloc
IO操作
I/O多路复用的基本思想,是使用于一个或多个系统调用来监视多个文件描述符,当其中一个或多个文件描述符就绪时,通知程序进行相应的操作。这样就可以再单线程中处理多个I/O操作,而无需为没哟个连接创建一个线程或2进程
select:
最早的I/O多路复用机制,可以监视一组文件描述符,当某个文件描述符就绪时,select返回,程序可以进行相应的读写操作。缺点:存在最大文件描述符限制
poll:
poll不再不再限制文件描述符的数量,使用pollfd结构体数组来监视文件描述符。缺点:高并发场景下仍存在性能问题。
epoll:Linux特有
epoll支持边缘触发和水平触发,能够高效地处理大量并发连接。适用于高负载的服务器应用
进程控制
fork和vfork都是创建进程的方式
fork创建的子进程是对父进程的数据段和代码段进行拷贝·,而vfork是共享数据段、堆栈段
fork通过写时赋值来给子进程开辟独立的地址空间父子进程执行的顺序不确定,而vfork子进程执行结束之后父进程才能执行,vfork()保证子进程先运行,在调用exec之后父进程才可能被调度运行。
进程通信
传统通信:
管道(无名管道、有名管道):
信号(异步):
ipc通信:
消息队列(管道的集合):
共享内存(地址映射的方式):
信号量(信号灯的集合):
网络编程
TCP
TCP流量控制:让发送端根据接收端的的实际接收能力控制发送的数据量
TCP通过滑动窗口来控制流量
TCP滑动窗口:分为发送窗口和接收窗口,实际是操作系统开辟的缓存空间,窗口大小值表示无需等待确认应答,而可以发送数据的最大值。
TCP头部有个字段叫win,也即那个16位的窗口大小,他告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,从而达到流量控制
TCP拥塞控制:避免发送发的数据填满整个网络。常用算法:慢启动、拥塞避免、拥塞发生、快速恢复。
UDP
Socket
并发和并行编程
线程同步机制
线程同步机制用于解决多个线程同时访问共享资源是可能出现的竞态条件,确保多个线程协作执行任务时的一致性和正确性。在多线程编程中,常见的线程同步机制包括互斥锁、信号量、条件标量、读写锁。
互斥锁:用于保护共享资源,使得同一时间只有一个线程访问该资源
信号量:信号量是一个计数器·,用于控制对共享资源的发变废为宝,允许多个线程同时访问特定数量的资源
条件变量:用于线程之间的等待和通知,当某个条件未满足时,线程可以等待,直到另一个线程发出通知
读写锁:允许多个线程同时读取资源,但是有写操作时,其它读写操作都会被阻塞
递归锁:自旋锁无法获取时,线程会不断的忙等待,即循环检测锁是否可用,而不是阻塞,会消耗CPU资源
线程读写分离
线程读写分离可以提高并发性能的常用编程计数,在需要频繁读取数据但写入操作相对较少的场景中使用
线程池
线程池通过vector管理线程,使用队列存储待执行的任务,线程池通过submit方法提交任务,任务被封装并加入队列中,当任务到来时,通过条件变量唤醒等待的线程,线程执行任务。线程池关闭时会确保任务执行完毕并释放资源
什么是线程池,优缺点,线程池的大小
线程池是通过提前创建一组线程来处理任务,可以提高性能、减少线程创建和销毁的开销
优点:提高系统的资源利用率,减少频繁的线程创建和销毁
缺点:增加了系统的复杂性,增加了管理难度
线程大小:根据CPU的核心数和任务性质来确定
条件变量的作用是什么?
用于线程同步,当某个条件不满足时,线程可以挂起并等待条件变量的通知,以避免忙等待,
用锁来保证数据安全,确保同一时间只有一个线程可以访问这些数据
什么是死锁,如何避免?
死锁是因为两个或多个线程因争夺资源而导致的相互等待状态。
避免方法:按顺序请求资源,使用超时机制
内存池
预先分配大内存块的技术,然后再此内存块内分配小块内存,小内存块使用嵌入式指针相连,这样可以减少频繁的分配和释放,提高性能.
操作系统
Linux常用命令
ls--list directory contents 列出当前文件夹内容
man ls 打开工具手册
mkdir--make directories 创建文件/文件夹
d 目录
rm 删除文件/文件夹
rm -r 删除文件/文件夹
touch 创建文件
cp 复制
cd 改变工作目录 cd/usr/ 切换文件夹
-help --help 帮助
pwd 打印当前文件夹所在的名字
mv 重命名/移动文件
vi readme.md 在readme.md内写内容
数据库
SQL语句
创建数据库:create database
创建表:create table
修改表:alter table
删除表:Drop table
插入数据:insert into
更新数据:update
删除数据:delete
授予权限:grant
回收权限:revoke
内连接:inner join
四大特性
①原子性:事物是一个完整的操作,要么都成功,要么都不执行
②一致性:事务执行的结果符合预期
③隔离性:事物与事物之间互不影响
④持久性:事物操作成功后修改应该是永久的