theKingOfNight's Blog

浅谈操作系统是如何管理CPU的

字数统计: 801阅读时长: 2 min
2019/01/19 Share

CPU的工作原理

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

tips

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

如何让CPU忙碌起来??

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

如何查看电脑中的进程

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

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

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

操作系统进程状态图:image.png

多个进程是如何交替的

1
2
3
4
1. 启动磁盘读写 //假设正在启动
2. pCur.state = 'W' //将状态设置为wait
3. 然后将pCur放到等待队列DiskWaitQueue
4. schedule(); //开始切换进程

1
2
3
4
5
schedule()
{
pNew=getNext(ReadyQueue); //从就绪态取一个
switch_to(pCur,pNew); //切换
}
1
2
3
4
switch_to(pCur,pNew){
定义一个结构体,将CPU的东西保存
将新的信息在赋值给CPU
}

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

生产者模型

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

消费者模型

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

线程切换

1
2
3
TCB原来保存栈以及栈执行的地址(切换不同的线程,就有不同的栈)(一套栈中切换)
指令切换,映射表资源不切换
缺点:切一个进程这个进程里面所有的线程都不执行了

1
2
多处理器每个处理器(CPU)都有自己的MMU
多核多个CPU都共享一个MMU(内存映射)

操作系统两套栈

1
2
3
TCB切换两套栈
用户栈
内核栈

CPU调度策略

1
2
3
周转时间:到达的时间到任务完成的时间
响应时间:任务从到达到开始处理的时间
平均周转时间:周转时间/任务数

1
2
FCFS(First Come,First Served)
先来先服务
1
2
SJF(短作业优先)
周转时间最短
1
2
GCC(优先级调度)
指按优先级进行执行
1
RR(时间片)

进程同步

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

###信号量临界区与保护
轮换法image.png

标记法image.png

非对称标记(结合标记和轮转)image.png
多个进程—-面包店算法(标记轮转结合)image.png

1
2
3
4
特点
互斥进入
有空让进
有限等待

硬件原子指令

1
2
3
4
while(TestAndSet(&lock));
临界区
lock=false;
剩余区

1
2
3
4
5
6
boolean TestAndSet(boolean &x)
{
boolean lv=x;
x=true;
return lv;
}
CATALOG