面经常问题目

进程和线程
1.进程和线程的区别
一个进程包含多个线程,一个线程只属于一个进程
进程 资源分配最小单位 线程 调度的最小单位
进程开销大于线程 进程创建和销毁时 需要系统为之销毁和创建资源 包括i/o 内存等;线程开销小 只需要保存和设置少量寄存器 不涉及存储
进程需要自己独立的内存 线程间共享进程的内存,共享 代码段包括代码和常量,数据段全局变量和静态变量,堆区端
进程调试可靠性高 较简单 线程开销小 速度快 调试较复杂
进程间不会相互影响 线程会 一个挂掉 会全部失去。

进程间通信的方式:
管道 ipc socket套接字
Ipc: 信号 信号量 消息队列 共享内存
管道:匿名管道 有名管道
有名管道 允许非亲属关系 进程间通信 fifo文件 存在于硬盘上 有路径
Pipe
Pipe[0] 读
Pipe[1] 写
全半双工
文件描述符 dup

Ipc:
信号量 pv操作 互斥量
共享内存 :互斥锁 信号量 共享内存最快通信
消息队列 消息链表

线程间通信
临界区 多线程串行化 访问一段公共资源
信号量
互斥量
事件 通过通知操作

缺页中断
物理内存和虚拟内存 映射

请问单核机器上写多线程程序,是否需要考虑加锁,为什么?
轮转抢占式 共享内存 加锁

线程间的同步
信号量 互斥量 条件变量

OS缺页置换算法
Fifo lru
多进程和多线程的使用场景
线程 切换代价小 io密集型
进程 cpu密集型 多机分布式

死锁
存在互斥条件
循环等待
不剥夺 不会强占有其他资源
请求保持 自己占有一定资源 阻塞不释放

读写锁和互斥锁
互斥锁 任何时刻 只有一个线程访问
读写锁 读可以多线程 一个时刻一个写锁 写权限大于读权限

软连接与硬链接
硬链接:同一个文件使用了不同的别名。 ln
软连接:存放路径指向

静态变量初始化
静态变量 编译前
全局或局部静态对象 第一次构造允许时

Sever 接收多个客户端
线程池 多线程 io复用

两个进程访问临界区资源,会不会出现都获得自旋锁的情况
单核cpu,并且开了抢占可以造成这种情况。

c++锁
自旋锁 互斥锁 条件变量 读写锁

协程
子程序 随时中断 协程效率高较线程 不需要锁 线程越多 效率越高

源码到可执行文件
预编译
删除define 处理预编译 删除注释
编译
语法分析 词法分析 语义分析 生成汇编文件
汇编
汇编转成机器语言 生成.o文件
链接
静态链接
静态库对函数库的链接是放在编译时期完成的。
 程序在运行时与函数库再无瓜葛,移植方便。
浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件
静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户

动态链接
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例

孤儿进程
父进程退出 子进程运行 被init进程接收

僵尸进程
子进程退出 父进程未收到退出信息 wait waitpid 仍保留文件描述符

5种io模型
阻塞 非阻塞 信号驱动io io复用 异步io

Tcp可靠性
序列号 确认应答 超时重传
拥塞控制
慢启动
拥塞避免
快速重传
超时重传

链路层 设备驱动程序 接口卡 mac
网络层 ip icmp arp
传输层 tcp udp
应用层 http ftp dns

http 与https
http明文传输 https 加密传输 tls
https 在三次握手后 需要进行ssl加密
https需要服务端申请证书 浏览器端安装证书
http 80 https 443

http返回码
1信息接收
2 成过
3 重定向 需下一步操作
4 客户端
5 服务器端

输入一个URL

解析url 使用dns 为ip地址
Dns查缓存 没有则递归查询和迭代查询 基于udp
http 或者https
生成请求报文
分片经过tcp数据包交给ip ip路由跳转 arp得到物理地址

报文17udp 6tcp

原子性 一致性 隔离性 持久性
读未提交
读已提交
可重复度
可串行化

MVCC
并发控制机制 InoDB实现 读已提交 可重复读 通过快照实现 在每一行数据后面添加两隐藏列 存储版本号和删除号 将快照存入undo日志中 该日志通过回滚指针将快照链接起来

InoDB具有行锁和外键约束
通过bin-log 灾难恢复
只有他支持外键约束

Hash冲突
开散列 链接法
开地址 线性 双重 随机哈希

缓存穿透
数据直接达到数据库上
接口校验。在正常业务流程中可能会存在少量访问不存在 key 的情况,但是一般不会出现大量的情况,所以这种场景最大的可能性是遭受了非法攻击。可以在最外层先做一层校验:用户鉴权、数据合法性校验等,例如商品查询中,商品的ID是正整数,则可以直接对非正整数直接过滤等等。
缓存空值。当访问缓存和DB都没有查询到值时,可以将空值写进缓存,但是设置较短的过期时间,该时间需要根据产品业务特性来设置。
布隆过滤

缓存击穿
缓存过期后 有大量热点key过来。
加互斥锁 rides分布式锁
在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存。
热点数据不过期。直接将缓存设置为不过期,然后由定时任务去异步加载数据,更新缓存

缓存雪崩
描述:大量的热点 key 设置了相同的过期时间,导在缓存在同一时刻全部失效,造成瞬时数据库请求量大、压力骤增,引起雪崩,甚至导致数据库被打挂。

1过期时间打散。既然是大量缓存集中失效,那最容易想到就是让他们不集中生效。可以给缓存的过期时间时加上一个随机值时间,使得每个 key 的过期时间分布开来,不会集中在同一时刻失效。

2、热点数据不过期。该方式和缓存击穿一样,也是要着重考虑刷新的时间间隔和数据异常如何处理的情况。

3、加互斥锁。该方式和缓存击穿一样,按 key 维度加锁,对于同一个 key,只允许一个线程去计算,其他线程原地阻塞等待第一个线程的计算结果,然后直接走缓存即可。
主从同步的实现过程
主从同步分为 2 个步骤:同步和命令传播

段错误
程序访问不允许访问的地址。不允许的方式访问内存位置(例如尝试写入只读位置,或覆盖部分操作系统)时会发生段错误

1.使用未经初始化及或已经释放的指针地址
2.访问受系统保护的内存地址
3.写入只读的内存地址
4.数组越界
5.堆栈溢出
6.文件操作符超出限制
7.跨线程传递指针
Valgrind内存泄漏和内存越界访问检查工具

沾包问题
https://blog.csdn.net/huangql517/article/details/79531536

深拷贝和浅拷贝
浅拷贝只是增加了一个指针指向已存在的内存地址,仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。深拷贝是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值