一个中央处理器可带若干个终端。终端每隔一定时间(均值为25秒的指数分布)向CPU传送一个任务,服务时间服从均值为0.8秒的指数分布。
该计算机系统用轮转法选择下一进程。
1 CPU为每一个任务分配的服务时间最大为:
q=0.1秒。
2 若进程的剩余服务时间s<=q,CPU用s+t时间
处理该进程(t=0.015秒,切换时间)。
3 若s>q,CPU用q+t完成该任务的处理
和切换后,该任务排到队尾,剩余服
务时间减少q。CPU为下一进程服务。
4 重复上述步骤直到某任务结果返回终
端,经过一定间隔时间下一任务再传
出。
5 模拟处理完1000个任务的情形。在响
应时间低于30秒的前提下,求CPU可
带最大终端数和CPU的利用率。
事件:n个到达,1个离开
思路:
1.到达事件:记录到达时间,服务时间,所属终端,该终端的下一个到达时间无穷。
若CPU不忙,则占用CPU,CPU状态设忙,安排占用CPU.
2.安排占用CPU:若本次可以完成处理,则安排离开系统的时间,所需的剩余服务时间为0;若还得继续处理,则安排离开CPU时间,计算所需的剩余服务时间。
3.离开CPU事件:若已经处理完成,计算响应时间,安排下一个的到达,若系统为空,则设备只闲,下次离开CPU不发生,若不空,则安排队首占用CPU。
若没服务完成,若系统只有自己,安排自己占用CPU,若系统还有其他人,安排队首占用CPU,自己排到队尾。
java程序1:事件数组版本:
到达事件:
public void arrive(int terminalNo){
this.currentTime=events[terminalNo];
this.numberOfTaskInSystem++;
Task tmp=new Task();
tmp.setArriveTime(events[terminalNo]);
tmp.setServiceTime(this.GenerateExpRandom(theta2));
tmp.setTerminalNo(terminalNo);
queue.add(tmp);
System.out.println("at "+this.currentTime+"----terminal["+tmp.getTerminalNo()+"] arrived...");
events[terminalNo]=this.INFINITE;
if(statusBusy==false){
this.statusBusy=true;
this.task=this.queue.getFirst();
this.occupyCPU();
}
}
占用CPU:
public void occupyCPU(){
//this.task=queue.getFirst();
if(task.getServiceTime()<=this.cycleTime){
events[TerminalSize+1]=task.getServiceTime()+this.currentTime;
task.setServiceTime(0.0);
}else{
events[TerminalSize+1]=this.cycleTime+this.currentTime;
task.setServiceTime(task.getServiceTime()-this.cycleTime);
}
}
离开CPU:
public void depart(){
this.currentTime=events[TerminalSize+1];
if(task.getServiceTime()==0){
// 可以离开系统,计算停留时间
this.stayingTime+=this.currentTime-task.getArriveTime();
this.finishNumer++;
//安排此终端下次到达时间
events[task.getTerminalNo()]=this.currentTime+this.GenerateExpRandom(theta1);
this.numberOfTaskInSystem--;
queue.removeFirst();
System.out.println("at "+this.currentTime+"----terminal["+task.getTerminalNo()+"] depart cpu...");
if(this.numberOfTaskInSystem==0){
this.statusBusy=false;
events[TerminalSize+1]=this.INFINITE;
}else{
this.task=queue.getFirst();
this.occupyCPU();
}
}else{
if(this.numberOfTaskInSystem==1){
this.occupyCPU();
}else{
Task tmp=queue.getFirst();
queue.removeFirst();
queue.addLast(tmp);
this.task=queue.getFirst();
this.occupyCPU();
}
}
}
链表版本:
到达CPU:
public void arrive(Event e){
this.currentTime=e.getTime();
this.numberOfTaskInSystem++;
Task tmp=new Task();
tmp.setArriveTime(e.getTime());
tmp.setServiceTime(this.GenerateExpRandom(theta2));
tmp.setTerminalNo(e.getTerminalNo());
queue.add(tmp);
System.out.println("at "+this.currentTime+"----terminal["+tmp.getTerminalNo()+"] arrived...");
if(statusBusy==false){
this.statusBusy=true;
this.task=this.queue.getFirst();
this.occupyCPU();
}
}
占用CPU:
public void occupyCPU(){
//this.task=queue.getFirst();
Event e=new Event();
e.setEventType(Event.departType);
e.setTerminalNo(task.getTerminalNo());
if(task.getServiceTime()<=this.cycleTime){
e.setTime(task.getServiceTime()+this.currentTime);
task.setServiceTime(0.0);
}else{
e.setTime(this.cycleTime+this.currentTime);
task.setServiceTime(task.getServiceTime()-this.cycleTime);
}
eventList.add(e);
}
离开CPU:
public void depart(Event e){
this.currentTime=e.getTime();
if(task.getServiceTime()==0){
// 可以离开系统,计算停留时间
this.stayingTime+=this.currentTime-task.getArriveTime();
this.finishNumer++;
//安排此终端下次到达时间
//System.out.println("测试两个地方的终端号:"+(e.getTerminalNo()==task.getTerminalNo()));
Event e1=new Event();
e1.setEventType(Event.arriveType);
e1.setTerminalNo(e.getTerminalNo());
e1.setTime(this.currentTime+this.GenerateExpRandom(theta1));
eventList.add(e1);
this.numberOfTaskInSystem--;
queue.removeFirst();
System.out.println("at "+this.currentTime+"----terminal["+task.getTerminalNo()+"] depart cpu...");
if(this.numberOfTaskInSystem==0){
this.statusBusy=false;
}else{
this.task=queue.getFirst();
this.occupyCPU();
}
}else{
if(this.numberOfTaskInSystem==1){
this.occupyCPU();
}else{
Task tmp=queue.getFirst();
queue.removeFirst();
queue.addLast(tmp);
this.task=queue.getFirst();
this.occupyCPU();
}
}
}
分享到:
相关推荐
"一种用于ASIC芯片测试的多接口CPU模型的VHDL设计" 本文主要介绍了一种用于ASIC芯片测试的多接口CPU模型的...3. [3] CPU模型在测试中的研究文献 4. [4] 仿真测试和验证相关文献 5. [5] 硬件描述语言(HDL)相关文献
重写覆盖原模型中使用的 cpu_nms.pyx, 解决碰到的 ModuleNotFoundError: No module named 'utils.nms.cpu_nms' 报错
CPU与简单模型机设计实验 CPU(Central Processing Unit,中央处理单元)是计算机的主要组成部分,负责执行指令和控制计算机的运算。简单模型机设计实验是计算机组成原理实验的重要部分,旨在掌握简单 CPU 的组成...
这些文件在CPU或GPU上运行时非常有效,但为了在特定硬件平台上运行,例如搭载MLU220芯片的设备,我们需要将模型转换为该硬件支持的格式。本篇文章将详细介绍如何将PyTorch模型转换为`.cambricon`格式,以便在MLU220...
.x模型可能包含大量数据,对内存和CPU有较高需求。因此,优化模型加载、减少冗余数据、使用适当的压缩技术和数据结构等都是提高游戏性能的关键。 总结起来,"用于DirectX的一些.x模型"涵盖了3D模型在DirectX游戏...
《CPU模型机设计详解》 在信息技术领域,CPU(中央处理器)是计算机系统的核心,它负责执行所有的计算和控制任务。本项目“湖南大学数电综合设计——模型机”聚焦于CPU模型的设计与实现,涵盖了从基本逻辑单元到...
这一步骤是确保模型能够在CPU上正确运行的关键。 最后,运行ChatGLM-6B模型有两种主要方式:在Python程序中直接调用,或者通过命令行接口。在Python环境中,可以导入`transformers`库的`AutoTokenizer`和`AutoModel...
3D模型.STEP文件则能够提供CPU-1215C的精确尺寸信息。这种三维模型可以直观地展示PLC的外观、尺寸和接口位置,有助于在工程设计阶段避免安装冲突。例如,通过查看3D模型,设计师可以确认PLC是否能适应有限的空间限制...
这个"西门子S7-300 315 CPU_iso三维模型图.zip"压缩包包含的是一份关于这款CPU的三维模型图,这对于系统集成、工程设计和故障排查等环节具有重要意义。 首先,了解S7-300 315 CPU的基本规格和特性是至关重要的。它...
Java程序员了解CPU以及相关的内存模型,对于深入理解Java内存模型以及并发编程至关重要。CPU作为计算机硬件的核心,其架构和工作原理影响着软件的性能和执行效率。尤其在Java这种多线程、高并发的编程语言中,对CPU...
3. CPU 验证平台的结构:CPU 验证平台的结构通常包括四个部分:测试用例生成器、验证引擎、测试平台和结果分析器。测试用例生成器负责生成测试用例,验证引擎负责执行测试用例,测试平台负责运行测试用例,而结果...
在这个项目中,我们关注的是一个用VHDL编写的八位模型机CPU。这个CPU具有基本的算术和逻辑运算功能,以及控制流程操作,如跳转和输出。 首先,让我们了解一下CPU的基本结构。CPU是计算机的核心部件,负责执行指令、...
3. **.pb 转换**:.pb是TensorFlow的图定义和模型权重的二进制文件,通常用于保存模型以便于部署。要从H5转换为.pb,首先需要将H5模型加载到TensorFlow中,然后使用`tf.saved_model.save`函数保存模型。.pb文件可与...
3. CPU 的传热过程:论文中讨论了 CPU 产生的热量传递到集成式散热器、空气散热器和周围环境空气中的过程。这包括了 CPU 产生的热量传递到集成式散热器、集成式散热器传递到空气散热器、空气散热器传递到周围环境...
在这个项目中,Verilog被用来编写单周期CPU的逻辑电路模型。 4. **FPGA**:Field Programmable Gate Array(现场可编程门阵列)是可重构硬件平台,能够根据Verilog代码配置为实现特定的逻辑功能。在单周期CPU设计中...
使用onnxRt CPU 部署tensorflow模型 需要使用tensorflow simple_save将模型保存为带参数的pb模型,再转化为onnx模型进行部署。训练:TensorFlow1.13.1 cuda 10.0 cudnn7.6.5 部署:cuda10.2 tensorRT8.0.1.6 cudnn...
在本篇内容中,我们将探讨如何使用Verilog设计一个简易的CPU模型。这个CPU模型包含了五条基本指令,主要用于操作累加器和内存,并通过状态机控制整个计算流程。以下是详细的设计过程和相关知识点: 1. **指令集**: ...