- 设备和文件IO
- Linux 内核函数
- 内核函数和API区别(fopen、open)?
- API函数通过库函数 进行操作
- 内核直接操作硬件
- 从效率上:内核函数比库函数快
- 从移植性上:内核几乎无法跨操作移植,库函数比较方便
- 文件操作
- open函数
- read函数
- wirte函数
- create函数
- close函数
- lseek函数
- fcntl函数
- 文件夹操作
- 业务场景
- 文件读写
- lseek 文件拆分
- 多线程操作同一个文件 fcntl文件锁 ——文件锁会被绕过,现在很少用,而是用线程锁
- 面试问题
- 进程管理
- 什么是进程
- 进程的状态
- init进程
- fork 函数
- 作用:开辟新的子进程
- 过程:一次调用,两次返回(父子进程)
- 父进程 pid>0 ?子进程pid==0
- 代码拷贝,多进程中数据,地址一直,数据独立不能数据共享
- 注意:多进程中的数据如果全局变量,地址是一样的,数据是独立的
- 业务场景
- 前后置服务器
- 守护进程(心跳 ——后台看不见,比如微信看完切换到qq,这时候微信这个进程就存在守护进程里)
- 面试问题
- 进程和线程关系和区别
- 进程状态切换问题
- 进程的结束问题(exit(结束状态码)——子进程调用,主进程会收到状态码。如果主进程先结束,子进程就托孤,系统没人管)
- 进程和程序的关系()
- IPC进程间通信
- 管道
- 半双工(数据单向流动)
- 匿名管道PIPE
- 命名管道FIFO
- 没有关系的多个进程之间
- 存在一个管道文件(容易被误删)
- 信号
- 什么是信号(信号发出,执行绑定的函数——类似qt信号和槽)
- 信号的分类
- 可靠信号(34只会,发多少执行多少)
- 不可靠信号(1-31-循环发送多次信号,就只会到达一两个)
- 代码去实现
- 不可携带数据signal
- 可携带数据 sigaction(int类型)
- 信号屏蔽 sigprocmask
- 信号冲突问题
-
- 消息队列
- 链表的形式存在
- 每一个消息都可以携带数据
- 数据是存在一定的顺序——先进先出
- 读取一个消息,会自动删除链表的头(最早的消息)
- 代码实现
- msgget 消息队列创建和访问
- msgsend 发送消息
- msgrcv 接收消息
- msgctl?控制消息队列
- 共享内存(跟消息队列、信号量 是三剑客 不属于进程,进程可以共享)
- 多个进程中可以共享的一块内存区域
- 不属于任何进程
- 所有的进程都可以操作
- 后一个访问者可以查看到前一个访问操作的结果
- 代码实现
- shmget 创建和访问
- shmat 连接进程
- shmdt 断开进程连接
- shmctl?控制共享内存
- 信号量
- 多个进程间访问同一数据 进程锁操作 通知操作
- 代码实现
- semget 创建
- semop?一次pv操作
- semctl 信号量控制
- 业务场景
- IPC通信管理
- 数据传输(适合:共享内存、管道、消息队列)
- 数据共享(共享内存,有指向性不能共享)
- 通知事件(消息队列、信号、信号量)
- 进程锁同步机制(信号量——进程锁——pv操作)
- 面试问题
- socket 网络通信(与前面不一样的是使用了网络)
- 网络基础概念
- IP地址
- 端口
- 通信协议
- TCP
- 1、验证通信双方是否在线
- 2、流式IO传输,不会限制大小
- 3、键链三次握手;断线四次挥手
- 牺牲效率,提高数据安全
- UDP
- 1、不需要验证通信双方是否在线的情况
- 2、报文包传输,每一包64KB大小
- 3、发送报文包
- 牺牲部分数据安全,提高传输效率
- 自定义通信协议
- 局域网
- 广域网
- 域名
- 代码实现
- 服务器
- socket 函数
- setsockopt函数——端口重用
- bind 函数
- listen 函数
- accept 函数
- 客户端
- 面试问题
- TCP和UDP区别
- xxx业务需要使用什么通信协议实现,为什么
- 三次握手四次挥手流程
- socket IO复用
- 为什么需要IO复用
- 为了实现高(客户端的访问数量高)、并发(数据量大)
- 阻塞式IO
- 非阻塞式IO
- 多线程IO
- 多路复用IO
- select
- 1、socket数组
- 2、轮询遍历所有的socket
- Poll——链表——仍然要遍历
- epoll
- 2、使用事件队列的方式,边缘触发
- 3、选择某一个触发了事件的socket到进程中执行操作
- Epoll——异步阻塞(所有socket全部处于阻塞状态,事件发生了才会处理read),同步执行(socket产生事件之后,唤醒主进程操作,主进程处于同步等待状态,epoll_wait,产生事件才能read,没有事件到达一直wait,(搭线程池的原因),从wait角度来说是同步的,从事件队列红黑树来说是异步阻塞
Wait后交给线程池处理又变成异步的了)
没有事件到达之后就一直阻塞,事件到达之后就变成同步执行
- 没有多线程之前,都是同步,有了之后变成异步(read——同步,读取到数据才往下走)
- 异步:我做的事情跟你无关,一个客户端登录登录不上,不影响其他线程处理业务
- 业务场景
- 面试问题
- select \poll和 epoll区别
- epoll原理
- epoll封装步骤
- LT模式和ET模式
- 线程池
- 为什么需要线程池——减少创建和销毁线程的次数——减少内存和cpu的消耗
- 代码实现
- 任务队列
- 空闲线程队列
- 忙碌线程队列
- 线程数量最大值 MAX 最小MIN
- 线程条件变量
- 线程访问同一数据的安全问题
两个进程,用了进程锁和线程锁,哪个优先级更高——进程锁
线程包含在进程内,线程锁是用在同一个进程有两个或者多个线程,解决进程内部问题
进程锁一定是进程与进程之间的访问
|