- 什么是协程
- 是微线程,在子程序内部执行,中断转而执行别的子程序再返回来接着执行
- 线程和协程的区别
- 协程执行效率极高。(因为基本没有内核切换的开销)
- 协程不需要多线程的锁机制,从属于一个线程,不存在冲突
- 一个线程可以有多个协程
- 协程的优势
- 协程调用跟切换比线程效率高
- 占用内存少
- 开销少
- 线程和进程的区别(面试真题)
- 一个进程可以包含多个线程,一个线程从属于一个进程
- 进程挂掉不会影响其他进程
- 进程是系统资源调度的最小单位;线程是CPU调度的最小单位
- 进程开销大
- 进程拥有独立内存单元
- 通信方式不一样
- 进程切换为什么比线程消耗更多资源
- 进程切换需要刷新TLB并获取新的地址空间
- 保存线程的上下文比进程的上下文小
- 介绍一下进程之间的通信
- 匿名管道
- 半双工,数据单向流动且只有亲缘关系(父子)的进程使用
- 有名管道
- 先进先出,不需要有亲缘关系
- 信号
- 可以在任意时刻发送给某一进程
- 消息队列
- 存放在内核中的消息链表
- 共享内存
- 信号量
- 解决进程和线程间并发执行的同步问题
- P操作(信号量值-1)和V(信号量值+1)操作
- socket
- 匿名管道
- 说说僵尸进程和孤儿进程
- 孤儿进程
- 一个父进程退出,它的一个或多个子进程还在运行
- 孤儿线程将被init进程收养,并完成状态收集
- 僵尸进程
- 一个进程使用fork创建子进程,子进程退出,父进程没有调用wait或waitpid,子进程的描述符仍保存在系统
- 孤儿进程
- 介绍线程之间的通信方式
- 锁机制
- 信号量机制
- 无名线程信号量
- 命名线程信号量
- 进程的状态
- 进程之间共享内存的通信方式有什么好处
- 效率高
- 进程可以直接读写内存,不需要拷贝数据
- 效率高
- 如何杀死一个进程
- 杀死父进程并不会同时杀死子进程
- kill
- killall
- 说一说kill的命令
- 向操作系统内核发送一个信号,系统内核根据信号进行相应的操作
- kill知识发送一个信号,只有当信号被捕获的时候才会执行
- 介绍下你知道的锁
- 悲观锁
- 乐观锁
- 自旋锁
- 基础的同步原语,保障对共享数据的互斥访问
- 线程等待自旋锁的时候,CPU不能做任何事
- 公平锁
- 多个线程竞争一把锁,先到先得
- 非公平锁
- 共享锁
- 多个线程共享锁的拥有权
- 死锁
- 什么情况会产生死锁
- 互斥条件
- 即某个资源不能同时被两个或以上进程占有
- 不剥夺条件
- 进程获得的资源在未使用完毕前,不能强行夺取
- 请求和保持条件
- 进程至少已经占有一个资源,但又申请新的资源
- 循环等待条件
- 在等待序列中出现互相等待
- 互斥条件
只要一个必要条件不满足,死锁就可以排出
- 说说对自旋锁的理解
- 定义
- 线程尝试获取锁的时候锁已被占用,线程会一直等待,间隔一段时间后会再次尝试获取
- 特点
- 用于临界区互斥
- 在任何时刻最多只能有一个执行单元获得锁
- 等待锁的线程进入忙循环
- 存在的问题
- 如果某线程持有锁的事件过长,会让等待的线程进入一直循环,消耗CPU
- 无法满足等待时间最长的线程优先获取锁
- 优点
- 不会使线程状态发生切换,减少不必要的上下文切换,执行速度快,性能好
- 与互斥锁的区别
- 互斥锁会让等待线程进入睡眠状态
- 定义
- CAS在什么地方用到过吗?
- 定义
- 比较并替换 CompareAndSwap,
- 执行指令时,当且仅当内存地址V与预期值A相等,将V的值修改成B,否则什么都不做
- 场景
- 高并发环境下对同一个数据进行并发读(都读100)和并发写(一个写20,一个写30)导致的数据不一致问题
- 解决方案
- 在set写回的时候加上初始状态的条件Compare,只有不变时才允许写回
- 解决方案
- 高并发环境下对同一个数据进行并发读(都读100)和并发写(一个写20,一个写30)导致的数据不一致问题
- 定义
- 谈谈IO多路复用
- 是一种同步IO模型,实现一个线程可以监视多个文件句柄。多指网络连接,复用指同一个线程
- 三种实现方式
- select
- poll
- epoll
- 区别 | | 最大连接数 | FD剧增后的IO效率 | 消息传递方式 | | —- | —- | —- | —- | | select | 有FD_SETSIZE宏定义 | 线性下降 | 内核拷贝 | | poll | 没有限制 | 同上 | 同上 | | epoll | 有上限但很大 | 活跃socket较少时没有线性下降;活跃socket过多时会有性能问题 | 共享内存 |