diff --git "a/Dokument\303\241ci\303\263.odt" "b/Dokument\303\241ci\303\263.odt" index f9fd3ca3fc50c610f191a3c2be130150bffb5a5d..ae55bac7d3e123cf0adfb06378c6ba97bb305546 100644 Binary files "a/Dokument\303\241ci\303\263.odt" and "b/Dokument\303\241ci\303\263.odt" differ diff --git a/NHF/include/heap.h b/NHF/include/heap.h index 819c5c7f1dc18520766825fcba29a5bf17c5497b..c32f238c60b00964e7a1a347b82c85756bef4409 100644 --- a/NHF/include/heap.h +++ b/NHF/include/heap.h @@ -1,5 +1,8 @@ #ifndef HEAP_H #define HEAP_H + +#include<ostream> + #include "mem_block.h" /** \brief Egy memóriamodul tuladjonságai. @@ -14,7 +17,13 @@ class heap * */ heap(const memnum size); - ~heap(); + ~heap(){delete [] blocks;} + + /** \brief Visszaadja a memória méretét + * + * \return const memnum A méret + * + */ const memnum get_size() const { return size; } /** \brief Ha lehetséges, lefoglal egy megadott méretű memóriaterületet @@ -23,7 +32,7 @@ class heap * \return memnum A pid, amivel később a process azonosítani tudja magát * */ - memnum allocate(memnum block_size); + memnum allocate(const memnum block_size); /** \brief Megszűnteti a kapott pid-val kezdődő memóriafoglalást * @@ -31,11 +40,20 @@ class heap * \return void * */ - void free(memnum pid); + void free(const memnum pid); + friend std::ostream& operator<<(std::ostream& os,heap& mem); protected: private: const memnum size;/**< A memóriamodul mérete */ mem_block* blocks;/**< Pointer a foglalt tömbre */ + + /** \brief A worst fit stratégiának megfelelően megkeresi a választott blokk kezdetét. + * A stratégia szerint a legnagyobb egybefüggő memóriaterületet választja ki. + * + * \param block_size memnum Az igényelt blokkméret + * \return memnum A process leendő pid-ja + * + */ memnum findfit(memnum block_size); }; diff --git a/NHF/include/mem_block.h b/NHF/include/mem_block.h index 31d7209e2669c1a47f6077a03bf01d824499325c..a6b9647e120e49493cac8d9f44436ac001bb0eb3 100644 --- a/NHF/include/mem_block.h +++ b/NHF/include/mem_block.h @@ -7,15 +7,20 @@ typedef unsigned int memnum; * Minden byte-hoz hozzárendeljük az alább látható három tagot, * hogy ne kelljen bonyolult nyilvántartást fenntartani. */ -class mem_block +struct mem_block { - public: memnum block_size;/**< Annak a blokknak a mérete, aminek az elején ez a byte áll */ bool filled;/**< Jelzi, hogy az adott byte épp foglalt-e */ /** \brief Beállítja a byte adatait töltetlenre, és 0 blokkméretre * \param false */ mem_block():block_size(0),filled(false){} + void set(bool fill=false, memnum block_size=0) + { + filled=fill; + this->block_size=block_size; + } + void reset(){set();}//Csak kényelemből, nem biztos, hogy érdemes bennehagyni. }; #endif // MEM_BLOCK_H diff --git a/NHF/include/process.h b/NHF/include/process.h index 27762c863acf1415465b255e000e7f813c120b17..4b855f0264321ef55cf0801f09251b59be3c9930 100644 --- a/NHF/include/process.h +++ b/NHF/include/process.h @@ -8,8 +8,8 @@ class process { public: - process(memnum block_size, heap& mem); - ~process(); + process(memnum block_size, heap& mem):mem(mem){pid=mem.allocate(block_size);} + ~process(){mem.free(pid);} protected: memnum pid;/**< A process pid-ja */ heap& mem;/**< A memóriamodul, amelyben a process a memóriát megkapta */ diff --git a/NHF/main.cpp b/NHF/main.cpp index 0448747f2355d6f64de0e3ae7b75b4a74d19b769..5cfadafb11994c8abc3bcf0bb107417707ab86c8 100644 --- a/NHF/main.cpp +++ b/NHF/main.cpp @@ -1,13 +1,19 @@ #include <iostream> #include"proc_test.h" +#include"test_container.h" using namespace std; int main() { - heap mem(2000); - proc_test x("kutya",process(1500,mem)); - cout << x.get_name() << endl; + heap mem(20); + cout<<mem; + cout<<mem.allocate(5)<<endl; + cout<<mem.allocate(5)<<endl; + cout<<mem.allocate(5)<<endl; + cout<<mem; + mem.free(5); + cout<<mem; return 0; } diff --git a/NHF/src/heap.cpp b/NHF/src/heap.cpp index 03d600473ae0d5d7dabb9b5a4119569009a4bc0f..a6c6fe8d585b5a7df1761272d4df14b54a354389 100644 --- a/NHF/src/heap.cpp +++ b/NHF/src/heap.cpp @@ -1,32 +1,85 @@ #include "heap.h" -heap::heap(memnum size):size(size) +heap::heap(const memnum size):size(size) { blocks=new mem_block[size]; blocks[0].block_size=size;//az egész memória egy nagy töltetlen blokk } -heap::~heap() +memnum heap::findfit(memnum block_size) { - delete [] blocks; + memnum max=0; + if(block_size>size) + throw ("Kivétel");//hibakezelés részletesebben kell + for(memnum i=0;i<size;i+=blocks[i].block_size)//0-tól kell indítani, különben a léptető művelet 0-val növel + { + if(blocks[i].block_size>blocks[max].block_size) + max=i; + } + if(max==0 && blocks[max].filled) + throw ("Kivétel");//hibakezelés jobban + return max; } -memnum heap::findfit(memnum block_size) +memnum heap::allocate(const memnum block_size) { - //egy maximum kiválasztási tétel + if(block_size<0) + throw "Kivétel";//hibakezelés jobban + memnum start; + try + { + start=findfit(block_size); + } + catch(const char*) + { + + } + memnum original_block_size=blocks[start].block_size; + blocks[start].set(true,block_size); + for(memnum i=start+1; i<start+block_size; i++) + blocks[i].set(true); + //Az eredeti blokk maradék részének felparaméterezése + memnum new_start=start+block_size; + if(new_start<size && !blocks[new_start].filled) + blocks[new_start].block_size=original_block_size-blocks[start].block_size;//fölösleges set() függvényt használni, mert eleve csak a töltetlen területre állítja be + return start; } -memnum heap::allocate(memnum block_size) +void heap::free(const memnum pid) { - memnum idx=findfit(block_size); + if(pid<0 || pid>size) + throw "Kivétel";//hibakezelés jobban + memnum next_block_idx=pid+blocks[pid].block_size; + for(memnum i=pid+1; i<next_block_idx; i++) + blocks[i].reset(); /* - * meg kell írni a blokk paramétereinek beállítását - * és adott esetben a blokk összes tagjának módosítását. + * Az új üres blokk méreténél figyelembe kell venni, + * hogy az utána következő blokk telített, illetve, + * hogy az előtte lévő blokk telített-e. */ - return idx; + memnum before=0,after=next_block_idx; + for(memnum i=0; i<size; i+=blocks[i].block_size) + { + if(i+blocks[i].block_size==pid) + { + before=i; + break; + } + } + if(!blocks[before].filled)//ha előtte is van üres memóroaterület + { + + } + blocks[pid].set(false,blocks[pid].block_size+blocks[next_block_idx].block_size); + blocks[next_block_idx].reset(); } -void heap::free(memnum pid) +std::ostream& operator<<(std::ostream& os,heap& mem) { - //az allocate inverze + for(memnum i=0; i<mem.size;i++) + { + os<<mem.blocks[i].filled<<"\t"<<mem.blocks[i].block_size<<std::endl; + } + os<<"-------------------------------------------\n"; + return os; } diff --git a/NHF/src/process.cpp b/NHF/src/process.cpp deleted file mode 100644 index 5184f5e88f07286d6a445dbb8b9bdb840e7fcaea..0000000000000000000000000000000000000000 --- a/NHF/src/process.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "process.h" - -process::process(memnum block_size, heap& mem):mem(mem) -{ - pid=mem.allocate(block_size); -} - -process::~process() -{ - mem.free(pid); -} diff --git a/diagram.uxf b/diagram.uxf index a4c0f5d03419101c53363fd3ba2b0f38e605eef5..99e4c7fd5a99f65fd3b58aa9e967c818ba2ba4f8 100644 --- a/diagram.uxf +++ b/diagram.uxf @@ -13,7 +13,8 @@ /+ mem_block()/ + block_size: unsigned int //+ byte: char -+ filled: bool</panel_attributes> ++ filled: bool +fg=blue</panel_attributes> <additional_attributes/> </element> <element> @@ -24,7 +25,8 @@ <w>150</w> <h>50</h> </coordinates> - <panel_attributes>lt=<<<<-</panel_attributes> + <panel_attributes>lt=<<<<- +fg=blue</panel_attributes> <additional_attributes>30;30;130;30</additional_attributes> </element> <element> @@ -49,8 +51,8 @@ {pid:} unsigned int //valamai, amit ha átadok a freenek, akkor tudja mi hol van. + free(pid: unsigned int): void - -//operator<<</panel_attributes> +//operator<< +fg=blue</panel_attributes> <additional_attributes/> </element> <element> @@ -69,7 +71,8 @@ mem: heap& /+ process(block_size: unsigned int,/ / mem: heap&)/ /+ ~process()/ -//destruktorban ki kell adni egy free-t a heap-nek</panel_attributes> +//destruktorban ki kell adni egy free-t a heap-nek +fg=blue</panel_attributes> <additional_attributes/> </element> <element> @@ -81,7 +84,8 @@ mem: heap& <h>90</h> </coordinates> <panel_attributes>lt=<<<- -//ezt a jelölést azért át kell gondolni</panel_attributes> +//ezt a jelölést azért át kell gondolni +fg=blue</panel_attributes> <additional_attributes>30;30;30;70</additional_attributes> </element> <element>