二.调度 之 基于最简单的CPU的问题

根据一中我们对智能芯片添加的规则

现在我们再假定物理内存在0x2000地址开始存在与上面0x1000地址有相同的程序(指令序列)
物理内存安排如下:
0x1000:        nop
0x1001:        nop
0x1002:        nop
0x1003:        nop
0x1004:        nop
0x1005:        nop
0x1006:        jmp 0x1000
  .
  .
  .
0x2000:        nop
0x2001:        nop
0x2002:        nop
0x2003:        nop
0x2004:        nop
0x2005:        nop
0x2006:        jmp 0x2000
并且假定我们的智能芯片当前正在0x1000处执行循环

 

思考一个问题:在不改变上述指令序列的情况下如何让我们的智能芯片既执行0x1000处的循环又执行0x2000处的循环呢?

 

方法1:向智能芯片添加规则
规则八.存在一个指令指针寄存器IP1,用于指示要读取的物理内存地址
规则九.如果当前执行的是NOP指令,IP1=IP1+1
规则十.如果当前执行的是JMP指令,IP1=(JMP指令的后两个字节)
规则十一.IP1内容改变时到物理内存中取指令
方法1的弱点,如果物理内存中有多处存在上述的指令序列,并都要执行,就得为每处指令序列添加方法1的规则

 

方法2:向智能芯片添加规则
规则八.存在一个寄存器SP,用于指示内存的某个地址
规则九.可以处理MOV指令,可以把寄存器的内容保存到物理内存中(比如 MOV [0x0050], SP),也可以把内存中的内容加
载到寄存器(比如 MOV SP, [0x0050]),也可以给寄存器赋值(比如 MOV SP, 1234), 指令长度3个字节
规则十.可以处理IRET指令,指令执行时自动把SP指向的物理内存中的值赋给IP, 指令长度1个字节
规则十一.智能芯片的外部有个输入引脚,当该引脚的电平从低变化到高时,打断指令的执行,自动把当前IP的值保存到
SP指向的物理内存中,并且IP的内容自动变成0x0000

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单轮转法调度算法(Round Robin Scheduling Algorithm)是一种常见的CPU调度算法,它是一种基于时间片的调度算法,旨在避免长时间进程霸占CPU资源。下面是一个使用C++实现的简单轮转法调度算法的代码示例: ```C++ #include <iostream> #include <queue> using namespace std; struct process { int pid; // 进程ID int arrival_time; // 到达时间 int burst_time; // 执行时间 int remaining_time; // 剩余执行时间 int turnaround_time; // 周转时间 int waiting_time; // 等待时间 }; void round_robin(process p[], int n, int quantum) { queue<process> q; int t = 0; // 当前时间 int completed = 0; // 已完成的进程数 int total_waiting_time = 0; // 总等待时间 int total_turnaround_time = 0; // 总周转时间 // 将所有进程按到达时间入队 for (int i = 0; i < n; i++) q.push(p[i]); // 循环调度所有进程,直到所有进程都完成 while (completed < n) { process curr = q.front(); q.pop(); // 计算该进程的等待时间 curr.waiting_time += t - curr.arrival_time; // 如果该进程的剩余执行时间小于时间片,则执行完毕 if (curr.remaining_time <= quantum) { t += curr.remaining_time; curr.turnaround_time = t - curr.arrival_time; completed++; } // 否则,该进程暂时退出CPU,剩余执行时间减去时间片,并重新入队 else { t += quantum; curr.remaining_time -= quantum; q.push(curr); } // 统计总等待时间和总周转时间 total_waiting_time += curr.waiting_time; total_turnaround_time += curr.turnaround_time; } // 输出平均等待时间和平均周转时间 double avg_waiting_time = (double)total_waiting_time / n; double avg_turnaround_time = (double)total_turnaround_time / n; cout << "Average Waiting Time: " << avg_waiting_time << endl; cout << "Average Turnaround Time: " << avg_turnaround_time << endl; } int main() { // 创建进程数组 process p[] = { {1, 0, 10, 10, 0, 0}, {2, 1, 5, 5, 0, 0}, {3, 2, 8, 8, 0, 0}, {4, 3, 3, 3, 0, 0}, {5, 4, 4, 4, 0, 0} }; int n = sizeof(p) / sizeof(p[0]); // 调用简单轮转法调度算法,时间片为2 round_robin(p, n, 2); return 0; } ``` 上述代码中的`process`结构体记录了每个进程的相关信息,`round_robin`函数实现了简单轮转法调度算法,其中`quantum`表示时间片大小。该算法先将所有进程按到达时间入队,然后循环调度所有进程,直到所有进程都完成。在每次调度过程中,算法先从队列中取出一个进程,计算该进程的等待时间,并根据其剩余执行时间判断其是否能在该时间片内完成。如果该进程能够完成,则计算其周转时间并将已完成的进程数加一;否则,该进程暂时退出CPU,剩余执行时间减去时间片,并重新入队。最后,算法统计所有进程的总等待时间和总周转时间,并输出平均等待时间和平均周转时间。 以上是一个简单的轮转法调度算法的实现,仅供参考。实际应用中,需要根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值