From 36358c9489cebd702cdf8152b14c017100caf2b8 Mon Sep 17 00:00:00 2001 From: kh06089 <kh06089@ajou.ac.kr> Date: Sun, 17 Jun 2018 22:21:23 +0900 Subject: [PATCH] last submit_assignment4 --- alloc.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ alloc.h | 10 ++++- main | Bin 14972 -> 14984 bytes main.c | 54 ++++++++++++++++++++++- 4 files changed, 197 insertions(+), 2 deletions(-) diff --git a/alloc.c b/alloc.c index 931b9fd..8a2d385 100644 --- a/alloc.c +++ b/alloc.c @@ -1 +1,136 @@ #include "alloc.h" +#include <unistd.h> +#include <memory.h> +#include <stdio.h> + +void *m_malloc(size_t size); +void m_free(void *ptr); +void *m_realloc(void *ptr, size_t size); + +meta *meta1 = NULL; +meta *meta2 = NULL; + +int mode = -1; + +void select_mode(char cr){ + if(cr == 'F'){ + mode = 1; + } + else if(cr == 'B'){ + mode = 2; + } + else if(cr == 'W'){ + mode = 3; + } +} + +meta *find_block(size_t size2){ + meta *temp = meta1; + meta *block = NULL; + while(temp != 0){ + if(temp->free != 0 && temp->size >= size2){ + if(mode == 1){ + return temp; + } + else if(mode == 2){ + if(block == 0 || (block->size - size2 > temp->size - size2)){ + block = temp; + } + } + else if(mode == 3){ + if(block == 0 || block->size < temp->size){ + block = temp; + } + } + } + temp = temp->next; + } + return block; +} + +void *m_malloc(size_t size){ + if(mode ==-1||size <=0){ + return NULL; + } + if(meta1 == NULL){ + meta1 = sbrk(size + sizeof(meta)); + meta1->prev = NULL; + meta1->next = NULL; + meta1->free = 0; + meta1->size = size; + meta2 = meta1; + return meta1 + sizeof(meta); + } + meta *block = find_block(size); + if(block == 0){ + block = sbrk(size + sizeof(meta)); + block->prev = meta2; + block->next = NULL; + block->free = 0; + block->size = size; + meta2->next = block; + meta2 = block; + return block + sizeof(meta); + } + block->free = 0; + if(block->size - size > sizeof(meta)){ + block->size = size; + meta *block2 = block + sizeof(meta) + size; + block2->prev = block; + block2->next = block->next; + block2->free = 1; + block2->size = block->size - (size + sizeof(meta)); + block->next = block2; + } + return block + sizeof(meta); +} + +void m_free(void *ptr){ + meta *temp = (meta*)ptr - sizeof(meta); + temp->free = 1; + if(temp->prev !=0 && temp->prev->free !=0){ + temp->next->prev = temp->prev; + temp->prev->next = temp->next; + temp->prev->size += temp->size; + temp = temp->prev; + } + + if(temp->next !=0 && temp->next->free !=0){ + temp->size += temp->next->size; + if(temp->next == meta2){ + meta2 = temp; + } + temp->next = temp->next->next; + if(temp->next->next != 0){ + temp->next->next->prev = temp; + } + } + + while(meta2 !=0 && meta2->free !=0){ + meta2 = meta2->prev; + if(meta2 !=0){ + meta2->next = NULL; + } + else{ + meta1 = NULL; + } + + brk(meta2); + } +} + +void *m_realloc(void *ptr, size_t size){ + meta *temp = (meta*)ptr - sizeof(meta); + if(temp->size >= size){ + return ptr; + } + void *new_ptr = m_malloc(size); + memcpy(new_ptr, ptr, temp->size); + m_free(ptr); + return new_ptr; +} + + + + + diff --git a/alloc.h b/alloc.h index 3245f55..628ebb2 100644 --- a/alloc.h +++ b/alloc.h @@ -1,8 +1,16 @@ #ifndef _ALLOC_H_ #define _ALLOC_H_ +#include <unistd.h> typedef struct meta_struct { + struct meta_struct *prev; + struct meta_struct *next; + int free; + size_t size; + +}meta; -} meta; +meta *meta1; +meta *meta2; #endif diff --git a/main b/main index 46ac1c4e7ddb9537dcab3abadc4e6507ba893967..ea9c6baf6268190d1cc43e8ebbddbc30d50bc301 100755 GIT binary patch delta 2290 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 delta 2290 zcmeAu{ZleQfw5<!VmYJ8q2Kct_IRFe-@5PCQm>UhF)sTAj5n`g6yUGFz`(%3Q^CZ* zV93D0P{DuzOpF{;7#SFtnAqc)7#NsX*f)WAEbMDR6eHU-5XHn=#K6G7%)*+PSHi%= z!Kwoi<X~UH$iTn?GKtkZjDdlHWi=B618Z{?1IQRwLy%-INTel&fuSB`@>39xg^gu4 zNChL?T#$+y1_lPU8^#O_4D6f?3=9J7tgjdt7&zpZ85r2vKuiV>BPIq0c6Jb(g(C(e z&fyPI!m$h_&bbKWF$Ol4wICOKV`N}p=LRv^SQr@@7&t*zu?K+cpThC6nTdgcV+}~} zCy)sY9Ks-h?^8iKIbJd{FmU_;u{k)dgT#M=*gPD+LE^taYypmWAicjqY!QxnkeWXr zwgks6koaE^TZTgcB>oS?R^a*tVlyyK1=+8{wG+f+1o0R&xFSJXn7|wzuHzsM3*&Ak z1_lGJ`5<L%j0c$*7)-dPgE$<FAm>_eod<Dvz#JQ{dXT&L81oqz7#z4FK^!4Q9R>yl z7p?*jN0`x(fq}t|>l%n7!dQQtiGjhL%L&AjU<CQkgR2?DQDkgnU|{g!G6$Kh$vByT zfgyy;4#d#{b0WB0K^$!`Cx*)h#L)qB61ajv96d%*45V-!1(~J~c3cJ*7f8mC@h%es zLk<JCJ~M+R1IIM>(~JxZJREaC-sCU@shA65GH|4Vw9W&0n1v&Ia)Pj(u@xwR>41FA z%)c3w^o&3bW7cM7U=T<H^TEtTj0_CSM&=;Vcatv)%P0qdl2jU4UnEGhh>3xLB@M(B zW)S?%z`!7)Gg&}Hf>Cm^rihHzenticMt+d$rOXTr!VD5$m>3us4Qp9JX_|pS5=4oz zGBAj4o}4ctEw2tzF4D}(z`$Jkq*@{hq*xTBTaJN&LA-nNN|A~3U_oV&Aam)RYEflo z1_nkI2=_s?xX0v3Q3C<6pe9_fd-6=tHTBJ)9KZ{*nw8mS0SkvxCrE$~BH*!rg+uuy z69WV13Q#C1YcMk~aIOR~c|hTEmz9A*v4??y;XfmTk`l<3Y-d;*7+9GTKnCS9FfcH( zgREm^PFTUhq4I!{fdPa$)-tMs0vCi8)w&rO7(kd&PQ9Ojfnf#%0|VziMi5iYgOP#3 zWAalmje1asfiNS#DhD$I0|+y?u!2efO;AWPf=ihoW=JVx(80o?%FMt3%IDN5Wth$D z;l&IyMlr(-DrWGNGAu}?3@f6PVMQusSdmH@R-{sf6<W&FBNa2O;9>?;wlGX#`v@vo z!9@!jQqjVORJ5=m6)kK?MGG5J(ZYsQw6Gx+Eo`u&1yts+LCO|RP}#x;E?XE>I6*}V z8?<QQ1Qji8(4vJCRJ5?MFm3=9Eu5gDg^i7I8>ndE1Qji8(4vJCRJ5=`ixy5$(ZU8T zS~x*P3mdd(spkZhEo{)Tg%eb^u!%740TnHrprVCMg7FL!1A_-AsAyq>7A>5hqJ<4w zv~Yro7B*<n!U-x`*q}uVC#Yy)gBC5EprVBhTC{M2iWW9d(PGEIkiiKmTi6U4FM-Pz zE`4SO1~zEX!ZruwO>oh|HW$Q%6fJD?KpqAaEypD7)Iq782~wPhFf%alfr=9*BQO(G zoG=+FfJEO-)|QfC+&|evO3BO}l!>K#nHd-wI#@WmK-p;yh$rF*mH-uhpmZ+^&S)|q z8O9(npUDfPL^Z$}${3VK1v*(cxIkHR4igIlgE*+}Vl)P6Wtzw!<}>-Olr*E&<eyU7 zj8T(SrIn<>W<`R`0%bSJjxH7sBT%s<>@hh}T1^?Oy$Yh81!8eENHNDm1~x7RMw$6y zX_Hq;hk{ELMlO&Hq*Rdwl`4$f5CKrBA_po}*jIo8NDfr0u&)F$WsiYe$_ptoEEceE z$R{#0Fn}<J7>hzuQ8ohza|o~~f<hC785ji_Rr!RunfavoLd69c1;iN`m{c~`$)vKY z>u2QWrs^kV<(KLkS{N9{`v=D-78hrx=jEp6m6$NZd-}(_dHT3+7E_rf%9uBKt)()f i!sLsV>Ws~ke_E<Ds!dk3QfE||>}jRWC^EUwN*n-P8Ca13 diff --git a/main.c b/main.c index b5fba06..9c28879 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,58 @@ #include "alloc.h" +#include <string.h> +#include <stdio.h> +#include <memory.h> + +void *arr1[512]; +int temp; + int main() { - return 0; + int num1; + int cr; + scanf("%d %c", &num1, &cr); + select_mode(cr); + while(num1 != -1){ + char class; + scanf("%c", &class); + if(class == 's'){ + char arr2[512] = {}; + int num2 = 0; + while(1){ + char cr2 = getchar(); + if(cr2 == '\n'){ + break; + } + arr2[num2] = cr2; + num2++; + } + arr1[temp] = m_malloc(num2); + memcpy(arr1[temp], arr2,strlen(arr2)); + temp++; + } + else if(class == 'f'){ + int num2; + int num3; + scanf("%d %d", &num2, &num3); + arr1[num2] = m_realloc(arr1[num2], num3); + } + else if(class == 'r'){ + int num3; + scanf("%d" , &num3); + arr1[temp] = m_malloc(num3); + temp++; + } + num1--; + } + + meta *temp2 = meta1; + while(temp2 !=0){ + printf("%d %d" , temp2->free, temp2->size); + if(temp2->free == 0){ + printf("%s\n", (char*)(temp2 + sizeof(meta))); + } + temp2 = temp2->next; + } + return 0; } -- GitLab