Lập trình đa tuyến

7 266 1
Lập trình đa tuyến

Đang tải... (xem toàn văn)

Thông tin tài liệu

Trang 97 Chng 4: LP TRÌNH A TUYN I. Các kin thc liên quan 1. Tin trình ( process) Tin trình là mt th hin ca mt chng trình ang x lý. S hu mt con tr lnh, tp các thanh ghi và các bin.  hoàn thành tác v ca mình, mt tin trình còn cn n mt s tài nguyên khác nh: CPU, b nh, các tp tin, các thit b ngoi vi Cn phân bit c gia tin trình và chng trình. Mt chng trình là mt th hin th ng, cha các ch thu khin máy tính  thc hin mc ích gì ó; khi cho thc thi ch th này thì chng trình s bin thành tin trình Có th nói tóm tt tin trình là mt chng trình chy trên hu hành và c qun lý thông qua mt s hiu gi là th 2. Tiu trình ( thread ) Mt tiu trình là mt n v x lý c bn trong h thng. Mi tiu trình x lý tun t các n code ca nó, s hu mt con tr lnh, mt tp các thanh ghi và mt vùng nh stack riêng, các tiu trình chia s CPU vi nhau ging nh cách chia s gia các tin trình. Mt tin trình s hu nhiu tiu trình, tuy nhiên mt tiu trình ch có th thuc v mt tin trình, các tiu trình bên trong cùng mt tin trình chia s nhau không gian a ch chung, iu này có ngha là các tiu trình có th chia s nhau các bin toàn cc ca tin trình. Mt tiu trình cng có th có các trng thái ging n các trng thái ca mt tin trình. 3. Hu hành n nhim, a nhim Ø H n nhim là HH ch cho phép 1 tin trình chy ti mt thi m, ví d HH DOS là HH n nhim. Ø - H a nhim cho phép nhiu tin trình chy ti mt thi m, ví d HH windows, Unix, Linux là các HH a nhim Ø H a nhim u tiên: các tin trình c cp phát thi gian s dng CPU theo mc u tiên khác nhau Ø H a nhim không u tiên: các tin trình không có mc u tiên nào c, chúng “t giác” nh quyn kim soát CPUsau khi kt thúc phn công vic Chú ý: trong thc t mi máy thng ch có 1 CPU, nên không th có nhiu tin trình chy ti mt thi m. Nên thông thng sa chng ch là gi lp. Chúng c gi lp bng cách lu tr nhiu tin trình trong b nh ti mt thi im, và iu phi CPU qua li gia các tin trình. 4. Các trng thái ca tin trình Trng thái ca mt tin trình ti mt thi m c xác nh bi hot ng hin thi ca tin trình ó. Trong quá trình sng mt tin trình thay i trng thái do nhiu nguyên nhân nh: ht thi gian s dng CPU, phi ch mt s kin nào ó xy ra, hay i mt thao tác nhp/xut hoàn tt… Ti mt thi m mt tin trình có th nhn mt trong các trng thái sau ây: 1. To mi: tin trình ang c thành lp 2. Running: các ch th ca tin trình ang c x lý, hay nói cách khác tin trình ang s hu CPU 3. Blocked: tin trình ang chc cp tài nguyên, hay ch mt s kin nào ó xy ra 4. Ready: tin trình ang ch cp CPU  x lý 5. Kt thúc: tin trình ã hoàn tt vic x lý Trang 98 5. Min gng ( Critical Section ) a) Vn  tranh chp tài nguyên Ta xét tình hung sau: Ø gi s A có 500$ trong tài khon ngân hàng Ø A quyt nh rút ra 100$ t tài khon ngân hàng, thao tác ca A gm 2 bc: 1) ly ra 100$ 2) gim s tài khon i 100$ Ø Tình hung gia 2 thao tác 1 và 2, B tr A 300$, do vy B cp nht vào trong tài khon ca A là 800$ ( =500$ +300$), sau ó A tip tc công vic 2, nó cp nht li trong tài khon là 400$, nh vy B ã tr A 300$, nhng A không nhn c. b) Min gng (Critical Section) on chng trình trong ó có th xy ra các mâu thun truy xut trên tài nguyên dng chung c gi là min gng ( Critical Section ) 6. Khoá cht (deadlock) Mt tp các tin trình c nh ngha là  trong tình trng khoá cht nu nh, mi tin trình trong tp hp u u chi mt s tài nguyên ang b nm gi bi các tin trình khác, nh vy không có tin trình nào có th tip tc x lý, cng nh gii phóng tài nguyên cho các tin trình khác s dng, tt c các tin trình trong tp hpu b khoá vnh vin!. II. Lp trình a tuyn trong Java Vi Java ta có th xây dng các chong trình a lung. Mt ng dng có th bao gm nhiu lung. Mi lung c gán mt công vic c th, chúng c thc thi ng thi vi các lung khác. Có hai cách  to ra lung Cách 1: To ra mt lp k tha t lp Thread và ghi è phng thc run ca lp Thread nh sau: class MyThread extends Thread{ public void run(){ //Mã lnh ca tuyn } 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: To ra mt lp trin khai t giao din Runnable, ghi è phng thc run class MyThread implements Runnable{ public void run(){ //Mã lnh ca tuyn } } 1. Lp Thread Lp Thread cha phng thc to dng Thread() cng nh nhiu phng thc hu ích có chc nng chy, khi ng, tm ngng, tip tc, gián n và ngng tuyn.  to ra và chy mt tuyn ta cn làm 2 bc: Ø M rng lp Thread và Ghi è phng thc run() Ø Gi phng thc start()  bt u thc thi tuyn Lp Thread không có nhiu phng thc lm, chúng ch có mt vài phng thc hu dng c lit kê sau: Ø public void run() c java gi  thc thi tuyn thi hành, bn phi ghi è phng thc này  thc thi nhim v ca tuyn, bi vì phng thc run()ca lp Thread ch là phng thc rng Ø public void start() khi ta to ra tuyn nó cha thc s chy cho n khi, phng thc start() c gi, khi start() c gi thì phng thc run() cng c kích hot Ø public void stop() có chc nng ngng tuyn thi hành, phng thc này không an toàn, bn nên gán null vào bin Thread  dng tuyn, thay vì s dng phng thc stop() Ø public void suspend() Có chc nng tm ngng tuyn, trong java 2, phng thc này ít c s dng, bi vì phng thc này không nh tài nguyên mà nó lm gi, do vy có th nguy c dn n deadlock ( khoá cht ), bn nên dùng phng thc wait(),  tm ngng tuyn thay vì s dng phng thc suspend() Ø public void resume() Tip tc vn hành tuyn nu nh nó ang b ngng, nu tuyn ang thi hành thì phng thc này b b qua, thông thng phng thc này c dùng kt hp vi phng thc suspend(), k t java 2 phng thc này cùn vi phng thc suspend()b t chi, do vy bn nên dùng phng thc notify () thay vì s dng phng thc resume() Ø public static void sleep( long millis) Threadows InterruptedException t tuyn thi hành vào trng thái ng, trong khong thi gian xác nh bng mili giây. chú ý sleep() là phng thc tnh. Ø public void interrupt() làm gián on tuyn thi hành Ø public static boolean isInterrupt() kim tra xem tuyn có b ngt không Ø public void setpriority( int p) n nh  u tiên cho tuyn thi hành,  u tiên c xác nh là mt s nguyên thuc on [1,10] Ø public final void wait() throws InterruptException Trang 100 t tuyn vào trng thái ch mt tuyn khác, cho n khi có mt tuyn khác thông báo thì nó li tip tc, ây là phng thc ca lp c s Object Ø public final void notify () ánh thc tuyn ang ch, trên i tng này Ø public final void notifyAll() ánh thc tt c các tuyn ang ch trên i tng này Ø isAlive() Tr v True, nu lung là vn còn tn ti (sng) Ø getPriority() Tr v mc u tiên ca lung Ø join() i cho n khi lung kt thúc Ø isDaemon() Kim tra nu lung là lung mt lung chy ngm (deamon) Ø setDeamon(boolean on) ánh du lung nh là lung chy ngm Ví d: Ta to ra 2 tuyn thi hành song song, mt tuyn thc hin vic in 200 dòng “i hc s phm k thut Hng Yên”, trong khi tuyn này ang thc thi thì có mt tuyn khác vn tip tc in 200 dòng ch “chào mng bn n vi 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 hc s phm k thut Hng Yên" ); } } class ChaoJV extends Thread{ public void run (){ for ( int i = 1; i <= 200; i++ ) System.out.println ( "chào mng bn n vi java" ); } } khi ta chy chng trình thy kt qu xen k nhau nh ……………… i hc s phm k thut Hng Yên i hc s phm k thut Hng Yên chào mng bn n vi java i hc s phm k thut Hng Yên chào mng bn n vi java i hc s phm k thut Hng Yên chào mng bn n vi java chào mng bn n vi java ………… . Trang 101 2. Vòng i ca Thread Hình sau th hin trng thái ca tuyn trong vòng i ca chúng 3. Lung chy ngm (deamon) Mt chng trình Java kt thúc ch sau khi tt c các lung thc thi xong. Trong Java có hai loi lung: - Lung ngi s dng - Lung chy ngm (deamon) Ngi s dng to ra các lung ngi s dng, trong khi các lung deamon là các lung chy nn. Lung deamon cung cp các dch v cho các lung khác. Máy o Java thc hin tin trình thoát, khi ó ch còn duy nht lung deamon vn còn sng. Máy o Java có ít nht mt lung deamon là lung “garbage collection” (thu m tài nguyên - dn rác). Lung dn rác thc thi ch khi h thng không có tác v nào. Nó là mt lung có quyn u tiên thp. Lp lung có hai phng thc  làm vic vi lung deamon: - public void setDaemon(boolean on) - public boolean isDaemon() 4. Giao din Runnable  mc trc bn ã to ra các lung thc hin song song vi nhau, trong java ta còn có th to ra các tuyn thi hành song song bng cách trin khai giao din Runnable. Chc bn s t hi, ã có lp Thread ri ti sao li còn có giao din Runnable na, chúng khác gì nhau?, câu tr li  ch, java không h tr k tha bi, nu chng trình ca bn va mun k tha t mt lp nào ó, li va mun a tuyn thì bn bt buc phi dùng giao din Runnable, chng hn nh bn vit các Applet, bn va mun nó là Applet, li va mun thc thi nhiu tuyn, thì bn va phi k tha t lp Applet, nhng nu ã k tha t lp Applet ri, thì bn không th k tha t lp Thread na. Ta vit li ví d trên, nhng ln này ta không k tha lp Thread, mà ta trin khai giao din 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 hc s phm k thut Hng Yên"); } } } class ChaoJV implements Runnable{ public void run (){ for ( int i = 1; i <= 200; i++ ) { System.out.println ( "chào mng bn n vi java" ); } } } Cho chy ví d này ta thy kt qu ra không khác gì vi ví d trc. 5. Thit lp  u tiên cho tuyn Khi mt tuyn c to ra, nó nhn mt  u tiên mc nh, ôi khi ta mun u chnh  u tiên ca tuyn t c mc ích ca ta, tht n gin, t  u tiên cho mt tuyn ta ch cn gi phng thc setPriority() và truyn cho nó mt s nguyên s này chính là  u tiên mà bn cn t. Ta vit li ví d trên nh sau: Thêm vào phng thc main() 2 dòng lnh: t.setPriority(1); //Tuyn này có  u tiên là 1 t1.setPriority(10); // Tuyn này có  u tiên là 1 Chy li chng trình này sau khi sa và trc khi sa ta thy tuyn t1 c cp thi gian s dng CPU nhiu hn tuyn t, lý do là ta ã t  u tiên ca tuyn t1, ln hn  u tiên ca tuyn t Chú ý: 1.  u tiên ca mt tuyn biu th bi mt s nguyên nm trong n t 1 n 10, mt li s phát sinh nu ta gán cho nó  u tiên, nm ngoài khong này 2. 2) nu mt tuyn không c t  u tiên thì nó s nhn  u tiên mc nh ( bng 5 ), ta có th kim tra u này bng cách gi phng thc getPriority() 6. Nhóm tuyn (Thread Group) - Nhóm tuyn là mt tp hp gm nhiu tuyn, khi ta tác ng n nhóm tuyn ( chng hn nh tm ngng, …) thì tt c các tuyn trong nhóm u nhn c cùng tác ng ó, iu này là tin li khi ta mun qun lý nhiu tuyn thc hin các tác v tng t nhau. Ø  to mt nhóm tuyn ta cn: + to ra mt nhóm tuyn bng cách s dng phng thc to dng ca lp ThreadGroup() ThreadGroup g=new ThreadGroup(“ThreadGroupName”); ThreadGroup g= new ThreadGroup(ParentThreadGroup,“ThreadGroupName”); Dòng lnh trên to ra mt nhóm tuyn g có tên là “ThreadGroupName”, tên ca tuyn là mt chui và không trùng vi tên ca mt nhóm khác. + a các tuyn vào nhóm tuyn dùng phng thc to dng ca lp Thread() : Thread =new Thread (g, new ThreadClass(),”ThisThread”); Trang 103 7. ng b các tuyn thi hành Khi nhiu tuyn truy cp ng thi vào tài nguyên dùng chung, mà tài nguyên này li không th chia s, cho nhiu tuyn, khi ó tài nguyên dùng chung có th b hng. Ví d, mt lung có th c gng c d liu, trong khi lung khác c gng thay i d liu. Trong trng hp này, d liu có th b sai. Trong nhng trng hp này, bn cn cho phép mt lung hoàn thành trn vn tác v ca nó, và ri thì mi cho phép các lung k tip thc thi. Khi hai hoc nhiu hn mt lung cn thâm nhp n mt tài nguyên c chia s, bn cn chc chn rng tài nguyên ó sc s dng ch bi mt lung ti mt thi im. Bi trong java không có bin toàn cc, chúng ta ch có thuc tính ca i tng, tt c các thao tác có th dn n hng hóc u thc hin qua phng thc, do vy java cung cp t khoá synchronized, t khoá này c thêm vào nh ngha ca phng thc báo cho java bit ây là mt phng thc ng b, mi i tng s có mt b qun lý khoá, b qun lý khoá này ch cho 1 phng thc synchronized ca i tng ó chy ti mt thi m Mu cht ca s ng b hóa là khái nim “monitor” (giám sát), hay còn gi “semaphore” (c hiu). Mt “monitor” là mt i tng mà c khóa c quyn. Ch mt lung có th có monitor ti mi thi m. Tt c các lung khác c gng thâm nhp vào monitor s b trì hoãn, cho n khi lung u tiên thoát khi monitor. Các lung khác c báo chi monitor. Mt lung có th monitor mt i tng nhiu ln. . riêng, các tiu trình chia s CPU vi nhau ging nh cách chia s gia các tin trình. Mt tin trình s hu nhiu tiu trình, tuy nhiên mt tiu trình ch có. thành tin trình Có th nói tóm tt tin trình là mt chng trình chy trên hu hành và c qun lý thông qua mt s hiu gi là th 2. Tiu trình (

Ngày đăng: 29/09/2013, 09:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan