OS

  • 操作系统补全计划

1.多进程图像引出

1.1 CPU管理

  • CPU执行方式 取指执行

  • CPU工作,只需要设定PC初值,CPU之后会依次取指执行

  • 1
    2
    3
    4
    5
    6
    int *fp,sum=0;
    for(int i=0;i<100000000000000;i++)
    {
    sum=sum+i;
    //fpritf(fp,"%d",sum);//IO指令特别慢
    }
  • IO指令时,不加fprintf0.015,加fprintf0.859

  • 在等待IO时,切换任务

  • 多个程序在内存中–多道程序,交替执行

  • 适当时候PC进行切换

    • 修改PC寄存器
    • 记录信息,每个程序有一个存放信息的结构PCB
  • 运行的程序(进行中的程序–进程)VS静态的程序

    • 进程为进行中的程序

    为了使用CPU,需要设置PC的初值,效率低,多道程序交替执行,切换时,需要记录一些信息,进程

    启动一个进程,CPU就可以工作,启动多个进程,CPU高效运行

    1.2多进程图像

  • 启动了的程序就是进程,多个进程推进

    • 操作系统将这些进程记录号,按照合理的次序
    • main中fork()创建了第一个进程,
      • init中执行了shell(桌面)
      • shell 再启动其他进程
    • 1565866335701
    • 1565866370830
  • 多进程如何组织

    • PCB process control block记录进程信息的数据块
    • 操作系统感知 操作进程全靠PCB
    • 基于PCB的一些数据结构
    • 1565866777674
    • 把进程根据状态区分开
      • PCB+状态+队列
      • 1565866925029
  • 多进程如何交替

    • pCur pNew 均为PCB
    • getNext 调度算法
    • switch 切换算法
    • 1565867058012
    • 交替三个部分 队列操作+调度+切换
      • 调度
        • FIFO
        • Priority
      • 切换 精细控制 汇编
        • 1565867555149
    • 多进程相互影响
      • 1565867856939
      • 每个进程有一个映射表
        • 多进程在内存中共存
        • 1565867914593
      • 多进程合作
        • 1565868011092
        • 1565868109153
        • counter ++ –非原子操作
        • 进程同步,合理的推进顺序
        • 1565868363151
  • 读写PCB,

  • 操作寄存器完成切换

  • 调度程序

  • 进程同步与合作

  • 地址映射

2 线程的引出和实现

进程切换

2.1用户级线程

  • 一个进程就是执行一堆指令

  • 1565958543201

  • 只切指令不切映射表(内存),速度快

  • 1565958580926

  • 线程保留了并发的特点,又避免了进程切换的代价

  • 线程切换实质就是映射表不变,PC指针变

  • 1565959094794

  • 1565959345501

  • 1565959558732

  • 1565959803214

    • B执行完之后404出栈,跳转到D执行出错,一个栈不够用
  • 1565960709561

    • TCB thread control block
    • TCB和栈
    • 不需要jmp 204,yield下一句为204;
    • yield只需要切换栈即可
  • 1565960955892

    • 把起始地址放在栈中,把tcb和栈进行关联
  • 1565961151494

  • 用户级线程在用户态切来切去,操作系统感知不到

    • 1565961336997
    • 在内核中阻塞时,操作系统感知不到用户线程,切换不到show线程
  • 1565961472640

    • 内核级线程并发性好

2.2 内核级线程

用户级线程切换的核心就是一个栈变为两个栈,每个线程有自己的栈和TCB,在切换的时候,首先切换TCB,再切换栈。创建的时候将要切换的PC指针放到自己的栈中,再创建好TCB,将来切换的时候,首先通过TCB切换到相应的栈,从栈中弹出PC执行

  • 没有用户级进程,进程必须在内核中,进程需要分配资源,必要到内核态才能访问这些资源,切换进程真正是切换内核级线程
  • 多核处理器 –核心级线程
  • MMU 内存映射,多核用的一个MMU,一个映射,多线程在核里,才能充分应用CPU
  • 核是由操作系统控制,操作系统看不到用户级线程,不能分配核
  • 多进程,用户级线程都不能充分发挥多核价值
  • 1566037574800
  • 核心级线程需要进入内核态,在用户态执行的时候用户栈,在内核态跑用内核栈
  • 一个TCB关联两套栈,根据TCB切换两套栈,用户栈和内核栈都要切
  • 1566037947219
  • 进入内核的唯一方法就是中断
  • 1566038414169
  • 1566038572573
  • cur next 为TCB
  • 1566038726005
  • 中断进入内核,找到TCB,完成TCB切换,并根据TCB切换内核栈,IRET,切换到用户栈
  • 1566039074863
  • 1566039402092
  • 1566039614637
  • 1566039789986

2.3 内核级线程的实现

  • 1566115924486
  • 每取一条指令PC自动+1
  • 1566116698043
  • state 非零 意味着阻塞
  • 1566117197837
  • 1566117305134
  • 1566117749363

9 内存管理

9.1 内存使用与分段

文章目录
  1. 1. 1.多进程图像引出
    1. 1.1. 1.1 CPU管理
    2. 1.2. 1.2多进程图像
  2. 2. 2 线程的引出和实现
    1. 2.1. 2.1用户级线程
    2. 2.2. 2.2 内核级线程
    3. 2.3. 2.3 内核级线程的实现
  3. 3. 9 内存管理
    1. 3.1. 9.1 内存使用与分段