02-操作系统必会问题

1、程序、进程与线程是什么?区别与联系?

  1. 程序:只是一堆代码。
  2. 进程:对运行时程序的封装。OS--资源调度与分配的基本单位。实现了OS的并发
  3. 线程:是进程的实体。CPU--调度与分派的基本单位。实现了进程内部的并发

联系

  1. 一个进程由一个或多个线程组成
  2. 一个进程内的所有线程,共享该进程的所有系统资源
  3. 进程与线程都可以并发

区别

  1. 地址空间。
    进程--独立的地址空间。
    线程--共享本进程的地址空间
  2. 拥有资源。
    进程--拥有系统资源的--一个独立单位。
    线程--拥有一点运行中必不可少的资源----(一组寄存器,栈,程序计数器)。
    共享---本进程的--相关资源--(内存,I/O,CPU)
  3. 独立性。
    一个进程崩溃--保护模式下--对其他进程--不会产生影响
    一个线程崩溃--整个进程--都死掉
    多进程比多线程健壮
  4. 系统开销。
    进程切换--保存cpu环境的设置
    线程切换--保存少量寄存器的内容
    进程切换开销大于线程
    进程创建开销大于线程
  5. 执行过程。
    线程--不能独立执行--必须依存在--应用程序中
    每个独立线程--有一个程序入口--顺序执行序列--程序出口

2、进程的5种状态

  1. 新建态。刚刚创建的--os没有把它加入到--可执行进程组
  2. 就绪态。进程is ready--有机会就执行
  3. 运行态。该进程正在执行
  4. 阻塞态。进程--等待阻塞进程的事件完成
  5. 退出态。os--从可执行进程组中---释放出的进程。或者自身或某些原因--停止运行

3、进程/线程同步方式

  1. 临界区。相当于保护区域
  2. 互斥量。加锁控制
  3. 信号量。PV操作--改变信号量的值 S+1+1+1-1-1-1
  4. 事件Event。相当于通知操作
    https://www.cnblogs.com/zhangbaochong/p/5800650.html

4、生产者消费者模型

目的:解决生产者消费者间的强耦合问题---阻塞队列Queue

  1. 生产者消费者彼此之间不直接通讯--通过阻塞队列通讯
  2. 生产者生产完data后,不用等待消费者处理,直接扔给阻塞队列
  3. 消费者不找生产者要数据,直接从阻塞队列里去
  4. 阻塞队列相当于一个缓冲区,平衡了生产者消费者的能力

5、进程通信方式

IPC (InterProcess Communication) 进程间通信

  1. 管道
  2. 消息队列rabbitMQ
  3. 信号量
  4. 共享内存
  5. 信号
  6. 套接字socket
  7. 远程调用RPC。https://blog.csdn.net/kkkloveyou/article/details/51874354

6、进程调度方式

  1. 先来先服务
  2. 最短作业优先。平均等待时间最短的进程
  3. 优先级调度算法。优先级高的
  4. 时间片轮转。每个进程轮流执行
  5. 多级队列调度。就绪队列分成多个独立的队列
  6. 多级反馈队列调度。允许进程在队列间移动

7、页面置换算法

  1. 先进先出。比如作业调度
  2. 最近最少使用算法。 使用时间到现在的时间长短判断
  3. 最少使用次数。
  4. 最优置换算法。理论上的最优

8、用户态与内核态?如何切换?

用户态:一个进程(任务)在执行用户自己的代码时---称其处于用户运行太态
内核态:一个进程(任务)执行系统调用--陷入内核代码中执行--内核运行态

用户态-->内核态:

  1. 系统调用
  2. 异常
  3. 外围设备中断
    https://www.jianshu.com/p/6bd7392568a6

内核态-->用户态:
状态寄存器中---设置程序状态字PSW---记录处理器的运行状态---设置1位标识--R0,R1,R2,R3
https://blog.csdn.net/qq_33414271/article/details/79634430

9、内存的4种分配方式

  1. 栈。系统自动分配,管理
  2. 堆。程序猿自己申请,分配,释放
  3. 常量区。存放常量字符串,程序结束-释放
  4. 静态变量区。存放全局变量,静态变量。

10、什么是死锁,如何解决

多个进程在运行过程中----抢夺资源而造成的一种僵局
如果没有外力推进-----处于僵局中的进程无法继续进行

导致死锁的4个必要条件:

  1. 互斥。一次------只有一个进程----可以使用一个资源
  2. 不可抢占。不能抢占---进程已经占有的资源
  3. 循环等待。存在封闭的进程链---每个进程----此链中---下一个进程需要的资源
  4. 占有且等待。一个进程等待其他进程---继续占有----已经分配到的资源

死锁处理:预防、避免、检测、解除死锁

11、linux下的I/O模型 5种

  1. 阻塞I/O(blocking I/O)
  2. 非阻塞I/O(nonblocking I/O)
  3. 多路复用I/O(I/O multiplexing)
  4. 信号驱动I/O (signal driven I/O )
  5. 异步I/O(asynchronous I/O)

前四种都是同步,只有最后一种才是异步IO。

12、IO发生时涉及的对象和步骤

  1. 两个系统对象:
    1. 调用这个I/O的进程或线程
    2. 系统内核
  2. 步骤
    1. 等待数据准备 (Waiting for the data to be ready)
    2. 将数据从内核拷贝到进程中(Copying the data from the kernel to the process)

这些IO模型的区别就是在两个阶段上各有不同的情况。

13、select、poll、epoll

I/O多路复用(select/epoll),也称这种方式为:事件驱动
通过一种机制,监视多个描述符。一旦某个描述符就绪,通知应用程序进行相应的读写操作

  1. select
    每次调用select,需要把文件描述符集合,从用户态copy到内核态,开销巨大
    需要在内核,消耗大量时间,去轮询每个句柄,返回包含整个fd的数组
    支持的文件描述符数量存在最大限制,默认1024

  2. poll
    链表保存文件描述符,没有了文件数量限制,其他缺点依旧存在

  3. epoll
    linux下的多路复用I/O接口
    第一次调用epoll,需要把文件描述符集合,从用户态copy到内核态,只copy一次。
    不是轮询,设备时,通过回调函数,把就绪的文件描述符,放在就绪链表中
    epoll_wait()查看就绪列表中有没有就绪的文件描述符。
    只是查看活跃的连接

原文地址:https://www.cnblogs.com/venicid/p/9710653.html