1.进程的常见状态?以及各种状态之间的转换条件?
- 就绪
- 执行
- 阻塞:正在执行的进程由于某些发生的事件/中断(如I/O请求,申请缓冲区失败暂时无法继续执行的状态)
2.进程同步
- 同步和互斥的区别?
- 同步指的是不同进程之间的执行有先后顺序/依赖关系。需要对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间互相合作,使程序的执行具有可再现性。
- 同步机制遵循的原则
- 空闲让进
- 忙则等待(保证对临界区的互斥访问)
- 有限等待(等待有限的时间,避免死等)
- 让权等待(进程不能自己进入临界区时,应该是v昂处理机,一面陷入忙等待状态)
3.进程通信的方式有哪些?
- 低级通信:使用信号进行进程间的互斥和同步,交换的信息量少
- 高级通信:利用才做系统提供的一组通信命令传送大量数据,实现过程对进程/用户隐藏
- 高级通信机制可以分为一下三大类
- 共享存储器系统(如剪贴板)
- 消息传递系统
- 管通信系统
- 管道时单向的,先进先出,无结构的,固定大小的字节流,把一个进程的标准输出和另一个进程的标准输入连接在一起。一段写入,另一端读取,有阻塞机制
- 什么是信号量:简单来说就是一个计数器
- 消息队列
- 共享内存:不同进程的虚拟内存可以被映射到同一块物理内存
- 套接字
4.上下文切换
- 将CPU资源从一个进程分配给另一个进程的机制。切换的过程中,操作系统需要保存当前进程的状态(包括寄存器,程序计数器,内存空间的指针/页表头的地址等),在载入另一个进程运行锁需要的资源(状态)。
5.进程和线程的区别和联系
- 进程和线程的关系
- 进程是资源分配调度的最小单元
- 线程是CPU分配调度的最小单元
- 线程必须属于一个进程,线程不能独立存在。一个进程至少有一个线程,线程是计算机可以识别的最小调度执行单位。
- 资源分配给进程,同一进程内的所有线程共享所在进程的所有资源,包括代码段,数据段(全局变量和静态变量),扩展段(堆)。
- 每个线程可以有自己的运行栈和局部变量、临时变量
- CPU分配给线程,真正在CPU上执行的是线程
- 线程在执行过程中,需要协作同步。不同进程的线程间要利用通信的方法实现同步
- 进程和线程的区别
- 进程有自己的地址空间,线程没有
- 进程是资源分配的最小单位,线城市CPU调度的最小单位,真正在CPU上运行的是线程
- 通信方式不同。线程之间通信比较方便,共享数据(代码段,数据段,扩展段等)。当然需要处理好这些共享数据访问的同步和互斥比较难。
- 进程上下文切换开销大,线程开销小,因为很多数据都共享,切换程序计数器的指针就好了。
- 进程之间一般不会相互影响,线程可能会互相影响
- 对进程操作开销都比较大
- 上下文切换的开销是什么
- 进程切换上下文需要
- 切换页表目录以切换地址空间
- 切换内核栈和硬件上下文
- 线程切换不需要第一步,因为共享地址空间
- 开销到底在哪里
- 扰乱缓存机制,原本TLB中缓存的地址都失效,重新翻译地址需要到内存中读取,更加低效
- 都需要进行的内核栈操作,因为上下文切换是内核执行的,需要陷入内核态,需要切换寄存器内容,开销大。
- 进程 = 加载上下文->程序执行(多个线程总和)->保存上下文,进程和线程都是一个时间段的描述,只是颗粒大小不同。
- 现成的分类
- 用户级线程:线程的管理由应用程序完成。内核并不清楚用户级线程的存在,用户级线程的优势在于,高效,不许要进入内核空间,但并发效率不高。
- 内核级线程:线程的管理由内核完成。内核可以将吸纳成分配到不同的CPU,真正实现并行计算。
6. CPU调度算法
- FIFO,先来先服务:比较公平,实现简单
- Shortest Job First:最短的作业优先调度
- 优先权调度
- 轮转调度算法:设置最长时间片,等待时间短,但是上下文切换次数比较多
- 多级队列调度。不同的队列由不同的优先级
- 多级反馈队列:不同队伍有不同的优先级。首先调度优先级高队列中的进程,高优先级队列中没有进程后才会调度优先级低队列中的任务。对于同一个优先级队列中的任务,采用时间片轮转调度法,如果一个任务不能完成,则加入下一级优先队列。如果正在执行低优先级队列中的任务,高优先级队列中到达新的作业,那么运行完这个时间片后,立即执行高优先级队列中的作业(抢占式)。
7. 产生死锁的条件?如何处理死锁?
产生死锁的必要条件:
-
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
-
请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
-
非抢占条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
-
循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
如何处理死锁问题:
-
忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。
-
检测死锁并且恢复。
-
仔细地对资源进行动态分配,使系统始终处于安全状态以避免死锁。
-
通过破除死锁四个必要条件之一,来防止死锁产生。
来源:CSDN
作者:ppdoge
链接:https://blog.csdn.net/ppdoge/article/details/104352946