『壹』 怎樣用java實現CPU的調度要用到什麼類
cpu調度及內存分配演算法
寫的一個操作系統的實驗,篇幅原因,只給了內存分配和回收代碼.
/**
單 位:中南大學軟體學院0501班
文 件:CpuScheler.java
項 目:操作系統cpu調度演算法模擬程序
作 者:劉欣
創建時間:2007年5月14日
**/
public static void InitMem(){
MemTable = new memory();
MemTable.Setmem_beg(0);
MemTable.Setmem_size(100);
MemTable.Setmem_state(0);
}
public boolean InitMemory(Pcb temp){
memory mem_temp,last,now;
last = MemTable;
mem_temp = new memory(temp.GetName(),temp.Getmem_size());
boolean flag = true;
if(mem_temp.Getmem_size() > 100 ){
c.tcpuinfo.setText(mem_temp.GetPcd_name()+"is too big");
flag = false;
}
if(MemTable == null){
return flag;
}
if(mem_temp.Getmem_size() + nowsize > 100){
c.tcpuinfo.setText("memory has been full please wait");
flag = false;
}
if(MemTable.Getmem_state() == 0){// if the first is empty;
if(MemTable.Getmem_size() > mem_temp.Getmem_size()){
mem_temp.next = MemTable;
mem_temp.Setmem_beg( last.Getmem_beg() );
mem_temp.Setmem_state(1);
MemTable.Setmem_beg(mem_temp.Getmem_beg() + mem_temp.Getmem_size());
MemTable.Setmem_size( MemTable.Getmem_size()-mem_temp.Getmem_size() );
MemTable = mem_temp;
nowsize += mem_temp.Getmem_size();
return flag;
}
if (MemTable.Getmem_size() == mem_temp.Getmem_size()){
// MemTable.SetPcd_name(mem_temp.GetPcd_name());
mem_temp = MemTable;
mem_temp.Setmem_state(1);
mem_temp.next = MemTable;
nowsize += mem_temp.Getmem_size();
return flag;
}
}
// begin obtain the other;
if(last != null){
now = last.next;
while(now != null){// search the teble for sutible memory;
if(now.Getmem_state() == 0){// if the first is empty;
if(now.Getmem_size() > mem_temp.Getmem_size()){
mem_temp.next = now;
mem_temp.Setmem_beg( now.Getmem_beg() );
mem_temp.Setmem_state(1);
now.Setmem_beg(mem_temp.Getmem_beg() + mem_temp.Getmem_size());
now.Setmem_size( now.Getmem_size()-mem_temp.Getmem_size() );
last.next = mem_temp;
nowsize += mem_temp.Getmem_size();
return flag;
}
else if (now.Getmem_size() == mem_temp.Getmem_size()){
now.SetPcd_name(mem_temp.GetPcd_name());
mem_temp = now;
mem_temp.Setmem_state(1);
last.next = mem_temp;
nowsize += mem_temp.Getmem_size();
return flag;
}
}
last = now;
//if(last != null){
now = now.next;
//}
}
}
return flag;
}
public void ReleaseMem(Pcb Temp){
memory mem_temp,last,now;
mem_temp = new memory(Temp.GetName(),Temp.Getmem_size());
if(MemTable == null){
c.tcpuinfo.setText("無內存可釋放");
//return false;
}
last = MemTable;
now = last.next;
if (MemTable.GetPcd_name() == mem_temp.GetPcd_name()){//如果第一個就是要釋放的分區;
MemTable.Setmem_state(0);
MemTable.SetPcd_name(null);
if(now != null && now.Getmem_state() == 0 ){//如果後鄰接分區也是空閑的;
MemTable.Setmem_size(MemTable.Getmem_size() + now.Getmem_size());
MemTable.SetPcd_name(null);
nowsize -= mem_temp.Getmem_size();
MemTable.next = null;
// return true;
}
}
while (now != null){//在鏈表中尋找要釋放的分區;
if(now.GetPcd_name() == mem_temp.GetPcd_name()){//找到;
nowsize -= mem_temp.Getmem_size();
now.Setmem_state(0);
if(now.next != null && now.next.Getmem_state() == 0){//查看後面相鄰結點是否有空閑;
last.next = now.next;
now.next.Setmem_beg(now.Getmem_beg());
now.next.Setmem_size(now.Getmem_size() + now.next.Getmem_size());
now = last.next;
now.SetPcd_name(null);
}
if(last.Getmem_state() == 0){//查看前面相鄰結點是否有空閑;
last.next = now.next;
last.Setmem_size(last.Getmem_size() + now.Getmem_size());
last.SetPcd_name(null);
now = last.next;
// now.SetPcd_name(null);
}
}
last = now;
now = now.next;
}
}
『貳』 29、Java中用到的線程調度演算法是什麼
操作系統的核心,它實際就是一個常駐內存的程序,不斷地對線程隊列進行掃描,利用特定的演算法(時間片輪轉法、優先順序調度法、多級反饋隊列調度法等)找出比當前佔有CPU的線程更有CPU使用權的線程,並從之前的線程中收回處理器,再使待運行的線程佔用處理器。
『叄』 優先順序調度演算法如何用JAVA實現
在多線程時,可以手動去設置每個線程的優先順序setPriority(int newPriority)
更改線程的優先順序。
『肆』 如何實現負載均衡,哪些演算法可以實現
1、輪詢調度
輪詢調度演算法就是以輪詢的方式依次將請求調度到不同的伺服器,即每次調度執行i = (i + 1) mod n,並選出第i台伺服器。演算法的優點是其簡潔性,它無需記錄當前所有連接的狀態,所以它是一種無狀態調度。
2、最小連接調度
最小連接調度演算法是把新的連接請求分配到當前連接數最小的伺服器。最小連接調度是一種動態調度演算法,它通過伺服器當前所活躍的連接數來估計伺服器的負載情況。
在實際實現過程中,一般會為每台伺服器設定一個權重值,這就是加權最小連接
3、 基於局部性的最少鏈接(LBLC)
基於局部性的最少鏈接調度(以下簡稱為LBLC)演算法是針對請求報文的目標IP地址的負載均衡調度,目前主要用於Cache集群系統,因為在Cache集群中客戶請求報文的目標IP地址是變化的。
LBLC調度演算法先根據請求的目標IP地址找出該目標IP地址最近使用的伺服器,若該伺服器是可用的且沒有超載,將請求發送到該伺服器; 若伺服器不存在,或伺服器超載或有伺服器處於其一半的工作負載,則用「最少鏈接」的原則選出一個可用的伺服器,將請求發送到該伺服器。
4、帶復制的基於局部性最少鏈接(LBLCR)
帶復制的基於局部性最少鏈接調度以下簡稱為LBLCR)演算法也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。它與LBLC演算法的不同之處是它要維護從一個目標IP地址到一組伺服器的映射,而LBLC演算法維護從一個目標IP地址到一台伺服器的映射。
LBLCR調度演算法將「熱門」站點映射到一組Cache伺服器(伺服器集合),當該「熱門」站點的請求負載增加時,會增加集合里的Cache伺服器,來處理不斷增長的負載; 當該「熱門」站點的請求負載降低時,會減少集合里的Cache伺服器數目。
5、目標地址散列調度
目標地址散列調度演算法是針對目標IP地址的負載均衡,但它是一種靜態映射演算法,通過一個散列(Hash)函數將一個目標IP地址映射到一台伺服器。
目標地址散列調度演算法先根據請求的目標IP地址,作為散列從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求發送到該伺服器,否則返回空。
6、 源地址散列調度
和目標地址散列調度類似,唯一的區別是按照源地址為散列函數的散列鍵。