Trang 97 Chng 4: LP TRÌNH A TUYN I. Các kin thc liên quan 1. Tin trình ( process) Tin trình là mt th hin ca mt chng trình ang x lý. S hu mt con tr lnh, tp các thanh ghi và các bin. hoàn thành tác v ca mình, mt tin trình còn cn n mt s tài nguyên khác nh: CPU, b nh, các tp tin, các thit b ngoi vi Cn phân bit c gia tin trình và chng trình. Mt chng trình là mt th hin th ng, cha các ch thu khin máy tính thc hin mc ích gì ó; khi cho thc thi ch th này thì chng trình s bin thành tin trình Có th nói tóm tt tin trình là mt chng trình chy trên hu hành và c qun lý thông qua mt s hiu gi là th 2. Tiu trình ( thread ) Mt tiu trình là mt n v x lý c bn trong h thng. Mi tiu trình x lý tun t các n code ca nó, s hu mt con tr lnh, mt tp các thanh ghi và mt vùng nh stack riêng, các tiu trình chia s CPU vi nhau ging nh cách chia s gia các tin trình. Mt tin trình s hu nhiu tiu trình, tuy nhiên mt tiu trình ch có th thuc v mt tin trình, các tiu trình bên trong cùng mt tin trình chia s nhau không gian a ch chung, iu này có ngha là các tiu trình có th chia s nhau các bin toàn cc ca tin trình. Mt tiu trình cng có th có các trng thái ging n các trng thái ca mt tin trình. 3. Hu hành n nhim, a nhim Ø H n nhim là HH ch cho phép 1 tin trình chy ti mt thi m, ví d HH DOS là HH n nhim. Ø - H a nhim cho phép nhiu tin trình chy ti mt thi m, ví d HH windows, Unix, Linux là các HH a nhim Ø H a nhim u tiên: các tin trình c cp phát thi gian s dng CPU theo mc u tiên khác nhau Ø H a nhim không u tiên: các tin trình không có mc u tiên nào c, chúng “t giác” nh quyn kim soát CPUsau khi kt thúc phn công vic Chú ý: trong thc t mi máy thng ch có 1 CPU, nên không th có nhiu tin trình chy ti mt thi m. Nên thông thng sa chng ch là gi lp. Chúng c gi lp bng cách lu tr nhiu tin trình trong b nh ti mt thi im, và iu phi CPU qua li gia các tin trình. 4. Các trng thái ca tin trình Trng thái ca mt tin trình ti mt thi m c xác nh bi hot ng hin thi ca tin trình ó. Trong quá trình sng mt tin trình thay i trng thái do nhiu nguyên nhân nh: ht thi gian s dng CPU, phi ch mt s kin nào ó xy ra, hay i mt thao tác nhp/xut hoàn tt… Ti mt thi m mt tin trình có th nhn mt trong các trng thái sau ây: 1. To mi: tin trình ang c thành lp 2. Running: các ch th ca tin trình ang c x lý, hay nói cách khác tin trình ang s hu CPU 3. Blocked: tin trình ang chc cp tài nguyên, hay ch mt s kin nào ó xy ra 4. Ready: tin trình ang ch cp CPU x lý 5. Kt thúc: tin trình ã hoàn tt vic x lý Trang 98 5. Min gng ( Critical Section ) a) Vn tranh chp tài nguyên Ta xét tình hung sau: Ø gi s A có 500$ trong tài khon ngân hàng Ø A quyt nh rút ra 100$ t tài khon ngân hàng, thao tác ca A gm 2 bc: 1) ly ra 100$ 2) gim s tài khon i 100$ Ø Tình hung gia 2 thao tác 1 và 2, B tr A 300$, do vy B cp nht vào trong tài khon ca A là 800$ ( =500$ +300$), sau ó A tip tc công vic 2, nó cp nht li trong tài khon là 400$, nh vy B ã tr A 300$, nhng A không nhn c. b) Min gng (Critical Section) on chng trình trong ó có th xy ra các mâu thun truy xut trên tài nguyên dng chung c gi là min gng ( Critical Section ) 6. Khoá cht (deadlock) Mt tp các tin trình c nh ngha là trong tình trng khoá cht nu nh, mi tin trình trong tp hp u u chi mt s tài nguyên ang b nm gi bi các tin trình khác, nh vy không có tin trình nào có th tip tc x lý, cng nh gii phóng tài nguyên cho các tin trình khác s dng, tt c các tin trình trong tp hpu b khoá vnh vin!. II. Lp trình a tuyn trong Java Vi Java ta có th xây dng các chong trình a lung. Mt ng dng có th bao gm nhiu lung. Mi lung c gán mt công vic c th, chúng c thc thi ng thi vi các lung khác. Có hai cách to ra lung Cách 1: To ra mt lp k tha t lp Thread và ghi è phng thc run ca lp Thread nh sau: class MyThread extends Thread{ public void run(){ //Mã lnh ca tuyn } Míi t¹o KÕt thóc RunningReady Blocked S¬ ®å chuyÓn tr¹ng th¸i cña mét tiÕn tr×nh A 500 $ 1 2 500- 50 Trang 99 } Cách 2: To ra mt lp trin khai t giao din Runnable, ghi è phng thc run class MyThread implements Runnable{ public void run(){ //Mã lnh ca tuyn } } 1. Lp Thread Lp Thread cha phng thc to dng Thread() cng nh nhiu phng thc hu ích có chc nng chy, khi ng, tm ngng, tip tc, gián n và ngng tuyn. to ra và chy mt tuyn ta cn làm 2 bc: Ø M rng lp Thread và Ghi è phng thc run() Ø Gi phng thc start() bt u thc thi tuyn Lp Thread không có nhiu phng thc lm, chúng ch có mt vài phng thc hu dng c lit kê sau: Ø public void run() c java gi thc thi tuyn thi hành, bn phi ghi è phng thc này thc thi nhim v ca tuyn, bi vì phng thc run()ca lp Thread ch là phng thc rng Ø public void start() khi ta to ra tuyn nó cha thc s chy cho n khi, phng thc start() c gi, khi start() c gi thì phng thc run() cng c kích hot Ø public void stop() có chc nng ngng tuyn thi hành, phng thc này không an toàn, bn nên gán null vào bin Thread dng tuyn, thay vì s dng phng thc stop() Ø public void suspend() Có chc nng tm ngng tuyn, trong java 2, phng thc này ít c s dng, bi vì phng thc này không nh tài nguyên mà nó lm gi, do vy có th nguy c dn n deadlock ( khoá cht ), bn nên dùng phng thc wait(), tm ngng tuyn thay vì s dng phng thc suspend() Ø public void resume() Tip tc vn hành tuyn nu nh nó ang b ngng, nu tuyn ang thi hành thì phng thc này b b qua, thông thng phng thc này c dùng kt hp vi phng thc suspend(), k t java 2 phng thc này cùn vi phng thc suspend()b t chi, do vy bn nên dùng phng thc notify () thay vì s dng phng thc resume() Ø public static void sleep( long millis) Threadows InterruptedException t tuyn thi hành vào trng thái ng, trong khong thi gian xác nh bng mili giây. chú ý sleep() là phng thc tnh. Ø public void interrupt() làm gián on tuyn thi hành Ø public static boolean isInterrupt() kim tra xem tuyn có b ngt không Ø public void setpriority( int p) n nh u tiên cho tuyn thi hành, u tiên c xác nh là mt s nguyên thuc on [1,10] Ø public final void wait() throws InterruptException Trang 100 t tuyn vào trng thái ch mt tuyn khác, cho n khi có mt tuyn khác thông báo thì nó li tip tc, ây là phng thc ca lp c s Object Ø public final void notify () ánh thc tuyn ang ch, trên i tng này Ø public final void notifyAll() ánh thc tt c các tuyn ang ch trên i tng này Ø isAlive() Tr v True, nu lung là vn còn tn ti (sng) Ø getPriority() Tr v mc u tiên ca lung Ø join() i cho n khi lung kt thúc Ø isDaemon() Kim tra nu lung là lung mt lung chy ngm (deamon) Ø setDeamon(boolean on) ánh du lung nh là lung chy ngm Ví d: Ta to ra 2 tuyn thi hành song song, mt tuyn thc hin vic in 200 dòng “i hc s phm k thut Hng Yên”, trong khi tuyn này ang thc thi thì có mt tuyn khác vn tip tc in 200 dòng ch “chào mng bn n vi java” public class Hello{ public static void main ( String[] args ){ new ChaoDH ().start (); new ChaoJV ().start (); } } class ChaoDH extends Thread{ public void run (){ for ( int i = 1; i <= 200; i++ ) System.out.println ( "i hc s phm k thut Hng Yên" ); } } class ChaoJV extends Thread{ public void run (){ for ( int i = 1; i <= 200; i++ ) System.out.println ( "chào mng bn n vi java" ); } } khi ta chy chng trình thy kt qu xen k nhau nh ……………… i hc s phm k thut Hng Yên i hc s phm k thut Hng Yên chào mng bn n vi java i hc s phm k thut Hng Yên chào mng bn n vi java i hc s phm k thut Hng Yên chào mng bn n vi java chào mng bn n vi java ………… . Trang 101 2. Vòng i ca Thread Hình sau th hin trng thái ca tuyn trong vòng i ca chúng 3. Lung chy ngm (deamon) Mt chng trình Java kt thúc ch sau khi tt c các lung thc thi xong. Trong Java có hai loi lung: - Lung ngi s dng - Lung chy ngm (deamon) Ngi s dng to ra các lung ngi s dng, trong khi các lung deamon là các lung chy nn. Lung deamon cung cp các dch v cho các lung khác. Máy o Java thc hin tin trình thoát, khi ó ch còn duy nht lung deamon vn còn sng. Máy o Java có ít nht mt lung deamon là lung “garbage collection” (thu m tài nguyên - dn rác). Lung dn rác thc thi ch khi h thng không có tác v nào. Nó là mt lung có quyn u tiên thp. Lp lung có hai phng thc làm vic vi lung deamon: - public void setDaemon(boolean on) - public boolean isDaemon() 4. Giao din Runnable mc trc bn ã to ra các lung thc hin song song vi nhau, trong java ta còn có th to ra các tuyn thi hành song song bng cách trin khai giao din Runnable. Chc bn s t hi, ã có lp Thread ri ti sao li còn có giao din Runnable na, chúng khác gì nhau?, câu tr li ch, java không h tr k tha bi, nu chng trình ca bn va mun k tha t mt lp nào ó, li va mun a tuyn thì bn bt buc phi dùng giao din Runnable, chng hn nh bn vit các Applet, bn va mun nó là Applet, li va mun thc thi nhiu tuyn, thì bn va phi k tha t lp Applet, nhng nu ã k tha t lp Applet ri, thì bn không th k tha t lp Thread na. Ta vit li ví d trên, nhng ln này ta không k tha lp Thread, mà ta trin khai giao din Runnable public class Hello{ public static void main ( String[] args ){ Thread t = new Thread ( new ChaoDH () ); t.start (); Thread t1 = new Thread ( new ChaoJV () ); t1.start (); } Trang 102 } class ChaoDH implements Runnable{ public void run (){ ChaoDH thu = new ChaoDH (); for ( int i = 1; i <= 200; i++ ) { System.out.println("i hc s phm k thut Hng Yên"); } } } class ChaoJV implements Runnable{ public void run (){ for ( int i = 1; i <= 200; i++ ) { System.out.println ( "chào mng bn n vi java" ); } } } Cho chy ví d này ta thy kt qu ra không khác gì vi ví d trc. 5. Thit lp u tiên cho tuyn Khi mt tuyn c to ra, nó nhn mt u tiên mc nh, ôi khi ta mun u chnh u tiên ca tuyn t c mc ích ca ta, tht n gin, t u tiên cho mt tuyn ta ch cn gi phng thc setPriority() và truyn cho nó mt s nguyên s này chính là u tiên mà bn cn t. Ta vit li ví d trên nh sau: Thêm vào phng thc main() 2 dòng lnh: t.setPriority(1); //Tuyn này có u tiên là 1 t1.setPriority(10); // Tuyn này có u tiên là 1 Chy li chng trình này sau khi sa và trc khi sa ta thy tuyn t1 c cp thi gian s dng CPU nhiu hn tuyn t, lý do là ta ã t u tiên ca tuyn t1, ln hn u tiên ca tuyn t Chú ý: 1. u tiên ca mt tuyn biu th bi mt s nguyên nm trong n t 1 n 10, mt li s phát sinh nu ta gán cho nó u tiên, nm ngoài khong này 2. 2) nu mt tuyn không c t u tiên thì nó s nhn u tiên mc nh ( bng 5 ), ta có th kim tra u này bng cách gi phng thc getPriority() 6. Nhóm tuyn (Thread Group) - Nhóm tuyn là mt tp hp gm nhiu tuyn, khi ta tác ng n nhóm tuyn ( chng hn nh tm ngng, …) thì tt c các tuyn trong nhóm u nhn c cùng tác ng ó, iu này là tin li khi ta mun qun lý nhiu tuyn thc hin các tác v tng t nhau. Ø to mt nhóm tuyn ta cn: + to ra mt nhóm tuyn bng cách s dng phng thc to dng ca lp ThreadGroup() ThreadGroup g=new ThreadGroup(“ThreadGroupName”); ThreadGroup g= new ThreadGroup(ParentThreadGroup,“ThreadGroupName”); Dòng lnh trên to ra mt nhóm tuyn g có tên là “ThreadGroupName”, tên ca tuyn là mt chui và không trùng vi tên ca mt nhóm khác. + a các tuyn vào nhóm tuyn dùng phng thc to dng ca lp Thread() : Thread =new Thread (g, new ThreadClass(),”ThisThread”); Trang 103 7. ng b các tuyn thi hành Khi nhiu tuyn truy cp ng thi vào tài nguyên dùng chung, mà tài nguyên này li không th chia s, cho nhiu tuyn, khi ó tài nguyên dùng chung có th b hng. Ví d, mt lung có th c gng c d liu, trong khi lung khác c gng thay i d liu. Trong trng hp này, d liu có th b sai. Trong nhng trng hp này, bn cn cho phép mt lung hoàn thành trn vn tác v ca nó, và ri thì mi cho phép các lung k tip thc thi. Khi hai hoc nhiu hn mt lung cn thâm nhp n mt tài nguyên c chia s, bn cn chc chn rng tài nguyên ó sc s dng ch bi mt lung ti mt thi im. Bi trong java không có bin toàn cc, chúng ta ch có thuc tính ca i tng, tt c các thao tác có th dn n hng hóc u thc hin qua phng thc, do vy java cung cp t khoá synchronized, t khoá này c thêm vào nh ngha ca phng thc báo cho java bit ây là mt phng thc ng b, mi i tng s có mt b qun lý khoá, b qun lý khoá này ch cho 1 phng thc synchronized ca i tng ó chy ti mt thi m Mu cht ca s ng b hóa là khái nim “monitor” (giám sát), hay còn gi “semaphore” (c hiu). Mt “monitor” là mt i tng mà c khóa c quyn. Ch mt lung có th có monitor ti mi thi m. Tt c các lung khác c gng thâm nhp vào monitor s b trì hoãn, cho n khi lung u tiên thoát khi monitor. Các lung khác c báo chi monitor. Mt lung có th monitor mt i tng nhiu ln. . riêng, các tiu trình chia s CPU vi nhau ging nh cách chia s gia các tin trình. Mt tin trình s hu nhiu tiu trình, tuy nhiên mt tiu trình ch có. thành tin trình Có th nói tóm tt tin trình là mt chng trình chy trên hu hành và c qun lý thông qua mt s hiu gi là th 2. Tiu trình (