/* * CSCAN.java (Implements CSCAN algorithm for disk Access). * * Written by : Nitin Motgi (nmotgi@cs.ucf.edu) * * * ASSUMPTIONS : * * 1. Request time is always in seconds. * 2. The request will be in the order of arrival time. * * Portions copyright(c) 2001 to School of Electrical Engineering and * Computer Science, UCF, Orlando. * * Use and distribution of this source code are strictly governed by * terms and conditions set by the authors. * * $Id : CSCAN.java, 04/10/2001. $ * * Revision History: * * 1. Created basic structure Nitin, v1.0.0 04/12/2001. * 2. Added Documentation. Nitin, v1.0.1 04/12/2001. */ import java.io.*; import java.util.*; public class CSCAN { private Vector requested; private Vector requests; private int heads; private int tracks; private int sectors; private int RPM; private int seekRate; private boolean debug; static Access preAcc; public CSCAN(Vector access,int head,int track,int sector,int rpm,int seekrate,boolean deb) { requests=new Vector(); requests=access; requested=new Vector(); heads=head; tracks=track; sectors=sector; RPM=rpm; seekRate=seekrate; debug=deb; preAcc=new Access(); } private boolean valid(Access acc) { if (acc.track>=tracks||acc.sector>=sectors||acc.head>=heads) return(false); if(preAcc!=null&&preAcc.requestTime>acc.requestTime) return(false); return(true); } public void simulate() { float curTime=0; int curTrack=0; int curSector=0; int distance=0; int reads=0; float latency=0; float readTime=0; System.out.println("Using Circular-SCAN"); if(debug) System.out.println("Starting heads at <0,0>"); int index=0; int ic; Access acc=new Access(); while (true) { while (indexcurTime) break; else { index++; if (valid(acc)) { preAcc=acc; requested.addElement(acc); if(debug) System.out.println("Read request: <"+acc.track+","+acc.sector+","+acc.head+">"); } else if(debug) System.out.println("Read request: <"+acc.track+","+acc.sector+","+acc.head+"> Invalid request"); } } boolean exist=true; while (exist) { exist=false; for(ic=0;ic"); requested.remove(acc); if (curSector>acc.sector) { latency+=(float)(sectors-curSector+acc.sector)*60/sectors/RPM; curTime+=(float)(sectors-curSector+acc.sector)*60/sectors/RPM; } else { latency+=(float)(acc.sector-curSector)*60/sectors/RPM; curTime+=(float)(acc.sector-curSector)*60/sectors/RPM; } readTime+=curTime-acc.requestTime; curSector=acc.sector; if(debug) System.out.println("Read <"+acc.track+","+acc.sector+","+acc.head+">"); while (indexcurTime) break; else { index++; if (valid(acc)) { preAcc=acc; requested.addElement(acc); if(debug) System.out.println("Read request: <"+acc.track+","+acc.sector+","+acc.head+">"); } else if(debug) System.out.println("Read request: <"+acc.track+","+acc.sector+","+acc.head+"> Invalid request"); } } } } if (requested.isEmpty()&&index==requests.size()) break; if (curTrack==(tracks-1)) { curTrack=0; curTime+=(float)(tracks-1)/seekRate; distance+=tracks-1; curSector=(int)(sectors*RPM/60*(tracks-1)/seekRate+curSector)%sectors; } else { curTime+=(float)1/seekRate; distance++; curTrack++; curSector=(int)(sectors*RPM/60/seekRate+curSector)%sectors; } } System.out.println("Total number of Reads:"+reads); System.out.println("Total distance traveled:"+distance); if(reads==0) System.out.println("No read at all"); else { System.out.println("Average Seek time:"+(float)distance/seekRate/reads+" seconds"); System.out.println("Average latency:"+latency/reads+" seconds"); System.out.println("Average total read time:"+readTime/reads+" seconds"); } System.out.println("Press any key to continue..."); try { System.in.read(); System.in.skip(1); } catch (IOException exce) { } } }