操作系统

进程和线程

  • 进程的各个状态

    • 就绪等待被调度

    • 运行 正在执行中

    • 阻塞;缺少需要的资源 等待中

      只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得

  • 线程的各个状态之间的切换

    • 就绪 :进程处于准备好的状态 得到CPU 就可以运行
    • 执行:进程获得cpu 执行
    • 阻塞:正在执行的进程由于发生某事件 暂时无法继续执行
  • 进程和线程

    • 进程: 进程是系统进行资源分配和调度的一个独立单位
    • 线程:是CPU分配和调度的基本单位
  • 进程和线程的关系

    • 一个进程可以拥有多个线程
  • 进程和线程的区别

    • 进程有自己的独立地址空间 线程没有
    • 进程是资源分配的最小单位线程是CPU分配的最小单位
    • 线程通信更方便:
      • 比如同一进程下线程共享数据(全局变量 静态变量)
  • 进程切换代价高

    • 进程切换
      • 需要切换目录地址空间
      • 切换内核栈 硬件上下文
  • 进程调度

    • 非抢占式调度 抢占式调度
    • 调度算法
      • 先进先出,最短作业优先
      • 优先权调度算法
      • 轮转调度算法
      • 多级队列调度
  • 一个程序从开始到结束的过程

    • 预处理 :头文件包含 宏替换
    • 编译:将预处理的文件转换成汇编语言
    • 汇编:将汇编代码转成二进制文件
    • 链接:链接目标生成可执行文件

程序和进程

​ 程序是永久的,进程是暂时的,程序是在数据集上的一次执行

​ 程序是静态的观念,进程是动态的观念

​ 进程具有并发性,而程序没有

​ 进程和程序不是一一对应的,一个程序可以拥有多个进程。

​ 程序有一定的生命周期

了解哪些寄存器

通用寄存器 标志寄存器 段寄存器

进程通信的方式

1. 管道通信 :

  • 命名管道:在内核申请一块固定大小的缓冲区 。程序拥有读写的权利

  • 匿名管道:

    2. 消息队列:

  • 在内核中创建一个队列,队列存储的元素是一个个数据报,不同进程通过句柄去访问这个队列

    3. 信号量:

  • 主要是PV操作

    4. 共享内存:

  • 主要是将一块物理地址映射到不同的进程虚拟地址空间中,实现不同进程堆同一志愿的共享

    5. 套接字( socket ) :

  • 套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。 比如QQ 聊天

死锁的四个条件

​ 互斥 不可剥夺 循环等待 请求和保持

​ 当系统出于安全状态时一定不会进入死锁

​ 当系统处于不安全状态时不一定会死锁

进程调度算法:

​ 先来先服务

​ 短作业优先

​ 时间片轮转调度

高响应比优先

优先权调度算法

多级队列调度算法

内存管理的方式:

段页式存储

​ ① 随机算法:用软件或硬件随机数产生器确定替换的页面
  ② 先进先出:先调入主存的页面先替换
  ③ 近期最少使用算法(LRU,Least Recently Used):替换最长时间不用的页面
  ④ 最优算法:替换最长时间以后才使用的页面。这是理想化的算法,只能作为衡量其他各种算法优劣的标准。

IO 控制的方式:

​ 有轮询 中断 DMA

外中断和异常有什么区别?

外中断是指由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。

而异常时由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。

磁盘调度算法

​ 先来先服务

​ 最短寻道优先

​ 电梯算法

动态分区分配算法有哪几种?可以分别说说吗?

1、首次适应算法

算法思想:每次都从低地址开始查找,找到第–个能满足大小的空闲分区。

如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链( 或空闲分[表),找到大小能满足要求的第-一个空闲分区。

2、最佳适应算法

算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区。

如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第-一个空闲分区。

3、最坏适应算法

又称最大适应算法(Largest Fit)

算法思想:为了解决最佳适应算法的问题—即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。

如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第-一个空闲分区。

4、邻近适应算法

算法思想:首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。

如何实现:空闲分区以地址递增的顺序排列(可排成-一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

程序的编译过程

  1. 预编译 主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下
1
2
3
1. 处理所有的预处理命令
2. 处理 define 命令 将内容替换到对应的位置
3. 删除注释 添加行号和文件标识 ()便于调试信息时能够显示行号
  1. 编译 进行语法语义分析生成 汇编代码 .i 文件

  2. 汇编: 将汇编代码转化成机器码

  3. 链接:将不同目标文件链接转化成一个可执行文件

操作系统在对内存进行管理的时候需要做些什么?

  • 操作系统负责内存空间的分配与回收。
  • 操作系统需要提供某种技术从逻辑上对内存空间进行扩充。
  • 操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换。
  • 操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰

五大IO 模型

  • 阻塞Io

  • 非阻塞IO 不断询问 询问中间 可以做其他的事情

  • 信号驱动:

    用户事先在内核注册一个信号处理函数,管道和内核进行交互,当管道中的某个请求需要的数据处理好之后,进程再把对应的数据拷贝到用户空间中。

  • IO 复用模型 NIO Channel , Selector,Buffer

    多个进程的IO 可以注册到同一个管道上,这个管道会统一和内核进行交互,当管道中数据准备好之后,进程再把对应的数据拷贝到用户空间。

  • 异步IO

    应用进程 把IO请求传递给内核后,完全由内核去操作文件拷贝,内核完成相关操作后,会发信号告诉本次应用进程本次IO 已经完成。

Donate comment here