操作系统
1、程序、进程与线程是什么?区别与联系?
- 程序:只是一堆代码。
- 进程:对运行时程序的封装。OS--资源调度与分配的基本单位。实现了OS的并发
- 线程:是进程的实体。CPU--调度与分派的基本单位。实现了进程内部的并发
联系
- 一个进程由一个或多个线程组成
- 一个进程内的所有线程,共享该进程的所有系统资源
- 进程与线程都可以并发
区别
- 地址空间。
进程--独立的地址空间。
线程--共享本进程的地址空间 - 拥有资源。
进程--拥有系统资源的--一个独立单位。
线程--拥有一点运行中必不可少的资源----(一组寄存器,栈,程序计数器)。
共享---本进程的--相关资源--(内存,I/O,CPU) - 独立性。
一个进程崩溃--保护模式下--对其他进程--不会产生影响
一个线程崩溃--整个进程--都死掉
多进程比多线程健壮 - 系统开销。
进程切换--保存cpu环境的设置
线程切换--保存少量寄存器的内容
进程切换开销大于线程
进程创建开销大于线程 - 执行过程。
线程--不能独立执行--必须依存在--应用程序中
每个独立线程--有一个程序入口--顺序执行序列--程序出口
2、进程的5种状态
- 新建态。刚刚创建的--os没有把它加入到--可执行进程组
- 就绪态。进程is ready--有机会就执行
- 运行态。该进程正在执行
- 阻塞态。进程--等待阻塞进程的事件完成
- 退出态。os--从可执行进程组中---释放出的进程。或者自身或某些原因--停止运行
3、进程/线程同步方式
- 临界区。相当于保护区域
- 互斥量。加锁控制
- 信号量。PV操作--改变信号量的值 S+1+1+1-1-1-1
- 事件Event。相当于通知操作
https://www.cnblogs.com/zhangbaochong/p/5800650.html
4、生产者消费者模型
目的:解决生产者消费者间的强耦合问题---阻塞队列Queue
- 生产者消费者彼此之间不直接通讯--通过阻塞队列通讯
- 生产者生产完data后,不用等待消费者处理,直接扔给阻塞队列
- 消费者不找生产者要数据,直接从阻塞队列里去
- 阻塞队列相当于一个缓冲区,平衡了生产者消费者的能力
5、进程通信方式
IPC (InterProcess Communication) 进程间通信
- 管道
- 消息队列rabbitMQ
- 信号量
- 共享内存
- 信号
- 套接字socket
- 远程调用RPC。https://blog.csdn.net/kkkloveyou/article/details/51874354
6、进程调度方式
- 先来先服务
- 最短作业优先。平均等待时间最短的进程
- 优先级调度算法。优先级高的
- 时间片轮转。每个进程轮流执行
- 多级队列调度。就绪队列分成多个独立的队列
- 多级反馈队列调度。允许进程在队列间移动
7、页面置换算法
- 先进先出。比如作业调度
- 最近最少使用算法。 使用时间到现在的时间长短判断
- 最少使用次数。
- 最优置换算法。理论上的最优
8、用户态与内核态?如何切换?
用户态:一个进程(任务)在执行用户自己的代码时---称其处于用户运行太态
内核态:一个进程(任务)执行系统调用--陷入内核代码中执行--内核运行态
用户态-->内核态:
- 系统调用
- 异常
- 外围设备中断
https://www.jianshu.com/p/6bd7392568a6
内核态-->用户态:
状态寄存器中---设置程序状态字PSW---记录处理器的运行状态---设置1位标识--R0,R1,R2,R3
https://blog.csdn.net/qq_33414271/article/details/79634430
9、内存的4种分配方式
- 栈。系统自动分配,管理
- 堆。程序猿自己申请,分配,释放
- 常量区。存放常量字符串,程序结束-释放
- 静态变量区。存放全局变量,静态变量。
10、什么是死锁,如何解决
多个进程在运行过程中----抢夺资源而造成的一种僵局
如果没有外力推进-----处于僵局中的进程无法继续进行
导致死锁的4个必要条件:
- 互斥。一次------只有一个进程----可以使用一个资源
- 不可抢占。不能抢占---进程已经占有的资源
- 循环等待。存在封闭的进程链---每个进程----此链中---下一个进程需要的资源
- 占有且等待。一个进程等待其他进程---继续占有----已经分配到的资源
死锁处理:预防、避免、检测、解除死锁
11、linux下的I/O模型 5种
- 阻塞I/O(blocking I/O)
- 非阻塞I/O(nonblocking I/O)
- 多路复用I/O(I/O multiplexing)
- 信号驱动I/O (signal driven I/O )
- 异步I/O(asynchronous I/O)
前四种都是同步,只有最后一种才是异步IO。
12、IO发生时涉及的对象和步骤
- 两个系统对象:
- 调用这个I/O的进程或线程
- 系统内核
- 调用这个I/O的进程或线程
- 步骤
- 等待数据准备 (Waiting for the data to be ready)
- 将数据从内核拷贝到进程中(Copying the data from the kernel to the process)
这些IO模型的区别就是在两个阶段上各有不同的情况。
13、select、poll、epoll
I/O多路复用(select/epoll),也称这种方式为:事件驱动
通过一种机制,监视多个描述符。一旦某个描述符就绪,通知应用程序进行相应的读写操作
-
select
每次调用select,需要把文件描述符集合,从用户态copy到内核态,开销巨大
需要在内核,消耗大量时间,去轮询每个句柄,返回包含整个fd的数组
支持的文件描述符数量存在最大限制,默认1024 -
poll
链表保存文件描述符,没有了文件数量限制,其他缺点依旧存在 -
epoll
linux下的多路复用I/O接口
第一次调用epoll,需要把文件描述符集合,从用户态copy到内核态,只copy一次。
不是轮询,设备时,通过回调函数,把就绪的文件描述符,放在就绪链表中
epoll_wait()查看就绪列表中有没有就绪的文件描述符。
只是查看活跃的连接