@ 2013-07-18T09:18:36Z <?php
class Pamiec {
protected $iFizyczna = 0;
protected $aFizyczna = array();
protected $iWirtualna = 0;
protected $aWirtualna = array();
protected $aKolejka = array();
protected $aOdwolania = array();
protected $sTyp = 'FIFO';
public function __construct($iFizyczna, $iWirtualna, $sTyp = 'FIFO') {
$this->iFizyczna = $iFizyczna;
$this->iWirtualna = $iWirtualna;
$this->sTyp = $sTyp;
$this->aOdwolania = array_fill(0, $iFizyczna+$iWirtualna, 0);
}
public function kolejka($iAdres) {
$this->aKolejka[ ] = $iAdres;
}
public function execute() {
$iBledyStrony = 0;
foreach($this->aKolejka as $iKey => $iAdres) {
$iBledyStrony += $this->get($iAdres);
unset($this->aKolejka[ $iKey ]);
}
return $iBledyStrony;
}
public function get($iAdres) {
// na potrzeby LRU
$this->aOdwolania[ $iAdres ] = 0;
if(in_array($iAdres, $this->aFizyczna)) {
return 0;
}
if(count($this->aFizyczna) >= $this->iFizyczna) {
// echo '<hr />! '.$iAdres;
// $this->drukuj();
// usuwam z pamieci wirtualnej
$iKey = array_search($iAdres, $this->aWirtualna);
unset($this->aWirtualna[ $iKey ]);
//odpowiednie sortowanie
$this->sort();
// przepisywanie pierwszego elementu fizycznej do wirtualnej
$iTymczasowy = array_shift($this->aFizyczna);
$this->aWirtualna[ ] = $iTymczasowy;
}
$this->aFizyczna[ ] = $iAdres;
// na potrzeby LRU
foreach($this->aOdwolania as $i => $v) {
$this->aOdwolania[ $i ]++;
}
return 1;
}
protected function sort() {
switch($this->sTyp) {
case 'FIFO': // usuwamy stronę najdłużej przebywającą w pamięci fizycznej
break;
case 'OPT': // optymalny - usuwamy stronę, która nie będzie najdłużej używana
$aOpcje = $this->aFizyczna;
// szukamy w kolejce ostatniego elementu w liscie opcji
foreach($this->aKolejka as $elem) {
// jezeli znajdziemy w kolejce usuwamy z opcji wyszukiwanych
$iKey = array_search($elem, $aOpcje);
unset($aOpcje[ $iKey ]);
// jezeli zostanie tylko jeden element to przesuwamy go
// w kolejce fizycznej na pierwsze miejsce
if(count($aOpcje) == 1) {
$iKey = array_search(current($aOpcje), $this->aFizyczna);
$tmp = $this->aFizyczna[ $iKey ];
unset($this->aFizyczna[ $iKey ]);
array_unshift($this->aFizyczna, $tmp);
return;
}
}
break;
case 'LRU': // usuwamy stronę, do której najdłużej nie nastąpiło odwołanie
arsort($this->aOdwolania);
// echo '<pre>';
// var_dump($this->aOdwolania);
// echo '</pre>';
// sortujemy odwolania a nastepnie szukamy najwiekszego odstepu w fizycznej
foreach($this->aOdwolania as $iAdres => $iCount) {
// echo "szukam $iAdres<br />";
if(($iKey = array_search($iAdres, $this->aFizyczna)) !== false) {
// echo $iAdres.'<br />';
// znaleziony adres w pamieci fizycznej przesuwamy na pierwsza pozycje
$tmp = $this->aFizyczna[ $iKey ];
// echo implode(',',$this->aFizyczna).'<br />';
unset($this->aFizyczna[ $iKey ]);
array_unshift($this->aFizyczna, $tmp);
// echo implode(',',$this->aFizyczna);
return;
}
}
break;
case 'aLRU':
break;
case 'RAND': // usuwamy losowo wybraną stronę
shuffle($this->aFizyczna);
break;
}
}
protected function drukuj() {
echo '<table border="1"><tr><td>Fizyczna</td>';
foreach($this->aFizyczna as $elem) {
echo '<td>'.$elem.'</td>';
}
echo '</tr><tr><td>Wirtualna</td>';
foreach($this->aWirtualna as $elem) {
echo '<td>'.$elem.'</td>';
}
echo '</tr></table>';
}
}
$iIloscStron = 10; //wirtualna
$iIloscRamek = 10; //fizyczna
$iMaxAdresy = $iIloscStron+$iIloscRamek;
foreach(array('FIFO', 'LRU', 'OPT', 'aLRU', 'RAND') as $sTyp) {
$Pamiec = new Pamiec($iIloscRamek, $iIloscStron, $sTyp);
srand(5);
for($i = 0; $i < 1000; $i++) {
$Pamiec->kolejka(rand(0, $iMaxAdresy-1));
}
srand(microtime(true)*100);
echo $sTyp.' = '.$Pamiec->execute().'<br />';
}
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Output for 7.2.0 FIFO = 488<br />LRU = 486<br />OPT = 245<br />aLRU = 488<br />RAND = 490<br /> Output for 7.1.0 , 7.1.7 FIFO = 488<br />LRU = 486<br />OPT = 245<br />aLRU = 488<br />RAND = 483<br /> Output for 7.1.5 - 7.1.6 FIFO = 488<br />LRU = 486<br />OPT = 245<br />aLRU = 488<br />RAND = 474<br /> Output for 7.0.0 - 7.0.2 , 7.0.4 - 7.0.5 , 7.0.7 - 7.0.8 , 7.0.10 , 7.0.20 FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 477<br /> Output for 5.3.23 , 5.4.5 , 5.4.7 - 5.4.8 , 5.4.10 , 5.4.12 - 5.4.13 , 5.4.16 - 5.4.17 , 5.4.21 , 5.4.35 - 5.4.36 , 5.4.44 , 5.5.4 , 5.5.11 , 5.5.24 , 5.5.26 , 5.5.28 , 5.5.31 , 5.5.35 , 5.6.1 , 5.6.3 , 5.6.5 , 5.6.8 - 5.6.9 , 5.6.15 , 5.6.18 - 5.6.19 , 5.6.25 , 7.0.3 , 7.0.6 , 7.0.9 , 7.0.14 FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 486<br /> Output for 5.2.0 - 5.2.1 , 5.2.4 , 5.2.7 , 5.2.14 , 5.3.0 , 5.3.4 , 5.3.6 - 5.3.9 , 5.3.11 - 5.3.18 , 5.3.20 - 5.3.22 , 5.3.24 - 5.3.29 , 5.4.0 - 5.4.4 , 5.4.6 , 5.4.9 , 5.4.11 , 5.4.15 , 5.4.18 - 5.4.20 , 5.4.22 - 5.4.34 , 5.4.37 - 5.4.43 , 5.4.45 , 5.5.0 - 5.5.3 , 5.5.5 - 5.5.10 , 5.5.12 - 5.5.21 , 5.5.23 , 5.5.25 , 5.5.27 , 5.5.29 , 5.5.32 - 5.5.34 , 5.5.36 - 5.5.38 , 5.6.0 , 5.6.2 , 5.6.4 , 5.6.6 - 5.6.7 , 5.6.10 - 5.6.14 , 5.6.16 - 5.6.17 , 5.6.20 - 5.6.24 , 5.6.28 FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 508<br /> Output for 5.1.0 - 5.1.6 , 5.2.2 - 5.2.3 , 5.2.5 - 5.2.6 , 5.2.8 - 5.2.13 , 5.2.15 - 5.2.17 , 5.3.1 - 5.3.3 , 5.3.10 , 5.3.19 , 5.4.14 , 5.5.22 , 5.5.30 FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 488<br /> Output for 5.0.0 , 5.3.5 FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 480<br /> Output for 5.0.1 - 5.0.5 FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 487<br /> Output for 4.4.2 - 4.4.9 Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/TIpGJ on line 4
Process exited with code 255 . Output for 4.3.0 - 4.3.1 , 4.3.5 - 4.3.11 , 4.4.0 - 4.4.1 Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/TIpGJ on line 4
Process exited with code 255 . Output for 4.3.2 - 4.3.4 Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in /in/TIpGJ on line 4
Process exited with code 255 . preferences:dark mode live preview
162.92 ms | 401 KiB | 216 Q