U2 Part 3: 死锁 | Deadlocks [未完成]¶
约 9 个字
+约 1562 个字 预计阅读时间 5 分钟
sketch¶
+deadlock: a situation in which every process in a set of processes is waiting for an event that can be caused only by another process in the set
+System Model
+-
+
- 资源被分为很多类,当一个线程希望有某个资源时,这个资源的任意实例都可以; +
- 互斥锁、信号量这种东西也是一种资源,而且是死锁产生的一个热点; +
- 线程使用资源可以划分为请求、使用、释放三个步骤;
-
+
- 请求和释放可能是通过系统调用实现的, +
+ - livelock
-
+
- 走廊里两人对走,两个人明明可以通过但是总是互相让到同一个方向,然后就被挡住; +
- 可以通过 trylock() 来描述; +
+ - 死锁和活锁的一个相同点是,它们都可能只在固定行为的特定情况下发生; +
死锁的条件,必须都成立才行
+-
+
- Mutual exclusion. At least one resource must be held in a nonsharable mode; that is, only one thread at a time can use the resource. If another thread requests that resource, the requesting thread must be delayed until the resource has been released. 互斥 +
- Hold and wait. A thread must be holding at least one resource and waiting to acquire additional resources that are currently being held by other threads. 持有并等待 +
- No preemption. Resources cannot be preempted; that is, a resource can be released only voluntarily by the thread holding it, after that thread has completed its task. 非抢占 +
- Circular wait. A set {T0, T1, ..., Tn} of waiting threads must exist such that T0 is waiting for a resource held by T1, T1 is waiting for a resource held by T2, ..., Tn−1 is waiting for a resource held by Tn, and Tn is waiting for a resource held by T0. 循环等待 +
- 四个并不完全独立,有一些互相的暗示关系。 +
system resource-allocation graph
+-
+
- T->R, T is waiting for R, request edge +
- R->T, R is assigned to T, assignment edge +
- T as circle while R as rectangle +
-
+
- 无环 <==> 无死锁; +
- 有环时,如果环上每个资源都只有一个实例,那么有死锁,否则只构成必要条件; +
- 这句话的意思是,就算环上的资源不止一个实例,也有可能死锁; +
处理死锁问题的方法
+-
+
- 忽略死锁问题;(?) +
- 使用某种协议来预防和避免死锁问题的出现; +
- deadlock prevention +
- deadlock avoidance +
-
+
允许系统进入死锁状态,但当检测到死锁时我们需要去恢复它;
+
+ -
+
多数操作系统普遍采取第一种方法,即将问题抛给开发者而非由内核来解决;
+
+ - 而开发者避免死锁的方法多数以第二种为方针; +
- 还有一部分系统(例如 DB),倾向于使用第三种方法; +
死锁预防 | Deadlock Prevention
+死锁预防指破坏之前提到的四个必要条件,只要保证某个条件始终不成立,就可以避免死锁的发生。
+-
+
- mutual exclusion
-
+
- 这个东西显然没法不成立,很多资源天然互斥 +
+ - hold and wait
-
+
- 一次性拿走所需要的所有资源,就不会有“有一部分等一部分”资源的情况,效率显然很低 +
+ - no preemption
-
+
- 拿不到所有的就需要主动释放正占有的 +
- 任务没完成之前就释放资源可能导致任务失败,总之很难实现而且效率很低 +
- 感觉和上面那个分不清到底破坏了哪个,但是毕竟很难区分 +
+ - circular wait
-
+
- 通过给资源编号,规定线程只能按编号递增的顺序申请资源,就不会出现循环等待的情况 +
- 限制很大(限制了添加新的资源、有些逻辑顺序与要求顺序也可能冲突) +
+
死锁避免 | Deadlock Avoidance
+++死锁预防是保证死锁在逻辑上不会产生;死锁避免是阻止可能产生死锁的情况。
+
-
+
- 安全状态
-
+
- 充要条件:safe sequence +
- 需要保证 Ti 所需要的资源可以由余下资源和之前的资源已经持有的资源满足 +
- 按照 safe sequence 的顺序分配资源和执行 +
- 在 safe sequence 下,所有资源都足够使用,没必要“争夺”资源 +
+
! eg "放一个例子"
+-
+
- 资源分配图算法(了解即可)
-
+
- 当所有资源都只有一个的时候可以使用 +
- 引入 claim edge,如果未来 Ti 可能需要申请 Rj,那么有一条 Ti->Rj 的 claim edge +
- 如果真的分配了,那么改成 assignment edge +
- 我们需要保证在 Ti 参与算法之前,所有的 claim edge 都已经在图中出现
-
+
- 我们可以约束当且仅当 Ti 的所有相关边都是 claim edge 时,Ti 才能进入图 +
+ - 如果将 request edge 从 Ti->Rj 变为 assignment edge Rj->Ti 时,图中出现了环(使用图论环检测算法),那么会让图进入 unsafe 状态;反之是 safe 的。如果 safe,则这个分配是允许的 +
+ -
+
银行家算法
+-
+
- 银行家算法支持每个资源类别不止一个的情况,但是效率不如分配图 +
- 每个进程进入以后都需要先声明自己需要(各类资源)最多多少资源 +
- 每次有用户请求资源的时候系统都会检测,这个请求会不会导致系统进入 unsafe 的状态,如果会就需要等待其他进程释放足够多资源以后再允许 +
- 为了实现这个算法,我们需要维护一些数据结构:
-
+
n
= number of threads
+m
= number of resource types
+Available[m]
= number of available resources of each type
+Max[n][m]
= maximum demand of each thread
+Allocation[n][m]
= number of resources of each type currently allocated to each thread
+Need[n][m]
= remaining resource need of each thread-
+
Need[i][j] = Max[i][j] - Allocation[i][j]
+
+
+ - Safety Algorithm 步骤:
-
+
- 判断系统是否在 safe 状态 +
Work[m]
<-Available[m]
,Finish[n]
<- False
+- 找到一个
i
使得:
+ Finish[i]
== False
+Need[i]
<=Work
+- 如果没有这个
i
,则 goto 4
+ Work
<-Work
+Allocation[i]
,Finish[i]
<- True, goto 2(即表示了进程运行结束后,资源会被释放)
+- 如果所有进程都满足
Finish[i]
== True,则系统处于 safe 状态;否则,系统处于 unsafe 状态
+
+ -
+
Resource Request Algorithm
+-
+
- 判断请求是否能被安全地允许(两个步骤,先判断能不能分配,再看分配之后安不安全) +
- 用
Request[n][m]
表示进程想要请求的资源的数量
+ - 如果
Request[i]
<=Need[i]
,goto 2;否则,出错,因为它请求的量超过了它之前说的最大预期
+ - 如果
Request[i]
<=Available
,goto 3,即资源足够;否则,进程必须等待,因为没有足够的资源
+ - 假设系统分配了资源,即 +
Available
<-Available
-Request[i]
+Allocation[i]
<-Allocation[i]
+Request[i]
+Need[i]
<-Need[i]
-Request[i]
+- 如果这样之后的状态是 safe 的(上面那个算法),那么就允许这个请求;否则,进程必须等待,因为没有足够的资源 +
+ -
+
有一个关键问题是,为什么这里看似“贪心”的做法是成立的?
+-
+
- 考虑一个进程,释放的资源总是不比索取的资源少,所以贪心的使用不会带来问题。 +
+
+
++缺陷: from Wiki
+Like the other algorithms, the Banker's algorithm has some limitations when implemented. Specifically, it needs to know how much of each resource a process could possibly request. In most systems, this information is unavailable, making it impossible to implement the Banker's algorithm. Also, it is unrealistic to assume that the number of processes is static since in most systems the number of processes varies dynamically. Moreover, the requirement that a process will eventually release all its resources (when the process terminates) is sufficient for the correctness of the algorithm, however it is not sufficient for a practical system. Waiting for hours (or even days) for resources to be released is usually not acceptable.
+
死锁检测 | Deadlock Detection
+-
+
- 如果系统既没有预防也没有避免死锁,那么可能需要一个死锁检测和恢复机制 +
创建日期: 2023年11月16日 11:17:25 diff --git a/cour_note/D3QD_OperatingSystem/img/24.png b/cour_note/D3QD_OperatingSystem/img/24.png new file mode 100644 index 0000000000000000000000000000000000000000..bf940441f79730fb762dc877b9e1d86a9e17fd02 GIT binary patch literal 7321 zcmb_>XE>bE(>H6?MDJY?StN)WeRWnBCDD`UB_c!!mL;M`S;6X^M3h7?(M1hmb-`wd z-d5d}#j|
C4XX46BGz$I-CGAt zQo6@eaCS!>Omdsvz`A0O!mXfwiDc?ZlRyYY=-p`GCZ rEooWP)+ d0w(q7%if*!>X ^ z7$^$3*njHf2Sj CE z=L-0A8bpJV8@?9nBI+Q8lC`tqi5@UA(}UV|(%Ap7O{!AJ;5gP^9_GWuZybxThODZ{ z%geuX3EC`-KKX$M2&@u8i}438nWr4sr0y`PGM{Q-c^Ur<2xAn+?2OsQM6ZbK&DRZZJ$TWzyZmj@Hh8b0VRK!*{QYm%(@tK%ihT^GiLXT(>l~N^ zNuvjuJ96N?5A~I5qXNgdFDZ^v^~LU6+4^cptiG7}U49pGLjXkwHNCbWi&sFkb+3@> zqxcXxN6T-N6RIzg($~*$%v{T|aw8oAWbc5{`kh#}8>uX)rp)V5;zt<$xfSAT7A*A( zp $lVv@T3P+xwe zCa%FTwG1hXDu*$=dE0N*FRfx@Ghen!U|TIYtK*!tO_3NRI5yB2SrbS9P+w1$U6nd5 zW<>h(6WjfUG$;5!VT%F0Chk7LoR vGelM zo@``a*gS9PAM_R0wwS9xTiu$I@t;=9KeC*5(Np#o?5_zo^>x<9FwV77JC}9AQT%RP ziC#B27f9rp%j}q-fYPSIQKmo!TVP^wiuV(ZV7~I6`nW8*!=E*y($H=N|K3L7YzWWI zhxjao) |ILVmiFSL--RC>BvO04>BMoA>=7Tldx4>NM#qq-fj!3P%-7+wA3#=xDT zm)r4Ty9T{6^@6$5i}pwVym({0d{xkc)T_*Z+`jaR6MgAnjm1e;q*02f6okuMbu=?v z&`J%y`PN|jB&sg#(!{TSeEya}S+gyo#GjRN9hYjFdh)aS z6SeN{^_H)CIdPL(M}_t14fJ5?6e7~#Jv{oRYTo0XFVV7E ?foWJg@>U?0108IJ2Z{vGg~mQ1L-IWd-L-S zgP^jBx_YfIl7|}M C#Wzr9X111HfLHwSaQI^ll*}3lUm#A?%T$X$#I+Jm`V~{+}|}m zxE)~>@ze$bLrJboA$LPre|b6o2-?*1a#S#aDiy~)TRa=RL1D2MDNeGgCk+vLb@BAf z=e4YbQ4ejl1%9}DHp}u4 zbp}pLoek8KtB*GG5=E+PMSi6;mw}EsYTx0Pi&A3am(?nDNQF)6=>4!-{v6HIUsiD< zIt%0$t13p`3cYxeS9w0eb8_%jcIp fX5IkyLyqvyMmVtZ_+y; zZmp9-J3T(80^Wh!f1<5h-^e6HgpksFYSh5QzXwMm4O=+0qhrQI1Nv`|GwV%4Q@m%E z(rHQis+-qZhClAJ_tW01z7VmM{aNpMQ;AXxj<5CYuQ5oQkR`99;Ls6ZjT9#eV{gA1 zLWR#qJwt_&8^c!nDoH MOety$I$!VN$-bp!UNF{Q zG9HR|VYYmiF>`ZlBVUwuQbHs~Ol5OJ*g%;QhGzJS2ZFerVv`B%?XB011`DFNms9PG zMq$A >UB^1sp`DuCH=Oig#FNclzu0hrpNnj2U)8FN&3E# z7s!fEkx|{sUN1!&q2;$@*W`c0Y%n9zZ?w=&oE*Eruq-_|{fCYwr=ip&UzM2M5wW(< z=ZC$t=QKP@G4~yE9=-qb*mxnl7cV}!!a3mzHxh>8wCi5rQRD4zSl7cuC+1WmNys~o zhDC#G+K-0ODff$jJ9XUdQeOF&(kV=xA;sH3=!)i4D1~CMYkuh2sMNTURL> zx%8syYJ$| tbFt9(`l=7m5a^dla%BFvPI{=yLWbzE@ff= z3~mCU?O(~&UhY&i3B5SSYt7MK>^@oQf!gIiCWzJ0K&a@SfXYvNDH3o;wQFS8{IpCw zIzwDHr(66{^Kn20P28_{rnLY5i*g=Dr~w`4?w)U-Wrm)14?uCK@HgQ%g8egmb{S?Z z@eCR=^#zRBdjt235A#Yk%WdLGb?{1m$rF?}dpCZKM5}u^l%X?x405^;pmXf)D=~`C zxd&3t?@o=7n&FQUQ#rAiI)*vKU+1T$YW*3hQ+I6VHaH`wJVc>5Z~&<)w173l-Yl({ zb;4-Pj}@0Jx#E^)MOd8Zs#EL`G_8xirft8qZ(ZdYe~fST1+5NQpaZm-6E;`X3o>Im zibtu&grR EMK#ck!7f5wv2&cYL~= z%llpaIrg3ro7nrEN9Du#?k_@$xmjh`ChK=;%KVY_l;oi?r#lx!7&@=>of03o^Xk6$ z8kB)kxX7xYJW4?XiX-c%#Iu2Zb#QvM4!a&4F64(@wRC$g9KtDIwy@tV0UOKL>ZZr7 z48iaG*g}>|WmjTzM-#Y3si68P>pbU H5)#xE!t0A=smCF>d8|Z}bmpxnGW!HTK-L6+Z14 zZNJOYS=aALQdD6S{Bs@Itsm%_RW45+M#}B3=e}NMH}$|g{AI~C>7_1tH>DJHzFRk* zRaxCS+ {_6 43FU{>o7GA*U5_yIo4A4E-^dot@1p`@~qzSUT&A4-JfhkpQGc&$qr68 zZ3Foj+Ml9=JL?7iIgx}URTXwBW<4r@uTFK6MiTENjP*@aUug1iD6 1{vGs~q zTrlFPp|3^vrp#S}u4vd!0S{HP|AnkV>F 42&fmuWntPJ&qcr@Pz-r90 R=cR%> zBUT76DX*1j8OkYMy|@+KKo;dKE-0S&O?NOLlO<%o$LC4vRo?{Qx;JGHlj6v!OPHhK z26V<*-SVH>QzPK$9yUaNJdAYxdw8$g&TJRw@$U`uJtEc5mseD0*YDi&es_v6cG^{R zGU7khBLR;~t}Wj2syeM& GM3 zj6|Xb-atZu-*0im=hLn_Y17YZ**}bJjLl86e@N|JWcTa08)J~kJEOJ8Y|Wbt;w~om z2LaZ!-s)YAV0teFUF=I#?McDkT0Y-7L5pu5z!3kz`DaYXAzMQ7A~!8-H6U2GEIS5* z*J@|JyZ=Z@h>M@MwUuj)Mr|p?V#}bnx;byPOx(%pmnF4eG}%HrdsNc9I~u ehg806TpExE*W HrWT}y~oQeZ}G2_?@lHuU!rAAewijZ*lV!i_Yy6mSyZ zjV9lRG{_$7(GR{2kGA#~lSGO!MurxGedoodml%M3-JpM&n3V1yBn~W05$I--liRSMuN$Q1}h%n&8EmYwh1s;U^qMm<) zo$+)HjKcp3BX{zo%TXcMX^FW99Y9umy;$N{DkPOv5-B^W&H2GBcOi<%mC?RR*jtbm zVygNzmEVLD!1IPh$7w Jrjk-Z&F+ zNGTaVYWS&rLB3|hzk3C9n4EQClt>|kCf#9jqq}A7Hlyi7cpUhW!oLs@8TIw~Q6bT* zLW0%L>Rpkt{zj6>SE-w( z0+rl^jYj;L*NPd>^gd1jfVTFdBZmh3YJ|+U=%kZV|3FQ#mI_vC=`Ll95FArwwmjv_ zCo_hP6!}W;MkSu}6<-X&n-A-m`9I||Qze@8XydgjJZFVzq`4;p8mDhDcLMP9QS7%R zkmr{v>qdr#2<6~2pmU@5qRaPz0iE>mH)bbvLjgrwpZC)3#{V1G`reNK7xv_iZN|$+ zI=_55X+k*bkWZgIdHJ*`%(V-~Y$sS#YXtGq^%wgRKV{e!;lRjpTo) cUJ(N7>gRv2BW^ce5>c(bb2D&$3vPHHs+RGAca#p;M3oGduZQ6pzKd zM>giP!(OTq?et?Q-Zw=KbTyco) s*!>rB|dL0+|e0K8*?_4M)sJD-AR$+Y&&?Mcgp3+oPl zpa`auAK=Vh@QD5>D*62FPrP(mLu`9poEX}ZvsIegihvdYhi9Km58S%uI{J&^jZBJ& z>JW_mR5}WL?80o +UBCG#U1Tm}K7Q6 2CA>g@PgP3r9p_F@*Pjn EmfB-Bo#A@%CN;KT%i+i)RnCOx9bhLKgkfIu zWx ysSU|LuR;01 z^2x4w9?0A?v=gw4TG7F*kQ#@#P&}ZyqJ43@FY1o43cOD-0}=JdI8RBQ6XfmC=i2R4 z7%kvCDyq;ya~X1LcSm?|33cAHYF@Mp4q{n2G{rcCw`@Lrn@?t?{tvo*WY3Br>HCV3 ztMJy^W~IM(bz|!p%9uYW7Vb<=Rh-e}vH_EakJ<_H6&s)hP||%zuYdXKn3V3-QK}6_ zIB>L!ijCM@kEXp&Os#*W;#(oDTfw#hPi`jDQ;(+MrivS4tPy;bWh- $B`d!>gk7Nq1+gw152Tsb1mg^d|V0SqP%}&FMB#eUwYOjOR>d zl}!_23&eQd?)TXk%hm9ZyHkmQ^~mjq{A&9-+Jjh2lv|b{?94E>q9!}PTt#6hMx1lK z5q)JkA0H%2hvwT~YLg2Tul?BsVc=_x$yasKJIr>dd@Nr@!Ne}PtU=qBG$V(J`03U{ z2QBuLS@l}=`IdT<(dS1R6U>yNUd4n>kOA~&QD)d;A+-7wR^)?T I+`NutGy*$cRmo@r7raq> dw{#dyQ>BR zLvQB!c=i}$c4)PVN%~>RD>J}82`#2hVv$6ew7bC_ n52}LzzJAr5ZLhL zO|bi1-a&VT1p&4p1IrQoqdiww {-8$#6ltsQ`Sd Lz%Xds&~G}P7_LwSQd z_>1y!?~ Nxpm zWudD$mqf67GmC7P=!PM+8o`NkwFxjgnk!2N{Ezwa;z^<;n~dRfMEE|!XFd;S-TqlE zcRLS9MqQRwM3DvyuQnY9TP%8U5sE2^oMti=H-XY7|9^T;iU%c48tM%%e-P`FYfpa# jz-a0><-4Yk))!$i^efw;d& - R5VOMw->?juHO__F5p` literal 0 HcmV?d00001 diff --git a/cour_note/D3QD_OperatingSystem/img/25.png b/cour_note/D3QD_OperatingSystem/img/25.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf54e9eb41f1fb553b17fa039b88eb073aa23f3 GIT binary patch literal 8027 zcmeI0Ra6{7*RE$^2qZuP1W9lS5ZpbuGk9
xVW;cxH!48lf5~_#tZ 08~ffkbWe`HR3hDmVO|bpmvxkv6Sb276VJzrK6km%h#iT`!sUlWEQt zuukNFWx8mY#P8+Eu?%AbgCU@)LF$qz*|h)+3?N=9GUi(zrM{@>Xh1DSlRwLu9g@Vd zK|_kwQ^QLaJ|?Mf3_1V@(~*!RCIkI~0&q@WEtB~UpfZx7FiIfHRw)9;Ko0h(!?hT4 zOu{W0z7R@N@L@#X#s?&-@e(_}0+gS|mJm2_ s7mzU+#D~m}CGd|oa0`n_gqU$G zJWBZ-auj65-RJNlcNXRT#3Rg=!eDF?J>u)44Zc#i`kfebwx6*$sH+=$^ij@NFwvBj z6%Ss+ac}cOs8}cUV-AQ7#rP6Q)c8|hIhMe#+29Wbn*m(&ddg6nzIZLj<385lzaJDp zC*MkPePZH@T9)B)qI8yKzOUWUYMaRSX%~6_9*vmvq8a^o2`aN#OldHV&MyZfF~)xk zzQc&0B!O kAthv&=7{Z03=e z=#;^50&~Yd`Fj_e3?d+-KoJpC9Ie@I+*lNltuLnUx#IeJ3| X7^k%__MI4on^&H{3tMiSaNP-V>o$_>_viieuHb1#Eq%7CO@Uw))+P zqvl~~_=D)AU91`1cCz`8=Y*RL^Yh+W<;6IX;m@9+r5u~5OBr=t^_FjVkZS+2m@f;B zTRsgT-hMZeaEga7iy<#I;Y jSuQ(7bQ Cc2<5z70;N&)7 iyA{{79G6K-!{gV`izDvy9 ziM6RKh6&>oGy;tUaAn4DIH0a~lYs(Ru~4=}*;7FUlfh6ujN(9TBcac)ii}XS(CNEr zYVl4$-rc|{Ky={jCUGmqau24%yXtJ_bEK>9?wcGz i zPiU4a&q@4Knl}IAp;{xBei*a(=(Lp!k4{Xs6iWfml;RZ%e*jSa<7|&St9MjjUF~N^ z6!2i*B5@^%p|`w_zw))vfwdOxLa1+FI4@?&&W!^~==N(~f}DuSo|J98JH-xC`<|Mu zm~+2JqCh!T@ & zR4Z--9|g~-7ugj}n!47bEJYGa?#EfgrX;k)WejN!>F-YBVn*QghvFy==Z}>nem(wd zL3c}MpO}=SkR+I7l87>LnK+tsOJ}I;SNNzR`L$o;M-jWIWPZK8S?CB|k^sGZsaiSp zd``O9cnNdCg7Ty?nW}K V*X5e(hUIbdjB}}033G4eN9Nv^>#IP& z(pKn}H_Y)JJI^u9$CPfUl1=48cp(yyT`R`<#Ue+Q0_lW8NZH52;aR=XU+R}p`|k;* zI11`4^_G#AxtFzdQt(wq h^4!doma(!~WZ=-JWcC|nBn<;>z9GO9@=B%f@b7P<@ z$AgDTvm2%U8eR5<3o>VMt8vs+@1i=a0|*xh`v}K47p z*R%H+sGXD< z9NPFiYWZ{eb%B9NdR ah8&nsRsoNc`=1gG`jN3@ Qp1|D1nxaulPqhi|x5R_b zTcyV;Ehp+HX*Vc0O*b*bF2t0?5yXVV2GQJPS?peWhnEFid~JODymrnV2Zcwt`)a#$ zyI0Fg3u#cjBcHV&$2ceKe~YH~k}9$oHe3s!wmj)8S}l@x<93E?f~);7S6C Y?H=W#uokA zF$Mh!(JOej%tGXTo{ya%C`eY!IbUZxxG%l$RyI(!BA$QnCn=Bj>YnM7si>358#-z> zGw+e^yW9)wL3ag*4COCd`w|u5v$O`8g~D_eGZ({F3496fig8pERNagGwj> >Y$1fqSEQnXr>;^zu)di>jCb~L)2+|IJm8q_M* zy1g&gl_a1EsifDtHoab)zqUTKmRso17w|moXa8HT0R0U81mz#48X@|dQDa#543;$S z|2Yyc(y9JR9bCR{ziHdrHtlb+M$@ZMlp$n`Z}Yp8+7#^DWahf0vAqyfHQ7vUC-6eF z(~^D)UjeuHuTiW{|Kf170RNO$7-#;jKWaU#BWrsGd)>Zr3xYu^8){bSH7)Fqgld)Q z&+eb+o_O8`lUWK4@oKpbZ7a`zTi%NID)f``^%pl6w=i)s8H}r?8dq3X2#w( )Im`s!W9OYOaheTnzM zg>+zy4%wjK@7v&q-Tv8*62mrpp#mWWC^xM7$Pvc3K(xB@?DKe8O^{EJ^APbech_)S zbUiBWfB!PSEL`0MO}d-kgcjLft)F;6;mw}pUYlF(tL`})DLzvVwU<;oJNHVmIc>s9 z4`OiD=lOl>*_LzrTU2LMR7qks=^KWCo`~WS <-^4v%2Ba86M@Ec0uh7qhg zB`rUxL_BxE@#c%SJlSLWFO=@zw&!;!*Yh+0ECm$u_4m2V%)PFMl{5mHa_HFE$lRem z3Zn|hFU3QXnZkWf&gg~Z)td)5hH)?-^|7+rI>Z+RubGytxqqr{(e)H>$p(uWap}gGs44Ul zlbpbEIB|G?LiYUZ%f?ps?F%rhorySZf0<7ASG|l(ahuaPYr^ykDJk)>uV41HDw|&n zDhwyjz8u_o8caeRvp4t-9v*x*HZEcA*_WB2QkgYMTwg>0AbJInNXpg;c i7LSP%P)1%j*2GYAo>iUj-x*T zdhxoFtfa2gfRwo=rw=Wwh@<{@r{rp-L_|bn3;GvVoAtEL#|A{{MF^kkb3g}XX3KpU zx*X38WP}XA6>bT%D83=p+*+%nLVMIjVs|QQ)nWVjyu0OmrPq8oO32md{czLjq|lnv z^Rj|t?45=c8wbXT^KymGHb}Q*LpA+O{x+{I+y5@U$rNazRU)xJv*EBg5hzNSe-?K{ ze)1`0a|rRjsj^v)nt&!(!#i}zXqQi}mJ--SqrRbuiMTO$POLS7TOw29BO)WEl}NL1 z$?fmAlejgSIkg2n?s98u9R^k*zJi@RRqI{{uq>_&jp^uz?VHM_Mz6!oEk%;{lU2M6 zug{F%MbzJyp1fqK7VU6wvie-zP2U$fTTJ9Ud%j#0OARQJWKrd}y!f0rl-wwy?=v6o ztv}eo^f_knEhe&x<314!@%FhNe&~viku70mQHR)Kbr1u!C&5QNGd7jBvm7&)i;ASD zNA tUmvsmFaF4sxgoB}ZJ&4ld@*`wkJ!?RK5lkVG@`d;1Wy?9AvG&Ks~{R9{V z1%>S)|7j3quDVJI;P-G;nQg$NlUso;^)rL!(Z!+vxah&HPgh&Zex=UL-G;NOp0j1_ zcM|n i4%XK7x95U%etS!ZRYYv1jdS8!hl}7Ip`cQx95KInY<6{a&EzI`GIubG zmr`MJ@d8WN^QyZtOM3c@eQ}G`H#^8TSK%`Q375Oee9Gm4* #$%(nE#8FL_Q(;^d zp2J%*p}9JDUO$-LQMX2L=*s n<=aI_f6lb`us2kSQk%L~S;=vdz;q zPcuEp%kAuX>5&@FLQ}-jtMTB^O2KJES_NlyDE1s(aJ_=syxp)|8IIQp=@M|7Z^OI# zF|(4rz9D7jd~qWG(~cQ7&t-a>67=c@UeLO$8z3k6CPz@0jO3|z0CRy!SB)Oat(p_~ z@z>n!8pr9MQI1A-&*|$nShb*?X(5l*Vk%>P6DAQSoDP=KNL1z`8nj;_Yw~#X@R@`p zt2Ooe(GdhOny832+81}a;;J&8)?#0>I`+lkB(<}sAMTkm$HTdr6 =ahC_etjFuwGlBKS*y9JDON6sBIUF$TwaoL8mW`ZdR?qjBLADk z-Y%n7dv#IxMg7NFB^tv=FN@u^hg(#oEN;Ke?y%Zg=ad?os3pma`|(Wmmgt`9J+N*@ zIy}@*ZUY~5-zk0CL-j~FUn5M;dbr+;x)B_*sH@{f%$}%72f-tyry?)#lr`fUZJ
pZweE5yuA3`?`^DDt2$FsEKb*0Xn9(G#i>BB zAQaR)G)#>*UhR!f6P?~gqgu*9U=!cqS72m0ET~$0rP0cDf2KkJBcaBy1i#F1{Mf%- z($2uZP&1{&M0%&o;A!*rF}CKf-sDhfy~FgMZo1nTlC=v-t+eTdGWCByMB%p&&M~BU z2xjFmQKkQ0TE6jI=BK{)aofGFr2x8lP-EcxxI0`e9{T% WBOBx>^ zbM)Kl=(nC-FMhXvq_#&3d4l?|M|xvarrD>^q6axz?-gT{;YG6dO1zkt?OBnYWw fj$UZWuON&J3q#XWJL%}KTG mSIVI#OR6LOXV7M%xf0CTs!lZKtF vB1S+jSG|2 &mKqJ(dJv+7D1Y}1 zx5Ksi+nfaof?<`Qz{mUN6Dyd;4Ga`Wxfg4`i%VMxpZEH;opSB$|12*Kxg%H34j^nb zogVpTt}#pyca`hieUxNJQ{P ^_H8EW z2bfuy72LDseg;n_H&Qb(wq+MjuLH+3(o{^Y30mHQRE{}5e z R?vPceP@qju3w2n`J6o=0N z03rm|VM ^*=Ll8*Wi>)F8VBY!w0CFRUkSIC~3CZF0 zAONkF0>P6G61a#vcwdPGAhJ_m2vvRnK<^J50Lcci05>r<3W)wew|f!ubpRR?xd;N- zW=iw+|D(yVyZK0?L0CrO2uR%u`%I45490(bGn+Wk!2kClr@}6;fhbsjz>)V;{6ZZ) zfWd$fR51`1R+@;~wo~R#xDSBbJsII0I6aJ-9YNDh*Kq=1gzeM{eK=_dn*IeJ%A!Wt z7f)jxE{~vTJ>T7lc!cw^@9QKGFfUOp @To9dixL6zl$vC}8W2xUYes@G4gvFV z6)~&YI00Zr2xamR0_KP2rD2SS{$x&UuqlFpcaN$5H~jz2{CMzn14l!SkS{!@AkX#< zDZ%58`J%`*!p7sYlvBrtfm3_;Yna`corUqsb67xP1)W*T-HxxChYJD2L1&!zi)D8g zJ0&26mtbeNhF07>WWs JzQt25HLR-Sg4Q%IQwTBM>6h2w?Zp03x0E;luDYTD?*W_p`sXKAiFGF`%( zIaxU^*Jmn43tny5MSNf_e3_aS7jQk@eaU MRQE$z*0A?_D9t2EICwo;B| z|Eod*i|?MdWUIr!zM3O yEwywL#t_kpOM@9c^ p87>=?1Peo%e;+2N7wsu~z4($ZttzvzpCmbh zk0@sf3Q>i7ZPys1CsNNJK6dHpn&YiIQJf#25vRbW>CiqSlD(=tT^yPPA~iV!r#g)h zIlMm+C)@#%gLnx5YYhK8;r~Y;bmsgKWoDv4 b3*|Jfwm-)H&u=PONkxfj IF{7aW1GoGv(EtDd literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 05803b80..c5fd0a4d 100644 --- a/index.html +++ b/index.html @@ -1099,7 +1099,7 @@ 欢迎!
站点统计
-本站目前共 95 页,累计 189363 字! +本站目前共 95 页,累计 190912 字!