From b42984ddb34cc4a8ae65a7acfd43f6589f32b526 Mon Sep 17 00:00:00 2001 From: Jose Date: Mon, 25 Nov 2024 14:24:10 +0100 Subject: [PATCH] cambios SS 2024-11-25 14:24:09 --- .obsidian/workspace.json | 28 +++++++----- Pasted image 20241125141142.png | Bin 0 -> 15774 bytes Pasted image 20241125141145.png | Bin 0 -> 15774 bytes TERCERO/SS/SS 24-25.md | 75 +++++++++++++++++++++++++++++++- 4 files changed, 90 insertions(+), 13 deletions(-) create mode 100644 Pasted image 20241125141142.png create mode 100644 Pasted image 20241125141145.png diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index d088028..4707ebf 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,19 +4,21 @@ "type": "split", "children": [ { - "id": "56e813a421587f25", + "id": "2d0b9251619569b8", "type": "tabs", "children": [ { - "id": "75fd2cd48c9b7660", + "id": "f159ed47981f3b40", "type": "leaf", "state": { - "type": "image", + "type": "markdown", "state": { - "file": "TERCERO/ATR1/images/Captura de pantalla de 2024-11-20 10-54-39.png" + "file": "TERCERO/SS/SS 24-25.md", + "mode": "source", + "source": false }, - "icon": "lucide-image", - "title": "Captura de pantalla de 2024-11-20 10-54-39" + "icon": "lucide-file", + "title": "SS 24-25" } } ] @@ -75,7 +77,8 @@ } ], "direction": "horizontal", - "width": 300 + "width": 300, + "collapsed": true }, "right": { "id": "44cf06183e1c1c7d", @@ -172,10 +175,14 @@ "obsidian-git:Open Git source control": false } }, - "active": "75fd2cd48c9b7660", + "active": "f159ed47981f3b40", "lastOpenFiles": [ - "Untitled.md", + "Pasted image 20241125141145.png", + "Pasted image 20241125141142.png", + "TERCERO/SPD/Teoría_2425.md", + "TERCERO/SS/SS 24-25.md", "TERCERO/ATR1/images/Captura de pantalla de 2024-11-20 10-54-39.png", + "Untitled.md", "TERCERO/ATR1/Resolución 1 Parcial ATR1.md", "TERCERO/IA/images/Pasted image 20241115112854.png", "TERCERO/IA/images/Pasted image 20241115110324.png", @@ -186,14 +193,11 @@ "conflict-files-obsidian-git.md", "TERCERO/IA/Teoría_2425.md", "TERCERO/SPD/P4_SPD.md", - "TERCERO/SS/SS 24-25.md", "TERCERO/SS/SS Lab.md", - "TERCERO/SPD/Teoría_2425.md", "TERCERO/SS/images/Pasted image 20241024113018.png", "TERCERO/SS/images/Pasted image 20241024090239.png", "TERCERO/SPD/images/Pasted image 20241022150214.png", "TERCERO/ATR1/images/Pasted image 20241020204947.png", - "TERCERO/ATR1/images/Pasted image 20241020204701.png", "SEGUNDO/ADDA/Teoría_2324.md", "TERCERO/IA/Apuntes Julia.md", "SEGUNDO/IISSI2/Teoría_2324.md", diff --git a/Pasted image 20241125141142.png b/Pasted image 20241125141142.png new file mode 100644 index 0000000000000000000000000000000000000000..1019cbfe5aa4ac43d1293385c9ebeb06b44915fb GIT binary patch literal 15774 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 kWI?v;G99N{Swh9?BBk_$JH^|gfpXuMY zanl>v{!Vlo_#b2Ybs4z9^UzmOxKTCAybIjHx0lzFzj31$MS`;?0Pf#$Q#J9paf7_; z`VX(qwdCcE8&Ad5p2-{dSR7=UqiALp-ZNd$g~s^zTe5${*HiP{%6Jxbi-YQ>I}vf@ z_ejib8uEL=kza#y?yz#D))0{L{K&r15;wAKDbf~DS=#DjXJTl+JT*0CzGPfyS2k;0 zd0J6joMkvuzvqyh1@5JXM(^Sa(_F<|Z)y^PguKg*D%Dx99|zn09=H3!iPp~QO3uQ;Wh5|(ZJReN5v8Y@a|quA_4FJx|gJ> zSp;IyD|D9rdKnDX=+V?W?%&6ASIP{_X(f4hp_)%*&em?BIH0$!uAdVV7oU53e&Vou zxY}tMDk%Hp&5zWmRx{d7w!pJoiFAu1B?~*SfaLoXzx~RzAJoEazZ8Bpt_BK>YR=XE z$8LymTTxjJ@dbz7fPe8_Lbe3_eM41OW6oXtE0t|W_6q0m^ZP`;Exi#%|8dN2S^wr0 zb|+g&)$8fYQZCk`tFukiO6$*#bY%X$`>PEyUV8>qlNv^Z6%<>F^uDu6vM)fMTFsD# zB9YPkE!(05y38>UWYJUturY-dwty2o zsg)XQMPm5bFKemlTLRDE7{O86?>fot`*YQF_6QER`K<=$#pJ#&4h zc)=P(Zr2bicV<5EF2bk`%>uVk`Sv2h%o1+wGb$o)9+)-hX4La0r%Agt`?JXgW?Xu( z4z=12C7)!sMCffX0KbK-!FDflCLoN zSS0bn3V0}nmQs$H%#<6`sgSgtOlsWPSCy>q5uh6yo#h840fc3xlBwn zU)%gAIC(p@(jOPr64kl)J(O6U7o_tG)Shc)$-;9{Om7Z88f%()B=I-|7_7rIxz3zC zT9IIx>8t%7h5RP$iDW4w!cv{OZ!PI3qzo7CTF!PK_wbd0P2>Y9GC z^*uk?{aVbhp&_|35#g~jDzrde$!RQ?q8`|OHm_=0^3ml5N8=^hBb+V$Rd~`9D34~x zy;K2RK_bwjX7`@QB*eN|Z^lDevB2E$e5C+-1XZXUOljSea=c9(hxvR&su}93IZvDt zCWry1l9WY_Hc27~L*i`})>Zh`Mc$5cSq@Hc0W75L9vLY3*{>)<>1wvp6wMUs&QD=5 zFjOJk6`k9k(=mBFv1^{!Y94GrD6V}nmWmRb^FtVrGq{;sMdz^hz`_x(4O!B@qNi6& za6S<`sHwv zi8f(`k$(G+iSoaGz6byRRan3*HZxN)yH+!0Th`b03u=c_C^W5D8knLNlfK?*-&GKU z*v)_Mw6E#xb!jY81O~%(aoeRdI{fEdQlY@v2DVbkf#UT4?Im`JKxz5d=rC2Z;RFtC z$6KoO0>k)h(Z}3=(w*(u zVuzSIo2kqF5WU`Qpkl_E-P5wR6H(;ze#lNOSQRr~PMgj0qghYi`oVEWD)Dh9jKeeLyY{dj&%!6C3?Y4XSmlul(#oVKx5rNR=iVM4AD1R9 zH^K6W7_x>^go~x!uFK)NV$VTT6ewQ7#0je$()yn9ar>{ zIrc9tnfZ2j?ay*5|MA($^q%ywsuC#@s!VECL9yObA?Y5tNn+lH*kEpiZT8kZCl@sr z$XwG_@`g^>&>wSohswboM>>IkS3NyAYg*{be+8I%;fNN5t z7aM*|$z|f?>b{`6Ye41m9bTf*f`(bOI8deB3!E2g>3%V8Zob=)%A4w8penDdnRzGb zw9RYZXuVY~(Znf4F`PW+gPbz-&MGak$*N3t@?A z1y|L(EVqclC%b!nf33-5c(XVAP$_d#KEJFSI6e`4))YGlSeABZTcel#0MX8tY46_< ziumZf*s!H?w$lC<5o<4!Mem`mA>CW?70LSa#rq53dj{Z?1+8xD3O@%Dc=?uhvf)`g zQpo0`=Yb$Z;?v?X8O^fkFsb#v)WFjj!+tPSls{-@6UIuTul}q7p3+r*iITKo`>dYfV zhUDP@>S~$-z7i(U{we3im;lYso%!@3=g(gH_ExV?psLS8q2Zd(S;xI^pQU?5cV|+m9Z`01e00s(O zT6t#;UyvBK9?uqxoY0ZIc$g&in}hivtfB{dyfY+nuE+dms#|w#$zjq?gO(eiUOK5i z`<?Ttoi2Hyz033;gVVi+2v_9ys%gQlC&nAf~`nI!vDgggYcHf zhBBF@B^C*{oHhoiX8xH>AWkBaWJ7OT{^&N9Z6nY_)Zw%+QIseQF|8d3R+U^&#;fLx zMbf=M!n9w<0n%1BNEs<=trv6r^4{=f?Xa2YMa;?Y2uv^i&4(?O`6~0)Nw8>CK-Qb6 z!P`;v#Khy(uR0$CSG1XiI_;*SZApG7jM-A|KN)Nj z<9n}vh_B9iv&|i?E>%peYLdW2E5-A*=*xICa1>2K1&waQVC;-y`{O_7DohfP`@MHJ zL!f-xS_oW$75Vt`6QplY9oTwMJx(CshH+oaB^LFP3mZ)=UcVI-Z(J{jWZH&Q^(iR- zm9G9ZkMAyb8}`-(!Xu>9O9!R4Er0Ewi%*5TtJ;+K8CHP?IfB~-v;G_|Yedn{Df%*U z|Ad8X&<;hpXPWZpt=Yu^gRp4QhfWSXS7mPcVtDUR^?hv-n8D_?EhfI`dKmH|RzRdJ z9*^t_tsUjOe}wej^#=w5;*d778a4p$jp;>x=D#QODoRKC>jv#iBsFhTzJ=@Q-V7gH zi1Y~gNGC<{MU&5w&AFvY1*+ms3#+@_QPLwtN@17q>7E4U`#R38}I^#?!jExU?Lb^Vd< zD?M1|56i1!&U;|Kj7y+CHa6jQL_%3Z6I>IycjP2(OfW6$&lVfF1se?0MI@;f5u&AS zzUTDHSQ}sCU`V(jZujl|=MJ!cl$kF4tJ;~ z5zto!_Wx=whCOYDGQrS1lH?~)BjRfLUO_U`f43b`|Fj*?gM_?$qY3}Ff?G`fjMkB5 z>au~oGpI39M?{MnN1Gftu}TkZc@KQZa8&SQgbiZK9)3efG?4c7Z0-YdJ!A}cD(0Uj z>wtQD(ymsK?9ZY|`=}%S3*lVrO|PRA*=TUWX8-|E-zGr{8m0(aKJcfbt~6;n1G^@& zVY8*YUQei0Z8iw+q(64%AElk7(r$Uh0Y&Iz*Ei~IOt2E(_qW40{XWC7>$i_o&M0NF zNhj??_8PSLo(megkmb7&bD^ZpAby6@m;_nv(+zrV14?1x?1m~RYj9JG_H*gjZ01vL zEhlj_USeF$d@{ed+d--&saUTk1#mDbZa_+PY2N%?F+Y3N3{ekA+ zv&u7s{lTfCqyshEbv@h$6vl-C>wGO##TD4Hofq!J#na^Tk7mnecYqYyKH85ZpLVqr zoq)!s3CUTd=l@>(S)BsIs?A$x-~K&lobtuL0xELxNkM6ApttS|2+#5>QdJ3EHx(=SDyT`YS9H|4eRja?TcCA-HPBZTV>CMC-m0>K;%tD) zuido+%fn*X?9N@UcW+B69j~sWH89<$%$O;*vm(p1!HI9t*qPhLlmXfj30y>3)Vj(q zOTSv@Dg?<(#uo~?JV8b!)|)oE6yg^7sS3ErXzP>k1vuSv$orL4sT8rTuuWzC-v!J_ zYMQ5s>KJ9U-n!S(;I4lF57!Wl`b|>@ea7zXk#ss|>bn#Onj@l3h_(G_hT4_rDjw!U%3(DCYI zX&&7H_S<~D)yj+0+#gRtol-q`^1GBAV?{vJm}w>F7zGJ6F-6}IH(nz3MqaF2mg((M z3hg63g=CEKE}-u<%IOY)>qxkffAKC_0B!hVsacF~PI|7<%xSfw-HAd{PWw~%pmN*e zlFG!Cg+cl$bE8w<>W6Q^-;X1Q>8DtGDHpSF*)$+6r*gmAEap$b>LP=)?y)JfSZO43@7<$n(&;QQC9&fZ4*Q7T|2)FZ6ZjFR2s1&cJpK z&z_C~(^E89jKXN<4hA2R6JReYE3e^U8sCOa&zbj));p#rZM)9OUDu2;Rht@~rDEEMLmA07 z?4P6~&UaZQo%Mz_K0@4=~vu)EwS6!@8Y*T`ol2>JzakHjw$&OI6Y53_^^uC zbn~8k){%W&M85N2QQh=jS9T|Z_cKBNNtd~@A@o368 zPv5NhGA|RSlPQ&CHu@!mFx#TTzxiJP?Qj>6ND2GGSz$keJ2&F0+2K`pLi-$hAA+;k zAI#x>-SowWCuO>g#wlg-TANX0>TXy^Rr{C7#&#k-BD{e~##7U80~UaZnB&cgu+10b zH^%RTSZ?%T6wF&E9(VVsu~HrvWcXq+IF8xOy0Sni+FC&~OXs1h4tK*earBqc_Pl7$ zfS!-T>1T~D%j$h`EuSc-=BTCsrUpRYqVK|o6*dE8=O!NjC|1nol6)G%mb;zazJQtX zFhA?O_`Qg3-uROgu4I(mA*ySUz!o2PjnhUsvM)I;EW#faRQ|Pan-MR@CO@1rGC70o zpQR_)3I+>jysIjA-al)%j!3S|;8H=}hhub?)3?6b-`YfFki2As$EKfQ=^Rf8k~%i@ z&mJaR71`tTNieJ@G2e;M+e1&mtg@o03{ZJsaKzPgBY8)wmfu3KPrO*NI+}%zEob!? znt9+8vgO1XxX3j7tZzmxl6@pvq=s2D-sb7$??+W;n*?EA@7vMOmz6D&zqN=MWYyh4B}KNQ=0O3J&LlukS&%U=z`oaLrI9?|jIUA&&G_};hf%X@oI z_3G1rpHm$v^y-y@4Hd;!$gZfyA6mCUvKzmNYUFF%$VI zqpvOHX4G`E$Ijrs-r?ivfiT<_FPsLPm~vKWZ$^HqM}LqAk5N*0_s6^6@ky6(^;`1N z-r5V$)gT>j*x@x=Z9M+g!M!3f{svS&D2_BwG{h!UpW`1zhT~?dEiKbK?p@qg4ON5= z6N$V(8F#&R@uc%a_ra0d#T_p_f9$5uyOdww2`}U=WwuB%{_rk&X7ug&$w^orN%V4O zA^#?*Me+KSK&)FH9Q~!%iYgZ|7XX^Ry}nu;6uTc`n^#dV_sE9+!MO^S80kxCa#_oo zXw06TYT+K1nzaei8RW^U2y)~zkEXK?pQ=x^!0ZXIAQp&=&$qipdqv$UAB$Q#fV`*9 zc15R`4HP?zD9T-54L_|0P~kkv2`JSHZr-!mvGf50)Th(p9=2#xtTK(0smOSIoIPCQRQPAEQtoF%B zkaZ3{mB+3Cphk6ubl0Zcw?o;8u0jn{oOP7zwxF_G;%L~qZRPwKlYiNBYtgxasaNv} zgy7p~G8zdRI9r>ahF;q#ci|-b{DOktv2VI-ax`Dvta$r`bbEVy(6RmUd|%Cayy1qm z-(s|A?&ls1KWU+&@0RO2I#y?CFcNDZZ_%xHiQDmGw}tqs#o-SQdOTk+imZ{lVJcmq zCllOwmx9&*_cq7TeUiYgD3Kudh1-*Q-bwcg_1!n%Cn&e&CM8vqd*0)w@Y)N#-?}Hm zC!23xD~pS}!~9cU14fe=hprUl$0PaL2oyC<37|)d+G=md+^TTp7e+cp-z0_%+w&!e z4Vny-5Q2grRl1(KZXaky)q?ctha&Hh=h@yBu%_-en_Vn=qojtK`zjT|91R|0`=^jg ztCE0NL4G&G3I{jvj}E|s8X)0!O1#^6AuHrew-d**1J6q(n2@j1xUw5uhw;3kF>9R_ z9-uJho#aL$^_U8mygjXMB3Eu3Y`g;K+g*yG`_`N;xty+;=PlH{+67l~QVq@fkdJm+ z=azqX?4KR@UH2KXDy|o~(?AIX`XwIxWNsR~3Oco|LlpOv@OC*fV;6ue3y z9*NOsx9O6Z+QS}^*N6f*uR@TzDh5*n^rJ7G^8~wjvs=Ws=ann;r**XrT@$~71fEh9 zxA_!NoUt9J+zhWc7N_#i1=U6!wR%StH*m5Ex(%l9e8b-*+GGrE|GnU-)c^I=7pk-C z_K9lzO<5N^37116JQKHTdJ=Y~Y`r`Z3@-Xxv8O}p(D3SmL^L?WnzUA^A1+3p$Vemi z^07uvbY6x7VkVjp#Rg4Qp56pTL~jLAo8+KaFu+ZF5!ZUw$DQIJhBWyH z#3nP)Ug3le&^Pw;0_R{a*235;>iTbxfKV?r6&N;J%v4(;!dZUKPWqk+Wbz@ zjgIkePg;GM`v1LFK&JFia8@H^$(W7=`H7{PAuN2wRo&9j*&pj+L zu{Ca(d{C7%<+PL#_F*Axwc_bdg!p`XZww_5k*?VHE*`X9Gx!% z?%~0pa!q_$zFXZ4&kR{ZVhz>i;?OF(vV6Rd=Chby=EP5Di*dN$Xh4P;hRSeVU1+}i zjLPHcyG2M&Q>z>zormfE`FOV7O+k8qwMTogS1bFwBKet8+1_%&nu@I!ansB4H*4oO z?X8?Q@)mpE)42yRJ?hs${$rj!}Q;Mb9f@A3Yb5Rgk>)Y z{^8>@(kCCykW9D?so<~soFNm?VwQ2N)Bot7pQEm`2yZG8%w@Kk2rfG?`0O4UpYM*m znatHdP57n3#_(wgbf)-d7NB&mhD43&^SK3F5s$}}LC;^OKR)>SsPG|qnRims$Ea)L z@jQWUajGWqO{9C;^~En%=%%t)&F)D@y8`%0?GmQCJdj@}nshn1+MGv0?t1oMDm{iY zv`m=0oVjkEu7RF1r~jc=w%6u2!7pF6q@2k%$`Y%`Wd1s>*{|!WZp^Z46XT6VJ1~8^ zvtT&)g{<67OdM2cmQ)yL|5_9r&TFtYwDbF=j|u_CUvu??F{(4jl){?qBcvT{wJF6X`JygXd|i<9_Nq z)A>uSE5$oT6zJZ4>+%n8t|;oVI|b*3oH{MjW!|9H!N&8VsWSvfZ7yp&g54=qD0N~{ zlN)*d`Lg5;l(O4}QV7snT=@dYRciGXO>PIceIfj~tf5T7muMsIK?B}}(pyVGQ3`1WDkpG>uP(l&6FhT0LM4{iS2*dXxz>jokCgf9Q2 zQ}*|y`36Air<%u^+ziKh+>FlwI8o@fMxM}k)i36fU85AvcI4Jgz0|XR@bFN=`^S7- zmaN{AWgxb2GVcrEc~fb?R9D|15IC==OU2oN3w})DK5zdV3QcheV{RSB8nWX4k}Q0- zcWrXCUsT3gQ~d=F8e-hu>YF}u)fd{y8usinJM&MycNS75rk{(h6W}=`2F~T4$Qw3G zAWxF=PuSoa(13TZ9Q6NA76H6m;CQP=k2ND9yRr|lt~GlWf3q(0edGOI#Y7chqSPIx zYp#E!+iAWLFF*#UIR^=_X39o#3wM^4QJM4QtqpGLyj0#lJemDL~$=P)g?e#i0T zlcwA&jb!(!8+EBgnAD^mKv=Tee;_TvM%_)$zL2e9Zyy5MMgk&6Zneu``w}JoHp^)yCU`GmliueoMGq2p z+>z_9cg0ioGFfr4+ZnP)+4w64{1I{8L6DkSLSDU$WDo}tAEmKpVaq~RoQ1}vTsz2A z^SLcvS4;5;2x<7r@x@|+bfW~ZzPbY!OM-Y5%V~t}gAG_aj{!WZv|K>;mmrHJUaVlr zt&1Y!M5T=!-CO8!ExfDr^Hi`Mrecrc^5Ho{lNNOlxQL;bk|O80lROdc>50rxj)c`N zL-7oZJ{C+X#rG^RT!#oNkNH+Oat7|5?wXHdwFgM3-FC$6BfeWkKL7!P2ar$(>S&JZ zUV`jDnvMS^bN0W+;{9KIN_p0AHNtWuZi;IsnO^KI4ga#u|1E#@Z`ShPoxe&pZwBz> zs-J87sS(UBnt={}iM4l~D$?rtW<&HAu-EK=znvInI(iZro2|o?KkOAw&a!v$tBa!N z+xOUOXIey8ChAXH2x%|hpTfz8pV1yq1J=XN(VYnBfiDz4wq!0@26%+?SYh~XCm)QZijCR?}Gp>Pt!5HC=vplg2K}(9Q;F5R76J2axsQ z$jC_24glnYY&=okE55ujgxkc>1yM{x#cgUM;lmGk=<TtA7LK+2{r9-nr``TkhCk=V+bQ6>9g< z?{`P{ubvlcCqW}cdz@GO%@T@xJ(#b$^#YrGg!GKF{U4N+>#*uz5Ne z9RlqX4|o`dlZ6^#KW}HYuVm>R{2%IpTtEu(DEmb3W2JZcb_X^!a69eFG9AOS8@Yq4!0bj7RvM za)#bE5+rNZW;6vsSW5&k12%f?fmgd(pw}k+1A|F(KFlh$)sb;+YapRCVM7%$J|7&% zmf-sXU%$m|Zw=tRyXKvN?GY3E=1p!KXuOAs7*6Nm{U6^xI&g4D`%DLkQtHrtt?s;R ziEti%`T6D%5T5fin}h3Q%VhFchTYk4T5J%)Qgr~i9L_BUO~}uVzbRSM6(hi`i0B{{sYMiX+pY70(7yce3kt3}(Wc-?ixS;!;U00#0W-wJI{8 zUr;S!ZZGc=1 z)>ppeu=aVm)qBX_%`;;jTj;r-IvtUJJLgM~e9-QTok7GWu<-5Z#0da0HXcUzY6cfw z4mClC!Foy&imQZ|j*~F}2ItlC3HB-AVzrJYIXdcNqf;4)MZ$_(O$Uqi^(kiXdTOJ} z&PC{etXd9pezXV8Y9ETN*h9WeB6)ve=ZToGBn*l)b8(jx)i*U`pb>OVDrWena+eK_aaE&a((V0pUTQZOl;M)L{SE()x6Xb1pQ; z{FXujAmkUpB>y9C|iJ zPmQD`-o&}v8fZcTdbKkBmE~#41mz*z$xO7WRe#`Df8bmx%_RRemFZqV?vIs(3i3t^ zpR?|tK15cx)PB*57IfZhsvVbp&P(V?|5fj%rTkkcE_5OxY}>&=YAtC_ zk$jk}pF6MhK>p}H;lT67s*qRzI-jIm+5C`sK%6|!5V|&%-G8pM*Nzx&u`DuS+m3pf zdcNHRi3@smjgAS(|EIUyss;&z{NU>MkDUl|?2&mV-Ry$TZD)pYn$l_Ji#S$7?v2pr zBDQw1Qs-*=~8+-MDB8u)d{!M*-_Ef2QFe1V>h9Chu<|p zj-D?*E&40mO_jORXU(IMQ&32iM5`hl6pKbZ4@p4Ye)+kFJn}sfEqAoIF z(J7XLXVb@B6tbGun69{=5^Fq9wucm=>&Sq_4k}o|q$raIOZ8qs{;h5{NU@hqJ$|xQ zpnD-ydSlki08}QImE*5E=4CCp^=(>be;YyMWwW0m5gi9`ELx7SSB#FKuz;{i^VY}M zTh{r*Ed7wpN66ixT4hs?=jgs;?>c;CNfA1<`&tWeF+~YkEhDC_`fGpjNX+`f+A_;E z0~^B?dNIam4oxgB+px*hHaLd37@Uwpvbp1X+m@EwF*a;UkWCN8g!orttyhz<0cc%$ zoP0&>Jf#DHke?pvI z=aLOYmlYyc!Oz5Voe3{W&h*!yMCUgB|HyP`5s^T#-BM14JG422SZg#_F`Sl9B17k# zMAuBXlgBp7Qh1mDpTu1%d6)eKU}?t6jMVG@a(EJebk=uk$9?dxBJHfY%F4U$el>Af z);Nhbp--H9zQ7(d9Vg1JzM5{JnayfC7{V55rAK`X^E|(_SsL6JHTstyZNkn8md&Wp z!lkfPMYRP6OY>2nyE+|)Vk++yx-Bgdy-d}f{)Y`Z%Z?DtkwW0>p-0UCkeKGe7H~-dZCNhiNIc5v5E2St%*ajSJ zTlzWLP(5;VF$&=^96Z!KiH@aUyEKwGMNo5*OaRsMIsKrvnI^t1$`_D&`LKz*-CQ#0 zd>l~X{iJsCw_e~kvC@*GS?;}RdUNo?*LhH@eTEg7&;-!W=7F@m>9z;%>`32t?Fz_T z58?_7mRh~5hf%Jcb+6nGKsqvR7TnYw`&hu|ES5;rnY)S6Wq_R&o813-)vrR?0CWj; z$dhsad=`iduwI=lzdUEKKAR$UV%dIpO89l!80IVlJ*fwVZPKosvwG{0>~D=%VvpS; zfVBZB$Ui?stUK()#qUSZp z9|JKgL4`es59J*|=37(~%Byez3g4jAW*|6?*(Ds|?Kkx5a|VLodZv{Ruj#SKb=ds8 z6ZrOruI88J>2N)g)ZxLl+i$F3953XOBMl}K5E?WW&3s6=Kzm*)66#R zs$yaqkZAX!gilciL}y|hR>0XRwM1VZP~C`U(R29X3?OQL0rm8SL>To2mvgT&xwseT z@0JS7u{41fuk_cY&^B(aDlLW$$P@Q1)pMN;vkonh#*zmhW#>JG>?9{l^K0NJ^_V=G z*0Bvk$zJ+Q&|8_^Iq$i;{L{Hn!I)_BvJ^9(HOw&;3=H5b>eNK+o8rTVwN@g0;J97# z^gE8FIS^Gf&MSWIU;;(-XC-u%P#sUd62Yq%ITp3i0uEpV`m=-e!QB%yMCDY##J{FU zS>T8I-O5^tMCD#$brSWvfqLuo1ei@8MR5iFvqcE5C=NDes1f!%(pgnD{U1nX{jz1J zDpk$QyXR*4UGGr+sE9s%E$OckM)PT6_LJ~&8zBvL(*RA0cU~ojNS0Y3j&>;qBc81B z;>VNJZaFkY3bixs>>_KwFvkiEi+FP3$&+Y4}IqD~cva zZ`wpJ#lb^;1ec=v;3j&Q8k3^ZE9&=NMWvRt2P~Bu-E%(8KqhX_SW@dEsHW*2(pS9`^8qgT0D#124ZLWPk?~jYYpdYboX_FCsc`c>Z$jHCb_ulil9Q)m+sMS zC9@s`$)kjiUsIR0p0pJpa)2EAF;q_QuD0E)1@Q)QWqZK1|yo zH7Am3U_Tr&*6|6iCob&cUKp}4m>@Px4l5eexASR1ficU(K&HuGzB1TZW+9{}`D|Lu zMV_nGtmt#_h*(DVm)DH#NVT>F7Lymd9N6hM-CgVcjnz2Xd0SGb_%VWD@zyHLy~$rC()6lZ4;#2&|yp`lJ(-dh}d+x#!J;Ktt`z2TIO|8gCZ0hGbPIKH@&Ar^gcQ(Q}2 zxBQ$yo4d%$cRdDt09YLd16OKa3I_1S1{;dNQ{C#(*|4q+q|H;UMGrd%H|k+B$-(tc zf3ya9{~e0xO(k{7s-4cO7+cT^|Hu329j^e8g$dvPyF&YaWzUC*I}c^5s#WNrSvo+V z;o%7#d#d+BAUfaix&jcd8IPCCz{JRV3(fSD169F;fE1CgwUGO}q#!Hd;3&L#)bP9-%gzL^j@2;Xe(1S@Y_3*c-kIzr0bm-6oXIx!lvRBe9T&U*e=1GND zMRW`902HzPJ87qX<5d^@>hJ0=TATC4UPfq;e^Uo$ zeY;2-Yh}itMZ>^ui7ltNxgM<)278(@3Om7;kVX|9FAKL=q zH!cBOw*58yFb;|B?8T1Z}JOsLB?01f|8EA(BMn)*aZ_Y)Tkvc{^GeU@sd zhf_qgIXYGt@vMVgxtxKV;b|bQiO9T72$4rDs15S^+}#1hBRn&9!u+8YPVg=u?fbqgCbEYKjF%3Rs#Y1m6L9K$uj+NufCFW6_TU2yZ9L z7!DUd$cf(l?@Uj;4>d0-E0>$}&JQK5aOHy0^73pw6!c6WO-RQ}aMz5YM4XFQuz~k3xJnX8ZWvKW1`5CT%uPQ@I_iELcr{ zkww9~v?Zi!AvtnZ0P=sv+~B3U4-P+YG|Ft%#MTlyn7+RQWQ7}4tv7e5YQ`hAT9rip%sH+lpfmN{$JFeqDEk{I~L*4XiS9D-5ZGUYVtTvKjgCX!i)itY79n|JoL}3a(qU@9|~Cy`)HFl z5U14fG@|D8o?1$@Rge`%pE-j@il?fHCHD?e&0sN3+LA^d%b__oL1}C|9@=35IWee` zD(Sjj*|9;HB1DZeVcuvk$qL^KL(Gx@MpRzdHn2t{#&_n+tcjrPT&{C3H=7tMz2XVB z1^kR@lJ}Jkhd}1W=7JNq4T}u0Fd+(67rPT;nW@A=pmikYz`(mVrpFLv8n<*qlyI#^ zeM2Q+pJqTJOGW-Trk6)NIeI`I+mp@5*`DZ-TWQzxg)IK9#f}s=b@SD=*@Ee{(P7Aw z)-@x*^j2#vdIuR^3l%*6)>K)W$%Udf_?MR!c93df&T z|8l1mewtH*=lv3^Tm(}M)^|5%U=GH9^}X65VZmln__ kTEMA 6: Control de concurrencia y sincronización +En el tema anterior se trataba como lanzar varios hilos que cooperan para una tarea. También vimos el mecanismo más básico de sincronización: la espera activa. Sin embargo, hay técnicas más complejas. +## 1. Control de concurrencia y sincronización +Cuando varios hilos cooperan para realizar un trabajo es necesario coordinarlos. Los mecanismos para coordinarlos se pueden dividir en dos grupos: +### Control de concurrencia +Hay al menos un recurso compartido por varios hilos (variables globales, buffers, la consola, etc.). Esto puede llevar a conflictos, por ejemplo en el uso de la consola: +- Un `printf` no habría problema. +- Si son varios la secuencia de ejecución no se asegura. +- Es complicado usar `getchar`, `scanf` y demás funciones I/O desde varios hilos en ejecución. +### Sincronización +Uno o varios hilos deben esperar a que otro/s terminen alguna tarea. Ya hemos visto uno de ellos: +- `WaitForSingleObject(HandleThread, ...)` espera a que un hilo termine. +- `std::thread.join` versión muy simplificada, equivalente a `WaitForSingleObject(pth -> native_handle(), INFINITE);` +## 2. Sincronización entre hilos +### Secciones críticas +Es el mecanismo de control de concurrencia mas fácil. Se trata básicamente de: +- Definir una variable tipo `CRITICAL_SECTION` (normalmente global). +- Identificar las zonas de código que usan un recurso compartido por distintos hilos. +- "Marcarlas" como secciones críticas: + - `EnterCriticalSection()` al inicio + - `LeaveCriticalSection()` al final +- Antes de usar las funciones anteriores debemos asegurarnos de inicializar la sección crítica con `InitializeCriticalSection()` y cuando ya no se vaya a usar más de borrarla con `DeleteCriticalSection()`. +

NOTA

EnterCriticalSection() bloquea sin timeout. Una vez bloquea, el hilo permanece bloqueado hasta que la sección crítica se libere. Esto hace que los errores sean difíciles de tratar. Se puede subsanar con TryEnterCriticalSection()

+### Mútex +El funcionamiento es similar a las secciones críticas. Algunas diferencias son: +- Tienen nombre y se pueden usar para coordinar hilos en **distintos procesos**. +- Permiten timeout. +Se usan de la siguiente manera: +- El mútex debe estar creado antes de usarlo. +- `WaitForSingleObject(HandleMutex, ...)` antes de usar el recurso compartido. La función bloquea el hilo si otro ya "posee" el mútex. Cuando se desbloquea puede devolver `WAIT_OBJECT_0` indicando éxito (y el hilo captura el mútex) o un error. +- `ReleaseMutex()` después de usar el recurso compartido. +### Funciones WaitFor +Hemos visto que `WaitForSingleObject()` se bloquea hasta que un hilo termine o el hilo capture el mútex. En general, se llama objetos con bloqueo (waitable objects) a aquellos elementos del SO sobre los que se puede usar una función `WaitFor`. +

NOTA

Un waitable object puede estar en el estado signaled (señalado) o nonsignaled (no señalado)

+La función se bloquea si el objeto está `nonsignaled`. +### Eventos +Los eventos son "notificaciones" de que ha pasado algo en el SO. Se usan de la siguiente manera: +- El evento debe estar creado antes de usarlo. + - `CreateEvent()` +- `WaitForSingleObject(HandleEvento, ...)` se bloquea si el evento está `nonsignaled`. Cuando se desbloquea puede devolver éxito (`WAIT_OBJECT_0`) si está `signaled` o error (`WAIT_TIMEOUT`,`WAIT_ABANDONED`,`WAIT_FAILED`). +- Manipular el evento: + - `SetEvent()` marca el evento como `signaled` + - `ResetEvent()` marca el evento como `nonsignaled` + - `PulseEvent()` desbloquea hilo/s esperando en el momento de ejecutarse y el evento pasa a `nonsignaled`. + ![[Pasted image 20241125141145.png]] +### Semáforos +Mucho menos usados en Windows que en UNIX/Linux. Un semáforo tiene un contador interno. +- El semáforo está abierto (`signaled`) si el contador es mayor que 0. +- El semáforo está cerrado (`nonsignaled`) si el contador es 0. +Se usan de la siguiente manera: +- El semáforo se debe crear antes de usarlo con `CreateSemaphore()`. +- `WaitForSingleObject(HandleSemaforo, ...)` se bloquea si el semáforo está cerrado (`nonsignaled`). Cuando se desbloquea puede devolver: + - `WAIT_OBJECT_0` el semáforo está abierto. Decrementa el contador en 1 y si llega a 0 el semáforo se cierra. + - Otro valor indicando error. +- `ReleaseSemaphore()` incrementa el contador en 1 +### Otros mecanismos +- **Interlock:** Se usan en variables compartidas. Permiten incrementar/decrementar una variable sin peligro. Son las más rápidas (frecuentes en drivers). +- **Mensajes:** Implementación rara en Windows pero muy comunes en otros SO. Muy útiles para intercambiar y sincronizar datos. En Windows se usan para el sistema de ventanas. +## 3. Sincronización entre procesos +Es posible usar mútex/eventos/semáforos entre procesos al igual que hacemos con los hilos. +### Sincronización + datos (named pipes) +Una named pipe permite enviar datos de forma sincronizada entre dos o más procesos. Las principales características son: +- Tubería de mensajes: los mensajes enviados por un lado se reciben por el otro en el mismo orden. +- Bidireccional: permite a un proceso enviar/recibir con la misma tubería. +- Utiliza el paradigma C-S. +
+

Ejemplo típico: named pipe

+
    +
  • El servidor crea un objeto de sincronización para indicar que se ha creado la named pipe
  • +
  • Cada cliente crea su propio objeto de sincronización con el mismo parámetro Name para ver si la named pipe ha sido creada, y luego se bloquea esperando a que la tubería esté creada.
  • +
  • Tras crear la tubería, el servidor indica que la tubería existe con el evento de sincronización
  • +
+