import java.awt.Color;
import java.util.ArrayList;
public class Manager {
private int pageSize=4;
private int minBlock=4;
private Color c[]=new Color[6];
private int method;
private PCB pcb[];
private Memory m=new Memory(8,32);
CompanySystem cs=new CompanySystem(minBlock,256);
PageSystem ps=new PageSystem(pageSize,256/pageSize);
SegmentSystem ss=new SegmentSystem(256);
public Manager(int method) {
super();
this.method = method;
c[0]=new Color(255,100,100);
c[1]=new Color(100,255,100);
c[2]=new Color(100,100,255);
c[3]=new Color(255,255,100);
c[4]=new Color(255,100,255);
c[5]=new Color(100,255,255);
pcb=new PCB[6];
int[] block=new int[256];
switch(method){
case 0:break;
case 1:break;
case 2:
case 3:
double i=0;
for(int j=0;j<block.length;j++){
block[j]=(int)i;
i+=1.0/pageSize;
}
}
m.setMb(block);
}
public int getFreePCB(){
for(int i=0;i<pcb.length;i++)
if(pcb[i]==null)
return i;
return -1;
}
public boolean cancel(int pid){
m.setPointer(-1);
if(pid<0||pid>5) return false;
switch(method){
case 0:
if(pcb[pid]!=null){
cs.free(pcb[pid].getStartAddress());
clearSegment(pcb[pid]);
pcb[pid]=null;
return true;
}
else
return false;
case 1:
if(pcb[pid]!=null){
clearSegment(pcb[pid]);
pcb[pid]=null;
return true;
}
else
return false;
case 2:
case 3:
if(pcb[pid]!=null){
clearPage(pcb[pid]);
pcb[pid]=null;
return true;
}
else
return false;
}
return false;
}
public boolean submit(PCB p){
m.setPointer(-1);
int ci=getFreePCB();
if(ci==-1)
return false;
else
p.setId(ci);
int a;
int totalSize=0;
ArrayList<int[]> pages;
switch(method){
case 0:
for(Integer i:p.getSegmentList())
totalSize+=i;
a=cs.allocate(totalSize);
System.out.println(totalSize);
if(a==-1)
return false;
else{
p.setStartAddress(a);
int k=a;
for(Integer i:p.getSegmentList()){
p.getSegmentTable().add(k);
k+=i;
}
writeSegment(p);
pcb[ci]=p;
return true;
}
case 1:
for(Integer i:p.getSegmentList()){
a=ss.allocate(i);
System.out.println(a);
if(a==-1){
clearSegment(p);
return false;
}
p.getSegmentTable().add(a);
}
writeSegment(p);
pcb[ci]=p;
return true;
case 2:
for(Integer i:p.getSegmentList())
totalSize+=i;
pages=ps.allocate(totalSize);
if(pages==null){
clearPage(p);
return false;
}
p.setStartAddress(pages.get(0)[0]*pageSize);
for(int[] pr:pages)
for(int k=pr[0];k<=pr[1];k++)
p.getPageTable().add(k);
writePage(p);
pcb[ci]=p;
return true;
case 3:
int pi=0;
for(Integer i:p.getSegmentList()){
pages=ps.allocate(i);
if(pages==null){
clearPage(p);
return false;
}
p.getSegmentTable().add(pi);
for(int[] pr:pages)
for(int k=pr[0];k<=pr[1];k++,pi++)
p.getPageTable().add(k);
}
writeSegmentPage(p);
pcb[ci]=p;
return true;
}
return false;
}
private void writePage(PCB p){
int totalSize=0;
for(Integer i:p.getSegmentList())
totalSize+=i;
int si=0,pi=0,sk=0;
int sil=p.getSegmentList().get(si);
for(int pk:p.getPageTable()){
for(int a=0;a<pageSize;a++,pi++){
if(pi==totalSize) return;
m.write(a+pk*pageSize,"p"+p.getId()+".s"+si+"."+sk++, c[p.getId()]);
if(sk==sil&&si<p.getSegmentList().size()-1) {sk=0;sil=p.getSegmentList().get(++si);}
}
}
}
private void clearPage(PCB p){
for(int pk:p.getPageTable()){
ps.free(pk, pk);
for(int a=0;a<pageSize;a++)
m.clear(a+pk*pageSize);
}
}
private void writeSegmentPage(PCB p){
int si=0;
for(int pti:p.getSegmentTable()){
int sk=0;
System.out.println(p.getPageTable().size());
int pageNum=p.getSegmentList().get(si)/pageSize;
if(p.getSegmentList().get(si)%pageSize!=0)
pageNum++;
System.out.println(pageNum);
for(int pi=pti;pi<pti+pageNum;pi++){
int pk=p.getPageTable().get(pi)*pageSize;
System.out.println(pk);
for(int a=0;a<pageSize&&sk<p.getSegmentList().get(si);a++)
m.write(a+pk,"p"+p.getId()+".s"+si+"."+sk++, c[p.getId()]);
}
si++;
}
}
private void clearSegment(PCB p){
Integer si=0,i;
for(Integer k:p.getSegmentTable()){
i=p.getSegmentList().get(si);
ss.free(k, k+i-1);
for(int j=k;j<k+i;j++)
m.clear(j);
si++;
}
}
private void writeSegment(PCB p){
int si=0,k;
for(Integer i:p.getSegmentList()){
k=p.getSegmentTable().get(si);
for(int j=0;j<i;j++)
m.write(k++,"p"+p.getId()+".s"+si+"."+j, c[p.getId()]);
si++;
}
}
public boolean visit(int pid,int shift){//cs,ps
if(pid<0||pid>5||pcb[pid]==null)
return false;
int totalSize=0;
for(Integer i:pcb[pid].getSegmentList())
totalSize+=i;
if(shift<0||shift>=totalSize)
return false;
if(method==0){
System.out.println("hhh");
m.setPointer(pcb[pid].getStartAddress()+shift);
return true;
}
if(method==2){
for(Integer i:pcb[pid].getSegmentList())
totalSize+=i;
if(shift<0||shift>=totalSize) return false;
int pti=0;
int pn=(shift+1)/pageSize;
int psf=shift%pageSize;
if((shift+1)%pageSize!=0) pn++;
int a=pcb[pid].getPageTable().get(pti+pn-1)*pageSize+psf;
m.setPointer(a);
return true;
}
return false;
}
public boolean visit(int pid,int sid,int shift){//ss,sps
if(pid<0||pid>5||pcb[pid]==null||sid>=pcb[pid].getSegmentList().size())
return false;
int sil=pcb[pid].getSegmentList().get(sid);
if(shift<0||shift>=sil) return false;
if(method==1){
m.setPointer(pcb[pid].getSegmentTable().get(sid)+shift);
return true;
}
if(method==3){
if(shift<0||shift>=pcb[pid].getSegmentList().get(sid)) return false;
int pti=pcb[pid].getSegmentTable().get(sid);
int pn=(shift+1)/pageSize;
int psf=shift%pageSize;
if((shift+1)%pageSize!=0) pn++;
int a=pcb[pid].getPageTable().get(pti+pn-1)*pageSize+psf;
m.setPointer(a);
return true;
}
return false;
}
public Memory getM() {
return m;
}
public int getMethod() {
return method;
}
}
wddpwzzwanggz
- 粉丝: 0
- 资源: 1
最新资源
- 基于知识图谱的健康养生智能知识服务系统架构设计
- 双向链表的从小到大的插入,删除,遍历,清空
- Matlab基于灰色隐马尔可夫模型(HMMP-GM11)的时间序列预测(含完整的程序,GUI设计和代码详解)
- CTF - Misc - 图片隐写 - 隐藏的钥匙.jpg
- Matlab实现LSTM多输入单输出未来碳排放预测(含完整的程序,GUI设计和代码详解)
- Controllable Image Synthesis of Industrial Data Using Stable Diffusion
- C语言课程设计(成绩管理系统)源程序
- 液晶面板打包机工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- 可爱猫4.6内含易语言开发包含案例
- Matlab实现EVO-CNN-LSTM-Mutilhead-Attention能量谷优化算法优化卷积长短期记忆神经网络融合多头注意力机制多变量多步时间序列预测(含完整的程序,GUI设计和代码详解)
- Matlab实现MSADBO-CNN-LSTM基于改进蜣螂算法优化卷积神经网络-长短期记忆神经网络多特征回归预测(含完整的程序,GUI设计和代码详解)
- 基于C++开发的WEB服务器,支持C/C++、Python、Java等多语言混合开发WEB应用
- 一个可以工作在nginx tcp负载均衡环境中的集群聊天服务器和客户端实例源码
- 强化学习Q学习的单摆运动Matlab代码.rar
- 强化学习的N-形式化Matlab实现。比较了epsilon贪婪,强化.rar
- 气动人工肌肉驱动的机器人腿和强化学习simulink实现.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈