From 8aa79f62b789966c6df7fdf2a0fa3849b16115b1 Mon Sep 17 00:00:00 2001 From: Klagarge Date: Thu, 28 May 2026 20:53:41 +0200 Subject: [PATCH] feat(lab04): add cgroups CPU --- .gitignore | 1 + doc/lab04-multiprocessing/main.typ | 96 +++++++++++++++++++++-- doc/lab04-multiprocessing/max-cpu.png | Bin 0 -> 36700 bytes doc/lab04-multiprocessing/shared-cpu.png | Bin 0 -> 72652 bytes src/04-multiprocessing/Makefile | 11 ++- src/04-multiprocessing/justfile | 4 + src/04-multiprocessing/max-cpu.c | 70 +++++++++++++++++ src/04-multiprocessing/max-cpu.sh | 57 ++++++++++++++ src/04-multiprocessing/shared-cpu.sh | 96 +++++++++++++++++++++++ 9 files changed, 325 insertions(+), 10 deletions(-) create mode 100644 doc/lab04-multiprocessing/max-cpu.png create mode 100644 doc/lab04-multiprocessing/shared-cpu.png create mode 100644 src/04-multiprocessing/max-cpu.c create mode 100755 src/04-multiprocessing/max-cpu.sh create mode 100755 src/04-multiprocessing/shared-cpu.sh diff --git a/.gitignore b/.gitignore index 0341fa9..23d320c 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ build src/03-led-controller/led-controller src/04-multiprocessing/multiprocessing src/04-multiprocessing/cgroups +src/04-multiprocessing/max-cpu src/05-optimization/ex01/basic src/05-optimization/ex01/optimized src/05-optimization/ex02/optimized diff --git a/doc/lab04-multiprocessing/main.typ b/doc/lab04-multiprocessing/main.typ index f1172dc..c24737a 100644 --- a/doc/lab04-multiprocessing/main.typ +++ b/doc/lab04-multiprocessing/main.typ @@ -98,13 +98,13 @@ SIGINT received The @multiprocessus shows the PID and the core of the processus and they can be compared to the output of the executable before. The child processus has the PID 273 and the core 0. The parent processus has th PID 274 and the core 1. -== CGroups +== CGroups memory The goal of this part is to understand how to use cgroups to limit the resources of a process. We will initially focus on memory, but cgroups can also be used to limit CPU, I/O, and other ressources. -For limit the memory usage of a process, we cans use the `memory` subsystem of cgroups. We use cgroup v1 with our Nanopi. +For limit the memory usage of a process, we cans use the `memory` subsystem of cgroups. We use cgroup v1 with our Nanopi. -We must first mount a temporary filesystem for cgroups: +We must first mount a temporary filesystem for cgroups: ```bash |> mount -t tmpfs none /sys/fs/cgroup ``` @@ -138,8 +138,8 @@ We can then run our test program that allocates memory in a loop and see what ha for (i = 0; i < NUM_BLOCKS; i++) { // Allocate a block of memory - blocks[i] = malloc(BLOCK_SIZE); - + blocks[i] = malloc(BLOCK_SIZE); + // [...] // check if failed and error, clean and exit @@ -176,7 +176,7 @@ It's possible to modify this behavior in several ways: === How to watch the memory usage? -We can monitor the memory usage of a cgroup by reading it directly from the file in the specific cgroups: +We can monitor the memory usage of a cgroup by reading it directly from the file in the specific cgroups: ```bash # Current memory usage in bytes @@ -187,3 +187,87 @@ We can monitor the memory usage of a cgroup by reading it directly from the file |> cat /sys/fs/cgroup/memory/0/memory.max_usage_in_bytes 20971520 ``` + +== CGroups CPU +To check this part, we need a tiny program that consumes CPU with at least two process. +The following program creates a child process that performs CPU intensive work, while the parent process also performs CPU intensive work. We can then use cgroups to limit the CPU usage of one of the processes and observe the effect. +```c +int main() { + pid_t pid = fork(); + + if (pid == 0) { + cpu_intensive_work("Child process"); + exit(0); + } else { + cpu_intensive_work("Parent process"); + wait(NULL); + return 0; + } +} +``` + +Based on previous exercice, we should already have mounted the cgroup filesystem. +```bash +|> mount -t tmpfs none /sys/fs/cgroup +``` + +We can then create and mount the cgroup filesystem for the `cpuset` subsystem +```bash +# Create a directory for the cpuset cgroup +|> mkdir /sys/fs/cgroup/cpuset + +# Mount the cgroup filesystem with cpuset +|> mount -t cgroup -o cpu,cpuset cpuset /sys/fs/cgroup/cpuset +``` + +Now we had the prerequirements, we can create 2 groupes. One for each of our running programme. With the following command, we attribute on ore more CPU to each group (`cpuset.cpus`). I'm not sure about the `cpuset.mems` file, but it seems to be related to memory nodes. It's definetly a topic that should be explored more in depth, but for now, we set to `0` as specified in the lab instructions. + +```bash +# Create and allocate CPU for programme "low" +|> mkdir /sys/fs/cgroup/cpuset/low +|> echo 1 > /sys/fs/cgroup/cpuset/low/cpuset.cpus +|> echo 0 > /sys/fs/cgroup/cpuset/low/cpuset.mems + +# Create and allocate CPU for programme "high" +|> mkdir /sys/fs/cgroup/cpuset/high +|> echo 2,3 > /sys/fs/cgroup/cpuset/high/cpuset.cpus +|> echo 0 > /sys/fs/cgroup/cpuset/high/cpuset.mems +``` + +We can then open 2 shells and run the test program in each of them, while adding the programme to the corresponding cgroup: +```bash +# In the first shell, add it on the "low" cgroup and run the test program +|> . ./max-cpu.sh low + +# In the second shell, add it on the "high" cgroup and run the test program +|> . ./max-cpu.sh high +``` + +We see on @max-cpu that as expected, both process in program _low_ is limited to CPU 1, while the programm _high_ is using CPU 2 and 3, one for each process. + +#figure( + image("max-cpu.png"), + caption: [CPU usage of the two programmes with dedicated resources] +) + +To share resources at 75% and 25%, we can use the `cpu.shares` file in the `cpu` cgroup. We attribute a value 3 time high for the _high_ group than for the _low_ group. + +```bash +|> echo 75 > /sys/fs/cgroup/cpu/high/cpu.shares +|> echo 25 > /sys/fs/cgroup/cpu/low/cpu.shares +``` + +Then running the test program in each shell, we see on @shared-cpu that the _high_ process is limited to 75% of the CPU, while the _low_ process is limited to 25%. +```bash +# In the first shell, add it on the "low" cgroup and run the test program +|> . ./shared-cpu.sh low + +# In the second shell, add it on the "high" cgroup and run the test program +|> . ./shared-cpu.sh high +``` + + +#figure( + image("shared-cpu.png"), + caption: [CPU usage of the two programmes with shared resources] +) \ No newline at end of file diff --git a/doc/lab04-multiprocessing/max-cpu.png b/doc/lab04-multiprocessing/max-cpu.png new file mode 100644 index 0000000000000000000000000000000000000000..3b376d0fc573aede477d62c3fa3ea31bbcbde731 GIT binary patch literal 36700 zcmb^ZcQl;ey9SIa5iLkV^dy1=LqZUuMGuKyhf$*UIy$2yMD$3AF1o?!y+@DU>lmUN zy)%aQk;&GqAao{CzN2%_vRbpC^+^@F9O6e7vEqDms`fV9)5}>@2y{ zpwG?dx%N|Lom0@V`2EuWx4jkCxG_qqUZTmpukHBPJy*u2rbgB{ugZ8=Ixfo8U+nih zeEj$z(>v|8c|ZN(HuCl1+?H!6xl0+Ocz}M`CT&KVpq83|{_h}iAxq24>+%;4q|{s{ zz*tO5k4arXRIkjF$U56%jJkV+n(FUwQ_KapEw6@urJ|-b{{8J4(EVfiwlx3N!73#& zdQR@vgbIUnzK-yCKQ2h^g7~^`0jd}bi;YeRQRxhq1cQZ+cep!NKy-(z%(7u`>=dcJ z8~+%edW+gjmlI>pk4Bn$y1QEv_^hKohk1zkS7@nZ42blINnrB_e!Yu$#%m;ICu~K1 z!T3z_cXSz7kXm7){Q-DX^k{-LCffk^+6F)PSKSKfsK|-ZkA5@%#ju6qaC8QFnB;d$ z>-j5_*Y&AeQjhhl>Np_>$|suvGEEApycCTMUh}>?e3@U;8}SG0v`v9+Bg;i+m5hA`S!hMzAH+>Ph=Wh3bA__t0SW1^D32WByWtPWr6 zFlm8lMbF(|sD>W|#TYXDAVeiJ>|UU>)^2SE%0AqJC#ql$4Hjl9iEZJm8$BBL@05&pGf()V> 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%0Ai%)MPUmZ{8*5>m2FuW3qzB@B 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 J1Y4xm literal 0 HcmV?d00001 diff --git a/doc/lab04-multiprocessing/shared-cpu.png b/doc/lab04-multiprocessing/shared-cpu.png new file mode 100644 index 0000000000000000000000000000000000000000..f170ebf691bd61b6ed456650fb822c368f1d5c18 GIT binary patch literal 72652 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%0DfF~czx90$9cGECN9jwKmPFuHdC$UVQM+2 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%0A1I9`H~lxomlk~2X8*~ z<$p(IM{pS^h#9tng96kYqyGH_N`>V#pU;=0xva<>P?gzUSz-bcdfS8tfPgJCfr{rr z^V`jLwr;l_ZATByEqe4awJ#3-U&q6uMqz&QoS+P>1bj-HSv*;T1)+rWG+5Wz)sPaa zV+ea1>%*YAm%7oia4)|aHR~o)1+V81_|ozkX#KS4t91C`tf@p z)@&Pa?S_)55|;fKe#2L{(uTJzPP>g39pPT(@OCb9>A>?~nXp!USg6){f6NMAEI3Y1 ze82gDsmh1s=}tC!)D6i?E#)qu4+1)TU>W(QYe(0QkzmRrg4Id1FRCy%iU9=-vi%5% zKXBX)Bfn+!ejhtGSd+8Ux6I%QnT4XJyzc(;>a`}MOBpwQS%6B+q0XZ3(xtBWJQ`WZ8WbYCZPozBpm?yk1HT`(-3AM&I>J40P^N z{zca~tZ<)daxxAOnxsvZEBf!Y!M6$2-cRjY zGr(T4bbkn<3FH|?APr`P@`QSoZG2FTH=rk-Z$WziV+}2RJ=h?J!F7#BXXvLhols7k zwXjCf6!|t}v1F+okr*GlA`yf4cHDFX*O2cZogJY3!gRlGY|fG@=kvu}7?H1bi%It0 zp`?v^+hDN?Q$9bNyKCFU<(_%|9)J~9Fw(XF9))r!Fat(jG!^r`fTYAN=S6pQX;(=V zZlk?&w>;kzwEJb}k`^DUwEOO@ zNX7Sg0ooCH_Z$Y`xDu!(%W!uO)XA{CB)XXm3d~h`^rGrV5k^;m%G;!}AU*IHAPith zyRP_X+~hPXSP=N0b+O445+~A|rxE!pkeyt8$(^*WcYMAPbeV14+!C4A?;(AxB9?n^ z*EP#ETjPZt(o3fedDJI!GFg0)1wh?^9(iS`1(z$g-dfB5m`|cz-9Cd~BEE*GlIhcj zz31M8dj;xD*iy>hR?5V^lZu7(HftS<_en0J;gvNg#r-vgQnoyDV&7A4GWeHH>npAH7iXNB483(rZocZ`DU%tUd18wS00pHSh+Ur%7RG zCeP5ojPi#R$U7gkN|~@42pCEP$vXL!A-GiOyF%nT171uf(;RJ5Rl+nFhp%_66xECZ~?8mwUd@tE0s6-L@S7!6 zuK9J@?CVCV>^?@AC~_Hy$a7loIQYY05SOHd-z#Xcxn1adz5sHp)|@q+uwsbjNcH9avH7M2eyJEHN{ zy@OVCX!s6F1k04&iZ3~*;Lpflj2zr$`>hMSY;&L1$K}a} zk%V1;0uRIF#(1wcRXB2awcC$fZ^8A*V3I_ySoBmLh996p;x9KL1j~&ebdY89BrkHm zcpf5M14VAP18^w0fvn+cWi{OL-4xOXWJDemTxy z%}AK13>I&|)5k3Wt8LiF$Cb~O<8GURvGU64;9(DKKK0nY4&)KK zo_Y(0-v+_y4i^TN|ClZbd#BWDzStw!C@SBH8kNJ*$fig~eTA&-JLjkD~Kc z!f7}WeNiiwSqA?`IFG&?YjYaMNQnbxy_!$nu2kyE;e3NaDEP08Xu};S*eV8rdEUH! z#IMc`j1dVLO+J=gw}eyAk@2H>T90LybQv zq^Y>n_fa@sI7}d(&-6e+GfuUlKad3a`yE5zI7Y`v{zyIb*lmIpvDd`mYCsf<%#lgE zwHX3Tu?CA?9(OLm=buCdL2TtsW^-io6}qExM;FkwXp2;gm6*Yv5eNVD-Mchf>sT%e zlaGHhLL6#CJZU3?T{;)&Z@6;)ac6GY%o z8*2nw$x_zoIlrIHC1UO z=YyGLxq54#CEwj{zc){$pY(>{7x)2}&ThSZ-$bkc_;D)IUKv5jy?;?=WhwqcbQs)! z=s<>gKyIYc*%J9XZ+bG}*M#&v#P=~Zj@5v}w4ej7_IPs#Ot{UFjMn}O!)9gQ@SDsi znmB52j^`ODhGQ_RfARi1T(`>gDRuR#opPmmkd}+#`}3apL4`_H3bzT})vX_%az$?t ztHv%q1t#?E6C{15TIW9}n~BqfNsodwKe|XzF(MNB@H-%KCR9E#+N;b|cETt{-lOkt zc4AT08r=LF%;6_!6K7uu93H6iWY0Z0s;!#`hbq|rI{K^bqosP2C#MF|Cen^Zqvc7s z#az)=it@|tE9r=@?77e9UAETpspf0TabHA&5%gCLs|9dFraT3uj=h6-R8_@`>NM_r ze!&RKN_;7V;>(r`2PQL**Sa}rd1pG(Dy@V_m*aPV#dAacKh+CZZX#I+l38i{k8}yK z0DIKe2yFBQ7$o26XY?n0TQlzDFVD^r=lKh8Ql#0!;SyxAUla`Z1Mr{u^q-J$TR`1) z8-}qj*0OsdN{lBn2HgnQt#J{d&z5ZdQe?4N!Ey473||2A9(521_M5AR2t6!(6-{z1 zH8P-GjUcc1<8fqzJ0V|wO;#IJe2C-=-@4Nf3qOTic30Y*(isOYL0_p`LUYdHnwRkJF@ahiH-f!8(7C`{>99i1>+Lyq<1f?nKk2uGm&-EWue4N})cedAdlpxx=L2qi8c1PFmayQ&OtKr8in(N$o% z@ApyG&5F=5r-4YihYeutxXqW4n_aBli}n-4?RVg1!XWa$Gq|XNpg#*RCOx@9GAM1DK^V!@#Pd&p3orX zh#MI4Ozg45KtO{-!pRlUYTW87Q4w?MIw>da^v6JdzB~zAzm4+;RM$TFPm;^oobfz!-sH zj~|SA&Hy6GOtb&@E-BY&p^QK^^G9fBSz3hmBYW zxIzuX^jUnmMQ4u)ctg)I=o0Gm($8K5ZRJ;!Y$tRArjQ5XMQ6t-pDhk~T#@J8uo>+c zw4zX+oMGj5m|Y5qvKqU-D;S1HWI6+H^@v61+j)2N(fX&Hz|6yu#89qiKMmfJ8B`)q zN~i(U*erjd@JxyyESk34*!!k0l+8ac8XJ%X?bP=@tS_fnyX{V93^t$m=oN)$DnoeI z;{Cjam4+h*TSJM%mp^LDVU;EASY<%#aiv%^+{i|&e#I6m!}q$w9IX|k(h2_7P-R?5Pg*CUe1II7x7z^)8evz5 z)r?WgO>|;Evmw&LwKj;u&68qY??s>PiCzA&9$p_Wnk1(|{E)JfXMO0arD%qLSB(lS zF{VXA8#iHEXhF~(C&EYPJe1m{g#}T~aa10^f+D{xad*jfxWQXf?ldl*JLaS6mh{XZ za2U8^$Esxdnce<)TotjN7*1%&%Kz_RY6P>SO8)xxT zv!R2jAB$cDXLdWpdQP*#_vVS~`m2C7LbF3}u{s`;l?7EZteZ>JFH(ypd`peFJmN@! zodxmdoR%Lizw5sWT$=-#>!}f~T`+<;b*724ukz+N+c_HCA5Jl#NZo|mO8K5N#Hoii zL{75ac4WOADUheGSsY~tWa`S^{IqPU91B<-O-?#g;(jM=5h5rn{>f-Gul+l3jFOas z&V2d4rqVf@aLHsAJcvXd$)16JmqmrIlu~m48%uj`U)G}M2YLv4ruSc-VNHgTIh7@Y zq!W>qqk2(3h*WfBujrG4#I<&07PrTUa0bEKKyQ%6`b32o>Hrg3W#H`C&j znc>-#`o^ug`$nLsYCNtI60&Cf-)UVpP;7EhqlH5(g%qhO(@f-2a6(>CY2ISErA10o zu9NIk)hs}_`gbSb{|VA1jWhm?qP1|Ozi2yRZc8+&sty*aWYKt<7Y*bUtdH=oxGtoK z@vWL}oF22DZLhUgQ%r+Jh=s~ICR)0T{^>T^WXZDBtT~U^uCXxez@!#v)L+hSrnsx{ z7oD=qkeP&Z38sE?iD&8ZoAju1UdKt+l^*TSZEvyzwZ2UAl4=p;;ITx;{H!CLJ~yk) zG^R;Z+s?GBO-dQH(cgJL$&hfxas1Ku!g0i^eyh`ip0xe*6^9IDjF(K=_&=iU2mll0 zkUY>~c84#BZ(&~wh=#xlpiR6e#Yyu+!Gh)@p4*G#FtJR%gLviZ7JtiTT`H>e;2v`s z8CXT*5l7Ww6o=4%K#p@K9^b~U*6B1STia+0jrIeX+S@dS%>DdvV*Q@mlY_3v;g!;0 z34Amv#hmhL{PFip3=Xi;P_SRbgRPdSO!v**S`s#0H;@D?TzY-q@a;yXM@=1poZmDs z0`iighHDo!=i8AHg)((*38Y(C0A5Fr!YmAYvW_=rw)%mH^4=}sK$OnH!LpXax^oG{ zPUDE*^2!7z!-4xu zqoHC+w0rY)gSkELQr4W0V~jTHH^%Shlss5>K&=NuWEKxtZa4Rhc@3Ye2>G$e z!H0g-%Fh3&+VaUbi;F%?vgMqO=u>i6U2cUDb&AvWK%p`lN3fD2DoQMf3i4T|%s9&+S(!Xvdz6YH z7GL;oZsx%wh~Q}MHuNr(`xug{Lq-qaF>LEU(IFx=m_L$Cd=c(Eo(i- zly6ezX`{aiIEmKlKUUcPK;^u$m|&28fxguvjwIEHWZ?a|64wh&e(t3;slqASb>DN_ zi!}BBlZbWah+DU4q6@Xo&0Ve28k_rP>rr5AK3pT`rz>C8``cBwi4g@)%%#0UyC)W( zQro31R5Xcbr@8_ZLq`WiMT zhK02r6Ixv1*?K@-L~)1a-NC4*&9?3PE)?4x>J(Sq{Ti;`U@6$V=}t|n-VlmTr%6Ft zNZCfgTQS^6l=3y@^U2)#u$WHDfJ#q{@xKfAFa@{|QFZ=PyA|@+u1&@hAIHE~r5G6Z zsjXwydv{Hvrh&FvZK~b6A{5m#_!pV`zXHmHba>&infn%W0JlhIA-7a#B-sS5`|~>y z*Y1p%S^AGdvCk7(#Xvtp?Z8_!`R@zYi|>1A{AEXb_aNntIWyK(1NR}GsZv=3tt z%g4t~2tb#|JNbW&4lbbSZbr<(Y$KS{@d9Jh$<$=MLcHk{Daym-4;kSHJ>6ur z=G$SG#dZmalODvXu(vlVt-=sLwOIX?=>2L&`_b@7e)EEY=O{3-HN%FxJzj)@fZhGR(NK9cE87J^~?8ggQ zy|B}C;%=>n`w?gm7v4K48tD92V{1^|-Li}_w_iwN8nk?{zq%MZsVc^8WK;XRMkNh& z^1i%3Iq~Qr12+}*Ny;e0hRx?oCIcYHmko7ysfc5q0XVMPzrF6S4|<~@;VNuIzH35u z4*Dh=hd|AP(L}ZDk(8e_6DUD(mZ0c}HssM;Yr^@zVWdn96xT}RN!sqJ+K=&aOS0#> zyXWLsTB1|t%=M{EGI9t=L~K@Z51mNH$HEzYL(N70KaU9;!^!i&F@!0f4C3E@RubLe zNOX3J$a4)6g~LAi04G3hR{IP1n}LHyiPY5PD%H6#XjFg9a^kj4RO1XQ)H>6E^YV|+ zyk_;jz*?+B2cl~|qD-QqM1Oyw@Ar*(xhyS(Ct2s3+zfu!wr}*Bk8_q(J zVruBi;1MgE#{Bl(|FQx(=e|$>v&Bk8xV`<29j7FmwI&I@rZS@lifltG((%9_1a`L& zC1-u&>^wRrwd&VQa<%$$Z?nAa_04cBRQWqp{d3Q@->27OE}j?*zks#-S+b^gL;7m4 z7f$4zU?_GLYn>VxoC?!@gNd{SV=PgPKeUQv1%GLsdAJ~OL>$egZd@Cv4^lFda4@tS zk#L4qsS{2m5~;#mm0S1hMt>xr2)Bkg5 z15#tCYn|T$;IIG&Bx&dCl}c){A2wO$Wj&vSh?lyN-jI|5lF(Nv62gU}#!e zU%fai1+s2h0TtC07@i{;$E22uCv(O`rAfeMczM$gjJj$8g4k-KPl^gIVD7{`Eb7|9?L!0&<>(|!I1LlhAboNqB9`6d*s<*IsL}DJ#2ulVfpYF_c zXLwII!#Le+tPeZsHK^g)2}sVlg$`T#?rZxB;%P^AjB0ZF?2q8Prl?ii&-!{5xpju@ zO_s%m$7%cQai_ZfOq5d)l%oV8Zx>J9Nvj-@O!`YufB=$1jw2K&kmwB5%p^pObU6Vc z#``Bv0>{0IqKUZy4MP2RkW6}-xL9a@Y*woR6TMvec zWx7On{gi!ina8QqO zo3|$GD@-zGmb|@zxUxMKBCrLU*zms%Q-$q_)(j3C6Rzeu;IZj;bYoKi;rp;rV><-3 zE7saei=GX@*NiZz63XE)!FNFaXOla33bp~4?INMUlj7`2d$6i3Tb2Gc=8A=$@eDXP z%~!X3S^B>&a1__yMcjezQAK*7(@m)?!axZQ`sNL>pz5e$PMs*<%g-n*-ZZ@WUc&!< z8!y9G0a|n+?D5;-e#E&)yuMY6Pc7${g9gq*#8ILUTp{4do8*yTmRFC76^%BxSmOvX zHo&5Erd(OtNpUYLCDJK*G+9CO))$Jz{{9n`1`K4IKHwj0c4}Wp_u&GareLNh8+M#| z^&FK_*|gSn_6_~rd|J9tKXyI9bC~OTQ_c|rq1k!6($Sc%r%xo)?cHy>3pM3lbGhz8 zAvxS)OSKxRkZ9;7pMiw9YBsgYsD@WYI{@5$lX`)q4?#SS)MN!7p53`3mN%QOdvo%u zn3Q_d;kN_8NReqDYJ>4f8N>ZzBM*QGC{rr`^Yv*0>*wW^V^hU-l}!2mn8yqqfq}lK zrrPdI8->qH#?X=LIDBKVXvKtjlo>6F?xtw1Wq`5oe6d>V8SFGHsXiEOEo5V2Z!l&4k+GD2#G6iI2Bh* zq++>p6zv{=coKB8h1ZW4oCSK&t6#Fnj#AUP2AcdAdf0Pu0;DyOQ_$vnkMz?CBRIg506 z8kZbyl{=Deddm5Hxp!+P8uUZz-|NGf+cX;F{st8+oD|^rbUv(!Y(aLRxPgSKoq5Ixu4N~Mwh~=qV4=LaauhdogeBX!nMYl-0Hvf-FRtNj7Q*ZRam z-+TUVFl*)(|G%n`Y3@1FN_`d5S?^pre6Fyx-aD(^ohEUCSc5Y;Q`}RQ+&bY+b4~E{ zU=3^0SYMG?`m5iqZL!hYgba|TQy4`eR1|E;BmB|T4*WQ{-^Ay_OxcrFEOPrfBv7CJ7p_XQC{Uvm#u;nqx6 zem$r(jcNpgepSRhWpV4YT~6hO59zG{RwgCSay)o1Snx(_7h`b;2EDp4tw{0rfDj!! zHielF#{tS;oMKH33=rZi9Mg%6x@>3|lzWlL4ABfshGT{jF*Oa2OHi}lWhGI-OS1>1 z7TQroeN=g5v^<4ddp43FrkWpaJHW4})cRZ@4KUE5`grx^v)xdCeQ5wyc4n^u~l6;76DGWBn?v`QTFv8Y?4puEH0(Qh%Z3WYtKp^JIzqWblJ0k3I zZTlXCgUtoXNO{(YLJxIF)4=Z@gT7%E=K znmHo;{V561>^~un>YJ_x!_lZUyXEZwSGZs3tNyJX&9#ox3JNmhY`{!^0EF7{kFIbM zDQ>2~1gbk-|1ol4``R3MR+;w!c#%5U=si%b-bZ@Tnc~+O=Qx)OdB9eZN)VkPM?>(t zS@z)x?{3p^wwN}?RJGr>Hl(~+cTQtDn0f3sUK5nF4v157O)Q3QLY}jQA4n)N3R_l@ zD%5dWP*Thng~z6>;6a!&rE_P2$gJWTG5F|#DV=;XbKaZ^wnQ3DStzAPRt_kFc1Tm; zD-787HzPG}#%8fS1+#{)NmHuU{xyyrx$gmN+hw?%HxMm(X!bZA2R(K>=I`xYq`fh?4WL>p%;b+cr$!j$RLezq$f9#Q}1 zu~xVJLS~*7g5c|iUZvh>Vdv2+gYyFN9x14zt_f(!=coU}2WP?)snvY-59ulW(dCQ% zMw2xm9kWUp?0$qCa_BKgLXI&+3fitPI5(;dS~K9VS>||>{IPpPpYV;KKkP(hL|$*O zi>K!iMQ}Qsx9g0NUzjD8JU0%dq`Pv2U1y<+h~^d0k$|Jdk1Sv){5hn7bN?I6BNNk( zF!CMWRJ-WMDdtSiZr2f^mGtpwNlgmK+i8}|W-I7>eQy;kbsCV7sk_pjl&D`K#?B8| zBYehENM|x%EIUx8e+d0X%1uWqxmwAduCv{@YsLK>MX8#42*gQR^vkp)uixtmo!gdU zJn1*7#z8#Wx9g#ns3ncfjp5uS!dH$BD>$kP|akq{Qu?`>t#I`*L54HvHG&e7L*L*V7zC;cgjtAR>0D9m9-C(< z4x4GuoL`E)8(>^sFsKedg;<>v!IY~!S#OkNLdPiOtAWEIY~`THm=4|dJfV2-j%pA~ zBPpz^8ZJ!21@yzH!=x2=a!+7v0Y&Mt2*|JJA^uw`=~g5RY$=Vu-zV;5@z^8-a@o78 z#`!-WzToy`pgQWiTlNz-OurRBG2(vJ`a(QFSj4%&mXC*q_so}WAMug#!n@X*SuiF> zintVlR=giH%^kWn)i_;kMw$Iut94#rSk)!SYWg-|a?c&$mbI2sdZCYQ`r@)x>w`!4 zyw`h#;Gcx%tY-1lv*|BIZJ=%37xyOl^S+$jhj!h z+=IC@Tdq+J>-GzoN#G%eU7##uH?I4+zu7{w;avzfoH)&1Fl<+>00Jo}L6Xt+yN5HT zYCRH^Bb;h0x6`E*K)y($mO>6(zyPsee!s_CD%$TMM25kCuM=d}l&Y~Rgrk^chXX=} zyk9(T)&`QS6dmGzcuaCS%5Qz33KT;?E^rkM;d5d7ie}SSMDx*3ENdqu3RbVC)A(I2 z_Z$=)*BFn67p^K4`2J*Dh_SnhY^&kT{e=}F=AME4akGEj>?kE^+*iI8)BY)|J9 z2H*2RSLTd6b`g-$%;{g5`yz|Y7YZ5tjnDILMuxJVcY~EK0WA69hu)0oK}RyACwhYK zk>J#>Dz8%Lpn2U_ev!gZH2N1D`H;}}Pq(j~=;vP?=#I&QD;BL0{hHrFTjiC9qt1Bk4T|Q))$0cF4)IkmLwaU| z$vz6@n*HR5Jyz=YQh~W_j|53=(J1$DFSc4@ug~{xa#sad@kKL5Ihq)bT|^ecPp`6*CF6jWX(7V|9WsUq{q2~5(2kRD zg9f-ik&|L5O0UFR)v3}nD4o@Fh23I)<;O4T>ug3oYA3mj+uwDNoZ-746Mc55-7hWE zHi-JRD>;7^^~FVG8X9_i^VMO7Lzeyi0VdEj zqny)1zM=-+E+X(Hh$R%;a5|QbA4w&*FJFy$?8~-79F3LxFAB$j#}%RTNHRv&Ssd&Y zLlagWL-ia^k_TOI6x`ZXq$jftGa(g!{Lkn_x*2P-58ikM(??(Mvk@ z9^Fx$8a0VB%!h4`E zm8+a?)q4yLv^bzF{D zZbgfg_&$PP=V2(AZyQD6eQbwsURAxw5LP*G$a`Rs)sp$)!RzPrwbUnM#+;QQ)SF^+w*sVO>?DxN|ykZKef5LXSJEI;%oYXT}MrpUbeowyEM6E~a! z?Ds`k>{x+WhHKsB?yL+Z8qBT?i&(Es=>l4&1MWc1Z^Z6gafJ`@A4XQnL5-BZ|0>cX z2jIfV3xbEloxbNm(z(xyR>5T_I6Qp&ZpyeB)`B;h|6)%fx8Hy9CNT0NB)H(-M0L?! z)w9gxMW9N;VbxD^6@MBfq?8lqjDa=z{C-rnk%usnJEf&mu_`}f1 zd;nDv3#PJR-(O{upOx^N8ydQ_WR+a`-+yfv@D@{9M-tI}?DDWMDqtV!_%j^w&s1xR z)tGv7zZAaa_mrw;*;%TuQ=bB$Fx=<21<-6F9Tob^mrp^T3fVOus^fjGhJ*wZR|=JC z<`BNkQa0SGgDqSUhf@&ygeqp-EwrKzb+-O0bRE243Mf){$R|sFrm>Qb@MML*`Z?44 z3vD$rw~Su8E4Fp**IyAIqf%#PM49p1WBA zT}c?fB2>_}H(3dF32?hH!o0kRj>G|db!CR;i)g&`}L9ddtu0tvaXTOC^-I?!yhZN66aFelJ zra8EDY*SdkDJb=?NO%L6<;dpF!Krr@Pzzki@sixB`F?*#l*dlIDHAdpsU1nM<;|fT zlI>q%>^qC@@nE3dieat$4dSGO{>2*=hgi4!PrAs`o}Ht8Jpy6!C1@-U^ms+t0jV7h z894U#BO~ff869U)!>HZmAGYT8p~2J@i@~wL0neIU{~3&suv|+`2c6G>e5)2t^P3EMsiv9fHxx{Q5hCRA<1f_-&4;dHJ4a zFr(lGLj3F6z9GTnsBV_laKF6ww^1dxRecF{GLKSBE-=Qg${*(|_^>4|tZAhXB zR~R+20(nkJWX;Ge3k=andX$6l>JAtrw;y@u&BQzEAf{9N=3a)6WDrfsiNH-`zT%B+ zkpI*?Iy^~m_Lx>Yff|bcq{?rzzFf;|KWwWH}`Ja8sq|*k9|BUdsJ>&?oxJ=@1J%sclJ{6W8 z*#;5)Ruml!V&1#zIFlL0R&(MerFYqNVH@X9#(oFibcJ}IyP&UH>U_VuZAm`akC%x? z>JEvHd=+wB2U5qmIY&-{Q7IsYYQNZ*~sb4G4Jf;ZS^;Ig}1;+_KYI|q@tsnsr5+V?=~dQEJTxQwYnz^nmq z?`F`zt8>`5JSF!n*s{Z&W=AgDeB+!zpUJ7N-y82Mn*li_NG^z3II&c1+5og^|;214M)fvs`XpR{7c$LhXhEF7|}dBZI0iW-=f$zfAhazgHNOr9Hm&mE;3MvGQc3LHrwcQS+^=p z*Bh1!Pn8AU3+GE=;g)*R%6^?J@~{0iPZ0ykJwi)xUBSWd?Ex{;yoDAj*xpyRTo3d3 zLZM%Mez}g1mtI`(fP1Om*n4LBU_Jv$-gzj2GUS4YX=_KuowDx_yq6imTwzv>O#IVT ze8`yXt4Y)f(c{8if0)v0bO zHuA?)K8mp|&aBs+xLNe{n^{ajF}sPi)|n)TL@FMztz7p_$6WBaDPPtbO;K4smz;ES z|F>vjo<4vfB(>5}WK;Hy_NSb5o7U7M2M-&%(=+u~gbS@dZ0~MM|0lN^431>-(InB3 z6jct!l4F!6)q0Y?)8yl()|fB+@9K7}?;+inNB2#_PJEwZI&I)4u)|X>28r$>V9*t) zn-qbGc=Q55a?^N1i(aoI#X^gjeV()VVu;GB8+yTE4A~U@s^oc)KjXpvt#SN-5Mxhn zI;SDV1^%BeqvtC z#^c+~IfNI~MJyfY*%RsPKq9}g(6djDbvGmmkye>U{2Wg`ddfjWiggYxE3ShCY_Xy> zyO*EYryH;)xn~}hwCGXy^bW&3FGb{OHJS=y_+CTF zU|?bKdAN4vxh{a5wye)9iZoQzH_6{n*appl`58)9KYaD;t=61@awU?He}dOS~N8YfjGuMbf|oe z!V=AlH+;`YL|eBMhu@p05zT&GF2kr4>i~?%=T*MG=$QWVfny?#bFRQG)%5Bj@{x{G z?Xtt-59b-!NM6G}9Yx6GtJxu^Dbt@KCL@Zo?`H!ZOa|lJZ4b*R8t{A?rpBe`#(Ta%kB=pNMe#dujYs^(F!Fe@c5#(Rty0ujh0yb3@@4j& zA@k!wMdxPt3dnlu8+#w7nj8ZPF)J9fam%*3;xL8HHW;uUIr|Urxq8hjXzzYsyo?6JgZW3huQlY7X+l0p`Ez3IV-HKPp$qE zU47GwJvUty?W!trg|>a4hHrhHTRrBIhH0Sfq3l2ZF~7+u2OBJN>ebp$8q?2jpGnG? zIS?XAmZDm3?6k`?PL-uXWts?Htz{b+u~{V~;FA*m-^G{<0c!IsmYw z8hZZ)Diqc0RO;KOFB=&TIN$&pJ9aG3BD!>!2w+wTu4||DJWUKNs|o$*J9_fTCtb5k z&}|kkUQE@hRb$s03}i=-9xZgBk*+XbfBiK*`skysdtV9N3;ItR|N z@WJe^fl;jN6$M|!8*aFPrcIs36?EpAXOhcrN_-r3)KTo?I{n>u=|y2hI^l#9BHfUJ zu7(F5NY`I~J^QhoFBIVM6UN&#_7WqFerNQfyY9Z5`kdZ}#tKW^O*h|6O~jP91rE~> zVeXLT+cs<=Y1p7a044I}r%Oqj@}Vb=fI@&p1@ts%(2&AlcS~^#M|XeUxN(Dh zTbE=yQz`yTo%#+7<71C)&OVZT`u3sCLeMSvc!3=r*WOkeoHmtxD2+Dg#u@$2U_mlN zQT|qVn}|EPx$g6Kp*#2^27Bpq{%-*3&9KhwPOhot)VGlS(X ztX_oXhU`KD7aL;{o64LN#R$ebEDv81@^HG4hc7}Nw)4I2uhV{%3~pM$KPR1Z5`Tvh zkc{pmF!E@$_vR+QIgHed^Zp832;qaxdH0TNVnGkMm&N6WB@-GpY)J8FOA=3z#7$Q> zRvTuyIxd{%Lk~Ta$_rjQ=%9n5qIK$Yx?6_8U2Ns|D}!ZA47@XSswwM^<@SZX8A_dO z*?#ApcOt_CBc0L={8=b$Zz>d6lrs!>L#`jf1Bcs%!VC+&y|zK5cj={<(xHbO%4=DA z_3Fin+Es(DVi{lo3M%CJdA$C>SPKBldJ?4>K>R3^J8r+j&~1eBeUs2_P-YI%8Y_)3 zaN-j#Jm;Nvp36{JXz0`Dbk-T+s@FrzFx+|9U3C6m|H?D6GB6_m-7XBsGZbZfLXjRc zXb|&t7;KBP+(E}d6)}Rn>#jR#yhsq1G8w2WjA}4l+~T<7m_aZy`AC`)swk{t@Izd- zbQ!f2Q}Gy?_V3@HzL7?7adF5YhtSz)oy8+FFFJSb%*+A>9l+EQ7^3|N?dg+`KQY2| zF~Yq2?sWdm?g0oRrm^5h3jFfRFZ_uS$(Ajf*=HsWg4$&X>K=(uLIy^vQpMn(m&g10 z2Y}Ud|Jt>AIyw_XW=NfLOBaI0Z~y)G&z&AU;*m?KbJGC8Z}*8OM$*HNJVHCR?_g!^ zvdb@{%^v@)o^l&(fi`$KefiawH18v$4OXpMh5Db}p9Wn$sPKLCOe5suk3YtO4Fm2S z!U{c8Oc&3Y^Px{+?b*}H`)FPm0{Qc$kUv)5_v<@$pHl8bD?8Yw81j|f?ZSxJ_4mtE%aRW;<{6Q(>=g~49%RY4s`6;(dVMms8J(cBk|d1pYc7E4Hi~@Y`ROr6%OH{ zgwC2Zi?T!E2T9dtfe8#Pkgwl< z`)%MmK39!6yi~qiIl5b9?gugTbN~JK`<~AbmfttUv;?vZMHnMeOiRo&6=zsk%v^>zs4WWd-J= zxgQ0jXXeLCPpRlFMkj}Md*+#EQJp&bvun!QwLfv^1q-tQ!&2sYl zJFXa3+C=I_Y4#RrP@Z=>3cR(2UCg{;(2gC7zWL@`{=In7BJMakckbd+oZp-AUP!*Q z!1%pDhmHXitb*%*{Z(|xeMKk!GbKZOM&R}?X8gFld#3uGyjy+2A~vKLd0&_+y^?|E zkqORyH=^lQ$CDK#F4j%CI@v2%-O?TdDX)u$7v;*Ar+WhG6tW14G%TdK0Llw2pRkaA z30Wts_Vj1?BQe(~iO zu5i$oUS5ngL`B!&FiDXtatJS z`32wli4!NX(mz$qPCx<1%w$p^uQJxGSre)Im5Z;Qns>x4nDVg@18xz}_PtoKVukBB zDh^f-3mB1kv2x`~9;KxLre;bT8Me#J5Qm1WE#F$eJxh7U*x%uw3z&br?`YP+C%GVl z3ee2IX%=8*4$UYR2wYeY-VlQdSaZG=N>-DmP3g4LdJ4O``FtUKzn3h=w$Y0+T$U7O!^{*>Yh0jxk?p#G{=ujaYumaE=6jSI-j2OoS$ z7!|7Vc94x5A4VU3_#x#3R)0}d$o30Fe<81D091KjiM&^<8WpqWcgafJtVBYI$re3Z zns2=E23E>05Hj3br>%r+X~43@uyVR&%gFe$bkEL=8>U2Rse8_b3c8z|pMd~)D`iwE#NiI^tb=rM}}zlzaL-8yw#_iBr& zpbFk0>Vbcg{{vl{@Ju?qc7aAzitpyiJrQsRZGchIm6`^q2?g) z?fxF#s996cv(Zg^;xk7QGKcl3a+S(rcI7v+PyNu1X}!voD@inOpgMIuZLn5tAyAw) zi2cYh^#=N(Dy3qXd1tzq3ROWQ|-GsINM8>YBfd!mKU$$IiQ) z2hEd)xo@y8xoCJ#ud_q5@AXc$a6p;g$%_~DR7C^@!Mmp}%R_9>X;w4KRac$r?tBFz zxK%#=^ixbX3?S(d&dAt~4DJ02^cNd9NzaT*ROh{(t1qyCoea=PLJ=!Xpv-+T0WxZ% zUq*$|tc<6oI-XqNq~$c8G&BPj3mM-0nC6BKu+cBWFTZ@CDO=9u3xgxbmT`&&S7B+v zg~hvt*l(METrnL=p+e{3k;SVXvF@e*3PWQo$k zdi2pp^VX#BcZR%%-jWoMAzmK4?z-!EzjF(aTG%Z`1{TZ7ZV#wuZy0a9B?%Z=G1CZ3 zGn8hO6Rh^uLcn|@k>cF-lvCJuY1o~2awh>_DO6?!X=UzIF~x&@oZAcLgD(&|y5q!j z3ifTb04pO7GQem79R$K)vEG|+y_tFc3qNcp%4%1tNY1yKM za=L2Kx8L$A*+2gAkD?>1o4SD(Dw33c(t*G!;2&Wzz0>5M+DiVJYB>J4JHe#{&>;8>I*^9jmzr2nKSLW z18sfK2HP7nqkX~8dCC;04Pu2owv)6jOy9%j?w551w3j+($l*pT7CK8PTF0Atw|vp2 zn(frc`!wbstWV&)_dA2b7#*EiLdt=FTj{gLCGsLbTY)CybVi&Q2E`Nd43~9cqn_}r za#-vJn)1++nb@!UEg=srAYZ5Z>a>Ns1J_7-l41~+FaM6-67M%_){GbEWex1P&HcqN zv%lECHeVGhI#a;vyf-ynQrry)ZaMIOG!8cj8qsN<&+Orr2@MUI02wvSFB9A}$B3u3 zI-cxl?iot+-AwZtzGqkve@_2%?Cmn4JmHde=fJ+|D%rBm^y&4db+L$rLUl?J*wZn)!;(i)9^>v2wIjqf?o%uzPm$<;p5fnW5NkjjEAradt%77w0A4qxZbVy1%(;AOJIi#8@jPL83R~^fwdlG4qs;r$TR$~ae;rZ z?PFRGfh>RlIeg!-$nkf-`yIQjL9v&2lY*NrbhJ9AAs2j#-&w3BD3?UQbnMiLH#HxA zulwKHATf42G8-@&_|Ni&CcK9)4$FS?h)q@9%5ngp>q-(Fa*5%Ka z6|ndW6+HOr!8Sd&+;XeE=+6i<-V^3KKJemWDU1c2n1qqwh!G=rR2sD%U7=c+Rdnf| z?{R4lG~#*C3H(#GEZrN%KcmO+R&Rp`oBZ?LcXaEmxBB*Q))Z;Gp4ijw>c??_*WpWr zP60=&%Jj_7_3#tNlOQsfX4i(!WrY*jt`$NQ+wg!M_>azf&*@CK4OX<;U=0p~-5BIH z7)Vg5S(T&l+_TTJ-`$WQ*K>PCzTp2j-`Y=G_vXENK;9#`Tl4?a6*nyFboi8IFsE98 z^$7#;!7LAJ81nF1w>(tkYlxjM&H5ievlf{CQ=^`u6T5Wb73qIV#nZuzjD< zdJ^s3+}0{M?+bl#;vNRkH~^+J5hN4lDGm}bXl|{bSqq6L+k=(T(cFp`-g$vKEi3Bu zUURQ(tA^w{O@gqro_gvjUVw`ovp_R=!;p3F*$E>Ic#Aiy%byoC%7PJ-B zx~?R^KI4!{SkwqhE_Raf>KgEChFC%S1dwmE6)5gWcGke=4d^GX6J-eZNUPpI@uY_V zI28H8*9_(@{y>|oIKvgDapT5Z7Z?bkAA(PLX#iCZ{cF%wSMeGt=#udNh6|&$A{j<&%uT!Q)maKy=}iS&-wVsA77{KZZt}k8 zJk+G9HFH(Aa|ATmpDLx)H7_wP&f08vpY0mmlev#+^6a(R%QWU|_U0WJ8O#OD8 z^rONTih`STAdm)*T`HZ@top4=BTEG9oLWR;5tL{Fig!L*WQ;gj57S}_|0IQ6=>0J> zrOBBNgC>Bd#mA~g-BCK_9WoSV=Lp+%2r?exs|d-YZcAE$j+0*85ot*vFNL1R_;xec z&0F0PHR+pfg-cnau=Y-$F@3jEns*l{L~~wIE@}KKu@=;M1c^W`Mwqy9g~y&7(uqVZ zbn&CxfdlhP>7w5F9X3A8qKBf7@xE{ zEbTtqsz*zC_R*s`;pE?{Frf%;IjU{wboo7<+*@5K!sj0{t#P4wKEsBi#hG z<{;&n0{FBf3%#Ti^peVx?nytbCB2CJp;*>F1iCPW$c{*;I_BNG>=Pe=k~Oj_Ud?mK z_tQeBV$&;C=s~xQnz8*)ExkIg&Q7}Liup>RqR8C4DYTp(JAvZ*h6jZ$Nd>kv8M)Yy zirDqxGe9TCp4A3Q%~c~yg*lfnxs0>2fY)xJLRx;-Vx*hoom|t*8B*lN7#GU3zXsv= zq`Mq8JTJST@LfzpRM3tW`6}olb`vDEM4Hwem60bbd@AfpQv#XKb!CivrWaOEc@{Lq zF~hC}76&?8nEjlgQ7*fVxD(mEu^ad}7qQ#JTmayx7)HaiEY6x@xXh=!nW2l2kW^1A z2^4G@m{fz(s literal 0 HcmV?d00001 diff --git a/src/04-multiprocessing/Makefile b/src/04-multiprocessing/Makefile index 295dd75..bb405a7 100644 --- a/src/04-multiprocessing/Makefile +++ b/src/04-multiprocessing/Makefile @@ -1,11 +1,14 @@ - -cgroups: - $(MAKE) EXE=cgroups SRCS=cgroups.c all - process: $(MAKE) EXE=multiprocessing SRCS=process.c all +cgroups: + $(MAKE) EXE=cgroups SRCS=cgroups.c all + + +max-cpu: + $(MAKE) EXE=max-cpu SRCS=max-cpu.c all + # Include the standard application Makefile for the CSEL1 labs include ../appl.mk diff --git a/src/04-multiprocessing/justfile b/src/04-multiprocessing/justfile index 701a012..4532e3c 100644 --- a/src/04-multiprocessing/justfile +++ b/src/04-multiprocessing/justfile @@ -10,8 +10,12 @@ @cgroups: make cgroups +@max-cpu: + make max-cpu + @clean: rm -rf build rm -rf .obj rm -f -- multiprocessing rm -f -- cgroups + rm -f -- max-cpu diff --git a/src/04-multiprocessing/max-cpu.c b/src/04-multiprocessing/max-cpu.c new file mode 100644 index 0000000..8feb396 --- /dev/null +++ b/src/04-multiprocessing/max-cpu.c @@ -0,0 +1,70 @@ +#define _GNU_SOURCE + +#include +#include +#include + +#include +#include + +#include + +#include + + +int fork(void); + + +volatile unsigned long counter = 0; +void cpu_intensive_work(const char *process_name) { + printf("%s (PID: %d) starting CPU-intensive work on CPU %d\n", process_name, getpid(), sched_getcpu()); + + while (1) { + counter++; + counter = (counter * counter + counter) % (counter * 1023); + } +} + +void print_usage(const char *prog) { + fprintf(stderr, "Usage: %s [--single] [--dual]\n", prog); + fprintf(stderr, " --single Run single process (default)\n"); + fprintf(stderr, " --dual Run two processes\n"); +} + +int main(int argc, char *argv[]) { + int use_dual = 0; + + if (argc > 1) { + if (strcmp(argv[1], "--dual") == 0) { + use_dual = 1; + } else if (strcmp(argv[1], "--single") == 0) { + use_dual = 0; + } else { + fprintf(stderr, "Unknown option: %s\n", argv[1]); + print_usage(argv[0]); + return 1; + } + } + + if (use_dual) { + // Dual-process mode + pid_t pid = fork(); + + if (pid == 0) { + cpu_intensive_work("Child process"); + exit(0); + } else if (pid > 0) { + cpu_intensive_work("Parent process"); + wait(NULL); + return 0; + } else { + perror("fork failed"); + return 1; + } + } else { + // Single-process mode + cpu_intensive_work("Process"); + } + + return 0; +} diff --git a/src/04-multiprocessing/max-cpu.sh b/src/04-multiprocessing/max-cpu.sh new file mode 100755 index 0000000..861566c --- /dev/null +++ b/src/04-multiprocessing/max-cpu.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +usage() { + echo "Usage: $0 {init|high|low}" + echo " init - Initialize cgroup filesystem and cpuset groups" + echo " high - Run ./max-cpu --dual in the 'high' cgroup (CPUs 2,3)" + echo " low - Run ./max-cpu --dual in the 'low' cgroup (CPU 1)" + exit 1 +} + +if [ $# -ne 1 ]; then + usage +fi + +case "$1" in + init) + echo "Initializing cgroup filesystem..." + + # Mount tmpfs for cgroup + mount -t tmpfs none /sys/fs/cgroup 2>/dev/null + + # Create and mount cpuset cgroup + mkdir -p /sys/fs/cgroup/cpuset + mount -t cgroup -o cpu,cpuset cpuset /sys/fs/cgroup/cpuset 2>/dev/null + + # Create "low" cgroup and allocate CPU 1 + mkdir -p /sys/fs/cgroup/cpuset/low + echo 1 > /sys/fs/cgroup/cpuset/low/cpuset.cpus + echo 0 > /sys/fs/cgroup/cpuset/low/cpuset.mems + + # Create "high" cgroup and allocate CPUs 2,3 + mkdir -p /sys/fs/cgroup/cpuset/high + echo 2,3 > /sys/fs/cgroup/cpuset/high/cpuset.cpus + echo 0 > /sys/fs/cgroup/cpuset/high/cpuset.mems + + echo "Cgroup initialization complete." + echo " - low group: CPU 1" + echo " - high group: CPUs 2,3" + ;; + + high) + echo "Running ./max-cpu --dual in 'high' cgroup (CPUs 2,3)..." + echo $$ > /sys/fs/cgroup/cpuset/high/tasks + ./max-cpu --dual + ;; + + low) + echo "Running ./max-cpu --dual in 'low' cgroup (CPU 1)..." + echo $$ > /sys/fs/cgroup/cpuset/low/tasks + ./max-cpu --dual + ;; + + *) + echo "Unknown command: $1" + usage + ;; +esac diff --git a/src/04-multiprocessing/shared-cpu.sh b/src/04-multiprocessing/shared-cpu.sh new file mode 100755 index 0000000..adfb6d3 --- /dev/null +++ b/src/04-multiprocessing/shared-cpu.sh @@ -0,0 +1,96 @@ +#!/bin/sh + +usage() { + echo "Usage: $0 {init|high|low}" + echo " ./shared-cpu.sh init - Initialize cgroup filesystem with cpu.shares groups" + echo " . ./shared-cpu.sh high - Run ./max-cpu --single in 'high' cgroup (75% CPU share on CPU 0)" + echo " . ./shared-cpu.sh low - Run ./max-cpu --single in 'low' cgroup (25% CPU share on CPU 0)" + exit 1 +} + +if [ $# -ne 1 ]; then + usage +fi + +# Helper to check if a directory is already mounted +is_mounted() { + mount | grep -q " $1 " +} + +case "$1" in + init) + echo "Initializing cgroup filesystem for CPU shares..." + + # Mount tmpfs for cgroup if not already mounted + if ! is_mounted /sys/fs/cgroup; then + echo "Mounting /sys/fs/cgroup..." + mount -t tmpfs none /sys/fs/cgroup || { + echo "ERROR: Failed to mount /sys/fs/cgroup" + exit 1 + } + else + echo "/sys/fs/cgroup is already mounted." + fi + + # Create and mount cpuset cgroup if not already mounted + mkdir -p /sys/fs/cgroup/cpuset + if ! is_mounted /sys/fs/cgroup/cpuset; then + echo "Mounting cpuset/cpu cgroup..." + mount -t cgroup -o cpu,cpuset cpuset /sys/fs/cgroup/cpuset || { + echo "ERROR: Failed to mount cpuset cgroup! Perhaps 'cpu' and 'cpuset' are already mounted separately elsewhere?" + exit 1 + } + else + echo "/sys/fs/cgroup/cpuset is already mounted." + fi + + # Create "low" cgroup with 25% share + echo "Configuring 'low' cgroup..." + mkdir -p /sys/fs/cgroup/cpuset/low + echo 0 > /sys/fs/cgroup/cpuset/low/cpuset.cpus || echo "WARNING: Failed to write cpuset.cpus for low cgroup" + echo 0 > /sys/fs/cgroup/cpuset/low/cpuset.mems || echo "WARNING: Failed to write cpuset.mems for low cgroup" + echo 25 > /sys/fs/cgroup/cpuset/low/cpu.shares || echo "WARNING: Failed to write cpu.shares for low cgroup" + + # Create "high" cgroup with 75% share + echo "Configuring 'high' cgroup..." + mkdir -p /sys/fs/cgroup/cpuset/high + echo 0 > /sys/fs/cgroup/cpuset/high/cpuset.cpus || echo "WARNING: Failed to write cpuset.cpus for high cgroup" + echo 0 > /sys/fs/cgroup/cpuset/high/cpuset.mems || echo "WARNING: Failed to write cpuset.mems for high cgroup" + echo 75 > /sys/fs/cgroup/cpuset/high/cpu.shares || echo "WARNING: Failed to write cpu.shares for high cgroup" + + echo "Cgroup initialization complete." + echo " - low group: 25 shares (25% CPU on CPU 0)" + echo " - high group: 75 shares (75% CPU on CPU 0)" + ;; + + high) + echo "Running ./max-cpu --single in 'high' cgroup (75% CPU share)..." + if [ ! -f /sys/fs/cgroup/cpuset/high/tasks ]; then + echo "ERROR: Cgroup is not initialized or mounted! Run './shared-cpu.sh init' first." + exit 1 + fi + echo $$ > /sys/fs/cgroup/cpuset/high/tasks || { + echo "ERROR: Failed to add shell process ($$) to high cgroup!" + exit 1 + } + ./max-cpu --single + ;; + + low) + echo "Running ./max-cpu --single in 'low' cgroup (25% CPU share)..." + if [ ! -f /sys/fs/cgroup/cpuset/low/tasks ]; then + echo "ERROR: Cgroup is not initialized or mounted! Run './shared-cpu.sh init' first." + exit 1 + fi + echo $$ > /sys/fs/cgroup/cpuset/low/tasks || { + echo "ERROR: Failed to add shell process ($$) to low cgroup!" + exit 1 + } + ./max-cpu --single + ;; + + *) + echo "Unknown command: $1" + usage + ;; +esac