CPU的工作原理
1.将一个程序放在内存中,然后设置一个地址
2.cpu根据地址发出取指指令,将设置的地址中的指令放在地址总线上,将该指令传到CPU中
3.CPU开始解释执行该指令
4.地址自动累加,看取一条指令,执行一条指令
tips
io指令与正常指令的执行时间比为570000:1(电脑不同可能比值不同,不过还是很大)
大部分时间都在读取数据(io操作),意味着CPU几乎是空闲的
如何让CPU忙碌起来??
多个程序,交替执行(并发)
切换的时候记录信息,切时程序的样子。
如何查看电脑中的进程
打开任务管理器就能看到有多少进程,每一个程序都会开启一个进程
多进程如何组织(操作系统组织的核心)
PCB(Process Control Block):用来记录进程信息和数据结构
多个进程所对应的PCB(磁盘队列、就绪队列等)分别放在不同的地方,操作系统都知道。
操作系统进程状态图:

多个进程是如何交替的
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(时间片)
进程同步
让进程走走停停,保证多进程合作的合理有序
信号量临界区与保护
轮换法


多个进程----面包店算法(标记轮转结合)

特点
互斥进入
有空让进
有限等待
硬件原子指令
while(TestAndSet(&lock));
临界区
lock=false;
剩余区
boolean TestAndSet(boolean &x)
{
boolean lv=x;
x=true;
return lv;
}
网友评论