操作系统是如何管理CPU的

CPU的工作原理

1.将一个程序放在内存中,然后设置一个地址
2.cpu根据地址发出取指指令,将设置的地址中的指令放在地址总线上,将该指令传到CPU中
3.CPU开始解释执行该指令  
4.地址自动累加,看取一条指令,执行一条指令

tips

io指令与正常指令的执行时间比为570000:1(电脑不同可能比值不同,不过还是很大)
大部分时间都在读取数据(io操作),意味着CPU几乎是空闲的

如何让CPU忙碌起来??

多个程序,交替执行(并发)
切换的时候记录信息,切时程序的样子。

如何查看电脑中的进程

打开任务管理器就能看到有多少进程,每一个程序都会开启一个进程

多进程如何组织(操作系统组织的核心)

PCB(Process Control Block):用来记录进程信息和数据结构
多个进程所对应的PCB(磁盘队列、就绪队列等)分别放在不同的地方,操作系统都知道。

操作系统进程状态图:
操作系统是如何管理CPU的_第1张图片
image.png

多个进程是如何交替的

1.  启动磁盘读写    //假设正在启动
2. pCur.state = 'W'   //将状态设置为wait
3.  然后将pCur放到等待队列DiskWaitQueue
4.  schedule();          //开始切换进程
schedule()
{
  pNew=getNext(ReadyQueue);      //从就绪态取一个
  switch_to(pCur,pNew);                  //切换
}
switch_to(pCur,pNew){
    定义一个结构体,将CPU的东西保存
    将新的信息在赋值给CPU
}

多个进程通过映射表使得不同的进程不会影响

生产者模型

while(true)
{
  while(counter==BUFFER_SIZE);          //缓存区满,消费者停滞
  
  buffer[in]=item;
  in =(in+1)%BUFFER_SIZE;
  counter++;
}

消费者模型

while(true)
{
  while(counter==0);                    //缓冲区空,消费者停
  
  item=buffer[out];
  out=(out+1)%BUFFERSIZE;
  out--;
}

线程切换

TCB原来保存栈以及栈执行的地址(切换不同的线程,就有不同的栈)(一套栈中切换)
指令切换,映射表资源不切换
缺点:切一个进程这个进程里面所有的线程都不执行了
多处理器每个处理器(CPU)都有自己的MMU
多核多个CPU都共享一个MMU(内存映射)

操作系统两套栈

TCB切换两套栈
用户栈
内核栈

CPU调度策略

周转时间:到达的时间到任务完成的时间
响应时间:任务从到达到开始处理的时间
平均周转时间:周转时间/任务数
FCFS(First Come,First Served)
先来先服务
SJF(短作业优先)
周转时间最短
GCC(优先级调度)
指按优先级进行执行
RR(时间片)

进程同步

让进程走走停停,保证多进程合作的合理有序

信号量临界区与保护

轮换法
操作系统是如何管理CPU的_第2张图片
image.png

标记法
操作系统是如何管理CPU的_第3张图片
image.png

非对称标记(结合标记和轮转)
操作系统是如何管理CPU的_第4张图片
image.png

多个进程----面包店算法(标记轮转结合)
操作系统是如何管理CPU的_第5张图片
image.png
特点
互斥进入
有空让进
有限等待

硬件原子指令

while(TestAndSet(&lock));
        临界区
lock=false;
剩余区
boolean TestAndSet(boolean &x)
{
    boolean lv=x;
    x=true;
    return lv;
}

你可能感兴趣的:(操作系统是如何管理CPU的)