You are on page 1of 214

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Phn 1: L thuyt HH Unix/Linux


Mc lc A. Tng quan: Vi nt v H iu hnh B. Unix/Linux Chng I. Tng quan h thng Unix Chng II. H thng tp (file subsystem) 1. Tng quan v H thng tp 2. Gi H Thng thao tc tp (System call for FS) Chng III. Tin Trnh (process) 1 Tng quan v tin trnh 2 Cu trc ca Tin trnh 3 Kim sot tin trnh Chng IV. Chng V. Chng VI. Chng VII Lin lc gia cc tin trnh Cc h thng vo ra (I/O subsystem) a x l (Multiprocessor Systems) Cc h Unix phn tn (Distributed Unix Systems)

Phn 2: Lp trnh trong Unix Phn 3: Lp trnh mng trong Unix

1 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

I. Tng quan v H iu Hnh


(An Operating System is a group of programs that provide basic functionality on a computer. This functionality is called services. Other word an Operating System can be seen as a set of functionality building blocks upon which other programs depend. It also manages computer resources and resolves resource conflicts, so OS abstracts the real hardware of the system and presents the systems users and its applications with a virtual machine). 1. Phn mm my tnh chia ra lm hai loi: cc phn mm h thng, qun l hot ng ca bn thn my tnh, v cc chng trnh ng dng, gii quyt cc yu cu ca ngi dng. Phn cn bn nht ca tt c cc phn mm h thng, gi l H iu hnh, m chc nng c bn l kim sot tt c ngun ti nguyn, cung cp nn tng (cc hm chc nng, cc dch v h thng) trn cc chng trnh ng dng c vit ra s s dng. M hnh mt my tnh nh sau:

Hnh trn cho ta mt phn gi l kernel, hay nhn ca HH, kernel h tr HH thc hin chc nng qun l cc thnh phn sau y: 1.Thit b (devices), cho mt giao tip cc chng trnh ngi dng ni chuyn vi thit b; 2.B nh (memory), cp b nh cho cc chng trnh (tin trnh) ang chy; 3.Cc Tin trnh (process), to, gim st hot ng ca cc tin trnh; 4.Lin lc (communication) gia cc TT. Ngun ti nguyn my tnh c nhiu, nh (CPU(s), b nh, cc thit b ngoi vi ghp ni vo my tnh) to thnh mt h thng rt phc tp. Vit cc chng trnh theo di tt c cc thnh phn, khai thc chng chnh xc v chng chy c lp mt cch ti u, l vic rt kh. V nu iu ny li cho tng ngi dng quan tm, th s c v s cc 2 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ chng trnh c vit v nu h l loi nhiu ngi dng th, hy th tng tng Nh vy r rng cn tch ngi dng ra khi s phc tp ca phn cng. Cch c th m bo l t phn mm (hay lp phn mm) ln trn nh ca phn cng v n qun l tt c cc phn ca my tnh, trong khi trao cho ngi dng mt giao din (interface) hay mt my tnh o (virtual machine) d hiu hn v d lp trnh ng dng hn. Lp phn mm gi l HH. T y xut hin mt quan nim mi, l s phn bit ch chy my, n bao gm: HH chy trong mt mi trng c bit, gi l ch nhn (kernel mode hay supervisor mode). Ch ny c h tr bi kin trc ca CPU ( bi cc lnh my c bit) v n ngn ngi dng truy nhp vo phn cng (qun l phn cng chun xc cho nhiu ngi dng ng thi, cn gi l ch c bo v (protected mode)). Thut ng kernel cp n phn m ct yu nht ca cc chng trnh h thng, n kim sot cc tp, khi ng v cho chy cc chng trnh ng dng ng thi, phn chia thi gian s dng CPU cho cc chng trnh, cp b nh cng nh cc ti nguyn khc cho cc chng trnh ca ngi dng. Bn thn kernel khng lm g nhiu nhng cung cp cc cng c nguyn thu (primitive functions) m cc tin ch khc, cc dch v khc ca HH c xy dng. Do cc chng trnh h thng, cc trnh ng dng s dng cc dch v ca HH, chy trong user mode. Tuy nhin c s khc bit l cc trnh ng dng th tn dng nhng tin ch h thng cho, cn cc trnh h thng l cn thit my tnh chy c. Cc trnh ng dng chy trong ch ngi dng (user mode), cc primitive functions chy trong kernel . Vic kt ni gia hai ch chy trnh c thc hin bi gi h thng (system call). Gi h thng (hay gi cc dch v ca h thng, GHT), l mt giao din lp trnh gia HH v ng dng. N c thc hin bng cch t cc thng s vo nhng ch c nh ngha r rng (vo cc thanh ghi ca CPU hay t vo stack) v sau thc hin mt lnh by t bit (trap intruction) ca CPU. Lnh ny chuyn ch chy my t user mode vo kernel mode v t iu khin chuyn cho HH (1). Tip theo HH kim tra s hiu v cc thng s ca GHT xc nh GHT no s thc hin (2). T trong bng vi ch s (s hiu ca GHT), HH ly ra con tr tr n qui trnh (procedure) thc hin GHT (3). Khi thc hin xong GHT, iu khin chuyn tr li cho chng trnh ca ngi dng.

T y c th thy cu trc c bn ca GHT nh sau: 1. Mt chng trnh chnh kch hot dch v h thng bng mt GHT. 3 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ 2. 3. 4. By (TRAP) chuyn GHT vo nhn HH, nhn xc nh s hiu ca dch v. Thc hin dch v. Kt thc dch v v tr v ni pht sinh GHT.

Hnh sau cho cc bc theo trnh t t lp trnh n thc thi GHT read():

Khi nhn cch thc thi mt chng trnh, phn m chng trnh ngi dng c kt hp vi m ca kernel (khi thc hin cc primitive functions qua GHT), to ra ton b m chng trnh. Ni cch khc vo thi im chy trnh, phn m ca kernel thc hin bi GHT l m ca chng trnh ngi dng, ch khc ch thc hin. 2. Trn c s nh ngha kernel mode v user mode, kin trc ca cc HH c th khc nhau: a. Loi n th (monolitic OS):

4 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

HH kiu n th (monolitic OS) Cc trnh ng dng chy user mode khi thc hin gi mt dch v ca H thng, HH s chuyn vic thc hin dch v vo kernel mode. Khi dch v hon tt HH chuyn vic thc hin chng trnh pht sinh gi dch v tr li user mode, chng trnh ny tip tc chy. PC DOS l mt v d. c im chung ca loi ny l kernel l mt thc th n, mt chng trnh rt ln, m cc thnh phn chc nng truy nhp ti tt c cc cu trc d liu v th tc ca h thng. b. M hnh Client/Server: Chia OS ra thnh nhiu tin trnh (TT), mi TT cung cp mt tp cc dch v ( v d cc dch v b nh, dch v to TT, dch v lp biu ). Cc phn mm dch v (server) chy trong user mode thc hin vng lp tip nhn yu cu cc dch v ca n t cc client. Client c th l thnh phn khc ca HH, hay l mt ng dng, yu cu phc v bng cch gi mt thng ip (message) ti server. Kernel ca HH, l phn rt nh gn (microkernel) chy trong kernel mode pht cc thng ip ti server, server thc hin yu cu, kernel tr li kt qu cho client. Server chy cc TT trong user mode tch bit, nn nu c s c (fail) th ton b h thng khng h b nh hng. Vi nhiu CPU, hay nhiu my kt hp, cc dch v chy trn cc CPU, my khc nhau, thch hp cho cc tnh ton phn tn.

5 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

c. Loi cu trc theo lp (layered OS): HH c chia thnh cc lp xp chng ln nhau. Phn lp l cu trc c sp xp theo hai hng ln-xung (nhn ti mt lp bt k), sao cho mi lp thnh mt n th vi chc nng cung cp cc dch v cho lp trn lin k, v s dng tan b dch v ca lp di lin k, vi nguyn tc lp trn yu cu v nhn kt qu, lp di thc hin v trao kt qu cho lp trn. Vi cch xc nh tng minh nh vy s trnh c s trng lp chc nng cng nh chng cho quan h (v d m hnh n th ni trn) gia cc n th. Kiu cu trc ny mang li cc u im sau: - Nu chun ha c cc dch v mi lp, v chun nh dng d liu vo/ra th cc phn mm thc hin n th s tr nn ph qut, d dng chung cho cc h thng c cu trc tng t. Chng trnh ngun d dng bin dch li v chy cc phn cng khc nhau. l tnh portable. - n gin ha qu trnh ci tin hay nng cp h thng bng vic thay i, nng cp cc n th cc th, m khng phi ch i cho n khi han tt ton b h thng. Chnh nh vy m tng c hiu nng hat ng, tnh n nh ca h thng. - H tr tt cho nhu cu trao i d liu gia cc h thng khc nhau khi c s chun ha v giao din (interface), v giao thc (protocol). chnh l tnh m ca h thng. Cc HH kiu UNIX (VAX/VMS hay Multics (tin thn ca UNIX), ) thuc loi ny. Hy quan st m t in hnh ca cu trc phn lp theo hnh sau:

6 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Trn m hnh ny, lp 1, 2 gn vi tng loi kin trc my tnh (hardware), trong lp 1 c gng du i cc kin trc phn cng c th, to ra mt lp phn cng tru tng (Hardware Abstract Layer). Lp 2 l cc thao tc (handling) c bn p dng trn cc phn cng bn di (bao gm x l ngt, chuyn bi cnh thc hin ca cc tin trnh, qun l b nh). Lp 3 thc thi phn phi thi gian chy my (scheduling), ng b tin trnh v lung. Lp 4 l cc c t thit b c trn my dng tng qut, khng ph thuc vo loi thit b c th, v d UNIX ti gm cc tp thit b ti th mc /dev. Lp 5 v 6 l cch t chc ti nguyn m kernel s thc hin cc bin php qun l (t chc chc tp (File System, Virtual File System), b nh o). Lp 7 l giao din ca HH vi trnh ng dng. C th thy, lp 3 n 7 l cc lp tng qut, khng ph thuc vo phn cng. Nh vy m thc thi c th trin khai trn bt k loi kin trc my no. M hnh di cho thy mt v d ca tng trn:

Unix l mt v d in hnh vi cc c im nh sau: 7 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ 1. H c vit bng ngn ng bc cao, lm cho d c, d hiu, d thay i v chy trn cc nn phn cng khc nhau. 2. C giao din ngi dng n gin, mang li sc mnh cung cp cc dch v ngi dng yu cu. 3. Cung cp cc hm c bn (primitive) pht trin cc chng trnh phc tp t cc chng trnh n gin. 4. S dng h thng tp c cu trc, d dng, d bo tr v hiu qu. 5. Tp c t chc theo kiu dng cc byte, nht qun, d to cc ng dng. 6. Giao tip cc thit b ngoi vi n gin, nht qun v n nh. 7. L h nhiu ngi dng, nhiu tin trnh, mi ngi dng c th chy nhiu tin trnh ng thi. H cn l h a x l. 8. Ngi pht trin ng dng khng cn bit ti cu trc my tnh, do ng dng vit ra c th chy trn nhiu phn cng khc nhau. n gin, nht qun, l t tng ch o ca Unix.

II. Unix/Linux
Chng I. Tng quan h thng Unix

1. Cu trc h thng
Cu trc ca Unix Unix c th xem nh mt loi kim t thp vi cc lp chc nng xp chng ln nhau v to ra cc giao din. Phn cng (hardware) s cp sau. H iu Hnh (HH, hay Operating System-OS) tng tc trc tip vi phn cng, cung cp cc dch v c bn cho cc chng trnh v ngn cch cc chng trnh vi phn cng c th. Nu nhn h thng nh t cc lp, th OS thng thng c gi l nhn h thng (System Kernel), n c cch li vi chng trnh ca ngi dng. Bi v cc chng trnh ng dng ni chung, k c OS, c lp vi phn cng, nn d dng chy trn cc phn cng khc nhau v khng ph thuc vo 8 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ phn cng c th. Chng hn Shell v cc editors (vi, ed) lp ngoi tng tc vi kernel bng cch pht sinh ra Gi H Thng (GHT) system calls. GHT s ch th cho kernel lm nhng vic khc nhau m chng trnh gi yu cu, thc hin trao i d liu (data) gia kernel v chng trnh . Mt vi chng trnh c tn trong hnh l cc chng trnh chun trong cu hnh ca h thng v c bit tn di dng cc lnh commands. Lp ny cng c th bao hm c cc chng trnh ca ngi dng vi tn l a.out, mt loi tn chun cho cc tp chy c do b dch C to ra. Cn c loi ng dng khc (APPS) c xy dng trn lp trn cng ca cc chng trnh c mc thp hn hin din lp ngoi cng ca m hnh. Mc d m hnh m t hai cp cc APPS, nhng ngi dng c th m rng ra cc cp thch hp. Rt nhiu cc h thng ng dng, cc chng trnh, cho cch nhn mc cao, song tt c u dng cc dch v cp thp c cung cp bi kernel qua GHT. Trong System V chun c 64 GHT, trong c 32 GHT l thng dng nht (LINUX 2.x c nhiu hn v khon chng 164 lnh GHT).

Tp hp cc System calls v cc thut ton bn trong to thnh thn (body) ca kernel, do vy vic nghin cu Unix trong sch ny s gin lc nghin cu chi tit cc system calls cng nh s tng tc gia chng. V khi nim Unix system, hay kernel hay system trong sch u c ni ti kernel ca h iu hnh Unix v r rng hn tng bi cnh trnh by.

2. Cch nhn t pha ngi dng: t chc tp


Phn ny tm lt cc nt c trng mc cao ca Unix chng hn: h thng tp (File system FS), mi trng x l, xy dng cc khi nguyn hm, v s c khai thc sau ny. 2.1. H thng tp (File system FS) H thng tp ca Unix c c t bi: Cu trc cp bc (cy th mc); Cch x l nht qun d liu ca tp (chui cc byte byte stream ); Kh nng to v hy tp (to mi, xa); Tnh tng trng ng ca tp (thm bt, ct dn); 9 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Kh nng bo v d liu ca tp (bi cc kiu thuc tnh nh quyn truy nhp); X l cc thit b ngoi vi nh x l cc tp (cch nhn thit b bi m t kiu tp).

FS c t chc nh mt cy bt u t mt nt n gi l root, c biu din nh sau: / ; t s c cc th mc khc to thnh nhnh ca cy, trong cc nhnh c th c cc nhnh (con) khc. Di cc nhnh s l tp. Tp c th l tp bnh thng (regural files) hay cng c th l tp c bit (special files). Tp c truy nhp qua ng dn (path name) m t cch thc nh v c tp trong FS. ng dn y , hay ng dn tuyt i, bt u bi du / v n xc nh s tm tp bng cch i t root qua cu trc cy th mc theo cc nhnh ch th trong ng dn. V d trong hnh ta c: /usr/src/cmd/date.c l ng dn tuyt i ti tp date.c. ng dn khng bt u t root gi l ng dn tng i, ch ti th mc hin ti ca tp. Cc chng trnh trong Unix khng c hiu bit g v nh dng (format) bn trong ca d liu ca tp. Kernel lu d liu ca tp, x l d liu tp nh mt dng cc bytes (byte stream) khng c nh dng. Do vy c php truy nhp d liu trong tp c nh ngha bi h thng v nht qun nh nhau cho tt c cc chng trnh, nhng ng ngha ca d liu th chng trnh ng dng phi x l. V d: Chng trnh troff x l vn bn c nh dng hoi vng s tm thy cc k t dng mi ( new line ) cui mi dng vn bn, cn chng trnh k ton acctcom hoi vng tm thy nhng bn ghi c di c nh. C hai chng trnh dng cng cc dch v h thng truy nhp d liu trong tp theo cch byte stream, nhng bn trong mi chng trnh li dng cch phn tch c php khc nhau thch hp cho n. Nu mt chng trnh pht hin thy nh dng l khng ng, th bn thn chng trnh s thc hin mt hnh vi khc x l (ch khng phi h thng lm iu ). Th mc cng l mt loi tp, h thng x l d liu trong th mc cng bng byte stream, nhng d liu y cha tn cc tp trong th mc c khun dng d on c, sao cho OS v cc chng trnh, v d ls, c th nhn ra cc tp trong th mc. Vic truy nhp tp c kim sot bi quyn truy nhp (access permission) kt hp vi tp. Quyn truy nhp c lp ra mt cch c lp kim sot truy nhp c (read), ghi (write), v thc hin (execute) cho ba lp ngi s dng: ngi s hu tp (u - user), nhm ngi c truy nhp (g - group), nhng ngi khc (o - other). Ngi dng c th to tp nu h c php v cc tp mi to s l cc nhnh l ca cu trc th mc h thng. 10 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ i vi ngi dng, Unix x l cc thit b nh th l cc tp. Cc thit b c m t bi cc tp thit b c bit v nm mt nhnh trong cu trc h thng th mc (/dev). Cc chng trnh truy nhp cc thit b bng c php ging nh dng truy nhp tp bnh thng, cc thit b cng c bo v cng phng thc nh cc tp, qua vic n nh quyn truy nhp. Bi v tn cc thit b cng ging nh tn cc tp bnh thng v cc thao tc trn chng l nh nhau, nn hu ht cc chng trnh u khng bit ti kiu tp bn trong ca tp m chng thao tc.

2.2

Mi trng x l

Mt chng trnh - program l mt tp thc thi v mt tin trnh (TT procces) l mt khonh khc (instance) ca chng trnh c thc hin theo trc thi gian. TT bao gm: m trnh thc thi, d liu (data) ca TT, program (user) stack, CPU program counter, kernel stack, CPU registers v thng tin khc cn thit chy trnh. Cc d liu ny to ra bi cnh (context) ca TT, mi TT c bi cnh ring bit. C rt nhiu TT c thc hin ng thi trn Unix (c tnh ny cn gi l a trnh - multiprogramming hay a nhim - multitasking) theo nguyn l phn chia thi gian (time sharing), m tng s cc TT v logic l khng c gii hn. C nhiu GHT cho php cc TT to ra cc TT mi, kt thc cc TT, ng b cc giai on thc hin TT, kim sot phn ng vi cc s kin khc nhau. Cc TT s dng GHT c lp vi nhau. V d chy a trnh vi 4 chng trnh A, B, C, D trn mt CPU:

Hy xt v d sau: main (argc, argv) int argc; char *argv[]; { /* gi nh c 2 i u vo*/ 11 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ if (fork () == 0) execl (copy, copy, argv[1], argv[2], 0); wait((int *) 0); printf (copy done\n); } Chng trnh trn dng GHT fork() to ra mt TT mi. TT mi gi l TT con s nhn c gi tr tr li l 0 t lnh fork v n kch hot execl chy trnh copy. Lnh execl s ph ln khng gian a ch ca TT con bng m ca trnh copy, vi gi nh trnh copy nm cng trong th mc hin hnh ca main, v chy trnh copy vi cc thng s do ngi dng a vo. Nu execl hon tt n s khng tr v a ch xut pht trong main v n chy trong mt min a ch mi khc. Trong khi TT b kch hot fork() li nhn c gi tr tr li khc 0 t GHT wait(), n treo vic thc hin i cho n khi copy kt thc v in ra thng bo copy done v sau kt thc thc hin main bng exit (exit() l ngm nh khi kt thc main trong C). Mt cch tng qut, GHT cho php ngi dng vit cc chng trnh thc hin cc thao tc rt tinh t m bn thn kernel khng cn c nhiu chc nng hn l cn thit. C th cp ti mt s cc chc nng, chng hn cc b dch (compilers), b son tho (editors) thuc lp cc chng trnh cp ngi dng (user level) v quan trng hng u l shell, l trnh thng dch m ngi dng s dng ngay sau khi log in vo h thng: shell thng dch cc t trong dng lnh thnh tn lnh my, pht sinh TT con v TT con thc hin lnh a vo, x l cc t cn li trong dng lnh nh cc thng s ca lnh. Shell thc hin ba kiu lnh: 1. Lnh l tp c th thc hin c cha m my pht sinh do b dch to ra t m ngun (chng trnh C chng hn); 2. Lnh l tp cha mt xu cc dng lnh ca shell; 3. L cc lnh bn trong ca shell. Cc lnh bn trong ny lm cho shell tr thnh mt ngn ng lp trnh rt mnh trong Unix. Shell l chng trnh thuc lp ngi dng, khng phi l phn ca kernel, cho nn c th d dng bin ci cho mi mi trng c th. Bn thn shell cng c ba loi khc nhau thch hp cho cc nhu cu s dng khc nhau v h thng c th chy cc shell ng thi. Sc mnh ca mi kiu shell th hin kh nng lp trnh ca mi kiu. Mi TT c thc hin trong Unix c mt mi trng (execution environment) thc hin, bao gm c th mc hin hnh. Th mc hin hnh ca TT l th mc dng ch ng dn khng bt u bng /. Ngi dng c th thc hin nhiu TT cng mt lc, v cc TT li c th to ra cc TT khc mt cch ng, v ng b vic thc hin cc TT . c tnh ny to ra mt mi trng thc hin chng trnh rt mnh trong Unix. 2.3 Xy dng cc hm chc nng c bn (primitives) Nh cp, tnh trit l ca Unix l cung cp cho OS cc nguyn hm (primitives) m ngi dng s s dng vit cc chng trnh (chc nng) nh, c tnh modul, c dng nh cc khi xy dng to ra cc chng trnh ln v phc tp. Mt trong cc primitive l kh nng ti nh tuyn vo/ra (redirect I/O). Tip theo l pipe, mt c ch linh hot cho php truyn d liu gia cc TT, hay lnh ngay t bn phm. V d, khi dng cc chng 12 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ trnh nh to cc chng trnh ln v phc tp, ngi lp trnh s dng cc primitives redirect I/O v pipe hp nht cc phn li.

3. Cc dch v ca Unix/Linux
Trong hnh m t cc lp ca kernel, cho thy lp kernel nm ngay bn di lp cc trnh ng dng ca ngi dng. Kernel thc hin v s cc thao tc c bn (primitives) thay mt cho cc TT ca ngui dng h tr cho giao din ngi dng. Cc thao tc bao hm cc dch v m kernel cp: Kim sot vic thc hin cc TT gm c: cho php TT to TT mi, kt thc TT, treo vic thc hin v trao i thng ip gia cc TT; Lp biu cc TT c thc hin trn CPU. Cc TT chia x CPU theo phng thc phn chia thi gian, mt TT s b treo sau khi thi gian phn b ht, kernel ly TT khc a vo thc hin. Sau ny kernel s li la chn TT b treo a vo thc hin tr li. Cp pht b nh cho TT ang thc hin, cho php TT chia s khng gian a ch ca TT di nhng iu kin nht nh, bo v min a ch ring ca TT i vi cc TT khc. Nu h thng chy trong hon cnh thiu b nh, kernel s gii phng b nh bng cch ghi li cc TT tm thi vo b nh d phng (cn gi l thit b swap). Nu ton b TT c ghi vo swap, th h Unix gi l h tro i (swapping system); Nu kernel ghi cc trang ca b nh ln swap, th h gi l h lu trang (paging system). Cp pht b nh th cp ct v tm li d liu ca ngi dng c hiu qu. Dch v ny cu to nn h thng tp. Kernel cp vng nh th cp cho tp ca ngi dng, khi phc li vng nh, xy dng cu trc tp theo mt cch thc hiu c, bo v tp ca ngi dng trc cc truy nhp bt hp php. Cho php cc TT truy nhp cc thit b ngoi vi, v d t/b u cui, a, t/b mng. Kernel cung cp cc dch v mt cch thng sut, chng hn kernel ghi nhn tp cn thao tc thuc loi tp bnh thng hay tp thit b, nhng n iu i vi TT ca ngi dng; hay v d, kernel to khun d liu trong tp ghi (a), nhng li n khun dng i vi TT ngi dng (user). Tng t nh vy i vi cc dch v h thng cung cp cho cc TT user dng mc cp ngi dng. V d dch v h thng m shell dng ng vai tr l trnh thng dch lnh: cho php shell c u vo t t/b u cui, pht sinh ng cc TT, ng b vic thc hin cc TT, to pipe, i hng I/O. Ngi dng cu to cc phin bn shell ring m khng tc ng ti nhng users khc. Cc trnh cng dng cc dch v ca kernel mc shell chun.

4. Phn cng
Tin trnh ngi dng (TT user) trn Unix c chia ra lm hai mc : Ch ngi dng (user mode) v ch nhn (kernel mode). Khi TT thc hin mt GHT, ch thc hin TT s chuyn t user mode sang kernel mode: OS thc hin v c gng phc v cc yu cu ca user, tr li kt qu v thng bo li nu c. OS lu li cc hot ng c lin quan ti TT user, thao tc cc ngt, lp biu chy TT, qun l b nh... C loi my h tr nhiu mc hn, tuy nhin trong Unix hai mc ny l . 13 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ S khc bit ca hai mc ny l: Cc ng dng chy trong ch x l khng c c quyn, user mode, lin lc vi h thng qua mt tp cc giao tip gii hn (k c mt s lnh ca CPU), cng nh b hn ch truy nhp d liu h thng. TT ng dng c th truy nhp cc lnh v d liu ca n, khng c truy nhp lnh v d liu ca kernel cng nh ca cc TT khc. Khi TT trong user mode thc hin mt GHT, kernel by GHT , chuyn ch thc hin vo kernel mode. Kernel kim sot TT, xc thc cc i (v d quyn truy nhp, quyn thao tc d liu) m TT chuyn cho GHT v thc hin GHT . Khi GHT kt thc, Kernel chuyn TT ngc li vo user mode trc khi tr iu khin li cho TT, cho php TT tip tc chy. Bng cch kernel bo v c chnh n cng nh cc d liu khi b TT user lm tn hi. Thc hin m ca HH chy trong ch c quyn ca CPU, gi l kernel mode. Trong ch ny HH chy v thc hin cc GHT m TT user gi. TT trong kernel mode c th truy nhp vo khng gian a ch ca n c hai vng kernel v user. Vic truy nhp ti nguyn h thng (cc cu trc d liu h thng v phn cng) khng c gii hn i vi kernel. Mt s cc lnh my l c quyn ch kernel mode mi dng c. OS duy tr cc thng tin (records) bn trong phn bit cc TT thc hin trn h thng. Mc d h thng chy mt trong hai ch ni trn, song kernel chy trn danh ngha ca TT user. Kernel khng phi l tp hp ca cc TT ring bit chy song song vi cc TT user, m l mt phn ca mi TT user. Trong vn ng khi ni kernel thc hin... th iu c ngha l TT chy trong ch kernel thc hin... ci g . V d, shell c u vo qua GHT v c m t nh sau: Kernel thc hin nhn danh TT shell, kim sot thao tc thit b u cui, tr li cc k t nhn vo cho shell. n y shell, chy trong user mode, thng dch xu k t nhn c t ngi dng v thc hin mt s hnh ng m c th cc hnh ng kch hot GHT khc dn ti TT shell li tr vo kernel mode. Trong mi trng a ngi dng nh Unix, cc thit b hot ng trn c s c lp c ngha rt cn bn. Unix nhn nhn cc thit b nh mt tp c bit. Khi mt t/b mi cn a vo h, ngi qun tr thc hin thm mt lin kt cn thit vo kernel. Lin kt ny c bit nh l phn mm thit b (device driver) , m bo rng kernel v thit b c gn li theo cng mt phng thc mi khi t/b uc a vo phc v. im mu cht t/b l c lp, lin quan ti kh nng t thch nghi ca kernel: Unix khng c gii hn s lng ca bt k lot t/b no khi thch ng vo h v mi t/b c nhn nhn c lp qua lin kt ring bit vi kernel.

4.1. Ngt v Ngoi l Unix cho php cc t/b nh I/O, ng h h thng ngt CPU theo cch d b. Khi chp nhn ngt, kernel s bo v bi cnh (context) hin ti ca TT ang thc hin, xc nh l do ca ngt, v phc v cho yu cu ngt . Sau khi x l xong kernel khi phc li context ca TT trc v tip tc thc hin nh khng c g xy ra. Phn cng thng thng c c ch t cc cp u tin v che cc ngt theo th t m ngt c thao tc. Cc trng hp ngoi l l s kin khng trng i gy ra bi mt TT, v d truy nhp vo vng a ch cm, thc hin lnh c quyn, php chia cho zero... Cc ngoi l ny khc vi 14 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ ngt bi chng pht sinh do cc s kin bn ngoi mt TT. Ngoi l xy ra gia chng ang thc hin mt lnh, v h thng s ti khi ng li lnh sau khi thao tc ngoi l. Ngt c xem l xy ra gia hai lnh v h thng chy lnh tip theo sau x l ngt. Unix dng cng mt c ch thao tc ngt cng nh thao tc cc ngoi l.

4.2. Cc mc thc hin x l i khi kernel phi ngn chn s xut hin ca ngt trong lc thc hin nhng hot ng c tnh cht c bit m ngt c th lm hng d liu hay ri lon cc con tr. Cc my tnh thng c mt s lnh c bit lm cng vic ny gi l t cc mc x l theo mc, c th che cc ngt mc thp v cho php ngt mc cao.

4.3. Qun l b nh Kernel thng tr trong b nh chnh v thc hin TT hin thi (hay t ra l mt phn ca TT ). Khi compiler dch mt chng trnh, n to ra tp cc a ch ca chng trnh cho cc bin, cu trc d liu, a ch ca lnh... Compiler pht sinh ra a ch cho mt my o, nh th khng c chng trnh no khc s c thc hin ng thi trn my vt l. Khi mt chng trnh chy trong my tnh, kernel s cp cho trnh mt khng gian a ch trong b nh vt l, nhng khng gian a ch o ny khng nht thit phi ng nht vi a ch vt l. Kernel phi hp vi phn cng nh x t a ch o vo a ch vt l. Cch nh x ph thuc vo c th ca phn cng v cc phn ca Unix s thch ng theo. V d loi my h tr theo trang (paging) hay theo hon i (swapping), kernel c cc hm c s tng t cho mi loi cu hnh.

5. Nhn h iu hnh (kernel)


Phn ny s gii thiu tng qut v nhn (kernel) ca Unix theo cch nhn kin trc vi cc khi nim c bn, h tr cho cc phn sau. 5.1. Kin trc ca h iu hnh unix 15 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Trn Unix, h thng tp (File SystemfiFS) c ch c tr v Tin trnh (TT-Proccess) c cuc i ca n. Tp (File) v TT chnh l hai khi nim trung tm trong m hnh ca HH Unix. Hnh sau y l s khi ca Unix, cho thy cc modul v mi quan h gia cc modul . Pha tri l h thng tp (FS) v bn phi l h thng kim sot TT (procces control subsystem), y l hai thnh phn c bn ca Unix. S cho mt cch nhn logic v kernel, cho d trong thc t c th c nhng khc bit v chi tit.

M hnh ch ra ba mc: ngi dng (user level), nhn (kernel level) v phn cng (hardware level). GHT v Th vin (Lib) to ra ghp ni gia chng trnh ca ngi dng (user programs), cn gi l chng trnh ng dng, v kernel. GHT tng t cc hm gi trong C, v Lib nh x cc hm gi ti cc hm c s (primitive) cn thit i vo kernel. Cc chng trnh hp ng (assembly language) c th kch hot GHT trc tip khng cn dng th vin Lib. Cc chung trnh thng xuyn dng cc chc nng chun, v d I/O ca Lib, to ra cch dng tinh xo khi GHT, v cc hm ca Lib s c lin kt vo chng trnh vo thi im dch v l b phn ca chng trnh ng dng. GHT chia ra thnh cc tp 16 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ hp tng tc vi file subsystem v vi process control subsystem. File subsystem trong hnh thc hin cc chc nng qun l tp: cp pht vng nh cho tp, qun l vng trng (trong b nh, trn a), kim sot truy nhp tp, tm d liu cho users. TT tng tc vi File subsystem qua mt tp xc nh cc GHT, chng hn open m tp, close, read, write thao tc cc k t ca tp, stat tm cc thuc tnh tp, chown thay i ch s hu tp, chmod thay i php truy nhp. File subsystem truy nhp d liu bng c ch m (buferring), iu chnh thng lng d liu gia kernel v cc t/b nh th cp, tng tc vi phn iu khin (drivers) I/O khi ng qu trnh trao i d liu. Cc drivers ny chnh l cc module ca kernel, kim sot cc t/b ngoi vi ca h thng. Cc t/b ngoi vi gm loi truy nhp ngu nhin nh t/b khi (a), hay lin tc (raw hay character device) nh bng t (loi ny khng qua c ch m). Procces control subsystem thc hin chc nng iu khin ng b cc TT, lin lc gia cc TT, lp biu a mt TT vo thc hin v qun l b nh. Procces control subsystem v File subsystem tc ng ln nhau khi np mt tp thc thi (executable) vo b nh thc hin. Mt s trong GHT kim sot TT bao gm: fork (to TT mi), exec (ph m ca chng trnh kch hot ln vng b nh ca TT gi exec ang chy), exit (kt thc tc th vic thc hin mt TT), wait (ng b thc hin TT ny vi exit hay vi TT trc to ra TT n), brk (iu chnh kch thc b nh cp cho TT), signal (kim sot p ng ca TT trc s kin khc thng). Memory management module kim sot cp pht b nh, iu chnh b nh qua swapping hay paging sao cho cc ng dng c b nh thc hin. Scheduler tuyn chn mt TT a vo thc hin: cho cc TT thu CPU thc hin cho ti khi TT t ng tr li CPU i mt ti nguyn hoc kernel s dng thc hin khi lng thi gian cp pht cho TT ht. Sau scheduler s chn TT c mc u tin thch hp nht cho chy. TT trc s chy li khi n tr thnh u tin thch hp nht. Vic lin lc gia cc TT c th thc hin qua vi phng thc t ng b tn hiu ca cc s kin hay truyn thng ip ng b gia cc TT. Cui cng khi hardware control thc hin thao tc, x l cc ngt (do a, t/b u cui...), v lin lc vi my tnh. X l ngt khng thc hin bi mt TT c bit m bi cc chc nng c bit trong kernel c gi ti (pht ng) trong bi cnh ca TT hin ang chy.

Chng II.

H thng tp (file system)

A. Tng quan v H thng tp o (VFS)


17 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ VFS c thit k biu din cch trnh by d liu trn mt thit b cng (a cng chng hn). Hu ht cc thit b cng u thng qua phn mm iu khin cng kiu (generic device driver) lin kt vo my tnh. VFS, xa hn, cho php ngi qun tr ghp (mount) bt k mt h thng tp logic trn bt k thit b no vo h thng. VFS tru tng ho cc chi tit ca c hai thit b vt l v h thng tp logic, v cho php TT ngi dng truy nhp tp dng cc giao tip thng thng m khng cn bit h thng tp logic hay vt l tn ti u.

Kin trc H thng tp o Cc modules 1. Cho mi thit b, c mt trnh iu khin. Do nhiu thit b khng tng thch nhau, nn c mt s lng ln trnh iu khin cho mi loi. 2. Modul ghp ni c lp vi thit b (Device Independent Interface) cung cp m t thch hp ca tt c cc thit b. 3. i vi mi h thng tp, c mt h thng tp logic tng ng. 4. Giao din c lp vi h thng (system independent interface) cho m t phn cng v m t s c lp ca h thng tp logic vi cc ti nguyn phn cng. 5. Giao din gi h thng (system call interface) cung cp truy nhp c kim sot cho TT ngi dng vo h thng tp. VFS ch trao cho TT ngi dng nhng chc nng nht nh. 18 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Biu din d liu Tt c cc tp c biu din bi cc i-node. Mi cu trc i-node cho thng tin v tr ca cc khi ca tp thit b vt l no. N cha cc con tr ca cc trnh th tc trong module h thng tp logic v cc trnh iu khin cc thao tc c/ghi. Bng cch lu cc con tr cc hm chc nng theo cch ny, cc h thng tp logic v cc trnh iu khin t ghi nhn vi nhn HH lm cho nhn HH khng b ph thuc vo bt k module c th no. Tnh c lp, dng d liu v hng iu khin Trnh iu khin ca mt thit b c trng l mt m phng ca thit b trong b nh (ramdisk): thit b thu mt khng gian ca b nh c t v thit b, x l c t d nh th x l chnh thit b. Nh vy n s dng qu l b nh hon tt cc thao tc, nh vy s c s ph thuc, c lung iu khin, dng d liu gia trnh iu khin thit b ca h thng tp v qun l b nh. Mt trong cc h thng tp logic l h thng tp mng ch vi vai tr l khch th (client ca mt my khc). H tp ny truy nhp cc tp trn mt my khc nh th l mt phn ca mt my logic. lm c iu ny, mt trong cc module h thng tp s dng h thng con mng. Nh vy s c s ph thuc, dng d liu v lung iu khin gia hai h thng con. Nh ni, qun l b nh s dng VFS thc thi hon i b nh-thit b, ng thi s dng lp biu TT treo TT trong khi i thao tc vo/ra hon thnh v cho chy li khi vo/ra kt thc. Giao din gi h thng cho php TT ngi dng gi vo VFS ct hay tm d liu. Ch khc bit y l khng c c ch no ngi dng ng k yu cu khng tng minh, do vy s khng c lung diu khin t VFS ti TT ngi dng. Cc kiu tp v H thng tp 1. tp chnh tc (regular) (-): l tp ph bin cho lu thng tin trong h thng. 1. tp th mc (directory) (d): l tp danh mc ca cc tp; 2. tp c bit (special file) (c,f): l mt c ch s dng cho c thao tc vo / ra (I/O), fifo. Cc tp loi ny nm th mc /dev. 3. lin kt (link) (l): l mt h thng to ra mt th mc hay tp nhn thy c trong nhiu phn ca cy h thng tp. 4. socket (s): l loi tp c bit cho cc truyn thng mng ca mt tin trnh bn trong h thng, v c bo v bi qui tc truy nhp tp. 5. ng (pipe) (p): l c ch cc tin trnh lin lc vi nhau. V mt s kiu khc. Linux files tn_tp.bz2 tn_tp.gz tn_tp.tar le tn_tp.tbz tn_tp.tgz tn_t.pzip

le compressed with bzip2 le compressed with gzip le archived with tar (short for tape archive), also known as a tar tarred and bzipped le tarred and gzipped letn_tp le compressed with ZIP compression 19

________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ File Formats

. tn_tp.au

audio le tn_tp.gif GIF image le tn_tp.html HTML le tn_tp.jpg JPEG image le tn_tp.pdf an electronic image of a document; PDF stands for Portable Document Format tn_tp.png PNG image le (short for Portable Network Graphic) tn_tp.ps PostScript le; formatted for printing tn_tp.txt ASCII text le tn_tp.wav audio le tn_tp.xpm image le System Files . .conf a configuration file. Configuration files sometimes use the .cfg extension, as well. . .lock a lock file; determines whether a program or device is in use . .rpm a Red Hat Package Manager file used to install software Programming and Scripting Files . .c a C program language source code file . .cpp a C++ program language source code file . .h a C or C++ program language header file . .o a program object file . .pl a Perl script . .py a Python script . .so a library file . .sh a shell script . .tcl a TCL script Cc c s d liu h thng cho tp Trong h thng tp, tp c biu din bng mt inode. Inode cho bit m t ca mt tp trn a cng cc thng tin khc nh s hu tp, quyn truy nhp, thi gian truy nhp tp. Khi nim inode c ngha l ch s ca mt nt (index node, trong FS l mt l ca cu trc cy) v dng thng dng trong ti liu v Unix. Mi tp c mt inode duy nht, nhng mi inode li c th c nhiu tn (tp) khc nhau. Cc tn tp ny u qui chiu ti inode v mi tn nh vy gi l mt lin kt (link). Khi mt TT truy nhp mt tp bng tn, kernel s phn tch tn trong ng dn, tm ti th mc cha tp, kim tra php truy nhp, tm inode v trao inode cho TT. Khi TT to tp mi, kernel gn cho tp mt inode cha s dng. Cc inode lu trong FS trn a, nhng khi thao tc tp, kernel c t a v a vo mt bng gi l in - core inode table (gi tt l Inode table) trong b nh h thng. Kernel cn c hai cu trc d liu khc l bng cc tp (File table) v bng cc m t tp ca ngi dng (User file descriptor per procces table gi tt l File descriptor table). File table l cu trc tng th ca kernel, cn File descriptor table cp cho TT khi TT m mt tp. Khi TT open hay creat tp, kernel cp mt u vo trong mi bng tng ng vi 20 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ tp . Cc thng tin c trong cc u vo ba bng s duy tr trng thi ca tp cng nh kh nng user truy nhp ti tp: - File table theo di quyn truy nhp, /c/ghi byte tip theo trong tp qua con tr tp byte offset, s m qui chiu cho bit tng s cc TT truy nhp tp, con tr tr vo inode table; - File descriptor table cho bit tt c cc tp mt TT m. Hnh sau cho thy mi quan h gia cc bng ni trn: kernel tr li m t tp-file descriptor, ch s tr ti mt u vo ca File descriptor table, ca mi tp khi TT GHT open v creat. Khi thc hin GHT read hay write, kernel dng file descriptor vo File descriptor table, ly con tr tm ti File table, ri t theo con tr trong File table truy nhp vo Inode table. T inode s c cc thng tin cn thit truy nhp d liu ca tp. - Inode table l bng ca kernel, cha cc inode c c t a. Mi inode khi c c vo b nh s c cp mt u vo trong bng, mi u vo cho mt mng d liu c t v mt inode a (xem nh ngha v inode). Vi ba cu trc d liu h thng trn kernel c cc mc khc nhau thc hin qun l v cc thao tc chia s tp. Tp trong Unix c trn thit b khi (a, bng t). My tnh c th c nhiu a, mi a c th c mt hay vi phn hoch, mi phn hoch to thnh mt h thng tp (File systemfiFS). Phn hoch mt a thnh nhiu phn to iu kin d dng cho vic kim sot d liu, v kernel x l mc logic vi cc FS ch khng phi vi bn thn thit b. Mi mt phn hoch l mt thit b logic v nhn bit n bng s ca t/b.

V d: SCO Unix: hd0a: hd ch hard disk, 0 ch a IDE primary, a ch phn hoch th nht. Linux: hda1: hd ch hard disk, a ch a IDE primary, 1 ch phn hoch th nht. (Trn PC, BIOS cho php to ti da 4 phn hoch chnh (primary partions), cc phn hoch khc s l phn m rng bn trong mt phn hoch chnh ). Do vy ta c: hda6 s l phn hoch m rng ca mt phn hoch chnh no mt khi s dng ht 4 phn hoch chnh. Mun bit c th ch c th ghi nhn li trong qu trnh ci t khi to cc phn hoch a. 21 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Qui c chung: xxyN , trong : xx kiu thit b (major number), y s hiu ca t/b (miror number), N s ca phn hoch trn t/b, v d trn my tnh cc nhn (PC): 1. hd = loi IDE: hda=IDE Primary 1, hda1, hda2 phn hoch 1 v 2 ca Primary IDE; hdc=IDE Primary 2, hdd=IDE Secondary 2, 2. sb = loi SCSI, sba1, sba2, Vic bin i gia a ch ca thit b logic (magic number ca FS) v a ch ca thit b vt l ( a) c thc hin bi b iu khin a (disk driver). Sch dng khi nim thit b l ch ti thit b logic, tr khi c din t c th khc. FS cha mt chui cc khi logic c ln 512 bytes hay bi s ca 512 tu h v l ng nht bn trong mi h, nhng c th khc nhau khi p dng trn mi h c th. ln ny c nh hng nht nh v thi gian truy nhp cng nh hiu qu s dng dung lng a. Sch cp ti khi c ngha mt khi logic a (logical block) vi kch thc l 1 K bytes. FS c sp xp hnh thc nh sau: V d a c 3 phn hach, mi phn hoch l 1 FS:

hdb=IDE Secondary 1, hdb1, hdb2, hdb3,

Linux ext2 FS: Boot block, phn u tin ca FS a, l sector u tin cha m bootstrap c c vo my v chy np HH. Superblock, m t tnh trng ca FS: ln, cha c bao nhiu tp (inode), khng 22 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ gian cn trng (block) ca a cha ni dung tp tm thy u, cng nh cc thng tin khc. Super block c cc trng sau y: 1. kch thc ca FS, 2. tng s cc block cn cha cp pht cho tp (free block) trong FS. 3. danh sch cc free block sn c trn FS (xem thm phn cp pht block a), 4. ch s ca free block tip theo trong danh sch free block. 5. kch thc ca danh sch inode, 6. tng s cc inode cha cp pht (free inode) trong FS, 7. danh sch free inode trong FS, 8. ch s ca free inode tip theo trong danh sch free inode, 9. cc trng kho (lock) cho free block v cc danh sch free inode, 10. c (flag) cho bit super block c thay i. Phn tip theo s ni n cch s dng cc trng, cc ch s v kha. Kernel s thng xuyn cp nht super block mt khi c s thay i sao cho n lun nht qun vi data trong h thng. Inode List, danh cch cc inode trong FS. Ngi qun tr xc nh kch thc khi lm cu hnh (ci t) h thng. Kernel qui chiu cc inode bng ch s (index) trong inode list. C mt inode gi l root inode trong mi FS: l inode khi u vo c FS sau khi thc hin GHT php ghp (mount) FS vo cy th mc gc. Data blocks, vng cha ni dung (d liu) ca tp v d liu qun tr h thng (l cc block ca tp th mc, cc block ni dung ca mt inode). Mt khi khi cp cho mi tp th khi ch thuc tp m thi.

2.Biu din bn trong ca tp


Mi mt tp trong UNIX c mt ch s duy nht (inode) gn cho tp lc tp c to. Inode cha cc thng tin cn thit mt TT truy nhp tp, v d nh ngi s hu tp, quyn truy nhp, kch thc ca tp, v tr data ca tp trong FS. Cc TT truy nhp tp bng cc GHT v xc nh mt tp bng xu k t gi l ng dn tn tp. Mi ng dn li xc nh duy nht mt tp, v kernel s bin i ng dn thnh inode ca tp. Chng ny cp ti cch t chc ca tp ni ring v ca FS ni chung nh: inode, tp v ghi/ c tp, tp th mc, tp v t chc a: inode a v block a cho tp; ng thi cng a ra cc thut ton c s thao tc tp. Cc thut ton ny nm lp trn ca buffer cache.

2.1

Inode (Index-node), nh ngha v cu trc

Inode tn ti trn a (disk inode) cn gi l inode dng tnh v kernel c inode vo b nh (gi l in - core inode) x l. In - core inode l mt mng trong Inode table. Mt inode khi c vo b nh l tp hp ca hai phn gm phn tnh trn a v phn ng 23 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ inficore inode. Disk inode gm c cc trng sau y: Nhn dng ngi s hu tp. Quan h s hu chia ra lm s hu c th v s hu nhm nh ngha mt tp hp cc users c quyn truy nhp tp. Superuser c quyn chi phi mi tp trong FS. Kiu tp (file type): tp thng (regular), th mc (directory), k t (character), kiu khi c bit (block special), hay FIFO (pipes). (Khi trng = 0, inode tng ng cha dng (free)). Php truy nhp tp (Permission). H thng bo v tp theo ba lp: 1. ngi s hu (ownerfiu) v 2. nhm ngi s hu (groupfig) v 3. nhng ngi khc (otherfio). Mi lp li c lp cc quyn khc nhau mt cch ring bit nh: c (rfiread), ghi (wfiwrite), thc hin (xfiexecute) (chy mt tp thc thi). Ring th mc thc hin l tng ng vi tm tp trn th mc. Thi im truy nhp tp (access time), cho bit thi im tp c s thay i vo ln truy nhp cui cng v khi inode c thay i. S cc lin kt (link) ti tp. Tp c th c nhiu tn trong cu trc th mc, l cc link ca tp. Bng a ch cc block data a cp pht cho tp. Mc d user x l tp nh mt xu cc k t, th kernel ct data ca tp trn cc block a khng lin tc, ni dung cc block a khi c v sp xp li chnh l ni dung ca tp. di ca tp. Data trong tp c a ch ho bng tng s bytes, bt u t u tp v khi ng bi offset=0 (con tr tp, ng vi byte u tin) v di ca tp l mt s ln hn offset ln nht 1 n v (offset max + 1). V d: owner group type permission accessed modified inode changed at size john os regular file rwx r-x r-x Oct 23 1999 1:45 P.M Oct 22 1999 10:30 A.M Oct 23 1999 1:30 P.M 6030 bytes

disk addresses (danh sch a ch cc khi afidisk blocks) Tt c cc thng tin trn l ni dung ca inode, cho bit chi tit v bn thn mt tp m nh user truy nhp ti ni dung ca tp. Khi ni ti ghi a, cn phn bit ghi ni dung ca tp ln a v ghi ni dung ca inode ln a. Ni dung ca inode thay i khi thay i ni dung ca tp hay khi thay i cc thuc tnh nh owner, permission, links. Thay i ni dung ca tp t ng dn n thay i inode, nhng thay i inode khng dn ti thay i ni dung ca tp. Incore - inode l bn sao ni dung inode trn a (disk inode) vo b nh v ti Inode table trong b nh sau s c thm cc trng sau y: 24 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Trng trng thi ca inode in - core cho bit: inode kho (locked); c mt TT ang i inode trong khi inode b kha, ch inode c gii kha (unlocked); bn in - core ca inode c s khc bit vi bn sao t trn a bi c s thay i thng tin t chc (data) trong inode; bn in - core ca inode c s khc bit vi bn sao t trn a bi c s thay i ni dung (data) trong tp; tp l mt im ghp (mount point) ca cu trc FS; S thit b logic ca FS cha tp. S ca thit b logic m tp c lu trn thit b ; S ca inode. Cc inode uc ct trong mt mng tuyn tnh trn a, kernel nhn bit s ca inode a bng v tr ca n trong mng. (Inode a khng cn c trng ny). Cc con tr tr ti cc in - core inode khc. Kernel lin kt cc inode trn mt hng bm (hash queue) v trong mt danh sch cc inode cha s dng (free list). Mt hng bm th c nhn bit bi s ca thit b logic ca inode v s ca inode. Kernel c th cha nhiu nht mt bn sao in - core inode ca mt inode a, trong khi cc inode c th ng thi c mt trong hash queue v trong free list. Mt s m qui chiu (reference count) cho bit tp m bao nhiu ln (actived), v d khi cc TT dng hm open() m cng mt tp, mi ln m s m ny tng ln 1 n v. Mt in core inode c trong free list ch khi no trng s m ny c gi tr bng 0 v inode l inactive v kernel s cp inode cho mt disk inode khc (khi c TT open mt tp no ). Mt inode b kho (locked) l khng cho cc TT khc truy nhp ti inode . Cc TT khc s t mt flag trong inode khi mun truy nhp inode thng bo rng cc TT s c nh thc khi inode c m tr li (unlock). Trong khi , kernel t cc flag khc ch ra s khc nhau gia disk inode v in - core inode. Khi kernel cn cp nht mi disk inode t inficore inode, kernel s kim tra cc c (flag) trng thi ny. Free list ca cc inode c s dng ging nh l mt cache ca cc inactive inode: Khi TT truy nhp mt tp m inode ca tp cha c trong nhm in - core inode, kernel s cp cho n mt in - core inode t free list s dng.

2.2. Truy nhp cc inodes Kernel nhn bit cc inode qua FS v s ca inode sau cp cho inode mt in core inode v vic c thc hin bi thut ton iget(). Thut ton ny v t duy cng ging nh getblk() tm mt block a trong buffer cache. Kernel s nh x s ca thit b v s ca inode vo hng bm, v tm mt hng c inode cn tm. Nu khng thy inode (cha c), kernel cp mt in - core inode trong free list v kho inode li. Sau kernel chun b c bn sao ca disk inode vo in - core inode va cp pht: kernel bit s ca inode v s ca thit b logic, kernel tnh ton block logic a c cha disk inode, tnh ra s ca block , c vo buffer h thng, ly inode v sao vo inficore inode trong inode table. Php tnh da vo cng thc sau y: block number = ((inode number 1) / numbrer of inode per block) 25 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ + start block of inode list. Trong php chia ny, ch ly phn nguyn ca thng s. V d: block s 2 l block u tin ca cc block dnh cho inode list (xem li hnh 2.3 chng 2); mi block c tt c 8 inode; Hy tm block cha inode s 8, inode s 9: Bl = ((8-1) / 8) + 2 = 2; block a s 2 cha inode s 8. Bl = ((9-1) / 8) + 2 = 3; block a s 3 cha inode s 9. Khi bit c s ca thit b (a cng s:.../phn hoch s:...) v s ca block trn a cng, kernel dng chc nng bread() c block v tm ti offset ca inode trong block bng thut ton: offset ca inode = ((inode number-1) modulo (number of inodes per block)) * size of disk inode (modulo l ly s d ca php chia ca hai s). Gi s cu trc mt disk inode c: 8 inodes, mi inode c di 64 bytes. Tm inode s 8 (byte offset bt u ca inode s 8): ((8-1) modulo (8)) * (64) = 448, inode s 8 bt u byte s 448 ca block a inode. Qu trnh tip theo l: - kernel cp in-core inode (ly ra t free list), t in - core inode vo hng bm; - t (khi ng) s m qui chiu = 1 (c mt TT m tp ny); - copy ton b cc thng tin t inode disk ni trn vo in-core inode; - kha (lock) in - core inode li. - tr li cu trc (con tr) inode cho TT gi. Kernel dng chc nng iget() tm mt inode trong FS, vi cc u vo: input: s ca inode trong FS ( inode number) output: l inode t trong Inode Table kha li chng tranh chp y iget(), bread() l cc chc nng (hm) c s ca nhn HH.

2.3. Gii phng mt inode Khi mt inode c gii phng khi s s dng ca mt TT (TT close tp n truy nhp), kernel gim s m i 1. Nu s m tr thnh 0 (khng cn TT no truy nhp tp), kernel cp nht (ghi) inode ln a nu bn in - core c s khc bit vi disk inode (xem li cc tiu ch v s khc bit trong phn trc). Kernel t inode vo free list ca cc inode, n inode trong cache c dng ngay khi ti s dng. Kernel ng thi gii phng tt c block a dng kt hp cho tp v nu s link = 0, gii phng lun inode. Qu trnh c m t bng thut ton iput(). Kernel dng chc nng iput() Input: Output: Khng c m tr li /*gii phng truy nhp cho mt in - core inode*/ con tr tr vo in - core inode trong bng Inode Table;

26 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

3. Cu trc ca tp thng thng (regular file hay ordinary file)


Nh ni, inode cha bng a ch cc block data nh v data trn a. Mi block a c nh du bng mt s, do vy bng bao gm tp hp cc s ca cc block a. Nu data ca tp c ghi trn mt vng lin tc ca a (trnh t tuyn tnh cc block a), th lu a ch ca block khi u v di ca tp trong inode l truy nhp tp. Tuy nhin chin lc cp pht nh vy s khng cho php m rng v thu nh cc tp trn mt h thng tp khi khng thc hin bin php phn on cc vng nh trng trn a. Hn na kernel c th phi cp pht v dnh ring nhng vng a lin tc trc khi cho php cc thao tc tng di ca tp.

V d: User to 3 tp A, B, C mi tp dng 10 block a v c cp cc block lin tc (xem hnh di). Nu user cn m rng tp B thm 5 block vo gia tp, th kernel phi sao chp li vo vng a khc vi 15 block lin tc. Bn cnh vic thc hin mt thao tc t gi nh vy th 10 block trc ch c th cp cho cc tp mi nh hn 10 block. Kernel c th ti thiu ho s phn on nh vy bng chy nh k cc th tc gn cc khng gian a li nhng iu bn rt nhiu sc mnh x l ca h thng. linh hot hn, kernel phn phi mt block mi ln cho tp v cho php data ca tp phn tn qua FS, tuy nhin s cp pht nh vy s l phc tp nhim v nh v data. Bng ni dung c th bao gm danh sch s cc block cha data thuc tp, th nhng bng cch tnh n gin ch ra rng danh sch tuyn tnh cc block trong inode kh qun l. Nu 27 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ mt block logic l 1 K bytes, th tp di 10 K cn mt ch s ca 10 block, vy nu l 100 Kb th s ch s s l 100 s nh du block. y ta thy kch thc ca inode do vy s thay i theo di ca tp, hoc s c mt gii hn thp s p t ln di ca tp. gi cho cu trc inode nh m vn cho php tp ln, bng cc block a thch hp vi cch trnh by trn hnh di y. H UNIX System V lm vic vi 13 u vo ca bng cc block trong mt inode, nhng nguyn tc l c lp vi tng s cc block: - Cc u vo nh du l direct cho s ca block a cha data ca tp. - u vo nh du single indirect ch ti mt block m ni dung ca n l danh sch s cc block trc tip cha data ca tp. ly data qua cc block gin tip kernel phi c block gin tip, ly ra s ca block trc tip, sau c block trc tip . - Khi nh du double indirect cho danh sch s ca cc block gin tip i: block gin tip block gin tip - Khi triple indirect cho danh sch s ca cc block gin tip ba: block gin tip block gin tip block gin tip. V nguyn l c th m rng ti gin tip bn, gin tip nm v.v...th nhng thc t cu trc nh trn l . Gi nh rng mt block logic l 1 K bytes v th hin s nguyn ca block cn 32 bit. Vy 1 block c th cha c 256 s ca cc block. Nu ch dng cu hnh: 10 u vo trc tip, 1 u vo gin tip n, 1 u vo gin tip i v 1 u vo gin tip ba trong mt inode, th c th to mt tp di hn 16 Gbyte: 10 u vo cho 10 block trc tip cho 1 u vo cho 1 block gin tip cho 1 u vo cho 1 block gin tip i cho 1 u vo cho 1 block gin tip ba cho 10 Kbyte 256 x 1 K = 256 K 256 x 256 x 1K = 64 M byte 256x256x256x1K= 16 Gbyte

Nu trng cha di tp trong inode l 32 bit, th kch thc hiu dng ca tp s gii hn ti 4 Gbyte (232). Cc TT truy nhp data ca tp bi byte offset (con tr tp), lm vic trong khi nim s m byte v nhn tp nh mt chui cc byte bt u byte c a ch bng 0 v tin ti cui tp. Kernel bin i cch nhn byte ca user thnh cch nhn vo block a: tp bt u block logic 0 v tip tc ti block tng ng vi di ca tp. Kernel truy nhp inode, bin i block logic vo block a thch hp. Thut ton bmap() thc hin bin i file offset thnh block a vt l. LINUX:

28 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

EXT2 Inode

Figure 9.2: EXT2 Inode In the EXT2 file system, the inode is the basic building block; every file and directory in the file system is described by one and only one inode. The EXT2 inodes for each Block Group are kept in the inode table together with a bitmap that allows the system to keep track of allocated and unallocated inodes. Figure 9.2 shows the format of an EXT2 inode, amongst other information, it contains the following fields: mode This holds two pieces of information; what this inode describes and the permissions that users have to it. For EXT2, an inode can describe one of file, directory, symbolic 29 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ link, block device, character device or FIFO. Owner Information The user and group identifiers of the owners of this file or directory. This allows the file system to correctly allow the right sort of accesses, Size The size of the file in bytes, Timestamps The time that the inode was created and the last time that it was modified, Datablocks Pointers to the blocks that contain the data that this inode is describing. The first twelve are pointers to the physical blocks containing the data described by this inode and the last three pointers contain more and more levels of indirection. For example, the double indirect blocks pointer points at a block of pointers to blocks of pointers to data blocks. This means that files less than or equal to twelve data blocks in length are more quickly accessed than larger files. You should note that EXT2 inodes can describe special device files. These are not real files but handles that programs can use to access devices. All of the device files in /dev are there to allow programs to access Linux's devices. For example the mount program takes as an argument the device file that it wishes to mount. The EXT2 Superblock The Superblock contains a description of the basic size and shape of this file system. The information within it allows the file system manager to use and maintain the file system. Usually only the Superblock in Block Group 0 is read when the file system is mounted but each Block Group contains a duplicate copy in case of file system corruption. Amongst other information it holds the: Magic Number This allows the mounting software to check that this is indeed the Superblock for an EXT2 file system. For the current version of EXT2 this is 0xEF53. Revision Level The major and minor revision levels allow the mounting code to determine whether or not this file system supports features that are only available in particular revisions of the file system. There are also feature compatibility fields which help the mounting code to determine which new features can safely be used on this file system, Mount Count and Maximum Mount Count Together these allow the system to determine if the file system should be fully checked. The mount count is incremented each time the file system is mounted and when it equals the maximum mount count the warning message ``maximal mount count reached, running e2fsck is recommended'' is displayed, Block Group Number The Block Group number that holds this copy of the Superblock, Block Size The size of the block for this file system in bytes, for example 1024 bytes, Blocks per Group The number of blocks in a group. Like the block size this is fixed when the file system is created, 30 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Free Blocks The number of free blocks in the file system, Free Inodes The number of free Inodes in the file system, First Inode This is the inode number of the first inode in the file system. The first inode in an EXT2 root file system would be the directory entry for the '/' directory.

The EXT2 Group Descriptor Each Block Group has a data structure describing it. Like the Superblock, all the group descriptors for all of the Block Groups are duplicated in each Block Group in case of file system corruption. Each Group Descriptor contains the following information: Blocks Bitmap The block number of the block allocation bitmap for this Block Group. This is used during block allocation and deallocation, Inode Bitmap The block number of the inode allocation bitmap for this Block Group. This is used during inode allocation and deallocation, Inode Table The block number of the starting block for the inode table for this Block Group. Each inode is represented by the EXT2 inode data structure described below. Free blocks count, Free Inodes count, Used directory count The group descriptors are placed on after another and together they make the group descriptor table. Each Blocks Group contains the entire table of group descriptors after its copy of the Superblock. Only the first copy (in Block Group 0) is actually used by the EXT2 file system. The other copies are there, like the copies of the Superblock, in case the main copy is corrupted. EXT2 Directories

31 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Figure 9.3: EXT2 Directory In the EXT2 file system, directories are special files that are used to create and hold access paths to the files in the file system. Figure 9.3 shows the layout of a directory entry in memory. A directory file is a list of directory entries, each one containing the following information: inode The inode for this directory entry. This is an index into the array of inodes held in the Inode Table of the Block Group. In figure 9.3, the directory entry for the file called file has a reference to inode number i1, name length The length of this directory entry in bytes, name The name of this directory entry. The first two entries for every directory are always the standard ``.'' and ``..'' entries meaning ``this directory'' and ``the parent directory'' respectively.
Finding a File in an EXT2 File System

A Linux filename has the same format as all Unix TM filenames have. It is a series of directory names separated by forward slashes (``/'') and ending in the file's name. One example filename would be /home/rusling/.cshrc where /home and /rusling are directory names and the file's name is .cshrc. Like all other Unix TM systems, Linux does not 32 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ care about the format of the filename itself; it can be any length and consist of any of the printable characters. To find the inode representing this file within an EXT2 file system the system must parse the filename a directory at a time until we get to the file itself. The first inode we need is the inode for the root of the file system and we find its number in the file system's superblock. To read an EXT2 inode we must look for it in the inode table of the appropriate Block Group. If, for example, the root inode number is 42, then we need the 42nd inode from the inode table of Block Group 0. The root inode is for an EXT2 directory, in other words the mode of the root inode describes it as a directory and it's data blocks contain EXT2 directory entries. is just one of the many directory entries and this directory entry gives us the number of the inode describing the /home directory. We have to read this directory (by first reading its inode and then reading the directory entries from the data blocks described by its inode) to find the rusling entry which gives us the number of the inode describing the /home/rusling directory. Finally we read the directory entries pointed at by the inode describing the /home/rusling directory to find the inode number of the .cshrc file and from this we get the data blocks containing the information in the file.
home

Kernel dng chc nng bmap( )(Xem m ngun Linux) thc hin bin i file offset thnh block a vt l. input: (1) inode (2) byte offset output: (1) s ca khi a (block number in file system) (2) con tr tr vo khi a (byte offset into block) (3) s byte cn thc hin truy nhp trong jhid a (4) c trc khi a cho ln c sau V d: bin i byte offset thnh s ca block a. Hy xt cch b tr cc block cho tp hnh sau: Gi nh rng mt block a c 1024 byte. Nu mt TT mun tm byte th 9000, kernel tnh thy byte ny nm block trc tip ti u vo s 8 (m t u v nh s t 0) trong bng a ch cc block ca tp c a ch ca block s 367. Vi 9 block cho 1024x9=9216 byte, t tnh ra byte th 808 trong block ny l byte 9000 ca tp (8 block trc cho 8x1024=8192 byte, 9000-8192=808). Nu TT tm byte th 350.000 trong tp, kernel tnh ra rng phi c block gin tip i m a ch ca block l 9156. Bi v 1 block gin tip cho 256 a ch cc block, vy byte u tin qua block gin tip i l byte 272.384 (256K + 10K); byte 350.000 l byte th 77.616 ca block gin tip i. V mi mt block gin tip n cho 256 K bytes, byte 350.000 phi block gin tip n th 0 ca block gin tip I, v d l block s 331 (u vo th 0 ca block 9156). Block 331 cho 256 block trc tip mi block 1K, vy byte s 77.616 ca block trc tip s trong block trc tip th 75 (gi nh s ca block ny l 3333) ca block gin tip n. Cui cng khi c block 3333, kernel tm thy byte th 816 l byte 350.000 ca tp. Xem xt hnh mt cch chi tit hn, c mt vi u vo trong bng a ch cc block l 0, c ngha rng cc u vo ca cc block logic ny khng cha data. iu ny xy ra khi khng 33 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ c TT no ghi data vo tp bt k v tr no tng ng vi cc block , do vy s ca cc block khng i v l cc gi tr ban u (initial). TT c th to ra cc block nh vy trong bng bng cch dng GHT lseek() v write(). S bin i byte offset ln, c bit khi phi qui chiu qua gin tip ba (triple) l mt qui trnh ht sc rc ri i hi kernel phi truy nhp thm ba block a ngay c khi cc block c trong cache th php thc hin vn rt t gi v kernel s phi yu cu buffer rt nhiu ln v s phi i ng do buffer b kho. Hiu qu thc tin ca thut ton ny ph thuc vo tn xut truy nhp cc tp ln hay nh trn h thng. Hy th xt ti kh nng tng ln ca 1 block a (4 K, 8K hay 12 K/block), liu c g kh quan hn cng nh hiu sut s dng a c ti hn ? Hin tng phn on c tng ln ?

34 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

4. Tp th mc
Th mc l mt tp m data ca n l trnh t cc u vo m mi u vo bao gm mt s ca inode v tn ca tp cha trong th mc. Mt ng dn l mt xu k t kt thc trng (NULL), c phn chia ra thnh cc thnh phn ngn bi k t /. Mi thnh phn, tr thnh phn cui cng, phi l tn ca mt th mc, v thnh phn cui cng khng phi l tp th mc. UNIX System V hn ch tn ca mt thnh phn ch ti 14 n 256 k t v 2 bytes cho s ca inode. Vy v d tn tp l 14 k t, th mt u vo th mc c 16 bytes, mt tp th mc s nh sau: Byte Offset 0 16 32 48 . . . 224 240 Inode number (2 bytes) 83 2 1789 1276 . . . 0 95 . . . crash mkfs File name

. ..

(th mc hin ti) (th mc b) init fsck

. . . Mi mt th mc cha cc tn tp . (dot) v .. (dot-dot) vi s ca inode l inode ca th mc v th mc b (trn mt mc). Inode s . ti offset 0 v tr s ca n l 83. Tng t ca inode .. c offset l v tr th 16 v tr s l 2. u vo ca th mc c th rng v c biu th bi s inode = 0. V d u vo 224 rng d mt ln cha tp c tn crash. Chng trnh to h thng tp khi ng FS sao cho . v .. ca th mc root c s inode ca FS. Kernel ct data ca th mc cng ging nh cho cc tp thng, s dng cu trc inode v cc cch cp trc tip, gin tip ca cc block. TT c tp th mc cng cch thc nh c tp thng, nhng kernel ginh c quyn ghi th mc, do m bo c s chun xc 35 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ ca th mc. Quyn truy nhp th mc c ngha nh sau: quyn c (read) th mc cho php TT c th mc; quyn ghi (write) th mc cho php TT to cc u vo mi hay xo u vo c (creat, mknod, link, unlink); bng cch thay i ni dung th mc. Quyn thc hin (excute) cho php TT thc hin tm kim tn tp trong th mc.

5. Bin i t ng dn thnh inode


Truy nhp tp khi u bng ng dn. V bn trong kernel lm vic vi inode, ch khng bng tn tp qua ng dn, nn kernel phi chuyn i t ng dn thnh inode truy nhp ti tp. Thut ton namei() lm phn tch mi thnh phn trong ng dn mt ln, bin i mi thnh phn thnh inode trn c s tn ca n v th mc ang tm kim, cui cng tr li inode. Nhc li trong chng trc l mi mt TT c kt hp vi mt th mc hin ti (m TT thng tr ). Min b nh ufiarea cha mt con tr tr ti inode l th mc hin hnh. Th mc hin hnh ca TT u tin trong h thng, TT s 0, l th mc root. Th mc hin hnh ca mi TT khc bt u t th mc b hin hnh vo lc TT c to ra. TT thay i th mc bng thc hin GHT chdir (i th mc). Vic tm ng dn xut pht t th mc hin hnh ca TT tr phi c du /, cho bit vic tm th mc phi bt u t root. Trong cc trng hp khc kernel d dng tm ra inode m vic tm ng dn bt u: th mc hin hnh c trong ufiarea ca TT, v inode ca root c trong bin tng th. namei() input: ouput: /*convert path name to inode*/ ng dn (path name) inode tm c (locked inode)

Kernel thc hin tm tuyn tnh mt tp th mc, kt hp vi working inode (th mc tm thi), th s tng xng ca thnh phn tn ng dn vi mt u vo ca tp th mc (xem li cu trc ca tp th mc). Bt u vi byte offset = 0 trong th mc, chuyn i offset ny thnh block a tng ng (bmap()) v c block (bread()). Kernel x l ni dung ca block ny nh tun t cc u vo ca th mc, tm tng thnh phn trong ng dn bng cch so snh cc u vo, nu tm c, kernel ly ra s ca inode ng vi tn ng dn , gii phng block (brelse()) v working inode c (iput()), cp pht mt inode ca thnh phn va tm c (iget()), v inode mi ny tr thnh working inode. Nu khng c kt qu block ny, kernel gii phng block, iu chnh li offset bng s byte trong block (ly byte offset tip theo), bin i offset mi thnh s ca block a (bmap()), v c block . Kernel lp li chu trnh ny cho ti khi tm ra inode tng ng vi thnh phn (tp) yu cu trong ng dn cho ti ht cc u vo ca th mc. V d: Tm tp passwd trong th mc /etc: /etc/passwd. Khi bt u phn tch tn tp, kernel gp / v nhn i ly inode ca root, inode ny tr thnh working inode. Kernel i thu thp xu etc: sau khi kim tra ng inode ny l ca th mc / v TT c quyn hn truy nhp, kernel tm tp c tn etc: Kernel truy nhp data trong th mc gc (root) ht block ny ti block khc, tm tng u vo ca tng block cho ti khi nh v c mt u vo etc. Khi tm c u vo ny, kernel gii phng inode root (iput()), ly inode ng vi etc (iget()), sau khi bit ch xc etc l tp th mc, 36 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ kernel tm trong cc block ca etc n tp passwd, ly t inode ng vi passwd.

6. Cp mt inode cho mt tp mi to
Kernel dng iget() nh v inode bit (vi s ca inode c xc nh trc trong thut ton namei()). Mt thut ton khc ialloc() gn mt inode cho mt tp mi to. H thng tp c mt danh sch tuyn tnh cc inode. Mt inode l free nu trng cha kiu tp (type) l 0. Khi mt TT cn inode mi, kernel c th tm trong danh sch inode mt inode free, tuy nhin cch lm ny c th rt t i hi t nht mt thao tc c a cho mi inode. ci thin, super block cha mt mng n s lng cc inode free trong FS. Hy theo di cho thut ton ialloc(), tm v cp mt inode mi: ialloc() input: /*allocate inode*/ FS

output: inode mi (locked inode) Thut ton gii phng inode n gin hn. ifree() /*inode free*/ input: FS inode number output: none

7. Cp pht cc block a
Khi mt TT ghi data ln a, kernel s cp cc block cho n theo c ch direct v indirect nh ni. Super block c mt mng gm nhiu block a dng n cc s ca cc 37 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ block a cha dng (free disk block) ca FS. Tin ch mkfs() t chc cc khi d liu (data block) ca FS vo mt danh sch lin kt, m mi mt lin kt ca danh sch l mt block a, block ny cha mt mng s hiu ca cc free disk block v mt u vo ca mng cho s ca block tip theo ca danh sch lin kt. Hnh sau l v d v danh sch lin kt: block u tin l danh sch block cha dng ca super block (super block free list), vi cc u vo l s ca cc block s dng cho cp pht, v 1 u vo c s ca block lin kt tip theo (block 109, 211, 310, 409). Khi kernel mun cp pht mt block, xem thut ton alloc(), kernel s ly block trong danh sch cc free block sn c ca super block list, v mt khi dng block khng th ti cp cho ti khi n tr li l free. Nu block cp l block cui cng c trong mng cache, kernel s x l block nh l con tr (109) tr vo block (109) cha danh sch cc free block khc. Kernel c block , nhp vo mng Super block vi danh sch mi s ca cc block cha cp, sau tip tc s dng s ca block gc, cp buffer cho block, xo data ca block (in zero vo). Block a lc ny cp pht cho tp, kernel cng c buffer lm vic. Chng trnh s thng bo li nu FS khng cn c free block. alloc() /*FS block allocation*/ input: FS (number) outout: buffer for new block Nu TT ghi mt khi lng data ln, TT s lp li yu cu xin cp block, trong khi kernel ch thc hin cp mi ln mt block. Chng trnh mkfs() s t chc danh sch lin kt ca cc block sao cho gn vi nhau, gim i thi gian tm kim trn a khi TT c tp tun t. Hnh di m t s hiu ca cc block vi s cch qung (interlive code = 3) u n da trn c s tc quay ca a. iu lu l th t sp xp ni trn s khng cn khi tn xut s dng block a cao (cp pht/ gii phng) v qu trnh cp nht li danh sch c tnh ngu nhin v kernel khng thc hin sp xp li th t gc. Thut ton gii phng block free(), ngc li vi cp pht block. Nu super block list khng y, s ca block va c gii phng s t vo danh sch . Nhng nu khng cn ch ( y) th block va c gii phng s thnh block lin kt; kernel ghi super block list vo block a v ghi ni dung ca block ny ln a, sau t s ca block mi gii phng vo super block list. S ca block ny ch l thnh vin ca danh sch. Thut ton gn/gii phng inode tp v block a l tng t ch kernel dng super block nh l mt cache ca cc ch s cho ngun ti nguyn cha dng (free), s ca cc block, s ca cc inode. Kernel duy tr danh sch lin kt ca s hiu cc block sao cho mi s cha dng hin din trong mt thnh phn ca danh sch. iu ny khng c i vi free inode. S d c s khc nhau do cc nguyn nhn di y: 1. Kernel c th bit inode l free bng cch tham kho trng Type, nu = 0 th inode free, nhng i vi block a th khng c c ch g nhn bit tng t. Do vy kernel cn c phng php khc bit block l free, v l linked listfidanh sch lin kt. 2. Cc block a bn thn l dng danh sch lin kt: mt block a c th cha mt danh sch ln s hiu ca cc block cha cp pht. Vi cu trc d liu ln cho mi inode, khng th thc hin nh cho block a. 3. Vic khai thc block a (c/ ghi ni dung tp) l thng xuyn hn khai thc inode (to, m, ghi tp), iu c ngha truy nhp block a gay cn hn tm inode.

38 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

8. Cc kiu tp khc
Unix h tr hai loi tp khc l: pipe v cc tp c bit (special files). Pipe cn gi l fifo (first-in-first-out), khc vi tp thng ch d liu ca tp l c tnh chuyn tip ngay: mt khi data c t pipe th khng th c li ln na, ng thi data c theo th t m data c ghi vo h thng khng cho php lm chch th t . Kernel ct data cng cng mt cch thc nh tp thng ch khc l ch dng cc block a kiu cp trc tip. Special file l cc tp kiu khi, kiu k t, cc tp loi ny xc nh cc thit b. V vy inode ca tp c bit khng qui chiu ti d liu, m cha hai s qui chiu ti thit b gi l major number v minor number. major number cho kiu thit b (v d:terminal, disk...); minor number cho bit s n v ca thit b . Xem v d phn trc v a cng.

9. Tm tt v bi tp
Tm tt Inode l mt cu trc d liu m t thuc tnh ca tp k c hnh thc t chc d liu ca tp trn a. C hai phin bn ca inode: bn disk inode lu cc thng tin ca tp khi tp khng a vo s dng; v phin bn in-core inode cp nht lin tc mi s thay i ca tp khi tp ang c s dng. Cc thut ton sau thao tc inode: ialloc(), ifree(), kim sot vic cp inode cho tp khi thc hin GHT creat(), mknod(), pipe(), unlink(); iget(), iput() kim sot cp in - core inode khi TT truy nhp tp; bmap() nh v disk block cho tp theo offset tp u vo; Th mc l loi tp cho s tng quan gia cc thnh phn tn (pathname) vi inode ca tp. Thut ton namei() bin i pathname thao tc bi TT thnh inode m kernel s dng bn trong cc qu trnh. alloc() v free() kernel dng kim sot cp v gii phng block a cho tp. Cc cu trc d kiu h thng xt gm: - linked list danh sch lin kt qun l disk block, - hash queue (hng bm) dng trong t chc buffer cache, - linear array cc mng t chc cc danh sch s block a v - cc thut ton khc h tr lm n gin cc thao tc data h thng. Tnh phc tp s gia tng bi s tng tc gia cc thut ton v m chng trnh cng cho thy c nhng vn v thi gian. Cc thut ton y cha c trau chut t m m ch minh ha cho n gin vic thit k h thng. Cc thut ton m t l ca bn trong h thng v dnh cho kernel thc hin v l n i vi 39 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ user. Qui chiu vo hnh m t nhn h thng, cc thut ton chng ny nm na phn di ca khi FS. Chng tip theo s trnh by cc GHT, cung cp giao din cho ngi dng (lp trnh h thng ng dng) ghp ni vi FS. Cc GHT ny s kch hot cc thut ton bn trong va m t.

Bi tp 1. Trong ngn ng qui c ch s ca mng bt u t 0, ti sao s ca inode li bt u t 1? 2. Trong iget(), TT i ng khi thy inode kho (locked), khi c nh thc, th TT phi bt u li vng lp t u? 3. M t thut ton cp nht mt disk inode vi u vo l in - core inode. 4. Thut ton iget() v iput() khng i hi phi nng mc u tin ca x l ngn chn ngt, ti sao nh vy? 5. Unix System V cho php di ti a cho mt thnh phn ca pathname l 14 k t. Namei() s ct i cc k t di hn trong thnh phn ca pathname. Phi thit k li FS v thut ton namei() nh th no cho php c th c di tn ty ? 6. (*) Hy xem namei(), trong qu trnh tm, kernel kim tra thy working inode hin ti l mt th mc. C th cho mt TT khc hy b (remove) th mc (bng lnh unlink) ? Lm g kernel ngn chn c iu ? 7. (*) Hy thit k cu trc th mc c th ci thin hiu qu tm tn bng cch khng dng phng php tuyn tnh. Hy nghin cu ti hai k thut: hash v n - aray tree. 8. (*) Thit k s gim bt s ln phi tm th mc bng cch n cc tn thng xun dng n. 9. Super block l mt block a v bn cnh danh sch free block list cn c cc thng tin khc, cho nn danh sch ny khng th cha c nhiu s ca cc block nh trong block a ca danh sch lin kt ca cc block cha dng (free). S lng ti u ca s cc block l bao nhiu c th cha trong block trn danh sch lin kt? 10. (*) Hy tho lun cc dng nh x bit (bit map) kim sot cc free disk block thay cho cch dng linked list ca cc block. u v nhc im ca phng php ?

B. Gi H Thng thao tc tp (System call for FS)


(Xem li m t ca GHT phn u ti liu) Chng trc m t cu trc d liu bn trong cho h thng tp (FS) v cc thut ton thao tc cc cu trc . Chng ny bn n cc hm h thng c gi truy nhp tp. in hnh cho cc GHT thuc loi ny c: truy nhp tp tn ti trong FS: open(), read(), write(), lseek(), close(); to tp mi: creat(), mknod(); thao tc cc inode: chdir, chroot(), chown(), stat(), fstat(); GHT loi nng cao: pipe(), dup(); 40 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ m rng FS nhn thy c cho user: mount(), umount(); thay i cu trc cy FS: link(), ulink(); Chng s trnh by cc tng quan h thng khc nh: qun tr, bo tr FS, ng thi gii thiu ba cu trc d liu c bn ca kernel dng trong qun l tp: File table (bng cc tp) vi mi u vo trong bng cp cho mt tp m trong FS; User file descriptor (fd) table: bng m t cc tp m ca mi TT ca mi user, vi mi u vo trong bng fd, dnh cho mt tp; Mount table: bng ghp mt FS khc vo cu trc FS gc, m rng FS gc.

Hnh trn cho thy mi quan h gia cc GHT v cc thut ton ni trong chng trc. GHT c th phn ra lm nhiu hng cho d c mt s GHT cng xut hin nhiu hn l trong mt hng: GHT tr li fd dng trong GHT khc; GHT dng namei() d phn tch path name; GHT gn v gii phng inode dng ialloc() v ifree(); GHT t v i thuc tnh ca tp; GHT thc hin cc I/O cho mt TT hay t mt TT, dng alloc() v free() cc thut ton cp buffer; GHT thay i cc trc ca FS; GHT cho php mt TT thay i cch nhn cy FS.

1. open
GHT open() l bc u tin mt TT thc hin khi mun truy nhp tp. C php nh sau: fd = open(pathname, flags, modes) Cc i trong l: patname l ng dn tn tp; 41 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ flags modes Hm tr li: kiu m tp, v d m c, m ghi; l quyn truy nhp tp;

fd l gi tr nguyn, cn gi l m t tp ca user (user file descriptor).

Cc thao tc trn tp nh c, ghi, tm, sao chp, t cc thng s I/O, xc nh trng thi v ng tp u s dng fd tr li bi open(). Thut ton open() nh sau: open() /*open file*/ input: ng dn/tn tp, kiu thao tc tp (R/W),quyn truy nhp output: con tr m t tp (file descriptor)

Cc cu trc d liu h thng gm: File table, l cu trc tng th ca kernel, dng qun l cc thao tc trn mt tp m bi open(), Inode Table: ni cc thng tin ca inde trong b nh (in - core inode). File descriptor table l ca ring tng tin trnh. GHT namei() dng tm file (inode, in - core inode) vi cc thng s ca u vo, kernel kim tra quyn truy nhp tp sau khi xc nh in - core inode ca tp, cp mt u vo trong File Table cho tp, u vo ny cha con tr tr vo in - core inode ca tp. Kernel cn khi ng mt trng khc cha con tr tp (byte offset) c hay ghi tp vi gi tr ban u bng 0, iu c ngha bt u t u tp. S m qui chiu tp (reference count) t = 1 (mt TT truy nhp tp).Nu ch truy nhp l ghi-thm vo tp (write - append), offset t bng di tp c. Kernel cp mt u vo trong user file descriptor table trong u area ca TT, ghi nhn li ch s u vo v ch s l file descriptor fd tr li cho user. Ni dung ti ch s ny l con tr tr vo File Table.

42 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Gi s TT thc hin m sau y: m tp /etc/passwd hai ln, mt ch c (read - only) v ln kia ch ghi (write - only) v tp local mt ln cho c-ghi. fd1 = open (etc/passwd, OfiRDONLY); fd2 = open (local, OfiRDWR); fd3 = open (etc/passwd, OfiWRONLY); Hnh ch mi quan h gia cc bng ni trn. Mi mt open() tr li mt fd cho TT gi v u vo tng ng fd trong user file descriptor (ufd) tr ti u vo duy nht trong File table. Ngay c khi mt file gi nhiu ln th u c cc fd tng ng trong ufd vi mi ln gi v cc u vo tng ng vi mi fd trong file table. Cc u vo khc nhau tuy nhin u tr ti mt in - core inode trong bng. Refrence count ca in - core inode s cho bit c bao nhiu s m ng thi. V d fd1 v fd3 cng truy nhp tp /etc/passwd, s m ny = 2. TT c th c hay ghi tp nhng vic l phn bit theo cc fd khc nhau: fd1: m tp ch c, fd2: c/ghi tp, fd3: m tp ch ghi. Kernel ghi nhn kh nng c hay ghi tp ca TT trong mi u vo file table vo lc gi open(). Gi s c TT th hai thc hin m sau: fd1 = open (etc/passwd, OfiRDONLY); fd2 = open (private, OfiRDONLY); Ta c hnh di phn nh tnh hung ny, lc ny tp etc/passwd li m mt ln na bi TT th hai (B), s m qui chiu ca tp ny tng thm 1 v tng s c 3 ln cng lc m tp. Tm li c mi mt open s c cp mt u vo duy nht trong ufd v mt u vo duy nht trong file table, v vi mt tp d m bao nhiu ln th cng ch c nhiu nht mt u vo trong in - core inode table. C th hnh dung rng u vo ca bng user file descriptor (ufd) c th cha con tr tp nh v c/ ghi tip theo v con tr tr trc tip ti in - core inode ca tp v loi tr s cn thit ca file table. Nhng cc v d trn cho thy mi quan h mt - mt gia cc u vo ca ufd v file table, Thompsons cho bit rng s dng file table ring nh trn cho php 43 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ chia s con tr tp gia nhiu ufd: file offset c lp cho mi fd, trong khi file m chung cho nhiu TT. Cc hm dup() v fork() thao tc cc cu trc d liu cho php chia s con tr tp ny. Ba con tr tp u tin trong ufd fd0, fd1, fd2 l cc con tr chun, trong : - fd0 cho tp standard input (thng l thit b bn phm, terminal) c u vo; - fd1 cho tp standard output (thng l thit b mn hnh) ghi u ra; - fd2 cho tp standard error, u ra ghi thng bo li l cc thng ip. H thng khng ni g rng l cc m t kiu tp c bit, user c th chn fd 4, 5, 6 v 11 cho cc tp c bit, nhng tn trng qui c ca C tnh t 0 vn l t nhin hn v thch ng vi qui c ny s d dng giao tip vi pipe.

2. read
C php: number = read (fd, buffer, count) fd l m t tp tr li t open(), buffer l a ch ca cu trc d liu ca TT user, nI s cha data khi li GHT hon tt, 44 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ count l tng s byte user mun c t tp, number Read() input: output: l s byte thc s c.

fd (tr li t open()), a ch ca b m d liu, s byte cn c s byte c c

Kernel ly t fd con tr tr ti u vo tng ng trong file table. Kernel chun b cc thng s I/O: - mode: - offset: - flag: c hoc ghi a; con tr nh v tp I/O bit bt u t u; cho bit a ch l min user hay kernel; - count: m s byte c hoc ghi; - address: a ch ch copy data trong b nh ca kernel hoc ca user; Sau khi c cc thng s ni trn, kernel theo con tr trong file table truy nhp in core inode, kha inode li trc khi c tp. Nhn HH,c tp cho ti khi tha mn, bin cc gi tr ca byte offset thnh s ca block cn c nh thut ton bmap() ni. Sau khi c block vo buffer, kernel copy data vo a ch ca TT user, cp nht cc thng s I/O mi u area theo s byte c, tng byte offset v tng a ch ca TT user cho ln c tip theo, gim s m byte ph hp vi yu cu ca TT user...Nu cha tho mn c tp, chu trnh lp li cc bc. Chu trnh kt thc khi tho mn c tp, hoc khng cn data c hay nu c li trong qu trnh thc hin. V d mt chng trnh c tp: #include <fcntl.h> main () { int fd; char lilbuff[20], bigbu[1024]; fd = open(/etc/passwd, OfiRDONLY); read(fd, lilbuff,20); read(fd, bigbuf, 1024); read(fd, lilbuf, 20); } open() tr li m t tp gn cho bin fd v dng c lin tc sau . Trong read(), kernel kim tra cc thng s ca fd v rng TT trc m tp c. Cc gi tr lilbuf, 20, 0 nh li trong ufi area ca TT l a ch tng ng vi user buffer, s m byte phi c, byte offset bt u ca tp. Kernel tnh ra l byte offset 0 block 0 ca tp v tm thy s ca block th 0 trong inode. Kernel c block t a vi 1024 byte vo buffer h thng v copy ch 20 byte vo vng ca user lilbuf, gim s m (count) byte phI c = 0, vic c tha mn, tr li s byte c l 20. Kernel lp file offset trong file table ti gi tr 20 chun b cho ln c tip theo Khi TT gi read(), kernel kho inode trong sut thi gian thc hin read. TT c th s i ng i buffer c data hay mc ni cc indirect block ca inode, v nu trong khi c TT khc 45 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ c php thay i data ca tp, th read() s cho mt kt qu data khng nht qun. Chnh v vy m TT phi kho inode trnh s thay i ni dung ca tp do TT khc cng truy nhp lc TT ng, i kt qu c tp. Kernel c th chen ngang (preempt) mt TT ang c gia cc ln GHT trong user mode v cho mt TT khc chy. Bi v inode c gii kho vo on cui GHT, s khng c g ngn cn cc TT khc truy nhp v bin i ni dung tp. Cng s khng cng bng khi TT c kho inode t lc m cho ti lc ng tp, v nh vy s ngn cn cc TT khc truy nhp tp. loi tr vn ny kernel gii kho inode vo cui mi GHT dng tp. Nu mt TT khc thay i tp gia hai ln GHT read() ca TT u, th TT ny c th s c c data khng nh n ch i, nhng cu trc data ca kernel vn nht qun. Xem v d sau y, l m trnh m kernel thc hin 2 TT ng thi. #include <fcntl.h> /*process A*/ main() { int fd; char buf[512]; fd = open(/etc/passwd, OfiRDONLY); read(fd, buf, sizeof(buf)); read(fd, buf, sizeof(buf)); } /*process B*/ main() { int fd, I; char buf[512]; for (I = 0; I < sizeof(buf); I++) buf[I] = a; fd = open(/etc/passwd, OfiWRDONLY); write(fd, buf, sizeof(buf)); write(fd, buf, sizeof(buf)); } V d cc TT c v TT ghi tp c thc hin ng thi trn cng mt tp /etc/paswd. Hai TT u truy nhp cng mt tp ch khc nhau ch khai thc: A c, B ghi tp. Gi s c 2 TT u hon thnh GHT open() trc khi mt trong 2 TT bt u c hay ghi. Kernel c th thc hin bt k GHT read() v write() theo 6 trnh t: read1, read2, write1, write2 hoc read1, write1, read2, write2 hoc read1, write1, write2, read2 hoc v.v. Data TT A c ph thuc vo trnh t m h thng thc hin GHT ca hai TT; h thng khng m bo rng data 46 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni /*write1*/ /*write2*/ /*read1*/ /*read2*/

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ trong tp l nh c sau khi m tp. Nu dng c ch file v record locking (xem tip 5.4) th s cho php TT m bo c s nht qun ca tp trong khi TT m tp. Cui cng ta hy xem v d mt TT c th m mt tp nhiu ln v truy nhp qua cc m t tp khc nhau. Kernel thao tc cc tr tp offset kt hp vi mi fd trong file table mt cch c lp ({fd1, file offsetfi1}, {fd2, file offsetfi2}), do cc mng buf1 v buf2 l ng nht khi TT kt thc. Gi s khng c TT no thc hin ghi vo tp cng thi im . #include <fcntl.h> main() { int fd1, fd2; char buf1[512], buf2[512]; fd1 = open(/etc/passwd, OfiRDONLY); fd2 = open(/etc/passwd, OfiRDONLY); read(fd1, buf1, sizeof(buf1)); read(fd2, buf1, sizeof(buf2)); }

3. write
number = write(fd, buffer, count) Cc i c ngha nh trong open(). Thut ton write() thao tc tp bnh thng (regular file) l tng t nh thut ton c read(). Tuy nhin nu tp khng cha block tng ng vi byte offset ghi, kernel cp block mi bi alloc() v gn s ca block vo v tr chun xc trong bng a ch ca inode. Nu byte offset ng vi block gin tip, kernel s cp mt vi block dng theo c ch gin tip, gm cc block cho ch s v cc block data cho tp. Inode s b kho trong sut thi gian thc hin write() bi v kernel c th thay i inode khi cp nhng block mi (cp nht bng a ch block ca inode). Vic cho php cc TT khc truy nhp tp c th lm hng inode nu mt vi TT xin cp block ng thi cho cng mt byte offset. Khi ghi tp hon thnh, kernel cp nht trng di tp vi gi tr thc t. V d, mt TT thc hin ghi tip byte s 10.240 vo tp. Khi truy nhp byte ny trong bmap(), kernel xc nh thy: - tp cha c block cha byte ni trn; - 10 u vo u tin cho di 10x1024=10240 byte vi offset bt u t 0, nn byte 10240 phi cn tip mt cp pht gian tip, indirect. Kernel cp mt block lm indirect block, v ghi s ca block ny vfo inode. Sau cp block cho data ca tp v ghi s ca block ny vo v tr u tin ca indirect block. Kernel thc hin vng lp bn trong, ging nh read(), mi vng lp ghi mt block a v nguyn tc, song kernel s xc nh ghi ton b block hay ghi mt phn ca block. Nu ch ghi mt phn th kernel c block a, bo ton phn c trc v ghi tip vo phn cn li ca block. Nu ghi ton b block, kernel khng cn phi c block v s ghi ln ni dung c ca block. Kernel s dng c ch tr hon ghi (delayed write s cp 5.12) ghi tp nhm gim bt cc thao tc I/O a. 47 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

4. Kha tp v bn ghi
Unix nguyn bn do Thompson v Ritchie pht trin khng c c ch tp loi tr khi truy nhp. gii quyt cc nhu cu vi cc ng dng thng mi c lin quan ti c s d liu (database) System V ngy nay c c ch kho tp (file locking) v cc bn ghi (record locking). File locking l kh nng ngn cn mt TT khc c, ghi bt c phn no ca ton b tp. Record locking l kh nng ngn cn mt TT khc c, ghi cc bn ghi ring phn (cc phn ca tp nm gia cc byte offset) Bi tp 5.9 s cho v d cch trin khai c ch ny.

5. iu chnh v tr ca I/O tp
Cc GHT read() v write() cho cch truy nhp tp theo tun t. TT c kh nng nh v I/O v truy nhp tp theo kiu ngu nhin, h thng cung cp GHT lseek() vi syntax nh sau: position = lseek(fd, offset, reference, position); fd: m t tp; offset: byte offset reference: cho bit offset c tnh so vi u tp, hay v tr c/ ghi hin ti hay cui tp: = 0 tm t u tp, = 1 chiu tin ti cui tp t v tr hin ti, = 2 tnh t cui tp. position: v tr s c/ ghi tip theo bt u t byte offset ny. #include <fcntl.h> main (argc,argv) int argc; char *argv[]; { int fd, skval; char c; if (argc != 2) exit(); fd = open(argv[1], OfiPDONLY); if(fd == -1) exit(); while((skval = read(fd, &c,1)) == 1) { prinf(char %c\n,c); skval = lseek(fd, 1023L,1); prinf(new seek val %d\n, skval); } } V d dng lseek(). TT m v c 1 byte ca tp, sau gi lseek() tin ti byte 1023 ca tp vi reference = 48 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ 1, so vi byte hin ti. Nh vy c mi vng lp, TT s c byte th 1024 ca tp. Nu reference = 0, TT s tnh offset so vi u tp, nu reference = 2 th tnh offset t cui tp. Ch l lseek() thc hin iu chnh con tr tp (gi tr ny trong file table) trong tp ch hon ton khng iu khin gi c cu nh v u t ca a.

6. Close
Mt TT thc hin ng mt thao tc m tp khi TT khng cn cn truy cp tp na. C php nh sau: close(fd); fd: m t tp khi thc hin open(). Kernel thc hin close() thao tc cc d liu trong user file descriptor fd, cc d liu tng ng ca file table v in - core inode. - Nu s m qui chiu count trong file table ln hn 1 (do c pht sinh GHT dup(), hay fork() hay c cc fds cng qui chiu v tp) th kernel s gim gi tr i 1. - Nu gi tr = 1, kernel s gii phng u vo ny (count 1 = 0), kernel gim s m qui chiu ca inode i 1, ng thi gii phng lun in - core inode cp khi thc hin open() nu s m qui chiu ca n = 0 v hon tt close(). Nh vy khi kt thc close() u vo trong ufd s c dng cp cho ln open() mi. Khi TT thc hin mt GHT exit() kernel cc fds ang hot ng v cng thc hin close() tt c cc tp li v rng mt TT khng th duy tr m tp khi TT kt thc.

Hnh l kt qu khi TT B trong v d trc, thc hin ng cc tp n m trc . Lc 49 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ ny cc u vo s 3, 4 ca bng ufd ca TT th 2 c gii phng (in l NULL). Cc trng s m ca file table s c gi tr l 0, s m ca inode /etc/passwd gim i 1, cn 2, ca tp private = 0. Do kernel cha loi inode khi free list nn nu c TT no truy nhp tp trong khi inode vn cn , kernel s khi phc li tp (xem li phn 4.1.2).

7. To tp
to tp dng GHT creat() vi c php nh sau: fd = creat(pathname, modes); Cc i c ngha ging nh trong open(). Nu tp mi cha c trn FS, kernel to mi tp vi tn xc nh trong pathname v vi cc quyn truy nhp xc nh modes. Nu tp tn ti kernel s gii phng tt c cc block trc thuc tp v t li di tp = 0 (truncate) tu thuc vo quyn truy nhp tp. Kernel phn tch tn th mc v tn tp bng namei() v khi n thnh phn cui ca ng dn, l tn tp s to, namei() ghi nhn li v tr (byte offset) ca u vo trng u tin tm thy ca th mc v ct offset vo u area. Nu tn tp mi cha c trong th mc, kernel ghi tn mi vo ch trng . Nu th mc khng cn c ch trng, kernel ghi nh li offset ca v tr cui cng v to ra mt u vo mi ca th mc. Kernel ng thi ghi nh li inode ca th mc ang tm ny trong u area ca n ng thi kha inode li. Th mc ny s l th mc b ca tp mi ang to. Vi quyn c ghi trn th mc, cui cng TT s ghi th mc nh l phn kt qu ca creat(). Gi nh tp l mi trong FS, kernel cp mt inode (ialloc()), sau ghi tn tp v inode v th mc gc ca tp ti v tr offset lu trc trong u area. Tip theo kernel gii phng inode ca tp th mc b trc truy nhp tm tn tp. Th mc b lc ny c tn v inode ca tp mi, kernel ghi inode ln a (bwrite()) trc khi ghi th mc ln a. Nu tn tp tn ti trc khi creat(), kernel tm thy inode ngay trong qu trnh tm tn tp. Tp c phi c quyn ghi TT to tp mi cng bng tn , v kernel s thay i ni dung ca tp bng cc cng on: ct b tp, gii phng cc block data cp cho tp (free()), tp c xem nh l mt tp mi to vi quyn truy nhp ging nh tp c trc : kernel khng ti gn ngi s hu, b qua cc ch truy nhp m TT xc nh. Cui cng kernel cng khng kim tra quyn ghi th mc v kernel khng thay i g trn th mc. Creat() tin trin tng t nh thut ton open(). Kernel cp u vo trong file table cho tp ang to sao cho TT c th ghi tp, c cp u vo trong bng ufd v tr li ch s ca bng l fd m t tp.

8. To cc tp c bit
GHT mknod() s cho php to cc tp c bit bao gm pipe, tp cc loi thit b, tp th mc. C php nh sau: mknod (pathname, type and permissions, dev) type and permissions: kiu tp tao ra l th mc, pipe hay thit b v quyn truy nhp; dev: xc nh s thit b (major v miror) cho tp kiu block v character. mknod() to mt nt mi 50 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ inputs: node (file name),file type,permissions,major, minor device number (for block, character special files); output: khng. Kernel tm trn FS tn tp s to, nu cha c, kernel cp cho tp mi mt inode trn a v ghi tn ca tp mi, s ca inode vo th mc gc. Kernel t trng kiu tp (type) trong inode ln gi tr cho bit tp l pipe hay th mc (directory) hay tp kiu c bit (special). Nu tp l kiu thit b block hay character kernel ghi thm s thit b major/ miror vo inode. Nu mknod() l to th mc, th node s xut hin ngay sau khi hon tt li gi ny nhng ni dung ca node th khng ng khun (format) chun (khng c u vo no trong th mc cho . v ... Bi tp 5.33 s xt cc bc cn thit t mt th mc v khun dng chun.

9. Chuyn i th mc v root
Khi khi ng h thng (booting), TT s 0 s ly root h thng lm th mc hin hnh trong qu trnh ny. TT 0 thc hin iget() trn root inode, bo v inode ny trong ufiarea nh l th mc hin hnh (current directory) v gii ta vic kho inode. Khi fork() to ra mt TT mi, TT ny s tha k th mc ca TT c (l TT b) lu trong u area, v kernel tng s m qui chiu trong inode gc. chdir(pathname) chdir() chuyn th mc Input: th mc cn chuyn n Output: none Vi tn cung cp kernel dng namei() xc nh inode v kim tra inode ch c ng l th mc v TT c quyn truy nhp th mc hay khng. Sau l qu trnh nh v th mc cn tm v vic lu inode tng ng ca tp th mc trong ufi area ca TT. Sau khi TT thay i th mc hin hnh ca n, thut ton namei() s dng inode khi ng th mc tm tt c cc pathname khng bt u t root. Sau khi thc hin chdir(), s m qui chiu ca inode ca th mc mi t nht = 1, cn ca th mc c c th = 0. Inode cp trong qu trnh chdir() c gii phng thc s ch khi TT thc hin mt chdir() khc hay thc hin exit. Mt TT thng dng root bt u cho tt c cc pathname, bt u bnh /. Kernel c mt bin tng th tr ti inode ca root h thng. Inode ny do iget() cp lc booting h. Mt TT c th thay i v tr root bng GHT chroot(). Cch ny rt c ch khi user mun m phng cu trc thng thng ca FS v chy cc TT y. C php nh sau: chroot(pathname); pathname l th mc m kernel sau x l nh th mc root ca TT. Thut ton thc hin ging chdir(), sau kt qu ny root m phng c ngha nh root cho tt c cc TT con ca TT b pht sinh chroot().

10. Thay i s hu v ch truy nhp tp


Thay i ngi s hu v ch truy nhp ca mt tp l thao tc tc ng trn inode ca tp ch khng phi trn bn thn tp. C php nh sau: 51 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ chown(pathname, owner, group); chmod(pathname, mode); Sau khi thay i quan h s hu, ngi ch c s mt quyn s hu tp. Thay i mode s thay i cch thc truy nhp tp, cc c (flags) trong inode thay i.

11. Kho st trng thi tp


Cc hm stat() v fstat() dng ly cc thng tin v tp nh: kiu tp, ngi s hu, quyn truy nhp, kch thc tp, tng s cc lin kt, s ca inode, thi im truy nhp tp. C php: stat(pathname, statbuffer); fstat(fd, statbuffer); Trong : statbuffer l a ch cuu trc data ni s cha cc thng tin trng thi ly t inode. fd l m t tp do open() thc hin bc trc.

12. Pipes
Pipe cho kh nng truyn data gia cc TT trong c ch vo trc ra trc (FIFO), v ng thi cho php ng b vic thc hin cc TT. S dng pipe cc TT c kh nng lin lc vi nhau m khng cn bit TT no u kia ca pipe. Cch ng dng truyn thng l s dng FS cha data. C hai loi pipe: named pipe (pipe c tn) v unmamed pipe (khng tn). Loi ny khc vi named pipe ch cch TT khi ng truy nhp pipe. TT s dng open() dng vi named pipe, cn dng GHT pipe() to mt unnamed pipe. Tip theo TT dng cc GHT thng thng (read(), write(), close()); thao tc pipes. Ch cc TT c quan h huyt thng (cc TT con, chu) vi TT to ra pipe mi c kh nng chia s truy nhp unamed pipe. V d

TT B to ra mt pipe khng tnfiunnamed pipe bng GHT v sau sinh ra hai TT con khc 52 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ l D v E, vy th ba TT ny s chia s cng truy nhp pipe ny. Trong khi TT A v C khng th truy nhp c. Tuy nhin tt c cc TT c th truy nhp named pipe b qua mi quan h gia chng v ch thng qua quyn truy nhp tp. 12.1. To mt pipe pipe(fdptr); Trong fdptr l mt con tr tr vo mt mng nguyn cha hai m t tp c v ghi trong pipe. Nh cp, pipe l mt loi tp c bit v cha tn ti trc khi s dng, nn kernel phi cp cho pipe mt inode to ra pipe. Kernel ng thi cp mt i m t tp cng nh cc u vo trong file table: mt fd c data t pipe v mt fd ghi data v pipe. Vi cch t chc trong file table, kernel m bo sao cho giao tip c v ghi v cc GHT khc trn pipe l nht qun nh i vi cc tp thng. V vy TT khng th nhn bit c l TT ang lm vic vi tp hay vi pipe. pipe() input: /*create unnamed pipe*/ none write file descriptor Cch to tp cng ging nh nhau, tuy nhin do pipe thuc loi tp c bit nn c t nhiu khc bit: inode cp t FS dnh cho thit b (pipe device). Pipe device l loi m kernel c th cp inode v block cho pipe, ngi qun tr xc nh thit b kiu pipe trong qu trnh lm cu hnh h thng v tp pipe cng ging nh cc tp khc. Trong khi pipe ang kch hot, kernel khng th ti gn inode v block ca pipe cho tp khc c. S khc bit cn th hin cc s m tc ng ln pipe: - S m qui chiu truy nhp tp (pipe) trong in - core inode khi ng = 2, v c hai con tr tp truy nhp: c v ghi trn pipe; - Cng mt lc cp hai u vo trong file table: cho c pipe v cho ghi pipe; s m cch truy nhp c khi ng trong mi u vo khc nhau: cho c v cho ghi; - Trong ufd cp hai fd, mt c pipe, mt ghi pipe; Duy tr hai byte offset l rt quan trng thc hin c ch FIFO ca pipe. TT khng th iu chnh byte offset qua lseek() thc hin truy nhp ngu nhin I/O trong pipe. C php tp mt pipe v danh (unnamed pipe) nh sau:

output: read file descriptor

53 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

12.2.

M mt pipe c tn (named pipe)

Pipe c tn-named pipe ngha cng ging nh unnamed pipe, ngoi tr rng pipe c tn c lit k trong th mc cc tp v truy nhp ti pipe loi ny bng tn (pathname). Cc TT m named pipe ging nh m cc tp thng v cc TT khng c quan h gn vi pipe c th lin lc vi pipe. Named pipe lun tn ti trong kin trc ca FS, trong khi unnamed pipe ch l nht thi: khi tt c cc TT kt thc s dng unnamed pipe, kernel thu hi inode ca pipe li. Cc TT m named pipe nh m cc tp thng, tuy nhin trc khi hon tt li gi, kernel tng cc s m read/ write ca inode cho thy s lung cc TT m pipe. Mt TT m named pipe s i ng cho ti khi mt TT khc m named pipe ghi v ngc li. (S v ngha nu TT mun c nhng li khng c g nhn). Tu thuc vo TT m named pipe c hay ghi, kernel s nh thc cc TT khc ng v ang i ghi hay c trn pipe. Nu TT open mt named pipe c v mt TT ghi tn ti, th vic m pipe hon tt. Hoc nu TT m mt named pipe m c tu chn no delay th GHT open() s kt thc lp tc ngay c khi khng c TT no ang ghi. Ngc li TT s ng cho ti khi c mt TT m pipe ghi. Lut ny p dng tng t cho mt TT m pipe ghi. 12.3. c v ghi v pipe Lm vic trn pipe c th xem nh l khi cc TT ghi vo mt u cui ca pipe v c ra u cui kia. Nh ni TT truy nhp data pipe theo c ch FIFO. S lng cc TT c pipe khng nht thit bng s lng cc TT ghi vo pipe. Khi s TT c v ghi pipe ln hn 1 th cc TT phi phi hp s dng pipe vi mt c ch khc. Kernel truy nhp data cho pipe nh cho tp thng, kernel ct data trn thit b pipe v gn cc block cho pipe nh write() thc hin. S khc nhau trong vic cp block cho pipe v tp thng l ch pipe ch dng cc block kiu trc tip tng hiu qu, cho d c gii hn v khi lng data m pipe c th cha mi ln. Kernel s dng cc block nh mt hng quay vng, bo tr cc con tr c v ghi bn trong bo ton c ch FIFO: vo trc ra trc.

54 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Xem xt bn trng hp c/ ghi pipe: 1 - writing pipe: 3 - reading data: 4 - writing data: c ch ghi data vo pipe, data tha mn cho c, khng tha mn data c, khng ch trong pipe ghi data vo. 2 - reading data t pipe:

Case 1:TT ang ghi vo pipe vi gi nh l pipe c ch ghi data: tng s cc byte ang ghi v cc byte c trn pipe nh hn dung lng ca pipe. Kernel thc hin theo thut ton ghi tp thng ngoi tr kernel t ng tng kch thc pipe sau mi ln ghi, bi v theo nh ngha s data trong pipe tng vi mi ln ghi. Nu con tr ca byte tip theo (byte offset) trong pipe c nhu cu dng block gin tip, kernel s iu chnh gi tr ca offset ca tp trong u area tr ti offset bt u ca pipe (byte offset 0) v data khng bao gi trn dung lng ca pipe, v kernel khng bao gi ghi data trong pipe. Sau khi ghi xong data vo pipe, kernel cp nht inode ca pipe sao cho TT sau ghi pipe s tip tc v tr cui cng dng trc . Tip theo kernel nh thc tt c cc TT ng i c pipe. Case 2:Khi TT c pipe, TT s kim tra pipe c hay khng c data. Nu pipe c data, kernel c data nh c t mt tp thng theo thut ton read(). Tuy nhin offset khi ng l con tr c ca pipe lu inode, v n cho bit s m rng ca ln c trc . Sau khi c mi block kernel gim kch thc ca pipe theo s byte c v kernel iu chnh gi tr ca file offset trong u area hon i vo v tr u ca pipe. Khi kt thc c pipe, kernel cp nht con tr c (read offset) trong inode v nh thc cc TT ng i ghi pipe. Case 3: c s byte nhiu hn l s byte c trong pipe, kernel tr li kt qu c l cc byte c cho d khng tha mn nhu cu c theo s m ca user. Nu pipe rng, TT s i ng cho ti khi c TT khc ghi data vo pipe, sau cc TT thc dy v cc TT s tranh nhau c pipe. Tuy nhin nu TT m pipe khng c ty chn no delay th TT s kt thc ngay nu pipe khng c data. ngha c/ ghi pipe ging nh c/ ghi thit b u cui, cho php cc chng trnh b qua kiu tp ang x l. Case 4: TT ghi pipe trong khi pipe khng th cha ht data s ghi vo, kernel nh du inode v a TT i ng i data thot bt khi pipe. Sau khi c TT khc c pipe kernel s thng bo cho bit TT ghi ang ng i pipe c ch cho vic ghi data. Qu trnh s tip tc nh ni. Trng hp lu l data ghi ln hn dung lng cha ca pipe (tc dung lng ca block trc tip cp cho pipe), kernel s ghi s data ti a c th vo pipe v TT i ng cho ti khi c ch ghi tip. Nu vy s c th xy ra l data s khng lin tc khi mt TT khc ghi data ca n vo pipe trc khi TT kia li tip tc ghi data ca mnh. Qua phn tch cc ng dng pipe ta thy kernel coi pipe nh l tp thng, nhng thay v qun l con tr tp (byte offset) file table i vi tp thng, th byte offset ca pipe c 55 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ qun l inode. Kernel nh offset c / ghi ca named pipe trong inode sao cho cc TT c kh nng chia s cc gi tr ca chng: inode m cho nhiu TT, trong khi mi ln m tp c mt u vo tng ng trong file table. i vi unnamed pipe cc TT truy nhp qua cc u vo trong file table nh thng l, nh i vi tp thng. 12.4. ng Pipes Khi ng pipe cc TT thc hin cc qui trnh nh i vi tp thng tr mt vi thao tc c bit kernel thc hin trc khi gii phng inode ca pipe. Kernel gim s cc TT c/ ghi pipe theo kiu ca m t tp. Nu s m cc TT ghi bng 0 v c cc TT ng i c pipe, kernel nh thc v cc TT ny thot khi li gi chng m khng cn c pipe. Nu s m cc TT c pipe bng 0 v c cc TT ng i ghi pipe, kernel nh thc v gi tn hiu signal thng bo c error cho cc TT ny. Nu khng cn c TT c hay TT ghi pipe, kernel s giI phng cc block data ca pipe v iu chnh li inode cho bit pipe khng c data. V d V d o dng pipe: char string[] = hello; main() { char buf[1024]; char *cp1, cp2; int fds[2]; cp1 = string; cp2 = buf; while(*cp1) *cp2++ = *cp1++; pipe(fds); for(;;) { write(fds[1], buf, 6); read(fds[0], buf,6); } } c v ghi mt unnamed pipe. TT to mt unnamed pipe bng GHT pipe(), sau TT i vo mt vng v hn ghi xu hello vo pipe v c xu t pipe. Trong v d TT c v TT ghi l mt. #include <fcntl.h> char string[ ] = hello; main(argc, argv) int argc; 56 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ char argv[]; { in fd; char buf[256]; /*create named pipe with R/W permission for all users*/ mknod(fifo,010777, 0); if (argc == 2) fd = open(fifo, OfiWRONLY); else fd = open(fifo, OfiRDONLY); for (;;) if (argc == 2) write(fd, string, 6); else read(fd, buf, 6); } c ghi mt named pipe Mt TT to ra mt named pipe c tn ffo v khi ng ghi (TT ghi) xu hello vo pipe nu c 2 i u vo; nu ch c mt i u vo th kch hot c (TT c) pipe. Hai TT ghi/ c lin lc b mt qua pipe ffo, tuy nhin 2 TT khng nht thit c lin quan vi nhau.

13. Sao chp mt m t tp (dup)


GHT dup() sao chp mt m t tp fd vo mt u vo trng ca ufd, tr li fd mi. du() p dng cho tt c cc kiu tp. newfd = dup(fd); Trong : fd l m t tp gc s c sao chp, newfd l m t tp mi cng qui chiu ti tp. Bi v dup() sao chp fd nn n tng s m ca u vo tng ng ca tp trong file table, tc l c thm mt fd tr vo u vo ny. V d trong hnh TT m tp /etc/passwd, kt qu s c fd3. Sau TT m tp local v fd tng ng l fd4. Khi TT m /etc/passwd mt ln na, s c fd5 trong ufd. Vi 2 ln m /etc/passwd, trong file table c 2 u vo c lp tng ng, v s m qui chiu trong inode ca tp /etc/passwd l 2 (2 ln tp c m). Nu TT thc hin dup(fd3), ta s c mt bn sao m t tp fd6 cng tr vo ni fd3 tr trong file table, ti y s m cc fd tr vo l 2 (bao gm fd3 v fd6). Mc ch quan trng ca dup() l xy dng cc chng trnh tinh xo t cc chng trnh n gin hay cc khi chng trnh chun. Mt trong cc ng dng in hnh l cu to cc knh lin lc ca shell. 57 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Xt v d di y: #include <fcntl.h> mail() { int i, j; char buf1[512], buf2[512]; j = open(/etc/passwd, OfiRDONLY); j = dup(i); read(i, buf1, sizeof(buf1); read(j, buf2, sizeof(buf2); close(i); read(j, buf2, sizeof(buf2); } Minh ha dup(). Bin i l m t tp ca /etc/passwd, j l m t tp c to ra bi dup() ca cng tp TT m. j lbn sao chp ca i. Trong ufd ca u area s c 2 fd l i v j cng tr vo mt u vo trong file table v do c hai dng chung mt con tr tp - byte offset. Ch l hai read() lin tip nhau sau cho data trong buf1 v buf2 khng nh nhau. iu ny khc vi trng hp khi TT open() hai ln trn cng mt tp (xem li 5.2). Mt TT c th close() mt fd m TT mun, nhng I/O vn tip tc bnh thng i vi fd kia, iu th hin trong v d. Mt ng dng khc m dup() lm l i vai tr truyn thng ca mt fd: sau khi dup(fd1) standard output, TT c th close(fd1) v fd mi s lm vic nh fd1. Chng 7 s cho thy 58 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ tnh thc t ca vic dng pipe() v dup() khi m t v shell.

14. Ghp v tho g mt FS (mount/unmount)


Mt n v a thng c chia ra thnh cc phn hoch v mi phn hoch s c tn ca thit b i km. Trn FS iu c th hin di dng mt tp thit b ti th mc /dev/. TT c th truy nhp data trn phn hoch bng open() tp thit b v sau c/ ghi tp ny, x l tun t cc block a. Chng 10 s m t k giao tip ny. 14.1. Ghp (mount) FS Mt phn hoch a l mt h thng tp, v c boot block, super block, inode list, data blocks nh bt k mt FS no. GHT mount() s ghp ni FS ca phn hoch trn a vo cu trc FS tn ti, sau users truy nhp data trn phn hoch nh thng thng, unmout() s ct FS ra. C php: mount(special pathname, directory pathname, options); Trong : - special pathname: l tn ca tp thit b ca phn hoch c FS s ghp vo; - directory pathname: (mount point), - options: V d: mount(/dev/dsk1, /usr, 0); Kernel s ghp FS ca phn hoch /dev/dsk1 vo th mc /usr ca FS c. Tp /dev/dsk1 l mt tp c bit kiu block, c ngha l tn ca thit b khi, thng l mt phn hoch a. Phn hoch c cu trc y ca mt FS nh ni. Sau khi ghp vo, root ca FS ghp s c truy nhp qua th mc /usr. Cy th mc trc v sau mount. Kernel c mt mount table vi cc u vo cho mi mt FS khi FS ghp vo FS tn ti. Mi u vo c cc trng thng tin sau y: S ca thit b nhn bit FS c ghp (l s logic ca FS); Con tr tr vo buffer c cha super block ca FS; Con tr tr vo root inode ca FS c ghp (/ l root ca /dev/dsk1 trong hnh); Con tr tr vo inode ca th mc l im ghp (usr l th mc im ghp cho FS /dev/dsk1 vo FS tn ti). S kt hp gia inode ca im ghp v root inode ca FS c ghp trong th tc mount gip cho kernel hot ng trn FS uyn chuyn v ngi dng khng cn c s hiu bit g c bit. l tn th mc trn FS tn ti (root), cn gi l im ghp

cho bit kiu truy nhp: R/W, read-only.

59 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

mount() input:

file name of block special file directory name of mount point options (read only)

output: none Kernal cho php ch cc TT do super user s hu mi thc hin mount v unmount FS, trnh s hy hoi FS ghp. Kernel tm inode ca tp thit b c FS s c ghp, ly ra s major v minor xc nh chnh xc phn phn hoch no ca a cha FS . Kernel sau tm inode ca th mc ni s ghp FS mi v FS tn ti. S m qui chiu ca inode th mc khng c ln hn 1, nhng t nht l 1 trnh cc s c khng mong mun c th xy ra (xem bi tp 5.27). Kernel tm mt u vo trng trong mount table v nh du a vo s dng, gn s ca thit b vo trng ny. Qu trnh ny c thc hin ngay lp tc trnh c hin tng mt TT khc mount FS ln na. S c s bt thng xy ra nu cng mt FS li c php mount ln th hai (xem bi tp 5.26). Kernel thc hin th tc open nh i vi cc thit b block khc: kim tra s hp l ca thit b, khi ng cc d liu ca b iu khin (driver), gi cc lnh khi ng thit b cho phn cng. Cc thao tc tip theo cn c l cp buffer n c v lu li super block ca FS c ghp, lu con tr ca th mc im ghp FS ca cy th mc gc sao cho cc ng dn c cha .. c th i ngang qua im ghp; kernel tm inode root ca FS c ghp v lu con tr tr vo inode ny vo trng tng ng ca mount table. FS mi lc ny c nhn nhn nh mt th mc ca FS gc: i vi user th mc ghp ny (ca FS gc) v root ca FS c ghp l tng ng v logic v s tng ng c kernel xc lp bi s cng tn ti trong mount table. Kernel khi ng cc trng gi tr thuc tnh ca super block, m kha (lock) cho free block list, free inode list, t s cc free inode trong super block v 0. Mc ch ca qu trnh khi ng ny l ti thiu nguy c hng FS trong khi ghp FS sau ln h thng b s c: Khi t s free inode = 0 s buc kernel thc hin ialloc() tm cc free inode a cp nht mt cch chnh xc sau khi mount FS ln. Xem hnh di y thy cc cu trc d liu khc c xy dng vo thi im cui ca qu trnh mount.

60 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Do c s thay i cu trc ca FS vi s ghp FS, nn mt s GHT c s thay i ph hp vi cu trc . Vic vit li cc GHT ny l tng qut cc trng hp khi c s i qua im ghp: t FS gc n FS ghp (i t root n nhnh ghp vo) v ngc li. V d v s dng mount v unmount: 1. Gi s trn my tnh c mt hay vi a cng vi cc phn hach khc nhau, mi phn hach l mt FS; 2. Cc phn hach c th l FAT (16, 32), NTFS, ext2, ext3; Sau y l cc bc cn lm: login vo vi t cch root hay su: a. $ su [ENTER] b Dng lnh sau bit cc phn hach c trn cc a cng: # sfdisk l Hy quan st kt qu cua lnh, chn phn hach s mount vo FS: v d /dev/hda4 0 764 765 6144831 Win95 FAT32 phn hach /dev/hda4 l lai FAT32 ca MS Windows b. to mt th mc rng (ch ghp FS v cy th mc chnh): # mkdir /mnt/hda4 (C th ly tn bt k sao cho c ngha, d hiu). c. Ghp vo FS gc: # mount t vfat /dev/hda4 /mnt/hda4 By gi c th truy nhp (R/W) nh bnh thng. Sau khi s dng unount trc khi tt my tnh. d. umount (phi ra khi th mc /mnt/hda4 trc khi umount ! Xem 14.2) # umount /dev/hda4 14.2. Ct (unmount) FS 61 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ umount (special filename); Trong : special filename cho tn ca FS s ct khi FS gc. Khi ct mt FS, kernel truy nhp inode ca thit b s ct, tm s thit b ca tp c bit, gii phng inode (iput()), tm u vo trong mount table cc con tr cn thit lin kt vi tp thit b. Trc khi thc s ct ghp FS kernel kim tra chc chn khng c tp no ca FS ghp vn cn ang s dng bng cch tm trong inode table tt c cc tp c s thit b bng s ca tp c bit s ct ra khi FS gc. Buffer n c th cn c cc block ch ghi delayed write, kernel cp nht ln a, cp nht super block c s thay i, cp nht cc bn in - core inode ln a... umount() input: special file name of FS to be unmounted

output: none

15. Lin kt tp (link)


GHT link() s to mt tn mi cho mt tp c trn cu trc th mc h thng, thc t to ra mt u vo mi cho mt inode tn ti. C php nh sau: link(tn tp gc, tn tp ch) Trong : tn tp gc l tn ca tp tn ti, tn tp ch l tn tp s c sau khi hon tt GHT link() . FS cha ng dn cho mi lin kt m tp c sao cho cc TT c th truy nhp tp bng bt k ng dn no. Kernel hon ton khng bit tn no ca tp l tn gc, cho nn khng cn c x l g c bit trn tn tp. V d: link(/usr/src/uts/sys,/usr/include/sys); /*link th mc*/ link(usr/include/realfile.h,/usr/src/uts/sys/testfile); Sau khi thc hin hai lnh trn s c 3 ng dn cng qui chiu ti mt tp: /usr/src/uts/sys/testfile.h /usr/include/sys/testfile.h /usr/include/realfile

62 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

V d ti console, thc hin lin kt logic: $ ln s /abc/xyz /mnt/yyy trong /abc/xyz l th mc gc ti /abc/xyz, /mnt/yyy s l ch. Kt qu sau nu dng lnh ls l s c dng sau: $ ls -l l rwx rwx rwx 1 root root xxx -> /abc/xyz Kernel ch cho php superuser thc hin lin kt th mc, v ngay c superuser cng phi thn trng khi lin kt th mc nu khng c th dn n mt vng lp v tn. V d khi lin kt mt th mc vo mt tn bn di n trong cu trc c th bc. Vi cc phin bn mi, vic a vo lnh mkdir() s h tr cho vic to th mc mi c p dng kh nng ca link() v loi tr s cn thit phi lin kt th mc. Thut ton link() Input: tn tp gc ( c) tn tp ch (mi) Output: none Cc bc trong thut ton ny nh sau: - Kernel nh v inode ca tp ngun (namei()), tng s m lin kt ti tp, cp nht mi ni dung ca inode a m bo s thng nht ca cu trc FS v gii kha inode . - Kernel i tm tp ch: nu tp ch ni s to tn ti (trng tn), bo li, gim s lin kt ( lm bc trc). Nu l tp mi, kernel to ch cho inode ca tp ch, ghi vo tn tp mi, s inode ca tp gc, ghi nhn inode ca tp mi trong th mc ch (iput(): gii kha inode ca tp th mc gc ca tp ch), ghi nhn mi tp gc vi s m lin kt tng thm 1 v tp c thm mt tn mi v c th truy nhp inode gc bng tn mi ny. S m link gi s m ca cc u vo ca tp th mc qui chiu v tp v khc vi s m trong inode. Nu khng c TT no truy nhp tp cui qu trnh link, th s m qui chiu ca inode ca tp = 0, v s m lin kt ca tp t nht l 2. V d: link(source,dir/target) 63 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Gi nh s inode ca source l 74. Kernel tm source, tng s lin kt thm 1, nh li s 74, hy kho source. Kernel tm inode ca tp th mc dir (l th mc gc ca tp target), tm trong tp ny mt u vo trng cho tp mi target, ghi tn target v s inode 74 vo ch ny. Sau gii tr kha cho tp source qua iput(). S m lin kt tng thm 1 (nu l 1 th lc ny = 2). Nh vy ta thy FS khng mt thm mt inode cho tp m ch thm mt tn tp mi trong th mc ch m thi. Trong thut ton ny c mt im rt quan trng cn lu l vic gii tr lock ca tp gc sau khi tng s lin kt cc TT c th truy nhp tp ny m khng gy ra tnh trng b kha ln nhau (deadlocking). V d: TT A: link(a/b/c/d,e/f) TT B: link(e/f,a/b/c/d/ee) iu g s xy ra khi cng mt thi im (l trng thi mi TT c cp inode ca tp n cn truy nhp x l): TT A c e/f tm th mc ny nhng TT B li ang khai thc f m khng gii tr trong GHT link(). Tng t khi TT B tm inode ca th mc /a/b/c/d m TTA li khng gii tr lock th mc d. C hai TT u b kt bi khng gii tr lock sau khi thc hin cc bc u trong thut ton. Kernel loi tr kiu kt c in ny bng cch gii tr kho inode ca tp ngun sau khi tng s m lin kt ca tp. V rng inode ngun u tin l t do (free) khi truy nhp ngun tip theo,vy s khng c deadlock na.

16. Hy lin kt tp (unlink())


GHT unlink() s xo b u vo ca tp trong th mc, tp sau khng tn ti th mc na, mi truy nhp s c thng bo li. Nu thc hin unlink() i vi link cui cng (tng ng vi delete tp), kernel s gii phng cc blocks cp cho tp. Nu cn c cc links khc (vi cc tn khc nhau) tp vn c truy nhp bnh thng. C php: Input: unlink(pathname) file name Tht ton unlink() Output: none

17. S tru tng ho FS


Tc gi Weinberger gii thiu cc kiu tp (file system types) h tr h thng tp mng (network FS) v cc phin bn mi nht ca System V cng h tr tng ny. Vi file system types kernel c th h tr a h thng tp ng thi (network FS, FS cho cc h iu hnh khc nhau). Trong khi cc tin trnh s dng cc GHT thng dng ca Unix truy nhp tp th kernel nh x tp cc thao tc chung trn tp vo cc thao tc xc nh cho mi kiu FS. Inode tr thnh ch ghp ni gia FS tru tng (generic inode) v FS c th. Mt incorefiinode tru tng s cha cc d liu (s thit b, inode number, file type, size, owner, reference count) c lp vi kiu FS c th v tr vo mt inode ca FS xc nh. Inode ca FS xc nh ny s cho cc ch dn c th p dng trn FS (quyn truy nhp, m hnh cc block data, super block cu trc th mc). Mt FS khng nht thit phi c cu trc ta inode, nhng FS xc nh phi tho mn cc ng ngha ca Unix FS v phi cp inode ca n 64 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ khi kernel m mt inode tru tng. Mi kiu FS c mt cu trc cha a ch ca cc hm thc hin cc thao tc tru tng. Khi kernel mun truy nhp tp, kernel thc hin gi hm gin tip trn c s ca kiu FS v cch thao tc trn FS . Cc thao tc tru tng bao gm: open, close, read, write, return inode, release inode, update inode, ckeck permissions, set attribute (attribute), mount, umount. Linux l mt v d p dng FS tru tng, cn gi l FS o (Virtual FS: VFS), h tr truy nhp hu ht cc FS hin c, trong c DOS, CDfiROM, NTFS (ca WINDOWS 2000, XP) (Bn Linux Mandrake 8.1 rt hon ho).

M hnh FS trn Linux:

65 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

18. Bo tr FS
Kernel duy tr s bn vng ca FS trong ch hot ng bnh thng. Nhng khi b s c (mt in) FS c th b ri lon: c tp cn, c tp mt. Mt GHT ca kernel s thc hin kim tra khi reboot my v thc hin truy nhp tp b qua cc kiu truy nhp thng thng sa li FS. Mt s cc tnh hung s c fsck() thc hin: Mt blk a c th l thuc nhiu inode, hay thuc danh sch cc blk t do hay ca mt inode. Vo lc to FS (nguyn thu), cc blks a thuc danh sch cc blks t do. Khi c cp pht cc blk ny s b loi ra khi danh sch ni trn gn cho mt inode. Mt blk s c gn li cho inode khc ch sau khi n tr li danh sch t do. Nh vy mt blk a ch c th l trong danh sch t do hay thuc mt inode. Xem xt cc kh nng khi kernel gii phng blk ca tp tr li s ca n vo bng ng (in - core) ca Super block trong b nh v cp n cho tp mi to: nu kernel ghi ln a inode v cc blks ca tp mi to nhng s c xy ra trc khi cp nht mi inode ca tp c (c gii phng), th mt blk c th s thuc 2 inode. Tung t: nu kernel ghi c Super block v danh sch blk t do ca n ln a v c s c trc khi cp nht inode c th blk a c th s hin din c trong danh sch t do v trong inode. Nu s ca blk khng trong danh sch t do cng khng trong inode th FS c coi l nht qun v cc blk phi c mt u . Tnh hung ny nh sau:blk loi khi tp v t vo danh sch t do ca Super block. Nu tp c c ghi a v s c xy ra trc khi Super block c cp nht, th blk c th khng xut hin trong bt k danh sch no trn a. Nu khun dng (format) ca inode khng chun (v trng file type c gi tr khng c nh ngha), FS c vn ; 66 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ S ca inode c trong u vo th mc, nhng inode l t do, FS c vn ; Xy ra l do: kernel to xong tp mi, cp nht th mc ln a nhng cha cp nht danh sch inode th c s c. Nu s cc block t do v inode t do ghi nhn trong Super block khng ph hp vi s tn ti trn a, FS c vn .

19. Tm tt v bi tp
Tm tt Chng ny gii thch v FS, gii thiu 3 cu trc qun l tp ca kernel: - File table, - Inode table, - user file descriptor table (ufd table), - mount table - cc thut ton lin quan ti FS v mi tng tc gia chng - fsck() dng bo tr FS. Mi quan h gia cc bng trn c th tm tt hnh sau y:

67 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

V d 1:
/*********************************************************************** * Lnh c i u vo, chun C * ***********************************************************************/ #include #include #include #include #include #include <fcntl.h> <stdlib.h> <sys/stat.h> <sys/types.h> <sys/uio.h> <unistd.h>

int main (int argc, char* argv[]) { int fd; struct iovec* vec; struct iovec* vecfinext; int i; /* cn "buffer" cha k t dng mi. /*ch ny. */

S dng bin k t cho mc*/

68 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________


char newline = '\n'; /* i u tin l tn tp u ra. */ char* filename = argv[1]; /* B qua 2 thnh phn u ca danh sch i. Thnh phn 0 l tn ca chng trnh ny, thnh phn 1 l tn tp u ra. */ argc -= 2; argv += 2; /* xin cp mt trng cc thnh phn kiu iovec. Ta cn 2 cho mi thnh phn ca danh sch i: mt cho text, mt cho newline. */ vec = (struct iovec*) malloc (2 * argc * sizeof (struct iovec)); /* Xst qua danh sch i, xy dng cc thnh phn cho iovec. */ vecfinext = vec; for (i = 0; i < argc; ++i) { /* Thnh phn u tin : text ca bn thn i. */ vecfinext->iovfibase = argv[i]; vecfinext->iovfilen = strlen (argv[i]); ++vecfinext; /* Thnh phn th 2 : k t dng mi (newline). Cc thnh phn ca struct iovec array tr ti cng mt vng b nh. */ vecfinext->iovfibase = &newline; vecfinext->iovfilen = 1; ++vecfinext; } /* Ghi cc i mi vo tp. */ fd = open (filename, OfiWRONLY | OfiCREAT); writev (fd, vec, 2 * argc); close (fd); free (vec); return 0; }

V d 2:
/*********************************************************************** *c ni dung ca FILENAME vo buffer. Kch thc ca buffer * *LENGTH. Tr li oqr u ra l buffer v phi c gii phng. Nu* *FILENAME khng phi l tp thng (regular), tr li l NULL. * ***********************************************************************/ #include #include #include #include #include <fcntl.h> <stdio.h> <stdlib.h> <sys/stat.h> <sys/types.h>

69 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________


#include <unistd.h> /* */

char* readfifile (const char* filename, sizefit* length) { int fd; struct stat filefiinfo; char* buffer; /* Open the file. */ fd = open (filename, OfiRDONLY); /* Get information about the file. */ fstat (fd, &filefiinfo); *length = filefiinfo.stfisize; /* Make sure the file is an ordinary file. if (!SfiISREG (filefiinfo.stfimode)) { /* It's not, so give up. */ close (fd); return NULL; }

*/

/* Allocate a buffer large enough to hold the file's contents. buffer = (char*) malloc (*length); /* Read the file into the buffer. */ read (fd, buffer, *length); /* Finish up. */ close (fd); return buffer; }

*/

V d 3:
/*********************************************************************** * Ghi tng s byte COUNT t BUFFER vo descriptor FD. * * Returns -1 :error, OK= Tng s byt ghi c * ***********************************************************************/ #include <assert.h> #include <unistd.h> /* */

ssizefit writefiall (int fd, const void* buffer, sizefit count) { sizefit leftfitofiwrite = count; while (leftfitofiwrite > 0) { sizefit written = write (fd, buffer, count);

70 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________


if (written == -1) /* An error occurred; bail. */ return -1; else /* Keep count of how much more we need to write. leftfitofiwrite -= written;

*/

} /* We should have written no more than COUNT bytes! */ assert (leftfitofiwrite == 0); /* The number of bytes written is exactly COUNT. */ return count; }

Chng III. (process)


A. Tng quan v tin trnh
1. Tin trnh

Tin Trnh

Unix l h a x l, tc kh nng thc thi nhiu tc v cng mt lc. Mt chng trnh my tnh l mt chui cc ch lnh (intructions, hay cn gi l lnh my) m theo my tnh phi thc hin. Mt khc ti nguyn my tnh (CPU, b nh, tp, cc thit b...) l hu hn v khi cc chng trnh chy th cc chng trnh u c nhu cu trn cc ti nguyn . p ng nhu cu ti nguyn, cn c mt sch lc chy trnh tht hiu qu m bo tnh a nhim, nhiu ngi dng. Cch ph bin nht l cp ti nguyn cho mi chng trnh trong mt lng thi gian nht nh, sao cho cc chng trnh u c c hi thc hin nh nhau v trong thi gian thc hin chng trnh, cn kim sot vic thc hin cht ch. lm iu , ta a ra mt khi nim gi l tin trnh (process). Vy tin trnh (TT) l thi gian thc hin (instance of execution) ca mt chng trnh v vic thc hin hin ch xy ra trong mt khon thi gian nht nh (gi l slice time). Tuy nhin thc hin c chng trnh, TT s s dng CPU chy cc lnh ca n, v b nh ni c m lnh (code hay text), d liu (data), v ngn xp (stack). Mt TT khi thc hin phi lm theo mt trnh t cc ch lnh trong vng code ca TT v khng nhy ti 71 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ cc ch lnh ca TT khc; TT ch c th c/ghi truy nhp data v stack ca n, nhng khng th trn data v stack ca TT khc. TT lin lc vi cc TT khc v phn cn li ca h thng bng cc Go H Thng (GHT, system call). H thng phn chia vic thc hin ra l hai ch , user mode v kernel mode nh ni, nhng cho d nh vy, th kernel vn l ngi thc hin m ca TT (cn gi l nhn danh TT ca ngi dng). Cn nhn thc rng, kernel khng phi l tp tch bit cc TT v chy song song vi TT ngi dng, m kernel l mt phn ca mi TT ngi dng.

2. Mi trng thc hin


2.1. Ch thc hin Vic thc hin mt TT trn Unix c chia ra lm hai mc: user (ngi dng) v kernel (nhn ca h thng). Khi mt TT ca user thc hin mt chc nng ca nhn (thng qua gi h thngfiGHT), ch thc hin ca TT s chuyn t ch ngi dng (user mode) sang ch nhn ca h thng (kernel mode): H thng s thc hin v phc v cc yu cu ca user, tr li kt qu. Ngay c khi user to ra cc yu cu khng tng minh, th h vn thc hin cc kt ton c lin quan ti TT ca user, thao tc cc ngt, lp biu cc TT, qun l b nh... Kernel mode l mt ch c quyn, trong khng c gii hn no i vi kernel: kernel s dng tt c cc lnh ca CPU, cc thanh ghi ca CPU, kim sot b nh, lin lc trc tip vi cc thit b ngoi vi. Kernel tip nhn v x l cc yu cu ca cc TT ca user, sau gi kt qu n cc TT . User mode c hiu l ch thc hin bnh thng ca mt tin trnh. Trong ch ny, c nhiu hn ch p t ln TT: TT ch truy nhp c cc lnh v d liu ca n, khng th truy nhp lnh, d liu ca kernel v ca cc TT khc, mt s cc thanh ghi ca CPU l cm. V d: khng gian a ch o ca mt TT c chia ra thnh min ch truy nhp c trong ch kernel, min khc ch user, hay TT khng th tng tc vi my vt l, mt s lnh ca CPU khng c s dng, c th b ngt trong bt k lc no. Mt TT trong user mode khi mun truy nhp ti nguyn, phi thc hin qua gi h thng (GHT). Gi h thng (GHT hay gi thc hin chc nng h thng cung cp) l qu trnh chuyn thng s (yu cu qua tn hay s ca cc dch v h thng) m TT yu cu cho kernel thc hin. Trong Unix, vic c lm qua mt by h thng (trap), sau kernel s thc hin nhu cu ca TT, i khi cn ni l: kernel thc hin TT trn danh ngha ca TT, trong mi trng ca TT. Kernel khng phI l tp tch bit ca TT chy song song vi TT ngi dng, m l mt phn ca mi TT ngi dng. Vn cnh trnh by ni kernel cung cp ti nguyn hay kernel thc hin ... c ngha l TT ang chy trong kernel mode cp ti nguyn hay TT thc hin . . .Bn cht ca GHT thc hin cc dch v ca kernel v m thc thi cc dch v l mt phn trong m ca TT ngi dng, ch khc l m ch chy trong kernel mode m thi. V d: shell c u vo t thit b u cui bng mt GHT, lc ny kernel thc hin nhn danh TT shell, kim sot thao tc ca thit b u cui v tr li cho shell k t nhn c. Shell sau chy trong user mode, thng dch xu k t v thc hin cc hnh vi nht nh v c th pht sinh GHT tip theo. 2.2. Mi trng thc hin ca Tin trnh Nh ni c rt nhiu TT c thc hin ng thi trong h thng, nhng kernel cn lp 72 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ biu a vo thc hin. Mi TT ch c mt TT b, nhng c nhiu TT con ca n. Kernel nhn bit mi TT qua s hiu ca TT gi l s nh danh ca TT (Procces ID: PID). Khi dch mt chng trnh ngun, mt tp kh thi (executable) c to ra v n c cc phn sau: Tp cc headers m t thuc tnh ca tp; M chng trnh (code hay cn gi l text); Mt th hin ca ngun ng my cc d liu c khi ng khi trnh bt u c thc hin v mt ch bo v kch thc (b nh) m kernel cp pht cho cc d liu cha c khi ng. V cc thnh phn khc, nh bng cc biu tng. V d: chng trnh copy tp #include <fcntl.h> char buf[1024]; int version = 1; main(argc, argv) int argc; char *argv[]; { int fdold, fdnew; if (argc !=3) { printf (can 2 doi dau vao cho trifnh copy\n); exit(1); } fdold=open(arg[1], OfiRDONLY); if(fdold ==-1){ printf(khong mo duoc tep %s\n, argv[1]); exit(1); } fdnew=creat(argv[2]. 0666); if(fdnew ==-1){ printf(khongtao duoc tep moi %s\n, argv[2]); exit(1); } copy (fdold, fdnew); exit(0); } copy(old, new) 73 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni /*l data cha c khi ng*/ /*l data c khi ng*/

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ int old, new; { int count; while((count = read (old, buffer, sizeof(buffer))) > 0) write(new, buffer, count); } Trong , text l m to ra cho hm main, d liu c khi ng l bin version (int version = 1) v d liu cha khi ng c kch thc cho trc l trng buffer. Kernel np mt tp thc thi (executable) bng GHT exec (Unix c 6 chc nng exec l execl(), execv(), execle(), execve(), execlp(), execvp()) v TT c np c ba phn gi l min (region): m lnh (text hay code l xu lin tc cc lnh), d liu (data), ngn xp (stack). Hai min u tng ng vi nhng xc nh trong tp, cn stack th kernel to v iu chnh ng vo thi im chy trnh. Mt TT trong Unix chy trong hai ch ni trn nn c hai stack ring bit cho mi ch : user stack v kernel stack. User stack cha cc i u vo, cc bin cc b, cc data khc cho cc chc nng chy trong ch user mode. Xem hnh di, bn tri: Khi TT pht sinh gi hm copy() (frame 2) v hm write() (frame 3) l hai khung stack lin tc trong hm main(), trong khi frame1 l stack cho main() do khi h thng thc hin exec() gi main(); Khi TT thc hin mt GHT (writre()), TT thc hin mt lnh c bit (lnh trap ci vo m khi dch qua hp ng), lnh ny to ra mt ngt chuyn CPU vo ch kernel, TT thc hin lnh ca kernel v s dng kernel stack. Kernel stack cha cc khung stack cho cc chc nng (system calls) thc hin trong kernel mode. Cc u vo ca hm v d liu trong kernel stack qui chiu vo cc hm v d liu bn trong ca kernel, khng phi cc hm v d liu ca chng trnh ngi dng. Hnh di, bn phi biu din khi mt TT gi GHT write(). Tuy vy cch cu to stack th nh nhau c hai. Kernel stack ca TT l null khi TT thc hin trong user mode. Phn ny s bn k khi cp ti bi cnh (context) ca TT. Mi TT c mt u vo (entry) trong Bng cc Tin trnh (Process Table). Mi TT li c cp mt vng d liu gi l ufiarea (user area) dng lu cc d liu ring ca TT m kernel s x l. Thng tin trong cu trc ny gm c: 1. Cc thanh ghi ca CPU. Khi c by vo kernel xut hin, cc thanh ghi (k c n v du phy ng) c lu li ti y.registers (including the floating-point ones, if used) are saved here. 2. Trng thi gi h thng: thng tin v GHT hin ti, bao gm c cc thng s li gi v cckt qu thc hin li gi . 3. Bng m t cc tp ca TT vi fd l ch s tr vo bng nh v cu trc in-core data (i-node) tng ng vi tp. 4. Con tr ti bng kt ton thi gian s dng CPU ca mi TT, cng nh cc gi tr gii hn h thng (max stack size, max page frames, v.v). 5. Kernel stack. L stack ring ca kernel Process table c cc thng tin: 74 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ 1. Cc thng s lp biu chy TT, mc u tin ca TT, lung thi gian hin dng CPU, thi lng trng thi sleep. Cc thng s ny cn tuyn TT no s chy tip theo trong lch trnh. 2. Ni dung b nh cha m thc thi. Cc con tr tr ti b nh: text, data, stack , bng cc trang b nh ca TT. 3. Tn hiu v mt n (mask) tn hiu. Mask ch ra tn hiu no s b qua, tn hiu no s x l, tn hiu no tm thi li v tn hiu no TT gi i. 4. Cc trng thi hin ti ca TT, cc s kin ang i s xut hin, cc timeouts, cc s hiu (PID) ca TT , PID ca TT b, s hiu tin trnh gn vi ngi dng (UPID) v nhm ngi dng (GPID). Khi TT gi chc nng thot (exit), kernel gii phng cc min TT s dng. V d chi tit cc cu trc d liu ca mt TT ang thc hin: Con tr trong Procces table tr ti Per procces region table (pregion); Con tr ti Per proccess region table (pregion) tr ti cc u vo ca Region table tr ti cc min ca text, data, stack ca TT. u vo ca Process table v u_area (user_area) cha thng tin iu khin TT. u_area l phn m rng ca u vo ca Proccess table, ghi mi v cp nht nhng thng tin trong sut cuc i ca TT.

Cc trng trong Process table l: trng trng thi; cc nhn dng cho bit ngi s hu TT: user IDs, EUIDs, GPID; tp m t cc s kin khi treo TT (TT trng thi ng). Cc trng quan trng trong u_area v ch truy nhp c khi TT ang c thc hin l: con tr tr ti u vo trong Procces table ca TT ; cc thng s ca GHT hin ti: gi tr tr li, m li; 75 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ cc m t tp ca tt c tp m; cc thng s I/O bn trong, bng cc khi a cha tp trong FS a; th mc hin hnh v th mc root; cc gii hn h thng trn tp v TT. Kernel c th truy nhp vo u_area ca TT ang c thc hin, nhng khng th c i vi cc TT khc. Bn trong kernel qui chiu ti bin u (bin tng th ca kernel) ca u_area ca TT ang thc hin v khi mt TT khc i vo thc hin kernel sp xp li khng gian a ch o ca TT sao cho cu trc bin u s tr ti u_area ca TT mi (xem context switch sau ny). Cch thc ny gip kernel d dng nhn dng mt TT hin ti bng cch theo di con tr t u_area ti u vo ca TT trong Proccess table.

3. Bi cnh ca Tin trnh (Procces context)


Bi cnh (context) ca TT l tp hp cc thng tin m t trng thi ca TT . Bi cnh c nh ngha bi m lnh, cc gi tr ca cc bin v cc cu trc tng th ca user, gi tr ca cc thanh ghi ca CPU m TT ang dng, cc gi tr trong proccess table v u_area ca TT v ni dung cc stack (ngn xp) trong user v kernel mode. Phn m, cng nh cc cu trc d liu tng th ca kernel tuy c chia s cho TT nhng khng thuc bi cnh ca TT. Khi thc hin mt TT, ta ni h thng c thc hin trong bi cnh ca TT . Khi kernel quyt nh cho chy mt TT khc, kernel s chuyn i bi cnh (switch context) sao cho h thng s thc hin trong bi cnh ca TT mi. Kernel cho php chuyn bi cnh ch di nhng iu kin nht nh. Khi chuyn bi cnh, kernel bo v cc thng tin cn thit khi tr li TT trc , kernel c th tip tc thc hin TT . Tng t nh vy cng xy ra cho qu trnh chuyn t user mode sang kernel mode v ngc li. Tuy nhin chuyn t user mode sang kernel mode ca mt TT l s thay i ch thc hin, ch khng phi chuyn i bi cnh. Bi cnh thc hin ca TT khng i, v khng c s chuyn i thc hin TT khc. Kernel phc v cho ngt trong bi cnh ca TT b ngt cho d TT khng h gy ra ngt. TT b ngt c th ang c thc hin trong user mode hay kernel mode, kernel bo v cc thng tin cn sau tr li thc hin TT b ngt v i phc v cho ngt trong kernel mode. Kernel khng pht sinh hay lp biu cho mt TT c bit no x l ngt. Trong bi cnh , kernel to ra mt layer mi trong kernel stack ca TT x l ngt, sau khi hon tt ngt, kernel tr v layer trc ca TT ang thc hin.

4. Trng thi ca TT
Cuc i ca TT c th phn chia ra cc trng thi, mi trng thi c cc c tnh m t v TT. Chng 6 s ni y cc trng thi tuy nhin lc ny cn hiu cc trng thi sau y: 1. TT ang chy trong user mode; 2. TT ang chy trong kernel mode; 3. TT khng c thc hin (khng chy) nhng sn sng chy khi b lp biu chn thc hin. C rt nhiu TT trong trng thi ny, nhng scheduler ch chn mt TT. 4. TT ng (sleeping): TT khng th thc hin tip v nhng l do khc nhau, v d ang i 76 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ hon tt nhu cu ti nguyn I/O. Bi v CPU ch thc hin mt TT trong mt thi im cho nn nhiu nht ch c mt TT trong trng thi 1 hay 2. Hai trng thi ny tng ng vi user mode hay kernel mode. Thc t s cc TT cn nhiu hn nh m t v s cp chi tit sau ny.

5. Chuyn i trng thi ca TT


Phn trn l cch nhn tnh (static) trng thi ca TT, tuy nhin TT chuyn trng thi lin tc v theo mt qui lut c nh ngha r rng. S chuyn trng thi l th m cc nt (node) biu din trng thi TT s i vo, thot ra, cc cnh ni biu din s kin lm cho TT chuyn i trng thi. S chuyn i gia hai trng thi l hp l nu c mi tn ni t trng thi th nht n trng thi th hai. C nhiu chuyn i bt ngun t mt trng thi nhng TT ch theo mt v ch mt l do, ph thuc vo s kin xut hin trn h thng. Hnh di cho th theo nh ngha ni trn. Theo cch phn chia thi gian (time - shared), vi TT c th thc hin ng thi trong kernel mode. Nu TT chy trong kernel mode m khng c cc cng ch, chng c th lm hng cu trc d liu tng th ca kernel. Bng cch cm chuyn i trng thi mt cch tu tin v kim sot nguyn nhn cc ngt, kernel bo v c s nht qun ca d liu v tt nhin c bn thn kernel. Kernel cho php i bi cnh ch khi TT chuyn t trng thi ang chy trong kernel vo ng trong b nh. Cc TT chy trong kernel mode khng b chen ngang (preempted) bi cc TT khc, do i khi ta ni kernel khng th chen ngang, trong khi user mode TT c th b chen ngang vic thc hin. Vic khng th b chen ngang lm cho kernel bo tr s nht qun d liu, v gii quyt c vn loi tr ln nhau (mutual exclution) - m bo rng cc phn nhy cm (critical) ca m l c thc hin bi nhiu nht mt TT mt thi im. (Phn m gi l nhy cm nu vic thc hin cc x l ngt tu tin c th gy ra cc tn tht (lm hng) s nht qun d liu). V d: X l ngt ca a thao tc cc hng i m, th phn m lnh m kernel thc hin thao tc trn hng i l phn m nhy cm khi nhn ti s lin quan vi x l ngt a. Nhn li ta thy kernel bo v s nht qun bng cch cho php i bi cnh ch khi TT t t vo trng thi ng v ngn chn mt TT thay i trng thi ca mt TT khc. Kernel ng thi gia tng mc thc hin (run level) ca CPU i vi cc vng m nhy cm ngn cn cc ngt c th gy nn s mt nht qun d liu. TT lp biu (scheduler process) mt cch nh k, chen ngang cc TT trong user mode loi tr trng hp cc TT c th c chim s dng CPU, v tuyn chn mt TT khc (theo cc tiu chun nht nh) a vo hot ng.

77 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Trng thi (gin lc) v s chuyn i trng thi ca TT

6. TT ng (sleep) v thc dy (wake up)


Mt TT thc hin trong kernel mode c kh nng t tr trong vic quyt nh s lm g khi phn ng vi cc s kin ca h thng. Cc TT c th lin lc vi nhau, xut cc gii php nhng cui cng t cc TT s quyt nh. C mt tp hp cc lut (rule) m cc TT phi tun th khi gp cc hon cnh khc nhau, nhng cc TT s theo cc lut ny ch ng x l. Mt TT i ng v TT ang i s xut hin ca mt s kin no , chng hn hon thnh mt yu cu I/O ca t/b ngoi vi, hay i mt TT kt thc thc hin, ngun ti nguyn yu cu c gii tr kho... Ni rng TT ng do mt s kin c ngha rng TT trong trng thi ng cho ti khi s kin xut hin, v vo lc TT thc dy v chuyn vo trng thi sn sng chy. Nhiu TT c th cng ch chung mt s kin (u ng) v khi s kin n tt c cc TT cng thc dy v chuyn t trng thi ng sang trng thi sn sng chy, tc s ch c scheduler sp xp lch chy. Cc TT ang ng khng s dng ti nguyn ca CPU: kernel khng phi kim tra xem TT vn ang ng, nhng sau s nh thc TT dy khi s kin xut hin. n y ta c mt s im c bn m t v mt TT: M t v TT (nh ngha, c t cc c s d liu v TT); Trng thi ca TT (i sng ca TT, qui lut TT hot ng); Ch lm vic ca TT (user mode v kernel mode) (ai chy mt chng trnh, ch no); Bi cnh (context) ca TT v qu trnh chuyn bi cnh ca TT (cc m t ca TT thay i khi TT chuyn trng thi); Cc im ny s c nhc li chi tit hn phn tip theo

B. Cu trc ca Tin trnh


78 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Chng ny cp n: m rng cc trng thi ca TT; cc cu trc d liu h thng qun l TT; cc nguyn tc qum l b nh o, b nh vt l ca my tnh; lm r bi cnhficontext ca TT, thao tc context trong qu trnh TT chuyn trng thi (save, switch, restore);

1. Cc trng thi ca tin trnh


Cc trng thi m TT s c trong sut cuc i c m t chi tit nh sau, trong <...> l tc nhn gy ra s chuyn trng thi:

S1: TT thc hin trong ch user; S2: TT ang thc hin trong ch kernel; S3: TT khng thc hin, nhng sn sng thc hin khi c scheduler chn; S4: TT ng trong b nh; S5: TT sn sng thc hin nhng TT ang trn swap (a); S6: TT ng, nhng TT hin ang trn swap; S7: TT chuyn t kernel mode v user mode nhng kernel chen ngang (preempt) TT, v tc ng s chuyn bi cnh la chn mt TT khc; 79 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ S8: TT c to ra (forked) v ang trng thi chuyn i: TT tn ti, nhng cha sn sng thc hin, cng khng phi i ng. y l trng thi khi u ca tt c cc TT, tr Tin trnh s 0. Ta ni rng TT bc vo m hnh trng thi khi TT b thc hin fork(): to ra mt TT; S9: TT thc hin mt exit, TT do vy khng cn tn ti na nhng TT vn cn li m lnh return v mt s gi tr thi gian v s c TT b thu dn. Trng thi ny l trng thi cui cng ca mt TT, cn gi l zombie (xc). (zombie: khi mt TT cht, Unix khng th loi b TT mt cch hon tt khi h thng cho ti khi TT b c s hiu bit v ci cht . TT b bit c iu ny khi thc hin GHT wait()). -Trn s cc mi tn ch ra s chuyn trng thi cn bn cnh <...> l cc tc nhn gy ra. Mt TT bc vo m hnh trn mt khi TT b thc hin to mi (forked) mt TT, sau s i vo S3 hay S5. Gi s TT vo S3, v c chn chy, TT vo S2 (kernel running) v ti y TT hon tt phn to TT ca GHT fork(). -Khi TT hon thnh mt GHT, n c th s chuyn vo S1 (user running) v chy trong user mode. Nu lc ny, ng h h thng ngt CPU (sau mt chu k thi gian), CPU I x l ngt ng h, khi kt thc x l ngt, b lp biu (scheduler) c th chn mt TT khc chy, TT trc khng tip tc v ta ni n b chen ngang (preempted, S7). Trng thi S7 thc t ging nh S3 nhng c m t tch bit nhn mnh rng mt TT ang chy trong kernel mode ch c th b chen ngang khi n ang vn ng vo user mode S1. H qu ca vic ny l kernel c th chuyn TT S7 ln swap nu cn, hay nu cui cng c chn, TT s tip tc chuyn vo S1 v thc hin user mode. -Khi TT thc hin mt GHT, TT i t user mode S1 vo kernel mode S2. Gi nh GHT thuc lp cc nhu cu I/O, TT phI i kt qu, TT i vo S4 v cho ti khi I/O hon tt, TT s c nh thc v chuyn vo S3. -TT c th s vo cc trng thi hon chuyn fi swap out, swap in (b nh S4 a S6, a S5 b nh S3) do kernel cn b nh chy cc TT khc. Nh vy mt TT c hai hnh thi ca sn sng chy ty thuc vo v tr m TT ang u: trn a hay trong b nh. Vic chuyn v tr nh vy do TT 0 swapper la chn, cn bn thn TT s c thc hin hay cha li ph thuc vo scheduler. Scheduler chn TT chy li trn c s ca cc chnh sch m kernel vch ra. -TT c th kim sot mt vi s chuyn trng thi user mode. 1. TT c th to ra mt TT khc nhng vic chuyn trng thi vo S3 hay S5 ph thuc vo kernel: TT khng kim sot c cc trng thI ny; 2. TT c th pht sinh mt GHT chuyn t S1 vo S2 v vo kernel mode nu mun, nhng khng th kim sot vic ra khi kernel mode: cc s kin c th khin TT khng th thot ra v a TT vo S9 (s ph thuc vo cc tn hiu signals); 3. TT c th thot ra khi s t ni trn do cc s kin bn ngoi buc m khng thc hin tng minh mt GHT exit(). Tt c cc qu trnh chuyn trng thi u theo mt m hnh cng nhc m ho trong kernel, phn ng trc cc s kin theo cch thc d bo trc theo cc lut hnh thnh. V d nh lut: khng TT no c chen ngang mt TT ang chy trong ch kernel nh cp. 80 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

2. Cc cu trc d liu ca tin trnh


C hai cu trc d liu ca kernel dng m t mt TT, l cc thnh phn ca Bng cc TT (Proces Table) v mt vng nh cp cho mi TT u_area (vit tt ca user area). Process Table c cc u vo (entry hay slot) dnh cho mi TT khi TT c to ra. Mi entry l mt cu trc d liu ca mi TT m cc trng trong kernel lun c th truy nhp c, trong khi u_area vi cc trng ch c th truy nhp c khi TT ang thc hin. U_area ch pht sinh khi to ra mt TT. Di y l c t cc trng ca mt u vo (entry) cho mt TT: Mi u vo (entry) cho mi TT ca Process Table c cc trng sau: 1. Trng trng thi: cho bit trng thi hin ti ca TT; 2. Trng nh v TT: cho bit v tr ca TT, ca u_area ca TT trong b nh hay trn swap. Kernel dng cc thng tin ti y chuyn i bi cnh ca TT khi TT t sn sng thc hin trong b nh vo thc hin trong kernel :S3 S2; thc hin hon i gia b nh swap; cho bit di ca TT sao cho kernel c th cp khng gian b nh cho TT; 3. Cc nh danh v ngi s dng (user IDs hay UIDs) cho bit user c cc quyn hn khc nhau trn TT; 4. Cc nh danh ca TT (PIDs), cho bit mi quan h ca TT vi cc TT khc (TT b, TT con). Trng ny s pht sinh khi TT thc hin mt fork() to ra TT (con) mi. 5. Trng m t cc s kin m TT hoi vng s n khi TT trng thi ng; v d ng dng trng ny c trong thut ton sleep() v wakeup(); 6. Cc thng s lp biu gip kernel xc nh th t TT chuyn vo trng thi thc hin trong kernel mode v thc hin trong user mode. 7. Trng s hiu cc tn hiu (signals) gi cho TT nhng cha c x l. 8. Cc s m qui chiu thi gian TT dng CPU v cc ngun ti nguyn khc ca kernel. Cc s liu ny gip cho vic kt ton, tnh ton mc u tin khi lp biu thc hin TT. Mt b m m user xc lp gi tr c dng gi signal thng bo (alarm signal) cho mt TT khc; U_area (m rng ca entry ca TT) c cc thng tin sau: 1. Con tr tr vo u vo ca mt TT trong Process table cho bit u_area thuc TT ; 2. nh danh ngi dng thc (real user ID) v nh danh ngi dng hiu dng (effective user ID), cho bit cc quyn hn khc nhau i vi tng loi user trn TT (v d quyn truy nhp mt tp); 3. Cc b m ghi nhn thi gian mt TT (v cc TT con ca n) tri qua khi thc hin trong user mode v kernel mode; 4. Bng ch ra (tr ti) cch thc TT s phn ng khi c cc signal; 6. Thit b u cui (terminal) kt hp vi TT nu c; 7. Cc thng bo li gp phi khi thc hin mt GHT; 81 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ 8. Cha gi tr tr li l kt qu (cho hm gi) khi thc hin GHT; 9. Cc thng s vo ra (I/O) cho bit khi lng data chuyn i, a ch ngun data trong khng gian a ch ca user, s m nh v (offset) ca I/O, v.v.v. 10. Th mc hin ti, th mc gc ca FS m TT truy nhp tp; 11. Cc m t tp (file descripters) cc tp TT m; 12. Cc gii hn v kch thc ca TT s to hay ca tp m TT c th ghi vo; 13.quyn to tp khi TT to tp (v d: to tp ch c, hay W/R);

3. T chc b nh h thng
(Khng cp)

4. Hon i (swaping)
Vic lp biu chy TT ph thuc rt nhiu vo chin thut qun l b nh. Vi cc TT t nht phi c mt phn m trong b nh chnh chy, tc l CPU khng th chy mt TT m m ca n nm ton b trn b nh ph (a), trong khi b nh chnh l ti nguyn t gi v thng khng ln cha tt c cc TT ang hot ng. Nh vy h qun l b nh (Memory Managment Subsystem MMS) s quyt nh TT no s tn ti (hay thng tr) trong b nh v qun l cc phn a ch ca khng gian a ch o khng nm trong b nh ca TT. MMS kim sot b nh chnh, ghi cc TT vo b nh ph gi l thit b hon i (swap device) c nhiu b nh chnh hn v sau ny khi TT c chy li s np li vo b nh. Unix truyn thng chuyn ton b TT gia b nh v swap device ch khng chuyn tng phn ca TT mt cch c lp, tr phn text chia s. Sch lc qun l nh vy gi l hon ifi swaping. Vi k thut ny kch thc ca mt TT c gi gn trong khun kh s lng b nh vt l h c (v d p dng trn PDP 11). Cho ti h Unix BSD phin bn 4.0 v cho ti cc phin bn ngy nay trin khai k thut mi gi l chuyn trang theo yu cu (demand paging), trong MMS hon i cc trang b nh thay v c TT ln swap device v nguc li vo b nh: ton b TT khng thng tr trong b nh thc hin, kernel np cc trang ch khi no TT yu cu, tr khi TT qui chiu vo min nh m TT cn c chy. K thut ny mang li cc thun li ln cho php qun l v s dng b nh mm do v linh hot khi nh x a ch o ca TT vo a ch vt l ca h thng. Chnh nh vy m kch thc ca TT khng b hn ch, i khi cn ln hn c b nh tht v cho php thng tr nhiu TT ng thi trong b nh. 4.1. Thut ton hon i Thut ton hon i gm 3 phn: - qun l khng gian trn swap device - chuyn TT ra khi b nh ln swap device - a TT tr li b nh

82 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

5. Bi cnh ca TT (context of a Process)


Bi cnh ca TT c th hnh dung nh mi trng trong TT sng v hot ng. Trong mi trng nh vy bt k s thay i hay cc tc ng ln TT u c ghi nhn, x l v chuyn giao khi TT c s thay i trng thi. user) Nh vy, context ca TT s bao gm ni dung ca khng gian a ch ca TT (lp v ni dung ca cc thanh ghi phn cng (m TT ang s dng), ni dung cc cu trc d liu ca kernel c lin quan ti TT. User level context: bao gm text, data, user stack, vng nh chia s. Cc vng ny thuc khng gian a ch o ca TT; Register context: gm cc thnh phn sau y: B m chng trnh (PC): xc nh a ch tip theo CPU s thc hin. a ch c th l a ch o ca kernel hay ca khng gian a ch o ca user; Thanh ghi trng thi (PS) ca CPU: trng thi ca phn cng lin quan ti TT, v d nh kt qu thc hin cc php ton vi gi tr m, hay dng, hay 0, c b trn ... Stack pointer: a ch hin ti ca v tr tip theo trong kernel stack hay user stack c xc nh bi ch thc hin; General purpose register: cc thanh ghi vn nng cha data do TT to ra trong qu trnh thc hin ca TT. System level context: bi cnh h thng c hai phn: Static: l phn tn ti trong sut cuc i ca TT: Cc trng trong u vo cho mi TT ca process table, cho bit trng thi ca TT v cc thng tin kernel truy nhp kim sot TT; U_area cha cc thng tin ca TT ch truy nhp c trong bi cnh ca TT; Pregion, region table, page table ca TT nh ngha cch nh x a ch o ti a ch vt l. Ch l nu c mt min no chia s chung cho cc TT, th min c xem nh l b phn ca TT v rng mi TT thao tc min mt cch c lp. Dynamic: TT c th c nhiu phn ng v coi nh cc lp (stack layers) m kernel y (push), hay ly li (pop) ni dung trn s hin din ca cc s kin (events): Kernel stack lu cc khung stack ca cc x l trong kernel mode, mi khung ng vi mt layer (TT pht sinh ca TT ). Cc TT u c bn copy ca kernel stack xc nh tng kiu kch hot cc chc nng ca kernel. V d TT kch hot GHT creat(), i ng i kernel cp mt ifinode, TT khc kch hot GHT read(), i ng i kt qu c t a xung buffer. C hai TT thc hin cc hm chc nng ca kernel v mi TT c stack ring lu cc trnh t TT thc hin. Kernel phi c kh nng khi phc li ni dung ca kernel stack v v tr ca con tr stack sao cho c th tip tc thc hin TT trong kernel mode. Kernel stack ca TT thng c t trong U_area ca TT , v rng khi TT chy trong user mode. 83 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

Trn c s nh ngha trn, v mt hnh thc ta c th chia context ca TT ra thnh:

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Phn ng ca system level context ca TT l tp ca cc lp (layers) bi cnh ca TT sp xp theo LIFO. Mi layer cha cc thng tin cn thit tr v layer trc k c registerficontext ca layer trc . Kernel y (thay i) layer khi interrupt xut hin hay khi TT thc hin mt GHT hay khi TT chuyn i bi cnh v ly li (pop) bi cnh khi tr v sau x l ngt, hay khi tr li user mode sau khi hon tt thc hin mt GHT hay khi TT chyn i bi cnh. Chuyn bi cnh thc t l kernel y context layer c (TT c) vo stack v to layer mi cho TT mi. Kernel qun l cc TT qua cc u vo cho mi TT trong Process table. Cu trc stack ny l mt thnh phn ca mi TT v t trong u_area ca TT .

6. Ghp ni vi GHT GHT ghp vo kernel c cp nh gi mt chc nng h thng. Nhng vi cch gi nh vy th khng th thay i ch thc hin TT t user mode vo kernel mode. B dch C dng th vin cc chc nng nh ngha (C - library) c tn ca cc GHT gii quyt cc qui chiu GHT trong chng trnh ca user ti nhng tn c nh ngha. Cc chc nng ca th vin C thng thng s kch hot mt lnh (instruction) v lnh ny s lm thay i ch thc hin ca TT t user mode vo kernel mode v lm cho kernel i thc hin m ca GHT. Lnh ny thng c gi l by h iu hnh fi operating system trap. Cc hm th vin s chuyn cho kernel s ca GHT theo cch thc ph thuc vo tng loi my tnh, hoc nh mt thng s cho trap qua mt thanh ghi xc nh hay n stack. T kernel s tm ra c GHT m user kch hot. Thut ton syscall Input: { .find entry in system call table corresponding to system call number; .determine number of parameters to system call; .copy parameters from user address space to u_area; .save current context for abortive return if there is; .invoke system call code in kernel; .if (error during execution of system call) { .set reg0 in user saved register context to error number; .turn on carry bit in status reg PS in user saved register context; } else .set reg0, reg1 in user saved register context to return values from system call; } y reg0 v reg1 l hai thanh ghi vn nng ca CPU. system call number (s ca GHT) Output: kt qu thc hin GHT

84 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

7. Chuyn bi cnh (context swich)


Qui vo m hnh chuyn trng thi ca TT, ta thy kernel cho php chuyn bi cnh trong cc hon cnh sau: S2 S4: TT t a vo trng thi ng (sleep), v rng s phi i 1 khong thi gian tri qua cho nhu cu c c ti nguyn (I/O: c/ghi data a, inode ang locked cha c gii kho...), thi gian ny l ng k, v kernel chn TT khc c th c thc hin; S9: TT thc hin mt exit() v vic chuyn bi cnh s xy ra lc kt thc exit v sau khng cn g phi lm vi TT , kernel tuyn chn mt TT khc thc hin; S1: Hon tt mt GHT hay khi kernel hon tt x l ngt nhng bn thn TT khng phi l TT c nhiu kh nng nht tip tc chy, nh vy cc TT khc c mc u tin cao hn c c hi thc hin;

S2

S2

Kernel m bo s thng nht ton vn ca cc c s d liu bng cch cm chuyn i bi cnh mt cch tu tin: trng thi ca cu trc d liu l bn vng trc khi chuyn bi cnh (tt c cc d liu c cp nht xong, cc hng i lin kt chun xc, cc kho (lock) c lp, nhm ngn cn s truy nhp bi cc TT khc v.v...). Cc bc chuyn bi cnh: { 1.Decide whether to do a context switch and whether a context switch is permissible now; /*sch lc*/ 2.Save context of old process; 3.Find the best process to schedule for execution; 4.If any, restore its context;/*chuyn sang context ca*/ /*TT c chn: khi phc */ /*li layer cui cng lc TT*/ /* ny chuyn bi cnh */ }

8. Thao tc khng gian a ch ca TT


Cho ti y ta c c m t cch kernel thay i bi cnh thc hin gia cc TT v cch kernel to cc lp (hay khungfilayer) ca stack. i vi cc min trong khng gian a ch ca TT, kernel cung cp cc GHT thao tc cc min . lm c vic ny, cn c cc cu trc d liu m t min cng nh nh ngha cc thao tc tng ng trn min. C mt thnh phn trong bng cc min (region table) cho cc thng tin cn thit m t mt min, l: 1. con tr tr vo inode ca tp m ni dung ca tp np vo min ; 2. kiu ca min (l code, hay stack, hay data, hay min nh chia s hoc ca ring ca TT); 3. kch thc ca min; 85 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ 4. v tr ca min trong b nh vt l (qua pages table); 5. Trng thi ca min ( kho(locked), min ang yu cu cp cho TT, ang c np vo b nh; min hp php, np vo b nh); 6. S m qui chiu cho bit tng s cc TT c truy nhp n min (min c kiu (thuc tnh) chia s). Cc thao tc trn min bao gm: 9.1. Kho (lock) v gii tr kho (unlock) min (b nh) Kernel cho php thao tc kho v gii kho mt min (tng t nh cc thao tc trn inode). Kernel c th kho v cp mt min sau gii kho m khng cn ti gii phng min. Kernel thao tc min cp, kho li ngn cn ccTT s truy nhp vo min sau . 9.2. Cp pht min (allocreg()). Khi pht sinh GHT fork(), exec() hay shmget() (chia s min), kernel s cp mt min mi cho TT. Kernel dng bng cc min (region table) vi cc thnh phn (u vo) lin kt ti mt danh sch cc min cn t do (free) hay danh sch ang s dng (active). Khi cp phtfiallocreg(), mt min cn t do tm thy u tin trong danh sch free s c a v danh sch active v gn cc thuc tnh cn thit. Thng thng mi TT u lin kt vi mt tp thc thi do exec() thc hin, cho nn allocreg() s t con tr inode trong region table tr vo inode ca tp thc thi . Khi min c tnh chia s, kernel tng s m qui chiu n min khi c TT khc truy nhp, ngn cn mt TT thc hin gii phng min khi chy link(). Hm allocreg() tr li min uc cp v kha. 9.3. Ghp mt min vo TT (attachreg()) Khi thc hin fork(), exec(), hay shmat() ghp min vo khng gian a ch ca TT. Min ghp c th l mt min mi, hay mt min chia s vi cc TT khc. Kernel m mt u vo trong pregion table ca TT, xc nh kiu ca min, ghi nhn a ch o ca min trong khng gian a ch o ca user. 9.4. Thay i kch thc min ca TT (growreg()) Khi TT m rng min b nh kernel phi thc hin mt s vic: - Khng chng cho a ch o (overlaping), - Min a ch tng cng khng vt qu gii hn cho php trong khng gian a ch o ca h thng. 9.5. Np mt min (loadreg()) i vi cc h dng k thut phn trang (paging), kernel s nh x ni dung ca mt tp vo khng gian a ch o ca TT trong qu trnh thc hin exec() v sp xp truy nhp cc trang vt l ring bit khi c yu cu (in demand). Nu h khng dng paging, kernel phi copy tp thc thi vo b nh: np cc thng s cc min ca TT vo cc a ch o khc nhau m ti tp s c np. Kernel c th s ni mt min cc vng a ch o khc nhau ni s np ni dung ca tp, v do vy s c nhng ch cch qung (gap) trong page table. np mt tp vo mt min, hm loadreg() s tnh ln ca gap chen gia cc min a ch o s ni vo cho TT, a ch o khi u ca min, m rng min theo lng b nh min cn c. Tip theo t min vo trng thi ang np no b nh, c d liu t tp vo min (bng GHT read()). 86 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Nu min text ang np l chia s cho nhiu TT, c th min s b truy nhp vo thi im ny, trong khi ni dung cha np hon tt, do vy kernel s kim tra c (flag) trng thi ca min, a TT vo sleep. Vo thi im cui cng ca loadreg(), kernel s i trng thi min thnh sn c (valid) trong b nh, nh thc cc TT i min cc TT truy nhp. 9.6. Gii phng mt min ca TT (freereg()) Khi mt min khng cn ni vo TT, kernel s gii phng min , a min vo danh sach lin kt ca cc min t do, bao gm: - Gii phng min a ch o cp, - Gii phng cc trang a ch vt l kt hp vi a ch o. 9.7. Tch mt min khi TT (detachreg()) L chc nng ngc li ca attachreg(), thc hin khi kt thc exec(), thc hin exit(), hy chia s shmdt(): - Cp nht mi cc register, cc u vo ca pregion table; - Nu s m qui chiu vo min = 0, v khng cn l do g tn ti (chia s chng hn) kernel sau s gii phng min (freereg()) - Nu s m qui chiu vo min khc c th truy nhp. 0 th gii tr lock cho min v inode tng ng TT

9.8. Nhn bn min ca TT (dupreg()) Khi thc hin fork(), kernel s nhn bn context ca TT gi fork() (TT b) to context cho TT con. - Nu min l chia s (code, data), kernel s khng nhn bn a ch ca min, ch cn tng s m qui chiu ti min, - Nu min khng chia s, kernel thc hin copy min: .cp u vo mi trong region table, .cp cc u vo mi trong page table, .cp vng nh vt l mi cho TT. V d: TTA (b) fork ra TT B (con), ta s c:

87 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

10. Tin trnh ng (sleep)


Phn trn cp n cc chc nng cp c s lin quan n s chuyn trng thi ca TT t sn sng thc hin trong b nh n/hay tr li thc hin trong kernel. Tip theo s l thut ton m t TT i vo trng thi ng trong b nh: S2 S4. Sau s l thut ton nh thc TT, a TT vo trng thi sn sng thc hin trong b nh S4 S3 hay S3 S5 sn sng thc hin nhng TT trn swap (a). Khi mt TT i ng (thng l khi thc hin mt GHT), TT thc hin mt by h thng (trap).

11. S kin (event) v a ch (addres) Ni rng TT i ng do ch i mt s kin no , thng thng l cho ti khi s kin xut hin v vo lc TT thc tnh v i vo trng thi sn sng thc hin hoc trong b nh hoc trn swap out. Mc d h thng ni ti ng mt cch tru tng, nhng cch p dng l nh x tp cc s kin vo tp cc a ch o ca kernel. a ch biu din cc s kn c m ho trong kernel, v kernel ch i s kin nh x n vo mt a ch c th. Tnh tru tng dn n vn l khng th phn bit c c bao nhiu TT ang i mt s kin v dn n hai iu khng bnh thng: khi mt s kin xut hin, th tt c cc TT ng i u c nh thc, v tt c u chuyn vo trng thi sn sng chy . iu th hai l c vi s kin li cng nh x ti mt a ch (ch). gii quyt, kernel s s dng gii php nh x mt - mt (one to one), v rng thc t cho thy nh x a s kin vo mt a ch rt t xy ra v mt TT ang chy thng gii phng ti nguyn kha, trc khi c TT khc c lp biu chy. TT lp biu nu khng nhn c ti nguyn th li chuyn vo sleep.

C. Kim sot tin trnh


88 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Phn trc nh ngha context v gii thch cc thut ton thao tc nhng g lin quan ti context. Phn ny s m t vic s dng v p dng cc GHT dng kim sot bi cnh ca TT, hay ngn gn l kim sot TT. Cc GHT s cp bao gm: fork(): to ra mt TT mi, exit(): kt thc thc hin mt TT, wait(): cho php TT b ng b vic thc hin ca mnh vi vic kt thc thc hin ca TT con, signal(): thng bo cho cc TT v cc s kin (khng ng b) xut hin, kernel li dng signals ng b vic thc hin ca exit v wait, exec(): cho php mt TT kch hot mt chng trnh mi. Bn cht ca exec l bin TT gi thnh TT mi. TT mi l mt tp thc thi v m ca n s ghi ln khng gian ca TT gi, v vy s khng c gi tr tr v khi exec thnh cng brk(): TT thu thm b nh mt cch linh ng cc kin trc chu trnh chnh ca shell() v init().

1. To tin trnh
To ra cc TT l mt im mnh trong Unix. Vy to ra cc TT lm g. Ngi lp trnh lun quan tm ti kh nng thc hin nhiu tc v ng thi trong khi pht trin mt ng dng, trong khi cng mun s dng li cc tin ch, cc hm c nng cao nng lc, hiu qu tnh ton ca my tnh. To TT l giI php p ng yu cu trn, bi v mt TT c to ra s chy song song vi TT to ra n. cng chnh l sc mnh a nhim m Unix c. Ta hy theo di qu trnh sau: Khi thc hin mt lnh my, cn gi l command (cmd), mt qui trnh c thc hin bao gm: Giao din ngi my, shell, nhn lnh (cmd) user a vo, sau shell to ra mt TT (con) thc hin cmd . Qu trnh ny xy ra qua hai bc:

89 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

1. shell to ra mt TT con chy cmd, tc to ra mt bi cnh sao cho lnh c th thc hin c. Qu trnh ny thc s l vic sao chp bi cnh ca TT b (shell) cho TT mi (TT con). Nh vy khi thc hin cmd th cmd ny s dng cc mi trng ca TT b sao chp cho n. Tuy nhin khng phi tt c mi trng ca TT b c sao chp cho TT con, m ch c cc phn tng th c sao chp, v phn ny bao gm: -mi trng xut (exported environment): -UID, GID ca TT b, cc u vo/ra chun (stdin, stdout), cc tp m, th mc root, th mc hin hnh, v cc thng tin h thng khc, danh sch cc bin tng th (global variables) v mt vi bin trong mI trng ring ca TT b cng c th xut cho TT con. -m chng trnh.

Chuyn thng tin t TT b cho TT con, cc phn fork sao chp TT gc TT to mi

2. Thc hin cmd trong bi cnh ca TT mi c to (s do scheduler sp xp: S8->S3 hay S8->S5). TT con s tr li cc kt qu khi kt thc thc hin cmd qua exit(). S to lp mt tin trnh mi thc hin bng lnh gi h thng fork. Fork() cho php mt tin trnh lp mt bn sao ca n, tr b nh dng tin trnh. Tin trnh gc t nhn bn chnh n c gi l tin trnh b v bn sao to ra c gi l tin trnh con. C php nh sau: pid = fork(); Khi thc hin xong, hai TT ni trn c hai bn sao user level context nh nhau (exported environment m hnh trn), v vi cc gi tr tr li pid khc nhau: 90 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ - trong bn thn m ca TT b, pid l s nh danh ca TT con; - trong bn thn m ca TT con, pid = 0 thng bo kt qu to TT l tt; (Ch : y khng phi l TT 0 Init nh ni, TT duy nht khng to ra bng fork()). Kernel thc hin cc bc sau khi fork(): Cc bc thc hin fork nh sau: 1. Cp cho TT mi mt u vo (entry) trong procces table; 2. Gn cho TT con mt s nh danh duy nht; 3. To ra bn sao logic bi cnh ca TT b cho TT con. V mt s phn ca TT c th chia s (v d min text chng hn) gia cc TT, kernel s tng cc s m qui chiu vo cc min thay v sao chp min trong b nh vt l. 4. Tng s m qui chiu trong bng cc tp m (file table) kt hp vi TT (m TT b m, TT con tha k s dng, tc l c hai thao tc trn cng mt tp), bng inode (inode table) v TT con tn ti trong cng th mc hin hnh ca TT b, nn s truy nhp tp th mc +1. 5. Tr li s nh danh pid ca TT con cho TT b.

91 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Cc c s d liu ca kernel sau khi fork() :

fork() to ra bi cnh cho TT mi Thc t thut ton fork() khng n gin v TT mi c th i vo thc hin ngay v ph thuc vo h thng kiu swaping hay demand paging. n gin chn h vi swaping v gi nh rng h c b nh cha TT con, thut ton s nh sau: fork() input:

none - 0 to child process;

output: - PID for parent process /* Process ID*/ { 92 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ .check for available kernel resources; .get free process table entry (slot), unique ID number; .check that user not running too many processes; .mark child state is being created; .copy data from parent process table entry to new child entry;/*dup*/ .increment counts on current directory inode and changed root (if applicable); .increment open file counts in file table;/*Ref. count of fds = +1*/ .make copy of parent context (u_area, text, data, stack) in memory; /*create user level context (static part) now in using dupreg(), attachreg(). Except that the content of childs u_area are initally the same as of parents, but can diverge after completion of the fork: the pionter to its process table slot. Note that, if nows parent open new file, the child cant access to it !!! */ .push dummy system level context layer onto child system level context; /*Now kernel create the dynamic context for child: copy parent context layer 1 containing the user saved register context and the kernel frame stack of the fork system cal. If kernel stack is part of u_area, kernel automaticlly create child kernel stack when create the child u_area. If other method is used, the copying is needed to the private memory associated with chile process. Next kernel creates dummy context layer 2 for child containing the saved register context for lauer 1, set program counter . other regs to restore the child context, even it had never executed before and so that the child process to recognize itself as child when it runs. Now kernel tests the value register reg0 to decide if process is parent (reg0=1) or child (reg0=0).*/; .if (executing process is parent process) { /* After all, kernel set child to ready to run in memory, return PID to user */ .change child state to ready to run; .return(child PID); /*from system to user*/ } .else { /* and it start running from here when scheduled executing process is the child process: Child executes part of the code for fork() according to the program counter that kernel restored from the saved regiter context in context layer 2, and return a 0 from the fork()*/ initialize u_area timing field; return(0); } } /*to user*/

93 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Trong thut ton ny cn lu mt s im: i vi h swaping cn c ch to TT con hoc trong b nh hoc trn swap (a). i vi h paging phi cp pht cc trang trong page table. Nu khng b nh, fork() s khng thnh cng, TT con khng c to ra. S PID l s duy nht cho mi TT, thng l s ln hn 1 so vi s cui cng dng. Tuy nhin do mt s TT c cuc i ngn nn PID c th s c dng li. H thng ng thi t mt s gii hn trn tng s TT cho mt user sao cho h khng b kt (deadlock) do phi i ti nguyn. Kernel khi ng cu trc TT ca TT con bng cch sao chp cc trng t cu trc ca TT b trong Process Table. TT con tha k t TT b cc loi user (real user, effective user ID, group user ID), s u tin (nice priority) dng thng k sp xp li mc u tin. Kernel gn PID ca TT b vo cu trc ca TT con, da TT con vo cy ph h ca TT b, khi ng cc thng s lp biu (nh ga tri mc u tin khi u, thng s s dng CPU khi u, cc trng thi gian), trng thI ca TT lc ny l ang c to S8. Kernel iu chnh li cc s m qui chiu vo cc tp TT b m, +1, v TT con s t ng kt hp ti. V TT con tn ti trong th mc ca TT b, nn tng s cc TT truy nhp th mc tng 1, tng t nh vy s m qui chiu ca inode cng tng 1. Nu TT b , hay mt trong cc t tin thc hin mt GHT chroot i ng dn, TT con mi s tha k v s m inode qui chiu tng 1. Kernel cui cng tm n s m qui chiu cc m t tp ca mi tp TT b m trong file table v tng 1. TT con khng ch tha k c cc quyn trn tp TT b m m cn chia s truy nhp tp vi TT b bi c hai TT u cng thao tc cc u vo trong file table. Hiu qu ca fork() l tng t ca dup() (nhn bn) theo quan im m tp, ch khc l c hai bng con tr tp (file descriptor table), mi bng trong u_area ca mi TT, u tr ti cng mt tp trong file table. (Xem hnh di). Lc ny kernel sn sng to user_level context (static) cho TT con (u_area, cc min, pages) bng vic nhn i tng min ca TT b cho TT con bng dupreg() v ghp vo cho TT con bng attachreg(). Sau kernel to tip phn dynamic ca context: copy layer1 context ca TT b, layer ny cha register context ca user c bo v, cng nh cc lp kernel stack ca GHT fork()... C ch thc hin cc bc lc ny tng t nh khi thc hin chuyn bi cnh ca TT. Khi context ca TT con chun b xong, TT b hon tt fork() bng vic thay i trng thi ca TT con thnh ready to run (in memory) v tr li PID cho user. TT con s c thc hin theo cch lp biu thng thng bi scheduler. Hai TT b v con thc s l hai TT chy c lp trong h, thng thng m thc thi ca TT con c ngi lp trnh xc nh khi thc hin mt kim tra vi PID=0. Kernel kch hot m ny t b m chng trnh m kernel lu trong khi to bi cnh cho TT con t TT b v lp saved register context trong layer 2 nh cp. Hnh di m t qu trnh to bi cnh cho TT con trong m hnh vi kernel stack l mt phn ca u_area ca mi TT. Nu l m hnh khc th TT b s sao chp kernel stack ca n vo vng nh ring kt hp ca TT con. Cn cc m hnh khc kernel tack ca TT b v TT con l ng nht nh nhau.

94 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

V d: TT b v TT con cng chia s tp (do TT b m): copy.c ($copy tep1 tep2) #include <fcntl.h> int fdrd, fdwt; char c; main(argc, argv) int argc; char *argv[]; { if (argc !=3) exit(1); if ((fdrd = open(argv[1], O_RDONLY)) ==-1) exit(1); if ((fdwt = creat(argv[2], 0666)) ==-1) exit(1); fork(); /*c hai TT cng thc hin code nh nhau:*/ rdwrt(); close(fdrd); 95 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ close(fdwt); exit(0); } rdwrt() { for (;;) { if(read(fdrd,&c,1)!=1) return; write(fdwt,&c,1); } } Chng trnh trn thc hin copy tp khi user kch hot vi hai i u vo l tn tp c v tn tp s to. Bn trong kernel sao chp context ca TT b cho TT con. Mi TT thc hin trong mt khng gian a ch khc nhau, truy nhp bn copy ring ca cc bin tng th fdrd v fdwt, c, v bn copy ring stack cc bin argc, argv v gi hm rdwrt() c lp. Bi v kernel sao chp u_area ca TT b cho TT con nn TT con tha hng truy nhp tp m TT b m: y cc m t tp fdrd, fdwt ca c hai TT u qui chiu v cng cc u vo trong file table: fdrd (tp ngun), fdwt (tp ch), s m qui chiu vo mi tp tng ln thnh 2, c hai TT dng chung cc ga tr ca file offset (thay i mi ln thc hin rdwrt()), nhng cc gi tr li khng ging nhau, v kernel thay i gi tr sau mi ln gi read() v write() ca mi TT v mc d c nhng hai ln copy tp do thc hin chung m lnh (cc lnh sau fork(): hm rdwrt()), kt qu s ph thuc vo trnh t TT no s thc hin cui cng (do scheduler sp t): kernel khng m bo rng tp ch c ni dung ging hon ton tp gc (th ngh ti kch bn nh sau: hai TT ang thc hin read() hai k t ab trong tp ngun. Gi s TT b readt() t a (con tr tp file offset tng tr vo b sau khi xong read()) v kernel chuyn sang thc hin TT con, trc khi n kp ghi a vo tp ch. TT con read() (s c b theo gi tr ca file offset hin ti, v sau tng 1) v gi s n thc hin c write() ghi xong b vo tp ch. TT b tr li chy, n ghi a c trc khi b treo thc hin (theo file ofset TT con tng. Kt qu lc ny trong tp ch s l xu ba ch khng phI l ab nh tp gc !.) iu g xy ra: l do qu trnh thc hin hai TT khng lun phin nh s mong mun m do kernel sp t theo hon cnh chung ca h thng. /*end of file*/

96 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

V d: To mt TT con, hai TT b v con cng chia s phn m thc thi ngay sau khi fork thnh cng: #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> main() { printf( TT b: Bt u to TT con. (Dng lnh ny in ra t m ca TT b)\n); fork(); /* To TT con, khng xc nh m ring*/ printf( PID= %d \n, getpid()); /* Bt u m chung (shared code)*/ execl(/bin/ls/,ls, -l,0); printf(Nu in ra c dng ny, execl() khng thnh cng !!!\n); } Phn in m l shared code ca hai TT, v kt qu thc hin s l: - In ra hai dng vi PID khc nhau, l PID ca TT b v PID ca TT con; - Hai kt qu danh sch th mc do hai TT thc hin lnh ls l.

2.

Tn hiu (signals)
97

________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Tn hiu (signals) l loi ngt mm, thng bo cho cc TT v s xut hin ca cc s kin (events) khng ng b, cng nh cho mt phng thc x l cc s kin . Cc TT c th gi cho mi TT khc cc tn hiu bng GHT kill(), hoc kernel gi tn hiu bn trong h thng. M hnh v signal trn cc h Unix c khc nhau v khng tng thch (nh gia 4.3 BSD v SVR3), tuy nhin vi chun POSIX.1 cc th tc c chun ho v m bo c tin cy cao. Unix System V Realse 4 v 4.3+BSD c 31 loi signals (nh ngha trong <signal.h>) v c phn chia nh sau: 1. signal thc hin kt thc ca mt TT, c gi i khi TT gi exit() hay khi TT kch hot GHT signal() vi thng s death of child- TT con kt thc; 2. signal thng bo cc trng hp bt thng do TT gy ra, nh khi TT qui chiu vo min a ch o khng phi ca n, TT ghi vo min a ch ch c, TT thc hin cc lnh c quyn m TT khng c php, hay cc s c phn cng; 3. signal thng bo cc iu kin khng th khc phc c khi thc hin GHT, nh ht ngun ti nguyn khi thc hin exec() m khng gian a ch TT gc khng np m ca chng trnh c kch hot; 4. signal pht sinh do li khng d on c khi thc hin GHT, v d thc hin mt GHT khng c trong h (s hiu GHT khng tn ti), hay ghi vo mt pipe m khng c TT no c pipe ... H thng s bn vng hn khi thot khi cc li nh vy thay v pht sinh ra cc signals, nhng s dng signals thot khi cc x l hn tp li c tnh thc t hn; 5. signal sinh ra t cc TT trong user mode, chng hn khi TT mun nhn tn hiu alarm sau mt chu k thi gian, hay khi TT gi signals bt k cho mi TT khc bng kill(); 6. signal lin quan ti tng tc vi thit b u cui khi ngi dng treo my (hung up), hay khi tn hiu sng mang ng truyn (carrier) b mt, hay khi ngi dng g break,delete trn bn phm; 7. signal dng theo di thc hin TT (tracing). gi mt signal cho mt TT, kernel lp signal bit trong trng signal ti u vo ca TT trong process table, tng ng vi kiu signal s nhn. Nu TT ang ng mc ngt c u tin, kernel s nh thc TT. Cng vic ca ngi gi tn hiu (mt TT hay kernel) coi nh hon tt. Mt TT c th nh c cc kiu signal khc nhau, nhng khng th ghi li c bao nhiu signal n nhn c ca mi kiu. V d nu TT nhn tn hiu hungup v kill, n s lp cc bits tng ng vi cc tn hiu trong trng ni trn, nhng khng th bit c bao nhiu ln cc tn hiu ny n. Kernel kim tra tip nhn mt signal khi ang chuyn trng thi t kernel mode v user mode (S2 S1) v khi TT i vo hay ra khi trng thi ng (t S2 vo trng thi ng S4 trong b nh , hay t S3 tr li S2 khi TT c chn thc hin) mt mc u tin lp biu thp thch hp. V kernel thao tc cc signal ch khi mt TT t kernel mode tr v user mode, nn signal khng c hiu ng tc th trn TT ang chy trong kernel mode. Nu TT ang chy trong user mode, v kernel ang thao tc mt ngt s sinh ra mt signal gi cho TT , kernel s ghi nhn v thao tc signal y khi kt thc x l ngt. Cho nn mt TT khng bao gi thc hin trong user mode trc khi kernel x l cc signal cn ang i. Di y l thut ton kernel s thc hin xc nh khi mt TT nhn mt signal. Mt TT c th quyt nh t chi nhn signal hay khng bng thc hin GHT signal(), do vy trong thut ton ny kernel s n gin b qua cc ch bo i vi cc tn hiu m TT mun 98 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ b qua, nhng ghi nhn s tn ti ca signals m TT ti. issg() :Kernel thc hin chc nng ny cc thi Im: S2->S4, S3->S2, S7->S1 v S2->S1, kim tra bit TT nhn mt tn hiu: trng signal trong u vo ca TT proces table khc 0. input: none f process received signal that it does not ignore, false: otherwise { .while(received signal field in process table entry not 0) { .find a signal number sent to the process; .if (signal is dead of child) /* l kiu signal TT con kt thc, cn zombie nhn c*/ { if (ignoring dead of child signal) free process table entries of zombie child; else if (catching dead of dead child signals) return(true);/*khng b qua, nhn x l*/ } .else if (not ignoring signal) /*nhn cc loI signals khc*/ return(true); .turn off signal bit in received signal field in process table; /*lp li ga tr ban u=0 ( reset field)*/ } .return(false);/*khng c signal no gi n cho TT*/ } output: true:

2.1. X l tn hiu Nh cch phn loi trn c th thy rng signal l lp cc s kin d b, xut hin ngu nhin i vi TT. TT do khng th kim tra xem signal n, m thay vi TT ni vi kernel theo cch nu v khi signal n, th lm nh sau . C ba vic khc nhau TT ni cho kernel v kernel thc hin, l chun b v hnh ng kt hp vi signal: TT thc hin mc nh, tc l phn ng t nhin i vi mi tn hiu, l kt thc TT. TT b qua signal, l trng hp cho hu ht cc tn hiu, tr SIGKILL v SIGTOP cung cp cho superuser bit quyt nh hu dit hay dng chy tip mt TT. Thm na nu b qua mt vi signal pht sinh t phn cng (qui chiu sai b nh, chia cho 0), th x s ca TT s khng d n c. 99 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ n nhn v ni cho kernel gi mt hm chc nng x l m user nh ngha (user function). V d khi mt TT kt thc, tn hiu SIGCHLD s pht sinh v gi cho TT b, nh vy TT b s dng hm chc nng, nh waitpid() chng hn, n nhn SIGCHLD, tm PID ca TT v kim tra m trng thi TT tr li. Mt v d khc, Khi TT to ra mt tp tm thi v nu mun xo tp i sau khi s dng, cn mt to mt hm nhn SIGTERM khi TT gi kill() xo tp . Nhc li rng, kernel thao tc tn hiu trong bi cnh ca TT nhn tn hiu, do TT phi c chy hay ng hn l khi TT va ra khi kernel mode bt u chy trong user mode nh ni, x l tn hiu. Ch mc nh l thc hin gi exit() trong kernel mode ( S2->S9), tuy nhin TT c th xc nh mt hnh ng c bit chp nhn mt s signals. GHT signal() l giao din n gin nht tip cn cc signals, ngha s dng l: lp hm x l nu TT nhn signal. C php GHT signal() (lm g khi nhn mt signal) nh sau: #include <signal.h> oldfunction = signal(signum, function) Trong : signum: s hiu ca signal, xc nh hnh ng s thc hin, v d: tn hiu: #define SIGHUP #define SIGINT #define SIGQUIT #define SIGILL #define SIGTRAP #define SIGABRT #define SIGIOT #define SIGBUS #define SIGFPE #define SIGKILL #define SIGUSR1 #define SIGSEGV #define SIGUSR2 #define SIGPIPE #define SIGALRM #define SIGTERM #define SIGSTKFLT #define SIGCHLD #define SIGCONT #define SIGSTOP #define SIGTSTP #define SIGTTIN s hiu 1 2 3 4 5 6 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 m t: Hang up ; phn ng mc nh: kt thc TT

Ctrl_C; kt thc ngay tc khc TT QUIT; Illegal instuction Li phn cng; kt thc v to tp core Crtl-\; Kt thc ngay tc khc TT asynch; I/O trap kt thc hoc b qua

kill; Dit TT ngay tc khc

Crtl_DEL; exit(), Chm dt tt c cc TT ang chy

Crtl_Z; Tm dng TT 100

________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ #define SIGTTOU #define SIGURG #define SIGXCPU #define SIGXFSZ #define SIGVTALRM #define SIGPROF #define SIGWINCH #define SIGIO #define SIGPOLL #define SIGLOST #define SIGPWR #define SIGSYS 22 23 24 25 26 27 28 29 SIGIO 29 30 31

function = a ch ca hm x l ca user m TT s kch hot, hay cc hng sau y: = 1 (hay SIG_IGN), TT s b qua s hin din ln ti ca signal, tuy nhin c hai signal khng c b qua l SIGKILL v SIGSTOP); = 0 (hay SIG_DFL), hnh ng kt hp vi signal l mc nh (xem man signal lit k c signal v hnh ng mc nh). Phn ln hnh ng l kt thc TT v ghi tp nh (core) ca TT degug. oldfunction: gi tr tr li l con tr ca function tng ng hnh ng trc ca signal, thng dng khi phc li chc nng trc . u_area ca TT c mt danh sch vi cc trng cc con tr tr vo cc x l tn hiu ca h thng. Kernel lu a ch hm x l ca user trong mt trng tng ng vi s hiu ca signal . Qu trnh x l mt signal khng tc ng ti signal khc. Thut ton thao tc signal nh sau: psig() (kernel primitive): thc hin chc nng ny thi im TT va ra khi kernel, vo user mode S2-S1, S7-S1, khi ghi nhn s hin din ca signal nu x l, chun b context. input: { .get signal number set in process table entry; .clear signal number in process entry;/*cho ln nhn tip sau */ .if (user had called signal system call to ignore this signal) return; /*done*/ if (user specified function to handle signal) /*ly cc i m signal() cung cp, chun b mI trng chy chc nng x li signal*/ { .get user virtual address of signal catcher stored in u_area; .clear u_area entry after get virtual address; 101 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni none output: none

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ .modify user level context: (-create user stack, -call function handling signal); .modify system level context: write address of signal function into program counter field of user saved register context; .return; } .if (signal is type that system should dump core image of process) /*v d:SGTRAP hardware fault*/ /*function set=0, default ->exit, dump core image of the proccess, then exit. T tp ce image, ngi lp trnh dng debug nu mun: nh TT thc hin illegal function, hay outside virtual address space (thuc din cc li). y kernel ch dump cc signal lm hng chng trnh m thI, cn cc sgnal khc nh: user g del:, break kt thc vnh cu chng trnh hay hungup thng bo t/b cui khng ni vo h thng na, s khng tc dng dump*/ { .create file named core in current directory; .write contents of user level context to core file; } .invoke exit() immediately; /*default*/ } Khi TT nhn signal m trc TT quyt nh b qua, TT tip tc chy nh khi khng c signal n. V kernel khng xo trng ghi nhn trong u_area (=1) trc , TT s li b qua nu signal li xut hin. Nu TT nhn signal quyt nh nhn, TT s thc hin hm x l tng ng vi signal ngay khi TT tr li trong user mode, sau khi kernel thc hin cc bc sau: kernel truy nhp user saved register context, tm li gi tr ca progam counter v stack pointer lu tr v TT ca user; xo trng x l signal trong u_area, t li bng mc nh; to khung stack mi trong user stack (trong user - context level). Ghi vo gi tr progam counter v stack pointer ni trn, xin cp vng b nh mi nu cn; kernel thay i user saved register context: np progam counter = a ch ca hm x l signal, lp gi tr tip theo cho user stack pointer trong user stack. Sau bc chun b bi cnh ny, lc TT tr v user mode, TT s thc hin hm x l signal. Khi kt thc x l signal, kernel s tr v v tr trong m thc thi ca user ni mt GHT hay mt interrupt xut hin. 2.1.1 B qua, khng x l tn hiu: signal(SIGINT, SIG_IGN), s v hiu ho t/h, nu c t/h ngt n (v d gy ra bi interrupt KEY, SIGQUIT do n phm quit, HUNGUP); Khi g interupt key trn console kt thc mt chng trnh, thi hiu ng s lan n c cc chung trnh chy nn ca user . trnh trng hp ny, s dng SIG_IGN khi c SIGINT n vi TT. V d sau minh ha SIGINT ch c hiu lc vi TT b, trong khi TT con vn tip tc chy: #include <signal.h> 102 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ main() { . . if (fork() == 0) { signal (SIGINT, SIG_IGN); . . } } 2.1.2 Khi phc li phn ng mc nh: signal(signum, SIG_DFL), xc dnh x l i vi signum l nh mc nh. V d: #include <signal.h> #include <stdio.h> main() { FILE * fp; char record [ BUFSIZE], filename [100]; signal (SIGINT, SIG_IGN); /*S b qua interrupt signal trong khi ghi tp*/ fp = fopen (filename, a); fwrite (record, BUF,1,fp); signal (SIGINT, SIG_DFL); /*KhI phc li phn ng mc nh cho ngt*/ } 2.1.3 Nhn signal x l: xc nh hm x l cho tn hiu, hay thay i t phn ng mc nh sang x l xc nh: #include <signal.h> main() { int catch(); printf( N Ctrl_C dng chy trnh.\n); signal (SIGINT, catch); /*Ci nhn signal v s x l theo catch()*/ while(){ /*cc lnh ca trnh*/ } 103 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ } /*Hm x l:*/ catch() { printf ( Chng trnh kt thc.\n); } 2.1.4 Khi phc li chc nng ca signal trc : V d: Khi phc li chc nng ph thuc vo gi tr tr li ca hm keytest(): #include <signal.h> main() { int catch1(), catch2(); int (*savesig)(); /* l con tr hm*/ if (keystest() ==1) signal(SIGINT, catch1); /*Khi c phm interrupt th catch1 hay catch2*/ else signal(SIGINT, catch2); savesig = signal (SIGINT, SIG_IGN);/*Nu b qua, th ly li hm trc */ computer(); signal (SIGINT, savesig); /* khI phc li phn ng vi interrupt key*/ } V d: on m m t h thng s v hiu ho tt c cc signal SIGINT v SIGQUIT trong khi TT con chy, cho ti khi n kt thc, h s khi phc li cc chc nng x l xc inh cho cc signal . Vic khI phc c thc hin trong TT b. Nu wait() tr li code -1 (khng cn TT con no na) th TT b s dng lun lm gi tr tr li ca n cho h thng. #include <stdio.h> #include <signal.h> system(s) char *s; { int status, pid,w; register int (*istat)(), (*qstat)(); 104 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni /*Chy dng lnh*/

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ if ((pid = fork()) == 0) { execl(/bin/sh, sh, -c, s, NULL); exit(127); } istat = signal (SIGINT, SIG_IGN); /*b qua khng x l nhng ly li con tr hm mc nh*/ qstat = signal (SIGQUIT, SIG_IGN); while ((w = wait(&status)) != pid && w != -1) ; if( w == -1) status = -1; signal (SIGINT, istat); signal (SIGQUIT, qstat); return( status); } 2.1.5 n nhn vi tn hiu V d dng mt hm x l nhn nhiu tn hiu, s dng s hiu ca tn hiu do h thng chuyn n nh l thng s: #include <signal.h> main() { int I; int catch(); for (i=1; i <= NSIG; i++) signal (i, catch); /* m lnh chng trnh */ } catch(sig) { signal(sig, SIG_IGN); if (sig != SIGINT && sig != SIGOUT && sig != SIGHUP) printf(Oh, oh. Tn hiu s %d nhn c. \n.sig); unlink (tmpfile); exit(1); 105 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni /*KhI phc li phn ng ca signal nh trc*/

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ } Trong hng NSIG l tng s cc tn hiu c nh ngha trong signal.h. Lu l phn ng u tin ca hm catch() b qua tn hiu xc nh nhn c, l cn thit v h t ng llp li phn ng mc nh. 2.1.6. Dng signal kim sot thc hin chng trnh Tn hiu (t/h) khng nht thit ch dng kt thc thc hin mt chng trnh,mt s t/h c th nh ngha li trf hon hnh ng hay tc ng kt thc mt phb no ca chng trnh, ch khng phI ton b. Sau y l cc cch dng t/h kim sot thc hin chng trnh. a) Tr hon tc ng ca signal Bng cch bt t/h v nh ngha li hnh ng ca t/h qua c (flag) tng th, sao cho t/h s khng lm g c, thay vo chng trnh vn chy v s i kim tra c xem c signal no nhn hay khng, trn c s s tr li theo gi tr ca c. im c s y l, nhng hm dng nhn t/h s tr li thc hin chnh xc ch m chng trnh b ngt. Nu hm thot ra bnh thng th chng trnh tip tc chy nh cha h c t/h xut hin. Lm tr t/h c ngha c bit i vi cc chng trnh khng c dng bt k thi im no. V d trong khi cp nhn danh sch lin kt, t/h khng th tc ng ln qu trnh ny b gin on, v nh vy s dn nvic danh sch s b hu hoi. on m sau y dng hm delay() bt t/h ngt s lp li c tng th sgflag v tr v nagy lp tc imtrnh b ngt. #include <signal.h> int sgflag; main() { int delay(); int (*savesig)(); signal(SIGINT, delay) /*Khong xu li t/h, chi lam tre lai*/ updatelist(); /* L chc nng khng th gin on*/ savesig = signal(SIGINT,SIG_IGN); /* Cm (disable) t/h li tr sigflag thay i*/ /*trong khi kim tra */ if(sigflag) { /* m x l t/h ngt nu xut hin*/ } } delay() { signal(SIGINT, delay); /*Mt ln na t li , v h t t/h v x l mc nh: kt thc*/ 106 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ /*thc hin chng trnh do INT*/ sigflag = 1; /* c t/h xut hin, set sigflag = 1*/ } b) Dng t/h tr vi cc hm ca h thng Khi mt chng trnh dng t/h b lm tr trong khi gi cc hm h thng, chng trnh phI c phn kim tra gi tr tr li ca hm gi m bo rng li tr li khng gy ra bi t/h ngt. iiu ny cn thit v khi dng t/h tr ngt cc hm h thng (nh read(0, write()), h thng s khin cc hm ny kt thc v tr li li. V vn l nu chng trnh din t li hm h thng gy ra bi t/h tr li nh li thng thng, th s dn n sai ln nghim trng. V d khi chng trnh c cc k t t bn phm m nhn c t/h ngt, th tt c cc k t nhn c trc s b mt (do h tc ng kt thc c bn phm, bo li) v nh vy ging nh cha c k t no g t bn phm. V d sau chng trnh s kim tra gi tr hin ti ca c ngt ntlag v gi tr tr li EOF ca getchar() l khng nh l kt thc tp thc s. if(getchar() == EOF) if (nflag) /* EOF l do INT gy ra*/ else /* y mi l EOF thc s*/ c) Dng signal vi cc chng trnh tng tc (interactive) Cc trnh tng tc thng s dng nhiu lnh (commmand), nhiu thao tc (operation) khc nhau. V d trong x l vn bn, ngt mt thao tc hin ti (nh hin th tp), v tr v chng trnh gc (i nhn lnh), ta c th dng t/h. lm c iu ny, hm dng nh ngha li hnh ng ca t/h, phI c kh nng tr li vic thc hin ca chng trnh v tr c ngha ch khng phI v tr b gin on. Hai hm th vin C setjmp() v longjmp() h tr cng on ny. setjmp(buffer): bo v bn sao trng thI thc hin ca trnh; longjmp(buffer): chuyn trng thi ang thc hin v li trng thi c bo v trc vi cc gi tr, cc trng thi ca cc thanh ghi nh cha c g xy ra. buffer: bin lu trng thI thc hin, khai bo theo kiu jmp_buf trc khi dng. V d bo v trng thI thc hin ca mt chng trnh vo bin oldstate: jmp_buf oldstate; setjmp(oldstate); bin oldstate sau s cha cc gi tr nh ca b m chng trnh, d liu, thanh ghi a ch, trng thI ca CPU. Cc gi tr ny tuyt i khng c bin i. V d: #include <signal.h> #inlude <setjmp.h> 107 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ jmp_buf sjbuf; main() { int onintr(); setjmp(sjbuf); signal(SIGINT, onintr); /*M ca chng trnh chnh, ngt c th xy ra trong khi thc hin*/ } onintr() { printf(\Interrupt n y!\n); longjmp(sjbuf); } 2.1.7. Dng cc signal trong nhiu TT V nguyn tc khi c t/h ti mt terminal, th t/h s ti tt c cc chng trnh kch hot ti terminal , k c l trnh chy ch nn hay cc TT con. Phn ny s giI thch vic s dng t/h trong nhiu TT. a) Bo v cc TT chy nn Cc chng trnh chy nn t shell (vi k t & sau lnh) u c shell bo v trnh b dng thc hin khi c ngt t terminal. C nhng trng hp TT chy nn cng mun bt t/h ca n. Nu thc hin c, th vic bo v chng ngt ca shell cho n tht bi, t/h m cc chng trnh khc mong i s ngt c n. ngn chn c uu ny, bt k chng trnh no s l TT chy nn, phI kim tra trng thI hin ti ca t/h, trc khi xc nh li phn ng ca t/h. Chng trnh ch c th ng ngha li phn ng ca t/h khi t/h cha b cm. V d sau cho thy, phn ng ca t/h thay i ch ny t/h hin ti khng b b qua: #include <signal.h> main() { int catch(); if (signal(SIGINT, SIG_IGN) != SIG_IGN) /* Nu shell cha thc hin v hiu t/h th*/ signal(SIGINT, catch); /* M ca chng trnh*/ }

108 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ b) Bo v cc TT b Mt chng trnh (l TT b) c th i TT con kt thc bng wait() ch khi n c th t bo v bn thn bng cch v hiu t/h ngt, trc khi gi GHT wait(), Bng cch ny, TT b ngn chn cc t/h n vi TT con c th lm kt thc li gi wait(). Lm nh vy ngn cn c li nghim trng c th xy ra khi TT b tip tc thc hin trc khi TT con kt thc. V d: #include <signal.h> main() { int (*saveintr)(); if (fork() == 0) { execl(); } saveintr = signal( SIGINT, SIG_IGN); /*TT b v hiu ho t/h ngt ngay sau */ /*khi to TT con*/ wait(&status); signal(SIGINT, saveintr); /*khoi phc li x l ngt*/ } 2.1.8. Tng tranh trong x l ngt Thut ton x l tn hiu cng cn c mt s vn , chng hn khi TT ang x l mt signal th signal khc n. Signal ny c th cng hay khc kiu v c th cng tc ng n TT. Ta ni c s tng tranh gia cc signal. Nh cp, kernel xo trng cha a ch ca hm x l ngt trong u_area ca TT trc khi TT tr v user mode x l tn hiu bng hm nh. Vy nu TT mun nhn v x l signal ln na, th trong hm x l TT phi gi li signal() trc. Nhng nu signal n trc khi TT kch hot signal() th s xy ra s chy ua (tng tranh): trong khi TT ang trong user mode, kernel c th chuyn bi cnh TT c c hi nhn signal trong khi TT cha kch hot c signal(). V d: TT dng GHT signal() nhn tn hiu ngt v thc hin chc nng sigcatcher(). Sau TT to mt TT con, kch hot nice() t h thp mc u tin ca n xung so vi TT con v chuyn vo vng lp v tn. TT con dng thc hin trong 5 giy TT b thc hin xong nice() v xp li mc u tin. Sau TT con i vo chu trnh, gi tn hiu ngt bng kill() cho TT b trong mi chu k tng tc. Nu kill() tr li li (-1), c th TT b khng cn tn ti, TT con s kt thc bng exit(). tng y l TT b c th kch kot signal() mi ln n nhn tn hiu ngt: Hm x l ngt in thng bo v gi lp li signal() n nhn tn hiu ln tip sau. #include <signal.h> sigcatcher() { 109 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ printf(PID %d caught one \n,getpid()); signal(SIGINT,sigcatcher); } main() { int ppid; signal(SIGINT,sigcatcher);/* TT b lp hm x l cho tn hiu ngt SIGINT*/ if (fork() == 0) /*TT b to TT con*/ /*code ca TT con: */ { /* mt khong thi gian cho 2 TT xc lp*/ sleep(5); ppid = getpid(); /* ly pid ca TT b, TT con dng kill() gi SIGINIT*/ /* cho TT b nu b cn sng:*/ for (;;) if (kill(ppid,SIGINIT) == -1)/* Nu TT b khng cn tn ti*/ exit(); } /*TT b h mc u tin ca mnh: */ nice(10); for(;;); /* TT b chy lng vng tn ti*/ } Trnh t cc s kin c th xut hin nh sau: 1. TT con gi t/hiu ngt cho TT b; 2. TT b bt c t/hiu, thc hin sigcatcher(), nhng kernel chen ngang v chuyn bi cnh trc khi TT b c th cho chy sigcatcher() ln tip theo; 3. TT con li c chy v gi t/hiu ngt cho TT b; 4. TT b nhn t/hiu ngt ln th 2, nhng khng x l c (do kt qu 2.), Khi tip tc chy, TT kt thc (exit). Cc cch gii quyt tng tranh giI quyt s tranh chp ny, Unix h cung cp cc hm sau: #include <signal.h> sigmask(); sigsetmask(); Linux: #include <signal.h> sigprocmask(int how, const sigset_t *set, sigset_t *oldset); Cu trc lu cc t/h dng thm hay loi b khi mask, hm dng x l bin cu 110 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ trc: Khai bo: Khi to bin: Thm mt signal vo cu trc: sigset_t mask_set; sigemptyset (&mask_set); sigaddset ((&mask_set, SIGTSTP); sigaddset ((&mask_set, SIGINT); Loi b mt signal khi cu trc: sigdelset ((&mask_set, SIGTSTP); Xc nh signal c hay khng trong cu trc: sigismenber ((&mask_set, SIGTSTP); t tt c cc signal ca h vo cu trc: sigfillset ((&mask_set); V d: n s ln Crtl-C, n ln th 5, hi ngi dng v nh thc t, v nu c Crtl_Z s in ra s ln n Crtl_C: #include <stdio.h> #include <unistd.h> #include <signal.h> int ctrl_c_count = 0; #define CTRL_C_MAX 5

void catch_int(int sig_num) /*hm x l phn ng ca INT khi c Crtl_C*/ { sigset_t mask_set; /* Khai bo*/ sigset_t old_set; signal(SIGINT, catch_int); /* Bt Crtl_C*/ sigfillset(&mask_set); /* Kha cc t/h khc x l INT*/ sigprocmask(SIG_SETMASK, &mask_set, &old_set); ctrl_c_count++; if (ctrl_c_count >= CTRL_C_MAX) { char answer[30]; printf("\nRealy Exit? [y/N]: "); fflush(stdout); gets(answer); if (answer[0] == 'y' || answer[0] == 'Y') { printf("\nExiting...\n"); fflush(stdout); exit(0); } else { printf("\nContinuing\n"); fflush(stdout); ctrl_c_count = 0; } 111 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ } sigprocmask(SIG_SETMASK, &old_set, NULL);/*KhI phc li nh c*/ } void catch_suspend(int sig_num) { sigset_t mask_set; sigset_t old_set; /* Chn bt Crtl_Z*/

signal(SIGTSTP, catch_suspend); /* Cc bc nh trn*/ sigfillset(&mask_set); sigprocmask(SIG_SETMASK, &mask_set, &old_set); printf("\n\nSo far, '%d' Ctrl-C presses were counted\n\n", ctrl_c_count); fflush(stdout); sigprocmask(SIG_SETMASK, &old_set, NULL); } /* Dch v chy trnh ny*/ int main() { signal(SIGINT, catch_int); signal(SIGTSTP, catch_suspend); printf(Please random press Ctrl-C or Ctrl-Z); while (1) { sleep(1); } return 0; } Tng hp x l tng tranh bng hm sigaction(): sigaction( int sig, const struct sigaction *act, const struct sigaction *oldact); trong cu trc sigaction cho thng tin v hm x l: struct sigaction { void (*) int sa_handler; /*hm x l t/h*/ sigset_t sa_mask; /* Tp t/h cn kho*/ int sa_flags; /*trng thI khI phc sau khi x l t/h*/ . . . } 112 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Lu chung khi x l signal: 1. 2. 3. 4. 5. Hm to ra phi ngn gn, chy nhanh, trch tng tranh signal; Ngn chn tng tranh ngay nu c th; Khng b qua cc signal h thng bo li nghim trng(SIGSEGV, SIGBUS) theo t duy ph hp vi lp lun khi l trnh, nu cn dn dp tI nguyn v kt thc (abort()) thc hin trnh gy v thm cc phn khc. Cn thn khi ci timer, mi TT ch c mt timer, tt bt hp l. X l signal l d b, n gin, khng c s ch i, ch c x l hay b qua

2.2. Cc GHT b ngt bi signal Trong h thng c mt s cc GHT thuc loi chm v trong khi thc hin, cc GHT ny c th b ngt bi signal v GHT s tr li thng bo li thuc loi EINTR (error interupt). H chia cc GHT thnh hai loi: chm v cc GHT cn li. Cc GHT chm c th b gin on thc hin vnh vin, l cc GHT: - c tp, nu cha c d liu (pipe, terminal, network); - ghi vo cng mt tp (hay nhiu tp nh nhau) nu d liu khng c chp nhn ngay; - m tp b kt cho ti khi c iu kin vo xut hin; - pause() v wait(), i cho ti khi signal xut hin; - mt s thao tc I/O (ioctl()); - Mt s IPC; x l cn vit m nh sau: again: if (( n = read(fd, buf, BUFFSIZE)) < 0) /*GHT l open()*/ { if (errno = EINTR) goto again; } Trong Unix 4.2BSD to ra ci gi l t ng khi ng li GHT b ngt, gm c: ioctl(),read(),write(), wait(), waitpid(), v writev(). SVR4 khng c c tnh ny, nhng hm sigaction() vi tu chn SA_RESTART dng khi ng li GHT b ngt. 2.3. Nhm cc TT H iu hnh Unix duy tr cc nhm tin trnh. Mt nhm tin trnh l mt tp hp gm nhiu tin trnh. Tt c cc tin trnh thuc mt nhm v cc tin trnh con bt k u thuc cng nhm theo mc nh. Mt tin trnh c th quyt nh to ra mt nhm mi v tr thnh trng nhm . Mt nhm c nhn bit bi s nhm ca n, s ny bng vi s ca trng nhm. Khi nim ny v cc nhm cho php gi cc thng ip n tt c cc tin trnh l thnh vin ca cng nhm thc hin kim sot cng vic. Cc trnh thng dch lnh (bash, 113 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ esh, ksh, v.v...) s dng cc nhm ny cho php ngi dng nh ch thc hin mt tin trnh v tip tc n pha trc hoc pha sau. Cc nhm tin trnh cng c s dng h qun l cc thit b u cui. Cc k hot ng Mt k hot ng l mt tp hp gm mt hoc nhiu nhm tin trnh. Mi k hot ng c gn cho mt thit b u cui iu khin. Thit b u cui iu khin ny l mt thit b ngoi vi hoc mt gi thit b (khi c mt lin kt mng n mt thit b u cui xa). Khi tin trnh to ra mt k hot ng mi: - n tr thnh trng qu trnh. - mt nhm mi cc tin trnh c to ra v tin trnh gi tr thnh trng ca n. - tin trnh gi khng c thit b u cui kim tra. Mt k hot ng c nhn bit theo s ca n, s ny bng vi s ca trng tin trnh. Thng thng, mt k hot ng mi c to ra bi chng trnh login khi ngi s dng c ni kt. Tt c cc tin trnh sau s tr thnh cc thnh vin ca cng k hot ng. trng hp cc lnh c lin kt (chng hn bng cc ng dn), trnh thng dch lnh (shell) to ra cc nhm tin trnh mi thc hin kim sot cng vic. D mt TT c nhn bit bng s ID, nhng i khi kernel li nhn bit cc TT bng nhm. V d tt c cc TT pht sinh sau login shell u c lin quan ti login shell , cho nn khi user g break hay delete tt c cc TT ni trn u nhn c tn hiu. Kernel dng procces group ID (GPID) nhn bit nhm cc TT (c cng thu t) c th cng nhn chung mt tn hiu ca mt vi s kin nht nh. S GPID l trong cu trc ca TT trong process table, cc TT trong cng nhm u c cng s nh danh nhm. GHT setpgrp() s khi ng s nhm TT ca mt TT v t s bng s PID ca n. grp = setpgrp(); Trong : grp l s nhm TT mi c tr li. TT con gi nguyn s nhm ca TT b trong qu trnh thc hin fork().

2.4. TT gi tn hiu Hm kill() gi mt signal cho mt TT hay nhm cc TT. V raise() cho php mt TT gi signal cho chnh mnh. C php nh sau: 1. Gi t dng lnh ti console: #kill [ SIGNAME] [ PID] 2. Khi lp trnh: #include <sys/types.h> #include <signal.h> kill(pid, signum);

114 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ raise( signum); Trong : Pid l cho bit tp hp cc TT s nhn signal v c xc nh nh sau: - nu pid l s nguyn dng, kernel gi signal cho TT c s pid ; - nu pid = 0 kernel gi signal cho tt c cc TT c s nhm TT (GPID) bng s nhm (GPID) ca TT gi signal; KhI nim tt c loi tr cc TT h thng (swapper (PID=0), init (PID=1), pagedaemon (PID=2)). - nu pid = -1 kernel gi cho tt c cc TT m UID thc (real user ID) bng s ID hiu dng (effective user ID) ca TT gi signal. Nu TT gi c s ID hiu dng l ca superuser, th signal s c gi cho tt c TT, tr TT 0 (swaper) v TT 1 (Init). - nu pid < 0, khc 1, kernel gi signal cho tt c cc TT c s nhm PID bng gi tr tuyt i ca |pid|, vi iu kin TT gi c quyn gi signal n. - trong cc trng hp nu: Eff. UID ca TT gi khc Eff.UID ca superuser, hoc Real UID hoc Eff. UID ca TT gi khc vi Eff. UID ca TT nhn, kill() s khng thc hin c. V d: TT b lp s ca nhm setpgrp() TT (bng chnh pid ca n) v to ra 10 TT con khc. Sau khi to, mi TT con c cng s nhm nh TT b, tuy nhin vi php & (bitwise), cc TT to ra khi i l s c s nhm khc (v bng chnh s pid ca chng) khi thc hin setpgrp() tip theo sau. Hm getpid() v getpgrp() cho s ID v s ca nhm ca mt TT ang chy, sau TT dng (pause()) thc hin cho ti khi TT nhn c mt t/hiu m TT gi. TT b gi t/hiu cho cc TT khng thay i nhm (trong nhm ca TT b): tc 5 TT chn khng i s nhm. 5 TT l khng nhn c tn hiu, tip tc chu trnh. #includ <signal> main() { register int i; setpgrp(); /*lp gpid nhm = 0, TT b*/ for(i=0; i<10; i++) { if (fork() ==0)/* sau fork() TT con c grp ID ca b*/ { if (i & 1)/* cho 1,3,5,7,9*/ setpgrp();/* gpr ID khc grpID ca b v= PID TT con */ printf(pid=%dpgrp=%d\n,getpid(),getpgrp()); pause(); /*dng thc hin TT, i signal*/ } } kill(0,SIGINIT);/*pid=0:TT b gi t/h ngt cho cc TT khng i gpid, */ /*cng nhm ca n*/ } 115 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ V d 2: Dng lnh kill trn terminal: user to ra hai signal (SIGUSR1 v SIGUSR2) v hm x l sig_usr() s n nhn v in ra s ca signal nhn c: #include <signal.h> #include "ourhdr.h" /*tp header do user to*/ static void sig_usr(int); /* hm x l dng cho c hai signal */

int main(void) { if (signal(SIGUSR1, sig_usr) == SIG_ERR) err_sys("can't catch SIGUSR1"); if (signal(SIGUSR2, sig_usr) == SIG_ERR) err_sys("can't catch SIGUSR2"); for ( ; ; ) pause(); } static void sig_usr(int signo)/* i vo l signal number */ { if (signo == SIGUSR1) printf("received SIGUSR1\n"); else if (signo == SIGUSR2) printf("received SIGUSR2\n"); else err_dump("received signal %d\n", signo); return; } Gi s sau khi dch, chng trnh c tn sigusr, v cho chy ch nn (background vi $ sigusr & cui lnh), v trn console dng lnh $ kill(1) v kill(2) gi signal cho TT hay nhm TT. Kt qu nh sau: $ sigusr & /* cho chng trnh chy nn*/ $jobs /* xem TT chy ngm vi s hiu s dng trong kill*/ [1] 4270 /*PID=4270*/ $ kill USR1 4270 /* gi cho TT 4270 signal SIGUSR1*/ reveived SIGUSR1 $ kill USR2 4270 /* gi cho TT 4270 signal SIGUSR2*/ reveived SIGUSR2 $ kill 4270 /*gi cho TT signal kt thc SIGTERM*/ [1] + Terminated sigusr & 2.6. alarm() v pause() 116 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ #include <inistd.h> alarm( seconds): t cho nh thi (timer) mt khon thi gian, khi ht thi gian , kernel s pht sinh ra signal SIGALRM. (cng vi tr TT chy hm x l signal); Ch c mt ng h bo ng (alarm clock) cho mt TT. Nu gi ln tip theo, m ln trc thi gian cha trI qua, gi tr tr li s l nh lng cn li, gi tr mi s c thay vo. Nu gi tr mi t =0, alarm() s hu, gi tr tr li s l s thi gian cn li b d. Hnh ng mc nh cho signal ny l kt thc TT. Nhiu TT dng ng h bo ng ny bt tn hiu SIGALRM: v d dn dp trc khi TT kt thc sau mt khon thi gian. Tr li: 0, hay gi tr nh ni trn. pause( void): Treo (tm dng thc hin) TT gi hm cho ti khi bt c signal. Hm tr li thi gian nu hm x l signal dc thc hin v hm ny tr v. Cc trng hp khc s l -1 vi thng bo errno=EINTR V d: Dng alarm() v pause() t i ng trong mt thi gian. Dch ra vi tn sleep1, i vo l thi lng (s thi gian ng): $sleep1(10) #include #include /* ng 10 s*/

<signal.h> <unistd.h>

static void sig_alrm(int signo) { return; /* nothing to do, just return to wake up the pause */ } unsigned int sleep1(unsigned int nsecs) { if (signal(SIGALRM, sig_alrm) == SIG_ERR) return(nsecs); alarm(nsecs); /* start the timer */ pause(); /* next caught signal wakes us up */ return( alarm(0) ); /* turn off timer, return unslept time */ } V d cn mt s vn tng tranh khi ln u gi alarm() v pause(). Trn h qu bn, phI di alarm kt thc v hm x l signal c th s chy trc khi gi pause(). Nu xy ra trnh gi pause() c th b treo. V d: (read1.c) #include <signal.h> #include "ourhdr.h" 117 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ static void int main(void) { int char sig_alrm(int);

n; line[MAXLINE];

if (signal(SIGALRM, sig_alrm) == SIG_ERR) err_sys("signal(SIGALRM) error"); alarm(10); if ( (n = read(STDIN_FILENO, line, MAXLINE)) < 0) err_sys("read error"); alarm(0); write(STDOUT_FILENO, line, n); exit(0); } static void sig_alrm(int signo) { return; /* nothing to do, just return to interrupt the read */ } Vn gn ging nh v d trc: chy ua gia ln gi alarm() u tin v gi read(). Nu kernel ngn cn mt TT gia ln gi hai hm y lu hn l chu k ca alarm, hm read() s b treo. Vy phI t chu k alarm dI trnh b kt read. strnh cc hin tng trn , chng trnh trn vit li vi s dng longjmp() dng t cc gii hn thi gian trn cc x l I/O. hm c dng t bn trong cc chc nng x l signal tr v vng main() ca chng trnh thay v tr v t chc nng x l. Lu l theo ANSI C cc chc nng x l signal c th tr v trnh chnh nhng cng c th abort() (t b hm, kt thc bt thng) hay exit() v longjmp(), v bng cch ny ta khng cn quan tm trn cc h chy chm cc GHT c b ngt hay khng. #include #include #include <setjmp.h> <signal.h> "ourhdr.h"

static void sig_alrm(int); static jmp_buf env_alrm; int main(void) { int char

n; line[MAXLINE]; 118

________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ if (signal(SIGALRM, sig_alrm) == SIG_ERR) err_sys("signal(SIGALRM) error"); if (setjmp(env_alrm) != 0) err_quit("read timeout"); alarm(10); if ( (n = read(STDIN_FILENO, line, MAXLINE)) < 0) err_sys("read error"); alarm(0); write(STDOUT_FILENO, line, n); exit(0); } static void sig_alrm(int signo) { longjmp(env_alrm, 1); }

3. Kt thc TT
TT trn Unix c th kt thc bnh thng theo ba cch v khng bnh thng theo hai cch v m t nh sau: 1. Kt thc bnh thng khi gi (a) (b) Kt thc mt main(), tng ng vi gi n exit(). Gi exit(). exit() do ANSI C nh ngh bao hm gi cc x l ca exit bng kch hot atexit() v ng tt c cc xu I/O (fclose() c gi ng tt c cc xu m, ghi buffer ln tp). Do khng x l cc m t tp (fd), nn cc TT (b v cc con), cc iu khin cng vic s khng hon tt ( nh cp khi TT l zombie). Gi _exit(),kt thc v v kernel ngay. Hm ny s do exit() gi v c cc x l c bit ca bn thn HH Unix thc hin. _exit() do POSIX.1 nh ngha. exit(3) l ca th vin C chun Unix, cn _exit(2) li l mt GHT. Gi abort(), b vic, to ra SIGABRT signal. Khi TT nhn mt s signal nht nh t bn thn n (bng abort()), hay t cc TT khc hay t kernel (TT chia cho s 0, qui chiu a ch ngoI khng gian ca TT).

(c)

2.

Kt thc khng bnh thng. (a) (b)

Mt TT kt thc s i vo trng thI zombie (S9) s b li cc ngun ti nguyn TT dng, hy bi cnh ca n, ch cn lu li entry trong procces table. 119 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ exit(status) Status l gi tr tr li cho TT b TT thc hin kim tra. TT c th thc hin GHT exit() mt cch tng minh hay n. Khi mt chng trnh thot ra khi main() th u t ng c exit(). Kernel t pht sinh exit() cho TT khi TT nhn c mt t/hiu khng c l do r rng nh ni v trong trng hp ny, status s l s ca signal . H thng tuy khng t gii hn thi gian cho vic thc hin TT, nhng TT s kt thc nu thi gian qu lu. TT 0 (swapper) v TT 1 (Init) l hai TT vnh cu ca h. exit() input: { .ignore all signals; .if(process group leader with associated control terminal) { .send hungup signal to all members of process group; .reset process group for all member to 0; } .close all open files; .release current directory (iput()); .release current (changed) root, if exists (iput()); .free regions, memory associated with process (freereg()); .write accounting record; .make process state zombie; .assign process ID of all child process to be Init process; .if any children were zombie. Send dead of child signal to Init process; .send dead of child signal to parent process; .context switch; } TT b qua cc signal v khng c l do g x l khi TT kt thc cuc i. Nu TT ang kt thc l TT ng u cc TT (l TT shell login, kt hp vi terminal), th kernel s gi SIGHUP cho tt c TT trong nhm (v d nu user g CTRL-DEL (tc End of File), ti login shell trong khi cc TT kt hp ang chy, th cc TT s nhn c hungup signal); ng thi s nh danh nhm s i thnh 0 cho tt c cc TT thnh vin. Kernel sau thc hin ng cc tp TT m, tr li cc inodes cho th mc (hin ti, cng nh th mc c chuyn i bng lnh cd). Tip theo kernel gii phng cc min b nh TT dng v a TT vo trng thi cn xc (zombie). Cc s liu kt ton thi gian s dng ca TT cng nh ca cc TT hu bi ca n trong user mode v kernel mode c ghi li trong proccess table. ng thi cc s liu cng ghi vo tp kt ton ca h thng (bao gm: user ID, run time CPU, s dng memory, cc I/O... c ch cho vic iu chnh hot ng ca h). Cui cng kernel ct TT ra khi cu trc cy ca TT, a TT init(1) tip nhn cc TT hu bi ca TT kt thc. Nh vy cc TT hu bi do TT to ra ang cn sng, s c b mi l TT init. C gng 120 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni return code for parent process output: none

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ cui cng ca TT ang kt thc l thng bo cho TT b ca n v s ra i ca mnh, v nu c cn TT con no ca n l zombie, TT s thng bo cho init thu dn khi proccess table, bn thn TT tr thnh zombie, chuyn bi cnh kernel tuyn TT khc vo thc hin. Trong thc t lp trnh ta dng wait() ng b TT b vi TT kt thc ca TT con. V d: TT b to TT con, sau TT con tm treo thc hin, cn TT b kt thc. TT con cn sng v i signal ngay c khi TT b khut: main() { int child; if ((child ==fork()) == 0) { printf( child PID= %d\n,getpid); pause() /* TT con treo, ch signal*/ } /*parent*/ printf( child PID= %d\n, child); exit(child); } V du: Cc g tr tr li ca exit() #include #include #include <sys/types.h> <sys/wait.h> "ourhdr.h"

int main(void) { pid_t pid; int

status;

if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid == 0) exit(7); if (wait(&status) != pid) err_sys("wait error"); pr_exit(status); if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid == 0) abort();

/* child */ /* wait for child */ /* and print its status */

/* child */ /* generates SIGABRT */ 121

________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ if (wait(&status) != pid) err_sys("wait error"); pr_exit(status); /* wait for child */ /* and print its status */

if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid == 0) /* child */ status /= 0; /* divide by 0 generates SIGFPE */ if (wait(&status) != pid) err_sys("wait error"); pr_exit(status); exit(0); } /*pr_exit(status)*/ void pr_exit(int status) { if (WIFEXITED (status)) printf(nornal termination, exit status = %d\n, WEXITSTATUS(status)); else if (WIFSIGNALED(status)) printf(abnornal termination, exit status = %d\n, WTERMSIG(status)); #ifdef WCOREDUMP WCOREDUMP(status) ? (core file generarted) : ); #else ); #endif else if (WIFSTOPPED } WIFEXITED(status), WIFSIGNALED(status), WIFSTOPPED(status) l cc macro nh ngha trong <sys/wait> theo POSIX.1 (status)) printf(child stopped, signal number = %d\n, WSTOPSIG(status)); /* wait for child */ /* and print its status */

4. wait(), pidwait(), i mt TT kt thc


Khi mt TT kt thc (bnh thung hay khng bnh thng) th TT b cng s nhn c thng bo t kernel bng signal SIGCHLD. Do kt thc TT l mt s kin d b (xy ra bt k lc no khi TT ang chy), nn tn hiu ny mang tnh thng bo cho TT b. TT b s 122 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ bt tn hiu x l hay cng c th b qua. Mc nh l b qua, cn nu quan tm n TT dng wait() hay pidwait() i TT con kt thc v sau d chy tip. TT khi dng wait(), pidwait() c th: (a) (b) (c) ngn cn tt c cc TT con nu hy cn ang chy, hoc tr v ngay lp tc vi thng bo trng thi kt thc ca TT con (nu TT con kt thc v ng i nhn trng thI kt thc), hoc Tr v ngay vi thng bo li.

Nu TT ang gi wai() do nhn c SIGCHLD, ta hoI vng wait() tht ra ngay lp tc. Cn nu gi wait() ti bt k thi im no, th wait() c th s b kt. #include<sys/types> #include <sys/wait.h> pid = wait(stat_addr); waitpid(pid, stat_addr, options) Trong : pid l PID ca TT con kt thc (zombie), nu OK, -1 c li; atat_addr l a ch cha m tr li ca exit() caTT con. Gi tr ca pid trong waitpid() nh sau: pid = -1: i bt k TT con no. waitpid() tng ng vii wai(). pid > 0 : i TT c s PID bng pid; pid == 0: i bt k TT no c s nhm TT (GPID) bng GPID ca TT gi. pid < -1: i bt k TT no c GPID bng |pid| wait() c th dng thc hin trnh gi ( TT b) cho ti khi TT con kt thc ( dng ng b thc hin TT b v TT con), cn vi options trong waitpid(), c th hu vic TT b i TT con u tin kt thc hay xc inh TT con no n s i kt thc. waitpid() cho ba c tnh khc vi wait() nh sau: - cho php i nhiu hn l mt TT (wait(0 tr li trng thI ca TT kt thc); - cung cp kh nng khng ngn cn TT gi tm dng i TT con, dng khi mun bit trng thI ca TT con nhng khng dng thc hin TT b. - h tr kim sot cng vic (job). Thut ton c bn ca wait(): Input: { .if (waiting process has no child process) return(error); .for(;;) { .if (waiting process has zombie child) { 123 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni none Output: child ID, child exit code

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ .pick arbitrary zombie child; .add child CPU usage to parent; .free child process table entry; .return (child ID, child exit code); } .if (waiting process has child process but none zombie) { sleep at interruptible priority(event:child process exit); } } } Thut ton cho thy hai trng hp c bn: TT b c TT con l zombie, n s lm cng vic thu dn v thot ra vi PID v m tr v khi TT con kt thc s tn ti. TT b c TT con nhng ang hot ng, cha kt thc cuc i, do vy TT b t i ng, v thc dy bng t/hiu ngt do TT kt thc bng exit. Khi nhn c t/h death of child TT s c cc phn ng khc nhau: - Trong trng hp mc nh, TT s thc t trong wait. Thut ton sleep() kch hot issig() kim tra nhn signal, ghi nhn trng hp c bit ca death of child v tr li false. Kt qu l kernel tr v wait, quay lai chu trnh tm thy zombie... v thot khi wait. - Nu l death of child kernel sp xp thc hin hm x l ngt ca user. - Nu Tt b qua death of child kernel ti thc hin wait, gii phng ti nguyn ca zombie v tm cc TT con khc. V d: Chng trnh cho cc kt qu khc nhau lc chy khi c hay khng c i u vo: 1. Khng c i u vo (argc = 1, ch c tn ca chng trnh): TT b to ra 15 TT con, mi TT kt thc bng exit() vi i tr v. Kernel thc hin wait(), tm zombie ca TT con kt thc, Kernel khng chc chn TT con no n s tm thy, bin ret_val s cho PID ca TT con tm c. 2. Khi c i u vo (argc > 1, c tn chng trnh v mt xu khc), TT b dng signal() b qua death of child. Gi s TT b i ng trong wait() trc khi c mt TT con exit(): TT con gi death of child cho TT b, TT b thc dy, nhn thy t/hiu gi n l death of child, TT b loi zombie ca TT con ra khi proccess table v tip tc thc hin wait() nh khng c t/hiu no xy ra. Cng vic lp li cho ti TT b i qua ht wait() v khi TT b khng cn TT con no, v wait() tr li 1. S khc nhau cho hai trng hp l: trng hp 1, TT b i kt thc ca bt k TT con no; cn trng hp 2 TT b i kt thc ca tt c cc TT con. #include <signal.h> main(argc, argv) { 124 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ int i, ret_val, ret_code; if (argc >= 1) signal(SIGCLD, SIG_IGN); /* b qua death of child*/ for(i = 0; i < 15; i++) if (fork() == 0) { /* TT con y*/ printf( child proc %x\n, getpid()); exit(i); } ret_val = wait(&ret_code); printf( wait ret_val %x, ret_code %x\n, ret_val, ret_code); } Nu p dng thut ton ny dn dp cc zombie cho procces table th bt buc TT b phi thc hin wait(), nu khng cc u vo ca procces table c th s ht.

V d vi waitpid(): (fork2.c) #include #include #include <sys/types.h> <sys/wait.h> "ourhdr.h"

int main(void) { pid_t pid; if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid == 0) { /* first child */ if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid > 0) exit(0); /* parent from second fork == first child */ /* We're the second child; our parent becomes init as soon as our real parent calls exit() in the statement above. Here's where we'd continue executing, knowing that when we're done, init will reap our status. */ sleep(2); printf("second child, parent pid = %d\n", getppid()); exit(0); } 125 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ if (waitpid(pid, NULL, 0) != pid) err_sys("waitpid error"); /* wait for first child */

/* We're the parent (the original process); we continue executing,knowing that we're not the parent of the second child. */ exit(0); }

5. S tng tranh
S chy ua (race) xut hin khi nhiu TT c thc hin mt vic g trn d liu chia s m kt qu cui cng ph thuc vo th t trong cc TT chy. To TT bng fork() c v nh l s gieo rc tng tranh nu c mt logic no n hay tng minh, ph thuc vo TT b hay TT con s chy trc sau khi fork(). Thc t khng th d on trc TT no s chy trc v cho d l bit, th iu g s xy ra khi TT bt u chy li ph thuc vo tI h thng cng nh vo thut ton lp biu ca kernel. Trong v d trn (fork2.c) tng tranh c xu th xy ra khi TT con th hai in xong s PID ca TT b. Nu TT con th hai chy trc TT con th nht th TT b sau s l TT con th nht. Nu TT con th nht chy trc v c thi gian exit() th TT b ca TT con th hai s l TT init ca h thng. Cho d dng sleep() cng cha c g m bo. Nu h qu bn TT con th hai s tip tc thc hin sau khii sleep(0 kt thc, trc khi TT con th nht c c hi chy. Mt TT mun i TT con kt thc, s phI dng wait(). Nu TT con mun i TT b kt thc, (nh trong v d fork2.c), vng i sau y c th s dng n: while (getppid() != 1) sleep(1); Vn k thut y l CPU b dng nhiu cho quay vng (polling) v sau mi giy, trnh gi s dc nh thc 1 ln thc hin kim tra (!= 1). loi tr tng tranh v quay vng s cn n mt kiu tn hiu, hay mt kiu lin lc gia cc TT no (c ch IPC chng hn). Kch bn thng din ra gia TT b v TT con nh sau: sau fork(), c hai TT s lm vic g (v d: TT b cp nht tp log vi s hiu mi ca TT con, TT con I to mt tp cho TT b). Trong trng hp ny ta cn mi TT ni cho TT kia vic n lm xong v mi TT i TT kia xong vic trc khi mi TT tip tc. M hnh nh sau: (tellwait2.c) #include <sys/types.h> #include "ourhdr.h" static void charatatime(char *); int main(void) { 126 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ pid_t pid; TELL_WAIT(); if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid == 0) { /*TT con s lm g y */ TELL_PARENT(getppid); /*Ni cho TT b l lm xong*/ WAIT_PARENT(); /*Di TT b, parent chytrc */ charatatime("output from child\n"); /*TT con tip tc vic ca mnh*/ exit(0); } else { /* TT b lm vic ca mnh*/ charatatime("output from parent\n"); TELL_CHILD(pid); /*ni cho TT : con lm xong*/ WAIT_CHILD(); /*i TT con* charatatime("output from parent\n"); /*TT tip tc cng vic/*/ exit(0); } exit(0); } static void charatatime(char *str) { char *ptr; int c; setbuf(stdout, NULL); for (ptr = str; c = *ptr++; ) putc(c, stdout); } Khi chy trnh trn,ta s c u ra nh mong mun, m khng c s xen k khi in ra mn hnh t hai TT. Nu phn in m thay i nh sau: if (pid == 0) { /*TT con s lm g y */ charatatime("output from child\n"); /*TT con tip tc vic ca mnh*/ TELL_PARENT(getppid); /*Ni cho TT b l lm xong*/ exit(0); } else { /* TT b lm vic ca mnh*/ WAIT_CHILD(); /*i TT con*/ charatatime("output from parent\n"); exit(0); } th TT con s chy trc. TELL_WAIT(), TELL_PARENT(), TELL_CHILD(), WAIT_PARENT(), WAIT_CHILD() l 127 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni /* set unbuffered */

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ cc hm sau, s dng c ch IPC pipe trao i thng ip gia cc TT: #include static int "ourhdr.h" pfd1[2], pfd2[2];

void TELL_WAIT() { if (pipe(pfd1) < 0 || pipe(pfd2) < 0) err_sys("pipe error"); } void TELL_PARENT(pid_t pid) { if (write(pfd2[1], "c", 1) != 1) err_sys("write error"); } void WAIT_PARENT(void) { char c; if (read(pfd1[0], &c, 1) != 1) err_sys("read error"); if (c != 'p') err_quit("WAIT_PARENT: incorrect data"); } void TELL_CHILD(pid_t pid) { if (write(pfd1[1], "p", 1) != 1) err_sys("write error"); } void WAIT_CHILD(void) { char c; if (read(pfd2[0], &c, 1) != 1) err_sys("read error"); if (c != 'c') err_quit("WAIT_CHILD: incorrect data"); } 128 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

6. GHT system()
Mt cch tin li cho chy mt lnh bn trong mt chng trnh, l dng hm function(). Tuy nhin hm function() c mt s c im, l hot ng ca hm ph thuc vo h thng, khng c giao din vi h iu hnh, ch giao din vi shell. #include <stdlib.h> int system (const char *cmd string); Nu cmdstring l con tr NULL, th hm s tr v gi tr khc 0 ch khi lnh xc nh tn ti. M hnh kin to khi chy system() nh sau:

Thc t, system() l trin khai p dng ca fork() v exec() cng nh waitpid(), do gi tr tr li s c khc nhau: (a) Nu fork() khng thnh cng hay waitpid() tr li error m error khc vi EINTR, system(0 s tr li -1 vi s hiu errono cho bit li ; (b) Nu exec() c li (suy ra l shell khng th thc hen c), gi tr tr li s nh th shell thc hin mt exit(127); (c) Trong cc trng hp cn li, ba hm (fork(), exec() v waitpid()) u thc hin c, gi tr tr v t system() l kt qu kt thc ca shell, theo nh dng xc nh trong waitpid(). V d: (system.c) S dng system() chy mt lnh trong h #include #include #include #include <sys/types.h> <sys/wait.h> <errno.h> <unistd.h> /* version without signal handling */

int system(const char *cmdstring) { pid_t pid; int status; if (cmdstring == NULL) return(1);

/* always a command processor with Unix */ 129

________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ if ( (pid = fork()) < 0) { status = -1; } else if (pid == 0) { /* child */ execl("/bin/sh", "sh", "-c", cmdstring, (char *) 0); _exit(127); /* execl error */

/* probably out of processes */

} else { /* parent */ while (waitpid(pid, &status, 0) < 0) if (errno != EINTR) { status = -1; /* error other than EINTR from waitpid() */ break; } } return(status); } Ga s tn chng trnh l system, ti du nhc ta c: $ system ls th: 1. shell h thng to ra mt TT mi (fork()) chy lnh system ls a vo; 2. chy c cn c mt shell ca ngi dng, phI exec(bin/sh); 3. bin/sh to mt TT khc (fork()) chy ls l bng exec(/bin/ls l). V d trn cha cp ti s l signal. Trong lnh execl() c tu chn c l ly i u vo tip theo (-l), (char *) 0) thng bo kt thc xu lnh a vo. C g khc bit khi ta khng dng shell chy lnh? Trong trng hp ny ta phI dng execlp() ( execlp (const char *filename, const ch *arg0, ,/* (char *) 0*/)), thay cho execl() v s phI dng bin PATH ( ta nh dng shell), phI x l kt thc xu sau gi execlp(), v khng th s dng cc k t metal ca shell. Cng vic xem ra c phn phc tp hn ! Ti y, dng _exit() loi tr vic to tp t ni dung ca cc cc b m I/O chun sao chp t TT b sang cho TT con. V d tip theo ca system() c quan tm ti x l signal:, kch hot lnh son tho vn bn /ed, l mt trnh ng dng c s dng c ch tng tc qua vic n sgnl v thot khi signal khi g t bn phm DEL, Ctrl_C: #include #include #include <sys/types.h> <signal.h> "ourhdr.h" 130 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ static void int main(void) { int sig_int(int), sig_chld(int);

status;

if (signal(SIGINT, sig_int) == SIG_ERR) err_sys("signal(SIGINT) error"); if (signal(SIGCHLD, sig_chld) == SIG_ERR) err_sys("signal(SIGCHLD) error"); if ( (status = system("/bin/ed")) < 0) err_sys("system() error"); exit(0); } static void sig_int(int signo) { printf("caught SIGINT\n"); return; } static void sig_chld(int signo) { printf("caught SIGCHLD\n"); return; }

7. Kch hot mt chng trnh


GHT exec s kch hot mt chng trnh khc, ph ln khng gian b nh ca TT gc bng bn sao ca tp thc thi. Ni dung ca user - level context c trc exec sau khng truy nhp c na, ngoi tr cc thng s ca exec m kernel sao chp t khng gian a ch c sang khng gian a ch mi. PID ca TT c khng i v TT mi do exec to ra s nhn PID . execve (filename, argv, envp) filename: tn tp thc thi s kch hot, argv: envp: trng cc con tr k t tr vo cc xu kt thc bng k t NULL. Cc xu ny to thnh danh sch i u vo cho TT mi c to. con tr tr vo cc xu k t to thnh mi trng ca tp thc thi.

Trong th vin C c su exec nh sau: execl (const char * pathname, const char *arg0, / * (char *) 0 */ ); 131 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ execv (const char * pathname, char *const argv[ ]); execle (const char * pathname, const char *arg0, /*( char *) 0, char *const envp [ ] */ ); execve (const char * pathname, char *const argv[ ], char *const envp [ ] ); execlp (const char * filename, const char *arg0, / * (char *) 0 */ ); execvp (const char * filename, char *const argv [ ] ); d nh dng bng sau: Hm execl execlp execle execv execvp execve p l ng dn Tn tp thc thi Danh sch i v e argv [ ] environ envp [ ]

Cc ch ci c ngha nh sau: p: l: v: e: hm ly i filename v dng bin mmI trng PATH tm tp thc thi; Hm ly mt danh sch cc i l s loi tr ln nhau vi v; hm ly i argv[ ]; Hm ly i mI trng t envp[ ] thay cho mI trng hin hnh. main(argv, argv) th trng argv l bn sao ca thng s argv cho exec. Cc xu k t trong envp c dng name = value v cha cc thng tin hu ch cho chng trnh (chng hn users home directory, ng dn tn tp thc thi). TT truy nhp cc bin mi trng ca n qua bin tng th environ c khi ng bng chu trnh thc thi (routine) ca C. exec() input: 1. file name 2. parameter list 3. environment variables list output: none { 132 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

Khi mt chng trnh dng dng lnh:

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ .get file inode(namei()); .verify file is executable, user has permission to execute; .read file header, check that it is a load module; .copy exec parameters from old address space to system space; .for (every region attached to process) detach all old region; .for (very region specified in load module) { allocate new regions; attach the regions; load region into memory if applicable; } .copy exec parameters into new user stack regions; .special processing for setuid programs, tracing; .initialize user register save area for return to user mode; .release inode of file; } Di y l dng ca tp thc thi trong FS thng c to ra bng hp ng (assembler) hay trnh np (loader): 1. Primary Header: cho bit c bao nhiu phn (section) trong tp, a ch u thc hin, magic number l mt s nguyn ngn cho bit kiu ca tp thc thi, (l tp kh np...) gip kernel phn bit cc c trng chy trnh (run time) ca tp. 2. Section header: m t mi phn trong tp, cho kch thc ca phn , a ch o khi phn chy trong h v cc thng tin khc. 3. Phn data: chng hn l text, c np vo khng gian a ch ca TT. 4. Other information: cc bng biu tng (symbols), cc d liu khc (cho debug chng hn). Bi v cc thng s cho exec l a ch ca cc xu k t trong khng gian a ch ca user, kernel copy cc a ch cng nh cc xu k t vo khng gian ca kernel (thng thng l vo kernel stack).

133 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Cch n gin nht sao chp cc thng s vo user_level context mi l dng kernel stack, tuy nhin do cc thng s c di khng bit trc c trong khi stack c gii hn, nn c th s dng mt trang no thc hin. Sau khi copy cc thng s kernel s gii phng cc min b nh c ca TT, cp min mi cho chng trnh mi, np ni dung ca tp thc thi s kch hot vo cc min , khi ng cc data ca chng trnh. Cui cng kernel cp pht min user stack cho TT, copy cc thng s tm lu ni trn vo user stack, chun b user context cho user mode. Kernel thc hin tip mt s cc x l c bit thc hin setuid: t cc trng effective user ID trong procces table entry tng ng vi TT, v trong u_area vo s nh danh ca ngi s hu tp thc thi. (Xem setuid() phn sau). Cui cng kernel chun b cc gi tr ca cc thanh ghi trong register context ca TT sau ny tr v user mode. Kernel kt thc thut ton, exec, TT chuyn sang thc hin m ca chng trnh mi. exec thc t bin i TT gi (calling procces) thnh mt TT mi. TT mi c xy dng t tp thc thi. Khng gian a ch ca TT c b ghi bi TT mi nn TT gi khng c return khi exec thnh cng, m thc hin m ca chng trnh mi. Tuy nhin PID khng thay i, cng nh v tr ca TT trong File table cng khng thay i, m ch c user_level context ca TT thay i ph hp vi mi trng ca chng trnh c kch hot. V d: main() 134 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ { int status; if (fork() == 0) execl( /bin/date,date,0); wait(&status); } Ngay lp tc sau khi TT b v TT con thc hin xong GHT fork(), chng s c lp thc hin. Khi TT con i vo kch hot exec() th min m ca n gm cc lnh chng trnh, min data c xu /bin/date, date, stack c cc gi tr cho n, s b y i (pushed) thc hin GHT exec. Ti user_level, kernel tm tp thc thi date, kim tra cc tiu ch (trong header) v sao xu /bin/date v date vo h thng, gii phng cc min nh TT con dng, xin cp pht khng gian mi cho chng trnh mi, copy m ca tp date vo min text, data vo min data (= np chng trnh mi vo b nh). Kernel ti xy dng danh sch cc thng s v t vo stack. Cng vic m exec cn lm xong, GHT exec kt thc, TT con khng thc hin m chng trnh c na m thc hin chng trnh mi date. Trong khi TT b wait() TT con chy xong date v nhn kt qu qua bin status. Cc TT thng thng kch hot exec sau khi thc hin fork. TT con sau fork sao chp khng gian a ch ca TT b, v loi b a ch khi exec, thc hin mt chng trnh khc vi ci m TT b thc hin. Liu c nn phi hp hai GHT ny lm mt kch kot mt chng trnh v chy chng trnh nh mt TT mi ? Hy xem thm Ritchie, D. M., The evolution of Unix Time-sharing System. Tuy nhin v chc nng, fork v exec tch bit li rt quan trng. Bi cc TT c th thao tc cc m t tp vo v m t tp ra chun mt cch c lp to pipe thun li hn l khi hai GHT ny c kt hp lm mt. Cho ti nay ta gi nh rng min text v data ca TT ang chy l tch bit. iu mang li cc thun li nh: bo v min v chia s min: kernel c th phi hp vi hardware (MMU) loi tr min b ghi (do sai trong qun l a ch). Khi nhiu TT cng thc hin mt chng trnh, chng s chia s text chy vi cc con tr lnh ring ca mi TT, tit kim b nh. Trong qu trnh thc thi exec, kernel s kim tra tp thc thi kh nng share qua magic number v share text cho cc TT khc. V d ca exec: (exec1.c) #include <sys/types.h> #include <sys/wait.h> #include "ourhdr.h" char *env_init[ ] = { "USER=unknown", "PATH=/tmp", NULL };

int main(void) { pid_t pid; if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid == 0) { /* specify pathname, specify environment */ if (execle("/home/SV1/bin/echoall", 135 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ "echoall", "myarg1", "MY ARG2", (char *) 0, env_init) < 0) err_sys("execle error"); } if (waitpid(pid, NULL, 0) < 0) err_sys("wait error"); if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid == 0) { /* specify filename, inherit environment */ if (execlp("echoall", "echoall", "only 1 arg", (char *) 0) < 0) err_sys("execlp error"); } exit(0); }

8. nh danh ngi dng ca mt TT


8.1. S nh danh ngi dng - nh danh ca ngi dng thc (real user UID): y l m hiu ngi dng trn h, khi ng tin trnh. - nh danh ca ngi dng hiu qu (effective UID); y l m hiu c h thng s dng kim sot truy nhp, n c th khc vi nh danh ca ngi dng thc, c bit trong trng hp cc chng trnh c lp bit setuid. - nh danh ca nhm thc (real group user): mi thnh vin thc phI thuc mt nhm thc, mi nhm c mt s nh danh l real group user (RGID). - nh danh ca nhm hiu qu (effective UID): y l m hiu c h thng s dng kim sot truy nhp: n c th khc vi nhm thc, c bit trong trng hp cc chng trnh c lp bit setgid. - Danh sch cc nh danh nhm: mt ngi s dng ng thi c th thuc nhiu nhm v kernel gi mt danh sch gm cc nhm kt hp vi mi tin trnh thc hin kim sot truy nhp. ( h iu hnh Linux, mt tin trnh c th c n 32 nhm). S nh danh ngi dng (user ID, vit tt UID) trn h l mt gi tr s, m h dng nhn bit ngi dng. S ny pht sinh khi ngi qun tr to mt ngi dng mi v sao cho khng c s trng lp, v khng th thay i. Kernel s dng UID kim sot cc quyn hn m user c trn h thng. Root hay superuser c UID = 0 v c cc c quyn m cc ngi dng thng thng khng c. Thc t user c hai s nh danh v c lin quan khi chy chng trnh v kernel kt hp hai s nh danh vo cho mt TT c lp vi s nh danh ca TT (PID): real user ID v effective user ID - s nh danh ngi dng thc (real user ID) cho bit ai cho chy mt TT; - s nh danh ngi dng c hiu lc (effective user ID) dng xc nh quyn s 136 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ hu cho mt tp mi to, kim tra quyn truy nhp, quyn gi tn hiu cho mt TT bng kill(). Kernel cho php mt TT thay i effective UID khi TT kch hot (exec) chng trnh setuid() hay thc hin GHT setuid(). Thng thng effective user ID = real user ID. setuid() l mt tp thc thi thc hin a bit setuid trong trng quyn truy nhp ca TT ln: kernel lp trng effective user ID trong proccess table ca TT v u_area ca TT thnh ID ca ngi s hu tp. phn bit hai trng ny, hy gi trng trong proccess table l saved user ID v thc hin minh ho: setuid(uid) Trong : uid l mt user ID mi v kt qu ph thuc vo gi tr hin ti ca effective UID: - Nu effective user ID ca TT gi l superuser, kernel s lp li trng effective user v real user trong proccess table v u_area. - Nu effective user ID ca TT gi khng phi l superuser, kernel s lp effective user ID trong u_area l uid nu uid c gi tr ca real user ID hoc cc gi tr ca saved user ID; - Cc trng hp khc bo li. Ni chung TT con tha k real user ID v effective user ID t TT b trong qu trnh fork v duy tr cc gi tr ca TT qua GHT exec. effective user ID trong u_area l kt qu ca GHT setuid() hoc ca vic thc hin setuid trong exec v setuid() chu trch nhim nh ot quyn truy nhp tp. Cc TT dng gi tr saved user ID khi phc li effective user ID. Trnh login dng vo h l chng trnh in hnh s dng GHT setuid(). Login lp user root (superuser) v chy bng root effective user ID, sau i user bt k g tn login v mt khu, tip theo kch hot setuid() lp real user ID v effective user ID cho user ang login vo my (user c trong danh sch /etc/passwd). Cui cng trnh login dng exec chy shell bng real user ID v effective user ID lp cho user . Trnh mkdir() cng dng setuid(), nhng ch cho effective user ID superuser m thi. cc user khc c kh nng to th mc, th mkdir l mt trnh c setuid s hu bi root, khi chy s dng quyn hn ca root to th mc cho user, sau thay i ngi s hu, quyn truy nhp th mc cho user (real user). Hy th vi trnh sau y bng hai user khc nhau, mt ngi tn maury c tp ca mnh l tp maury, ngi kia mjb c tp l mjb v u l tp c thuc tnh ch c. Chng trnh c dch bi maury v l ngi s hu trnh . #include <fcntl.h> main() { int uid; /*value of real user ID*/ int euid; /*value of effective user ID*/ int fdmjb, fdmaury; /* file descriptors*/ uid = getuid();/*get real UID*/ euid = geteuid(); /*get effective UID*/ printf(uid = %d euid = %d \n,uid, euid); fdmjb = open(mjb, O_RDONLY); 137 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ fdmaury = open(maury, O_RDONLY); printf(fdmjb = %d fdmaury = %d \n,fdmjb, fdmaury); setuid(uid); printf(after setuid(%d): uid = %d euid = %d \n, uid, getuid(), geteuid()); fdmjb = open (mjb,O_RDONLY); fdmaury = open(maury,O_RDONLY); printf(fdmjb = %d fdmaury = %d \n,fdmjb, fdmaury); /*reset effective UID*/ setuid(euid); printf(after setuid(%d): uid = %d euid = %d \n, uid, getuid(), geteuid()); } Gi s ID ca abc l: 5088, ID ca xyz l 8319. Khi user tn l mjb chy trnh, kt qu nh sau: Uid = 5088, euid = 8319 fdmjb = -1 fdmaury = 3 fdmjb = 4 fd fdmaury = -1 after setuid(8319): uid= 5088 euid = 8319 Khi user tn l maury chy trnh, kt qu mh sau: uid = 8319 euid=8319 /*=-1 khng c quyn truy nhp tp*/ fdmjb = -1 fdmaury = 3 fdmjb = -1 fdmaury = 4 after setuid(8319): uid= 8319 euid = 8319 Chng trnh cho thy hiu ng do setuid() to ra trn cc tp c ch s hu khc nhau, v c ch khi chia s cc tp cho ngi khc s dng. 8.2. S nh danh nhm ngi dng Nhm trong Unix c dng ni ln s la chn hay tp hp ca mt s ngi dng c kh nng chia s ti nguyn (tp, t liu, ng dng . . .), sau h thng s gn cho mt gi tr s. /*=-1 khng c quyn truy nhp tp*/ after setuid(5088): uid = 5088 euid = 5088

after setuid(8319): uid = 8319 euid = 8319

9. Cc lnh lin quan ti s hu v quyn trn tp


91. Thay i quyn trn tp: # chmod u+x tntp # chmod g+wx o+wx tntp # chmod g-rwx tntp 9.2 i tng truy xut tp: u (user), g (group), o (other) Nhm ca i tng: khi ngi qun tr to mt user mi, th ngi s gn user 138 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ vo mt nhm no bng cc cch sau y: # groupadd tn_nhm_mi_to # useradd tn_user_mi # useradd tn_ca_user -g tn_nhm -d tn_th_mc_home_ca_user -p mt_khu 1. Cp quyn s dng th mc cho user, tc dng cho tt c user # chmod o-w /home/abc 2. Chia s th mc cho nhm cc user, tc dng: ch cho mt nhm # chgrp tn_nhm /home/abc 3. Thay i ngi s hu, tc dng: duy nht mt user c th # chown tn_user /home/abc

10. Thay i kch thc ca TT


TT c th iu chnh min d liu (data region) bng brk(endds) Trong : endds l gi tr a ch o cao nht ca min d liu ca TT. Phin bn khc ca lnh ny l: oldendds = sbrk(increment) Trong : increment s xc nh s bytes thay i, oldendds gi tr trc khi thc hin sbrk(); brk() input: { .lock process data region; .if (region size increasing) if(new region is illegal) { .unlock data region; .return(error); } .change region size (growreg()); .zero out addresses in new data space; .unlock process data region; } new break value output: old break value

11. Shell
Chng ta c cc hm chc nng thao tc mt TT, v cng c ngha c th m t 139 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ hot ng ca shell. Shell c cp u phn v TT, tuy nhin shell tng i phc tp. Hy tm hiu qua v d: Shell c dng lnh t u vo chun (stdin, stdout l cc tp c cho mi TT trong file descriptor ca mi TT, v gn cho terminal thc hin shell login), thng dch theo lut c nh. Nu xu u vo l cc lnh bn trong ca h (built - in commands), shell to TT thc hin, nu khng phi, shell gi nh l tn ca mt tp thc thi ca user, shell cng to TT thc hin. shell to TT con (fork()), TT con ny s gi mt trong cc execs, kch hot lnh user a vo. TT b, tc shell, m user s dng s wait() cho ti khi TT con exit v vng lp nhn lnh bt u t u.

V d: Shell x l lnh a vo vi pipe: u ra ca lnh ls chuyn qua pipe ti u vo ca lnh wc: $ ls -l | wc

Chu trnh chnh ca shell: m t qu trnh thc hin dng lnh trn /* shell c dng lnh do user a vo cho ti khi c End of File*/ /* shell lm phn tch dng lnh a vo stdin:*/ while (read (stdin, buffer, numchars)) { /*phn tch lnh*/ if (/* dng lnh c cha &, chy background*/) amper = 1; /*c &, bin amper t = 1, shell s start t*/ /*u*/ else amper = 0; /*lnh khng thuc ngn ng ca shell:*/ 140 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ if (fork() ==0) /* to TT con thc hin cc bc tip theo*/ { /* 1. Lnh c i hng vo ra I/O?: */ if (/* redirect output */) { fd = create (newfile, fmask); close(stdout); dup(fd); close(fd); /* u ra i hng*/ } if (/* piping */) /*lnh c dng pipe: ls -l | wc */ { pipe(fildes); if (fork() == 0) /* to TT chu thc hin lnh */ /*u: ls -l*/ { close(stdout); du(fildes[1]); close(fildes[1]); close(fildes[0]); /*u ra stdout ca lnh th nht chuyn vo pipe*/ /*TT con kch hot exec thc hin lnh:*/ execlp(command1, command1,0); } / *TT b tip tc lnh th hai wc*/ close(stdin); (fildes[0]); close(fildes[0]); close(fildes[1]); /*u ra ca pipe -> stdin*/ } execve(command2, command2, 0); } /*TT b tip tc chy ti y... hay i TT con (wc) kt thc nu cn*/ if (amper ==0) /*khng phi lnh c &*/ retid = wait(&status); 141 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni /* thc hin lnh wc */

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ } /*shell quay v u nhn lnh khc ca user*/

12. TT boot v init


a h vo hot ng cn qua bc khi ng, gi l bootstrap: - bt ny, - np chng trnh mi (hardcoded bootstrap: vi lnh c m phn cng); - bootstrap chy, mi mt chng trnh khc (loader) (Unix: c boot block: 0 ca a v np vo b nh); - loader thc hin: np H iu hnh t FS xung (Unix: /unix); - bootstrap hon tt, chuyn iu khin cho HH (Unix: kernel chy): . kernel khi ng cc cu trc d liu h thng: buffers, inodes, page table, file table, process table, region table,...; . mount FS trn root (/); . to mi trng cho TT s 0 (to u_area, khi ng u vo cho TT 0 trong procces table, root l th mc ca TT 0...; . chuyn sang chy TT 0 trong kernel mode, to TT 1 vi context ca n (user v kernel context), TT 1 chy trong kernel mode, copy m ca kernel, to user - level context cho n; TT 0 i ng v thnh swapper. . TT 1 return t kernel sang user mode, thc hin m va sao chp t kernel. TT 1 tr thnh TT user_level, TT 0 l kernel_level chy trong kernel; TT 1 gi exec thc hin chng trnh /etc/init. T y TT 1 c tn l TT init. Boot system start Input: { init all kernel data structures; pseudo - mount of root; hand - craft envirinment of proccess 0; fork proccess 1: { /*TT 1 y*/ allocate regions; attach region to init address space; grown region to accommodate code about copy; copy code from kernel space to init user space to exec init; change mode: return from kernel to user mode; 142 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni none Output: none

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ /*init khng quay li y na v chuyn mode,*/ /*init thc hin /etc/init bng exec v tr thnh user process*/ /*bnh thng*/ } /*TT 0 tip tc*/ fork kernel processes; /*TT 0 kch hot swapper qun l b nh v thit b nh (a)*/ /*TT 0 thng l ng nu khng c g lm*/ execute code for swawapper algorithm; } TT init l mt TT iu vn (dispatcher), khi ng cc TT khc qua /etc/initab, khi ng cc ch chy my (v d: multi-user state (2)), khi ng cc TT gettys, login shell... init cn thc hin wait() kim sot cc TT cht, thu hi ti nguyn... Cc TT trn Unix: - thng thng l TT ca user, kt hp vi user ti terminal - hay daemons (cc trnh dch v khng kt hp vi user no chy ngm) nhng cng ging nh cc TT user khc, chy user mode thc hin cc GHT truy nhp cc dch v h thng, - hay TT kernel ch chy trong kernel mode. TT 0 pht sinh ra cc TT kernel sau chuyn thnh TT swapper. Cc TT kernel tng t cc TT daemon ch chng cung cp rng ri cc dch v h thng, nhng cc TT ny li c kh nng kim sot c mc u tin thc hin bi m ca chng l mt phn ca kernel. Chng c th truy nhp trc tip vo cc thut ton v c s d liu ca kernel m khng dng GHT, chnh v vy cc TT kernel rt mnh. Tuy nhin mi ln sa i kernel, th phi thc hin dch li kernel, trong khi cc TT daemon khng cn dch li. init (TTs 1) Input: { fd = open (/etc/init, O_RDONLY); while (line_read(fd, buffer)) { /*read every line of file*/ if (invoked state != buffer state) continue; /* loop back to while*/ /*state matched*/ if (fork() == 0) { 143 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

none

Output: none

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ execl(process specified in buffer); exit(); } /*init process does not wait*/ /*loop back to while*/ } while((id = wait((int *) 0)) != -1) { /* check if spawned child died;*/ /*consider respawning it*/ /*otherwise, just continue*/ } } V d init vi qu trnh login ti t/b u cui:

144 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

13. Tm tt v bi tp
Tm tt Chng ny cp cc GHT thao tc bi cnh ca TT v kim sot qu trnh thc hin (chy) mt TT. fork() to ra mt TT mi bng cch nhn bn tt c cc min ca TT b cho TT con. Phn tinh vi hn c ca fork() l khi ng saved register context ca TT con sao cho n khi ng thc hin bn trong GHT fork() v ghi nhn rng n l TT con. exit() dng cc TT kt thc, tr li cc min (a ch, b nh) cho h thng m TT dng v gi tn hiu death of child cho TT b. TT b c th ng b thc hin vi TT con bng wait(); exec() cho php mt TT kch hot mt chng trnh, m (ni dung) ca chng trnh xc nh trong exec() ph ln khng gian a ch ca TT gc: kernel gii tr cc min trc ca TT, cp pht cc min mi tng ng cho chng trnh c kch hot, sau khi thc hin xong, khng th tr v chng trnh gc c. V d: #include <stdlib.h> #include <stdio.h> int main() { printf ( chy lnh ps bng GHT execlp()\n); execlp (ps, ps, ax,0); prntf ( S khng bao g thc hin n lnh ny na !!!\n); exit(0); } Kernel cho php mt user bnh thng thc hin chng trnh bng cc quyn hn ca cc user khc bng setuid(). Cc TT kim sot vic thc hin ca chng qua GHT signal(). Khi TT chp nhn (x l) mt tn hiu, kernel thay i user stack v user saved register context chuyn ti a ch ca hm chc nng x l tn hiu. Cc TT c th dng kill() gi tn hiu i n tng TT hay nhm cc TT qua GHT setpgrp(). Shell v init dng cc GHT chun to ra cc chc nng tinh xo c trong kernel ca h. Shell dng GHT thng dch lnh u vo, chuyn hng cc stdin stdout stderror, sinh ra cc TT, to pipe gia cc TT pht sinh, ng b thc hin vi cc TT con, ghi nhn trng thi khi cc lnh kt thc. Init to ra cc TT khc nhau, t bit l vai tr kim sot kt thc thc hin ca TT. Bi tp 145 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ 1. Chy chng trnh sau ti terminal v sau i hng u ra t mn hnh thnh tp, so snh kt qu: main() { printf(hello\n); if(fork == 0) printf( y l m ca TT con\n); } 2. Liu c th xy ra trng hp mt cc thng bo nu TT nhn nhiu signals tc thi trc khi TT c c hi phn ng ? (V d bng chng trnh TT m cc signal ngt n nhn c). Liu c cch gii quyt loi b tnh hung ? 3. Khi TT nhn signal m khng x l, kernel to ra mt tp ton cnh (image) ca TT (dump image ca TT: dump core), tp gi l core ti th mc hin hnh ca TT. Kernel copy cc min u_area, code, data, stack ca TT vo tp ny. User sau dng debug TT. Hy to thut ton (cc bc) kernel thc hin to ra tp ny. PhI lm g nu ti th mc hin hnh c tp core? Kernel s phi lm g nu c nhiu TT cng dump core cng mt th mc ? 4. V d di cho thy mt TT tn cng mt TT khc bng cc signal m TT kia s chn bt. Hy tho lun xem iu g s xy ra nu thut ton x l tn hiu thay i theo mt trong hai cch sau y: . kernel khng thay i hm x l tn hiu cho ti khi user yu cu r rng phi thay i; . kernel tc ng n TT TT b qua tn hiu cho ti khi user thc hin GHT signal() mt ln na. #include <signal.h> sigcatcher() { printf(PID %d caught one \n,getpid()); signal(SIGINT,sigcatcher); } main() { int ppid; signal(SIGINT,sigcatcher);/* TT b nhn tn hiu ngt*/ if (fork() == 0) /*TT b to TT con*/ /*code ca TT con: */ {/* mt khong thi gian cho 2 TT xc lp*/ sleep(5); ppid = getpid(); /* ly pid ca TT b*/ /*TT con dng kill() gi SIGINIT*/ /* cho TT b nu b cn sng:*/ 146 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ for (;;) if(kill(ppid,SIGINIT) == -1) exit(); } /*TT b h mc u tin ca mnh: */ nice(10); for(;;); } 5. Mt TT i kim tra signals khi TT i vo hay ra khi trng thi ng, v khi tr v user mode t kernel mode sau khi hon tt mt gi h thng hay sau khi hon tt thao tc ngt. Ti sao TT khng th kim tra signal trong khi ang chuyn vo thc hin mt gi h thng ? 6. Cho mt GHT mi: nowait(pid) trong pid cho s hiu ca TT con ca TT pht sinh ra GHT ny. Khi thc hin nowait(pid), TT gi (b) s thng bo cho kernel ng bao gi i TT con kt thc (exits), do vy kernel s dn dp ngay slot u vo ca process table khi TT con cht (khng li zombie. Hy tho lun gi tr ca nowait() v so snh vi vic dng death of child signal. Kernel s dng giI php ny nh th no? 7. wait() s tm thy thng tin g khi TT con kch hot exit() m khng c thng s ? (Tc l khi TT con dng exit() thay v dng exit(n)). Nu ngi lp trnh dng exit(), th gi tr g wait() ch i kim tra? 8. Superuser l ngi duy nht c quyn ghi ln tp /etc/passwd. Chng trnh passwd() cho php user thay i mt khu ca mnh, v khng cho thay i mt khu ca user khc. Vy chng trnh ny lm vic nh th no? 9. Khi shell to ra mt TT mi thc hin mt lnh (command), lm th no shell bit c l tp thc thi? Nu l tp thc thi c th lm th no shell c th phn bit c l tp loi shell script v tp do comliler to ra ? Trnh t chun xc kim tra cc trng hp trn l nh th no? 10. Khi user g delete hay break trn bn phm, th terminal driver s gi interrupt signal cho tt c cc TT trong nhm ca login shell. User thc t kt thc c cc TT pht sinh bi shell nhng li khng mun logoff. Vy chng trnh shell trong chng ny phi ci tin th no? 11. Ch c mt TT init l TT s 1 trn h. Tuy nhin system adminitrator c th thay i trng thi h thng bng pht ng init. V d lc khi ng h thng chy ch single user (console hot ng, cc terminals b kha), do vy adminitrator a vo lnh: # init 2 chuyn sang multi-user mode. Shell s forks (to TT mi) v execs (kch hot) init vi thng s l 2. iu g xy ra vi mt h nu ch c mt TT init c php kch hot ? /* TT b chy lng vng tn ti*/

147 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Chng IV. gian

Lp biu v thi

Trong cc h phn chia thi gian, kernel s phn phi CPU cho cc TT trong mt khong thi gian nht nh (gi l time slice). Khi lng thi gian ny kt thc kernel s lp biu (schedule) chn TT khc v cp CPU cho TT . Chc nng lp biu ca Unix dng thi gian tng i thc hin m (code ) ca mt TT, lm thng s xc nh TT no s tip theo s c chy. Mi TT hot ng u c mc lp biu u tin. Khi kernel thc hin chuyn bi cnh, kernel s chuyn bi cnh t TT ang chy sang bi cnh ca TT c mc u tin cao nht. Kernel s tnh ton li mc u tin ca TT ang thc hin khi TT ra khi kernel mode v li user mode v kernel thc hin u n vic iu chnh mc u tin ca cc TT trong user mode khi TT ang trng thi ready to run. Khi bn v lp biu, cc TT c phn ra lm hai lp theo nhu cu thi gian, l : hng I/O (I/O bound) c ngha TT s dng nhiu ti I/O v s dng nhiu thi gian i kt qu I/O; Lp th hai l hng CPU (CPU-bound), l lp TT yu cu nhiu thi gian 148 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ CPU. Tuy nhin cng c cch phn bit khc theo lp ng dng nh: Lp TT tng tc (interactive), tng tc thng xuyn vi user, do chi ph nhiu thi gian cho nhn bn phm, hay chut. Khi c u vo TT phI thc dy tht nhanh, thi gian tr trung bnh l 50 n 150 ms, nu qu chn, user co h c vn ; Cc ng dng nh son vn bn, shell, ho (tI to hnh nh) thuc lp ny; Lp TT x li l (batch), khng cn c s can thip ca user, v thng chy nn (background). Do khng cn phI c p ng nhanh, nn thng khng c xp u tin cao, V d loi ny l cc trnh dch (compiler) hay c cu tm d liu (database search engine), cc tnh ton khoa hc; TT thi gian thc (real time), c yu cu rt khc khe, khng bao gii b cn tr bi cc TT mc u tin thp, cn p ng thi gian tht nhanh, v quan trng hn c l thi gian p ng ch c thay i mc ti thiu. Cc ng dng nh video, m thanh, iu khin robot, thu nht s liu vt l thuc lp ny. Cc chng trnh thi gian thc thng c nhn bit n trong thut ton lp biu, ch khng c cch no phn bit gia ng dng tng tc v ng dng x l l. c p ng tt v thi gian cho cc ng dng tng tc, Unix thin v hng I/O. Cc TT trong Unix c c th chen ngang (preemptive), nn khi TT i vo trng thi sn sng chy, kernel s kim tra nu s u tin ca n ln hn ca TT ang chy, th TT ang chy s b ngt (b chen ngang_preempted), scheduler s chn TT khc trong cc TT nh trn cho chy. TT b chen ngang khng c ngha b treo, ch n gin l TT khng c dng CPU, v TT vn cn trong danh sch cc TT chy. Nhc li ( nh m hnh cc trng thi), TT ch b chen ngang khi chy trong user mode. (Tuy nhin trong h thi gian thc_real time kernel, TT chy trong kernel mode c th b chen ngang sau bt k ch lnh no, ging nh trong user mode). Mt s cc TT li cn bit v thi gian, v d lnh time, date cho thi gian ngy thng v gi ca ngy. Cc chc nng lin quan ti thi gian s h tr cho cc TT khi c nhu cu cp nht thi gian ( TT cn t hay tm li cc gi tr thi gian TT s dng CPU v.v ...). ng h thi gian thc s ngt CPU trong cc khong 50 hay 100 ln/giy (PC intel l 18,2 ln/s = 54.9 ms). Mi ln c mt ngt nh vy gi l mt clock tick. Chng ny s cp ti cc hot ng c lin quan ti thi gian trn Unix, xem xt cch lp biu cho TT, cc hm thao tc thi gian v ngt ng h.

1.

Lp biu cho tin trnh

Lp biu chy trnh trong Unix phi gii quyt cc vn sau y: p ng thi gian nhanh cho TT, thng sut cho cc x l nn (background jobs), loi tr mt TT b kt khng c chy, iu ho mc u tin ca cc TT c mc u tin cao v cc TT c mc u tin thp v cc vn khc na. Tp cc qui lut s dng xc nh khi no v la chn mt TT nh th no chy, gi l sch lc lp biu (scheduling policy). Sch lc lp biu cn t nn tng trn s sp xp v mc u tin ca cc TT. Cc thut ton phc tp c s dng ly ra c mc u tin hin ti ca mt TT, l gi tr kt hp vi TT cho bit vic TT s c tin chn s dng CPU (TT chy). Trong khi mc u tin ca TT li c tnh ng, c thut ton iu chnh lin tc. Nh c vy cc TT b t chi s dng CPU trong thi gian dI s c y lm mc u tin cao, ngc li TT dng CPU lu s chuyn xung mc thp. Lp biu ng thi cng xem xt ti s xp loi TT (nh nu trn) 149 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ v c th chen ngang chn TT chy. Lng thi gian chy TT cng l mt thng s nh hng rt ln ti nng lc thc thi (performance) ca ton h thng. S la chn ln (time slice duration) sau c tnh nhn nhng, vi lut l chn lu nu c th ( gim thiu tiu tn thi gian cho vic thc hin chuyn bi cnh t TT ny sang TT khc), nhng phI m bo p ng nhanh cho cc TT (tc cc TT cho d l lp no cng c c hi thc hin mau chng). Trn Linux, cc TT khc nhau c lng thi gian khc nhau, nhng khi TT ht thi gian ca n th TT khc s thay th. Mc u tin cho mt TT c hai kiu: Mc u tin tnh : ngi dng c th gn cho cc TT thi gian thc v khon xc nh t 1 n 99, v b lp biu s khng bao gi thay i gi tr ny; Mc u tin ng: cho cc TT thng thng; l tng ca cc lng thi gian (base priority ca TT ) v tng s tick ca CPU trI qua cho TT trc khi lng thi gian cho TT kt thc. B lp biu s chn TT thng thng nu khng c TT thi gian thc no trong hng i thc hin. C ngha mc u tin tnh cho TT thi gian thc t cao hn TT thng thng. Mt macro nh ngha lng thi gian c s (base time quantum) nh sau: #define DEF_PRIORITY (20*Hz/100) Hz do ng h ng thi trong my tnh (timer, timer interrupt) xc lp, v t = 100 cho IBM PC, do DEF_PRIORITY = 20 tick, tc khon 210 ms. Ngi dng c th thay i thi lng ny bng hm nice() hay setpriority(). B lp biu trong Unix thuc lp c s ca cc b lp biu ca HH v lm vic theo cch lun chuyn quay vng a mc (round robin with multilevel feedback) , c ngha l kernel s cp cho TT mt lng thi gian, khng cho TT s dng qu thi gian cho, a TT vo tr li mt trong cc hng i u tin, sau li chn TT nu iu kin chy tr li. Do TT c th c nhiu ln tng tc qua vng lun hi ny, trc khi n kt thc cuc i ca mnh. Khi kernel thc hin chuyn i v khi phc bi cnh, TT li chy tip ti v tr TT b treo trc . Di y l v d m hnh kin trc ca module lp biu v mi quan h vi cc module chc nng khc trong nhn h Linux. Cc module nh hn bao gm: 1. Module chnh sch lp biu (scheduling policy) nm quyn la chn TT no s s dng CPU. N c thit k thc thi chnh sch chy TT sao cho tt c cc TT u c c hi s dng CPU. 2. Module kin trc c trng (Architecture-specific) c thit k tru tng ho cc chi tit ca bt k kiu kin trc my tnh no. Module ny chu trch nhim lin lc vi CPU treo hay tip tc chy mt TT. Cc thao tc y thc hin tp cc m my chuyn i bi cnh ca mi TT (procces context) khi TT b chen ngang (preempted) cng nh s chy tr li. 3. Module kin trc c lp (architecture-independent) lin lc vi module chnh sch lp biu xc nh TT no s chy trong thi gian ti, sau gi module architecture-specific phc hi li TT chn, ng thi module ny s gi module memory manager m bo rng vic khi phc li b nh cho TT l chun xc. 4. Module ghp ni Gi H thng (System Call Interface) cho php TT ngi dng ch 150 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ c th truy nhp ti cc ti nguyn m nhn HH cho php. iu ny s hn ch s ph thuc ca TT ngi dng vo cc giao din nh ngha cht ch v t khi sa i bt chp cc sa i cc module khc ca nhn HH. Nh vy TT ngi dng (hay chng trnh m ngun C) c th chy trn cc nn tng khc nhau (tnh portable).

H thng con Lp biu tin trnh Vi cc module trn, b lp biu s thc hin cc thao tc: - nhn cc ngt, chuyn cc ngt n cc module tng ng ca kernel x l; - gi signal ti cho cc TT ca user; - qun l b nh thi gian (timer) phn cng; - xc nh TT no s chy tip theo; - thu dn ti nguyn khi mt TT kt thc hon ho; - Cho php mt TT nhn bn khi gi fork(); 1.1 Thut ton lp biu cho TT Di tc ng ca ngt timer, thut ton s hot ng input: none output: none { while (no process picked to execute) { for (every process on run queue) 151 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ pick higest priority process that is loaded in memory; if (no process eligible to execute) idle the machine; /* interrupt takes machine out of idle state*/ } remove chosen process from run queue; switch context to that of chosen process, resume its execution; } Ta nhn thy cc TT c xu hng c chn chy phi cc trng thi ready to run in memory v preempted nh cp trc y, v TT c chn l TT c mc u tin cao nht. Cn cc TT cc trng thi khc u khng c ngha la chn. Nu c nhiu TT cng c mc u tin nh nhau, kernel s chn TT c thi gian i lu nht v tun th theo sch lc lun chuyn (round robin). Nu khng c TT no iu kin chy, h s ngh cho ti khi c ngt tip theo xut hin xy ra, nhiu nht l sau mt tick ca ng h. Sau khi thao tc ngt ny, kernel li th sp xp cho mt TT chy.
Linux 2.4.7-10 (Version 7.2), Xem trong m ngun. /*

* /usr/linux-x.y.x/kernel/sched.c
* * Kernel scheduler and related syscalls * * Copyright (C) 1991, 1992 Linus Torvalds * * 1996-12-23 Modified by Dave Grothe to fix bugs in semaphores and * make semaphores SMP safe * 1998-11-19 Implemented schedule_timeout() and related stuff * by Andrea Arcangeli * 1998-12-28 Implemented better SMP scheduling by Ingo Molnar */ /* 'sched.c' is the main kernel file. It contains scheduling *primitives *(sleep_on, wakeup, schedule etc) as well as a number of simple system * call functions (type getpid()), which just extract a field from * current-task */

Cc thng s lp biu

Mi u vo cho tng TT trong proces table c mt trng ghi nhn mc u tin lp biu chy TT. Mc u tin ca mt TT trong user_mode l hm s ca vic TT hin s dng CPU. Cc TT va s dng CPU xong th xp loi c mc u tin thp hn. Khong xc nh mc u tin c th phn ra lm hai lp: user_priority v kernel_priority. Mi lp c mt vi gi tr, mi mc u tin c mt hng i cho cc TT kt hp vi hng . Cc TT vi mc u tin ca ngi dng (user_priority) dnh quyn u tin khi t kernel mode tr v user mode, cn cc TT vi mc u tin trong kernel (kernel_priority) dnh c u tin n c trong thut ton ng (sleep). Mc user_priority nm di mt gi tr ngng, cn mc 152 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ kernel_priority th trn gi tr ngng v cn c chia nh nh sau: TT vi mc kernel_priority thp s c nh thc (wake up) trn c s nhn c tn hiu (signal), cn mc kernel_priority cao hn th tip tc ng. Hnh di cho thy ngng u tin gia user mode v kernel mode, ranh gii y l waiting for Child exit v user level 0. Cc u tin c tn swapper, waiting for disk I/O . . . vi cc TT i cng 1, 3, 2, vi mc u tin c th hin trn hnh. Cc mc user priority c phn bit l user level 0, user level 1 vi mc 0 l cao nht.

Kernel tnh mc u tin ca TT trong cc trng thi xc nh nh sau: Gn mc u tin cho TT ang i vo trng thi ng tng ng vi mt gi tr c nh lin quan ti l do m TT i ng. S u tin khng ph thuc vo cc c tnh thi gian chy TT , thay v, l mt hng gi tr m ho cng cho mi GHT sleep() tng ng vi l do lm TT ng. Cc TT i ng khi chy cc thut ton mc thp v khng tr li hot ng trong thi gian cng 153 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ lu cng c xu hng to nn s tc nghn h thng. V th cc TT loi ny nhn mc u tin cao hn cc TT t c kh nng gy tc nghn. V d, cc TT ng v i hon tt truy nhp a ( disk I/O) c mc u tin cao hn l cc TT i c c buffer (v l do no ). l v cc TT I/O ny c buffer, v mt khi thc dy chng c iu kin x l (data t a) v gii phng buffer cng nh, c th c cc ti nguyn khc. Hn na nu cng nhiu ti nguyn m TT s gii phng (tr li cho h thng), th cng tng thm c hi tt cho cc TT ang i ti nguyn, lm gim i xu th h b nghn, kernel cng t phi thc hin chuyn bi cnh ca cc TT, p ng thi gian cho TT nhanh hn, h thng thng sut hn. Cn c trng hp l mt TT ang i c buffer m buffer li ang s dng bi TT khc ang i hon tt truy nhp a, c 2 TT u ang ng, vi l do: cn buffer, cn TT kia cha xong vic. Khi I/O hon tt c 2 thc dy v chng cng trng i vo 1 a ch (buffer). Nu TT i buffer chy c trc th TT ny s li i ng cho ti khi TT kia tr li buffer. V vy mc u tin ca n s thp hn. Kernel ng thi iu chnh c u tin ca mt TT khi TT chuyn t kernel mode v user mode. Mt TT vo trng thi ng trc , ang thay i mc u tin ca n vo mc u tin trong ch kernel th TT phi h thp mc u tin ca n trong ch user khi tr v user mode. Kernel lm vy l m bo s cng bng cho tt c cc TT khi cc TT c nhu cu cc ngun ti nguyn c gi tr ca h thng. . B x l ng h ( clock handler) iu chnh mc u tin ca tt c cc TT trong user mode u n sau 1 giy (trn Sytem V) v khin kernel phi i qua thut ton schedule v nh vy s ngn chn mt TT c chim CPU. Clock c th ngt mt TT vi ln trong khon thi gian cp cho n. V mi ln nh vy clock handler s tng thm 1 vo gi tr ca trng thi gian ca TT trong process table ghi nhn thi gian TT s dng CPU v iu chnh vic s dng CPU theo hm s sau: decay(CPU) = CPU/2 Khi tnh ton li vic s dng CPU, clock handler cng tnh li mc u tin ca mi TT ang trng thi b chen ngang nhng sn sng chy (S3, S7) v thc hin theo cng thc: priority = (recent CPU usage / 2) + (base level user priority) Trong base level user priority l ngng u tin ni trn. y gi tr s cng thp tng ng vi mc u tin cng cao. Hai cng thc trn cho thy mi lin h gia vic s dng CPU v mc u tin ca mt TT v rng khi t l suy gim dng CPU (decay(CPU)) thp hn, TT cng lu t c mc c bn. Hu qu cc TT trng thi ready to run s c xu hung dnh c nhiu mc u tin hn. Tc ng ca vic tnh li mc u tin mi ln trong 1 giy l ch TT vi user level priority s chuyn dch gia cc hng i u tin (hnh di). Trong hnh, mt TT chuyn t hng i cho mc u tin user_level 1 ln user_level 0. Trong cc h thc t , c nhiu TT chuyn sang cc hng i ca cc mc, nhng hnh v ch biu th 1 TT. Kernel khng thay i mc u tin ca TT trong kernel mode, cng khng cho php cc TT c mc u tin trong user mode vt ngng sang mc u tin trong kernel 154 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ mode. TT ch c th thay i khi pht sinh GHT i vo trng thi ng (nh ni trn). Kernel tnh ton li mc u tin ca tt c cc TT hot ng mi ln / giy, nhng khong thi gian c th thay i t nhiu. Nu ngt clock n vo lc kernel v ang thc hin mt min m nhy cm (critical codes: mc x l nng cao hn nhng cha b qua ngt clock), kernel s khng tnh li mc u tin , thay v kernel s ghi nhn v s thc hin ngt clock ngay tip theo khi m mc thc hin x l trc thp. Vic tnh li mc u tin nh k m bo chin lc lun chuyn vic thc hin cc TT trong user mode. Kernel phn ng t nhin i vi cc yu cu tng tc, chng hn khi mt TT c t s thi gian ngh dng CPU cao, th mc u tin ca TT s nng ln khi TT sn sng chy. Khong thi gian ca c ch lp biu c th thay i t 0 giy dn 1 giy tuy thuc vo ti (nhiu hay t TT hot ng) ca h thng.

1.3

V d vic lp biu

Gi s trn System V c 3 TT: A, B v C, hot ng vi cc tnh hung nh sau: Chng ng thi c to ra vi mc u tin khi u l 60, mc u tin cao nht ca 155 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ user-level l 60, ng h ngt h thng 60 ln/giy, cc TT khng pht sinh ra GHT, khng c TT no khc trng thi ready to run. Kernel tnh gi tr suy gim dng CPU: CPU = decay(CPU) = CPU/2; v m u tin ca TT: priority = (CPU/2) + 60; Gi s A chy u tin v A bt u chy u ca khong thi gian ca n, A chy trong 1 giy: trong khong 1 giy ny h b ngt 60 ln v x l ngt tng s s dng CPU ln ti 60. Kernel chuyn bi cnh sau 1 giy v sau khi thc hin tnh ton mc u tin cho tt c cc TT, chn B chy. S vic cng din ra nh trn Qu trnh lp li v cc TT ln lt uc chy.

Hy quan st cc TT trong hnh tip theo:

156 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

H c TT A, (a), v sau c TT khc l B, (b). Kernel c th chen ngang cho A, t A vo ready to run sau khi A nhn c lng thi gian chy k tip trn CPU, v mc u tin user-level c th thp (a). Thi gian tin trin, B vo ready to run, v mc u tin user-level ca B cao hn A (b). Nu kernel khng lp biu cho A v B ( m cho mt TT khc no ), th c A v B c th s cng mc cho d B vo mc ny trc v mc khi u ca B gn vi mc ni ti hn (c) v (d). Tuy nhin kernel c th chn A trc B, v A trong trng thi ready to run lu hn (e). iu ny gi l quyt nh ai khi m cc TT c mc u tin user-level nh nhau (tie-breaker). Nhc li l kernel lp biu cho TT vo lc kt thc ca chuyn bi cnh: TT phi chuyn bi cnh khi TT i ng hoc khi TT thc hin exit v TT c c hi chuyn bi cnh khi t kernel mode v li user mode. Mt TT c mc u tin cao trong user mode khng th chy c nu c TT c mc u tin cao hn ang kernel mode. X l clock cho bit TT dng ht thi gian ca n, v c nhuu TT thay i mc u tin, nn kernel thc hin chuyn bi cnh ti lp biu cho cc TT. 1.4 Kim sot mc u tin

TT c thay i vic lp biu ca n bng GHT nice(): nice(value); trong value s cng vo gi tr lp biu: priority = (recent CPU usage/constant) + (base priority) + (nice value) GHT nice() tng hay gim trng nice ca mi TT trong process table bng gi tr ca thng s value, v ch c superuser c th cho gi tr nice tng priority ca TT ln cng 157 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ nh gi tr di mt ngng nht nh. User pht sinh ra nice() gim mc u tin ca mnh khi thc hin cc tnh ton i hi nhiu s u tin th user c u tin hn cc users khc (gi tr nice cng cao, gi tr priority cng cao, mc u tin cng thp). Cc TT con sau fork() tha k gi tr nice t TT b, v GHT nice() hot ng ch cho cc TT ang chy, v mt TT khng th t li (reset) gi tr nice ca TT khc v Iu ni ln rng nu adminitrator mun gim mc u tin ca cc TT do dng qa nhiu thi gian my (CPU), th con ng cn lm l git (kill) cc TT i. 1.5 X l thi gian thc

X l thi gian thc l vic p dng kh nng mang li p ng tc th cho nhng s kin bn ngoi ring bit v lp biu cc TT ring bit chy trong mt gii hn thi gian nht nh sau khi s kin xut hin. Thut ton lp biu cp c thit k cho mi trng phn chia thi gian v khng thch hp cho mi trng thi gian thc, v khng th bo m rng kernel c th lp biu cho mt TT nht nh trong mt khong thi gian gii hn c nh. Mt cn tr khc l kernel khng th chen ngang mt TT : kernel khng th lp biu mt TT thi gian thc trong user mode nu ng thi ang c TT khc ang thc hin trong kernel mode. h tr thi gian thc, cn c cc sa i: ngi lp trnh cn a cc TT thi gian thc vo kernel c c p ng thi gian thc. Gii php thc s l cho php cc TT thi gian thc kt thc mt cch ng, v kh nng thng bo cho kernel v nhng rng buc ca TT thi gian thc. Cho ti nay cc h Unix chun khng c kh nng ny, m OS thi gian thc l loi OS tng i khc bit. 2. Cc GHT dng vi thi gian

Cc GHT lin quan ti thi gian bao gm: 1.stime(): cho php superuser t cc gi tr vo cc bin tng th c thi gian hin ti: stime(pvalue); trong pvalue tro ti mt s nguyn di (long integer) cho thi gian tng bng giy tnh t na m ( 00:00:00), GMT. X l ngt ng h s tng bin ny bng +1 mt giy mt ln. 2. time(): hin thi li thi gian : time(tloc); tloc tr vo v tr ca TT user dnh cho ga tr tr li: time() tm li thi gian tch ly trong user mode v kernel mode ca TT gi s dng v thi gian tch lu m tt c cc TT con ang trng thi zombie thc hin trong user mode v kernel mode. C php gi nh sau: times(tbuffer) struct tms *tbuffer; y cu trc tms cha thi gian cn tm v c nh ngha bi: struct tms { /* time_t l ct trc d liu cho time*/ time_t tms_utime; /*user time of process*/ time_t tms_stime; /*kernel time of process*/ time_t tms_cutime; /*user time off children*/ time_t tms_cstime; /*kernel time off children*/ }; times tr li thi gian tri qua, thng l t lc boot h. Thc t chung cho tt c cc GHT 158 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ lin quan ti thi gian l s trng cy vo ng h h thng (system clock): kernel thao tc cc b m thi gian khc nhau khi x l ngt ng h v khi ng cc hnh ng thch hp. 3. ng h to ngt

Clock hay cn gi l timer l ht sc cn trong cc h phn chia thi gian. C hai kiu clock c to ra trn h: loi lp trnh c bao gm mt xung ngn (one short) c to ra bng cch m li mt gi tr khi c mi xung ca thch anh (crystal) trong my, cho ti khi ht s m th pht sinh ra xung hp (one short), kch hot mt ngt cng. Sau dng lm vic cho ti khi phn mm khi ng li. Kiu th hai l to ra mt xung vung u n (square wave): sau khi b m v 0, ngt c to ra, b m np li gi tr v t ng nhc li qu trnh m li v qu trnh l khng i. Ngt tun hon nh vy gi l clock tick. Gi tr ca b m l lp trnh c. Thun li ca kiu to clock ny l ngt pht sinh kim sot c bng phn mm. Loi th hai l dng ngay u ra ca thch anh, a v b m. B m s m cho ti 0 th to ngt CPU, qa trnh ny thun ty in t vi chnh xc rt cao. Chc nng ca b x l ngt ng h l : khi ng li ng h, lp biu kch hat cc chc nng bn trong ca kernel trn c s cc nh thi gian (timer) bn trong, cung cp kh nng nh hnh s thc hin cho kernel v cho cc TT ca user, thu thp cc s liu kt ton ca h thng v ca TT, gi nhp thi gian, gi cc tn thiu thng bo cho cc TT khi c yu cu, nh k nh thc TT swap, kim sot vic lp biu TT. Mt s cc thao tc (operation) c thc hin trong mi ngt ng h, cc thao tc khc sau mt vi ticks. X l ngt ng h thc hin trn CPU vi mc cao u tin cao, ngn cc s kin khc ( nh ngt t cc thit b ngoi vi) xy ra trong khi n ang chy. X l ngt ng h phi nhanh sao cho thi gian cm cc ngt khc nh nht nu c. Thut ton x l ngt ng h (clock handler) nh sau: Input: none Output: none { restart clock; /*so that it will interrupt again*/ if (callout table not empty) { adjust callout time; schedule callout function if time elapsed; } if (kernel profiling on) note program counter at time of interrupt; gather system statistics; gather system statistics per procces; 159 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ adjust measure of process CPU utilization; if ( 1 seconde or more since last here and interrupt not in critical region of code) { for (all procceses in the system) { adjust alarm time if active; adjust measure of CPU utilization; if (process to execute in user mode) adjust process priority; } wake up swapper process is neccesary; } } 3.1 Khi ng li ng h

Khi ng h ngt h thng, th hu ht cc my (tnh) u c yu cu sao cho ng h s li ngt h sau mt khon thi gian thch hp. Cc lnh thc hin yu cu ny ph thuc vo phn cng, v s khng cp y. 3.2 Timeout bn trong h thng

Khi kernel chy, c mt s cc hat ng cn kch hat nhng chc nng ca kernel trn c s thi gian thc, v d chc nng qun l thit b, cc giao thc mng v mt s thao tc khc. V d : TT t terminal vo ch c mt khi dt vo sao cho tha mn yu cu ca read() mt khon thi gian c nh thay v i user g phm xung dng. Kernel lu cc thng tin cn thit trong bng gi l callout, bng cho mt hm s kch hot khi khon thi gian ht, cc thng s cp cho hm, lng thi gian tnh theo ticks.

User khng th kim sot callout table c, cc thut ton ca kernel s to ra cc u vo ca bng khi cn thit. Kernel sp xp phn loi cc u vo ca bng trn s tn trng thi im pht ha (time to fire), c lp vi th t cc chc nng c t vo bng. Theo trnh t thi gian, trng thi gian cho mi u vo lu li lng thi gian pht ha sau khi thnh phn trc khai ha. Tng thi gian pht ho cho mt thnh phn trong bng l tng ca thi gian pht ho ca tt c u vo tnh ln trn, k c thi gian ca thnh phn . Hnh trn cho v d tc th ca callout table trc v sau khi thm mt u vo mi 160 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ trong bng cho chc nng f. Khi to mi 1 u vo mi, kerenl tm thy v tr chnh xc (timed) cho u vo v iu chnh thch hp trng thi gian ca u vo ngay lin pha sau . Trong hnh, kernel sp xp kch hot chc nng f sau 5 ticks ng h:nh sau: -to u vo cho f sau u vo cho b vi thi lng =2 (tng thi lng cho b v f =5), -iu chnh thi lng cho c =8 (c s pht ho sau 13 ticks). Cch thc hin qu trnh ny c th dng danh sch lin kt cho mi u vo hay Iu chnh v tr cc u vo trong bng khi thay i bng ( cch ny khng t gi nu kernel khng dng nhiu ti bng). mi ngt ng h, x l ng h s kim tra xem c u vo no trong bng callout v nu c, th gim trng thi gian ca u vo u tin. Theo cch m kernel qun l thi gian trong bng, vic gim thi lng ca u vo u tin cng gim thi lng ca tt c cc u vo khc. Nu lng thi gian ca u vo u tin l b hn hay bng 0 th chc nng tng ng s kch hot. X l ng h khng kch hot chc nng trc tip, sao cho chc nng khng tnh c cn tr ngt ng h sau ny: Mc u tin ca b x l hin c t ngn ngt ng h n, tuy vy kernel li khng th bit l chc nng s hon thnh trong bao lu. Nu chc nng m lu hn 1 tick ng h, th ngt ng h (v cc ngt khc) ti s b ngn li. Thay v lm nh vy, x l ng h thng thng sp xp chy chc nng bng cch to ngt mm (soft interrupt) hay cong gi l ngt c lp trnh, v n tc ng thc hin cc lnh my c bit. Nh ni ngt mn mc u tin thp hn l cc ngt khc, cho nn ngt mm s b chn li cho ti khi kernel kt thc thao tc cc ngt khc. C mt s ngt , k c ngt ng h c th xut hin vo gia khon thi gian kernel sn sng kch hot mt chc nng trong bng callout v thi gian ngt mm xut hin, do trng thi gian ca u vo u tin trong bng c th c gi tr m (xem hnh). Cui cng, khi ngt mm xy ra, x l ngt s li tr cc u m trng thi gian ca n ht hn khi bng v kch hot chc nng tng ng. V rng trng thi gian ca cc u vo u tin l 0 hay gi tr m, x l ngt ng h phI tm u vo u tin c trng thi gian l dng v gim gia tr . Chc nng a c gi tr thi gian l -2, c ngha rng h bt c 2 ngt ng h sau khi a c c hi kch hot, kernel b qua a v gim thi lng ca b. 3.3 Lm lc s (profiler)

Bng cch theo di lch s (profiling), kernel c c thc o mc h chy trong ch user ht bao lu so vi ch kernel, cng nh tng th tc (routine) chy trong ch kernel ht bao nhiu thi gian. Kernel kim sot thi gian tung i thc hin cc module ca kernel bng cch ly mu s hot ng ca h vo lc c ngt ng h. B iu khin lc s (profile driver) c danh sch cc a ch ca kernel ly mu m thng thng l a ch ca cc chc nng ca kernel. Nu chc nng profile c php hot ng (enable), x l ngt ng h s kch hot x l ngt ca profile driver v profile driver s xc nh thi im ngt ny b x l ang l ch user hay kernel. Nu l ch user, profile driver s tng b m thc hin trong ch user, nu l ch kernel, th tng mt b m bn trong tng ng vi b m chng trnh (program counter). Cc TT ca user c th c c cc thng s ca profile driver ly cc gi tr m ca kernel v thc hin cc s liu thng k. V d cho cc a ch gi nh ca cc chc nng ca kernel v cc g tr m tng ng:

161 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Algoritms bread() bread() bwrite() User() Addres 100 150 200 Count 5 0 2 2

Ngi dng (user) c th thc hin gi h thng k c cc gi tr mc user nh sau: profil(buff, bufsize, offset, scale); buff: bufsize: offset: scale: 3.4 a ch ca mt mng trong khng gian ca user, kch thc mng; a ch (o) ca chng trnh x l ca user; l mt h s (factor) nh x ch o ca user vo mng.

Kt ton v thng k

Khi clock ngt h, h c th ang chy trong ch user hay kernel, hay khng lm g c (idle: khng chy mt TT no, cc TT ang ng i s kin hoi vng). Kernel lu cc (gi tr ) ca cc b m (cho bit mi trng thi ca CPU), iu chnh cc ga tr ny trong mi ln ngt ng h, ghi nhn ch my (user/kernel) v TT ca user sau c th dng cc s liu ny lm phn tch. Mi TT c 2 trng trong u_area ca mnh lu thi gian tri qua trong ch user v kernel. Khi thao tc ngt ng h , kernel s cp nht cc gi tr mi cho TT ang c thc hin v tu vo TT ang ch no. Cc TT b tp hp cc s liu ca cc TT con trong khi thc hin wait() i TT kt thc (exit). Kernel tng bin thi gian (timer) mi ngt ng h lu li thi gian k t khi h khi ng. Gi tr ca timer s l u ra ca chc nng time() v tnh tng thi gian (thc) thc hin mt TT. Kernel lu thi gian bt u ca TT trong u_area khi TT c to ra bng fork() v tr i gi tr thi gian lc TT kt thc. Chc nng stime() s cp nht mi giy mt ln tnh thi biu lch. 4. Tm tt v TT v s lp biu chy TT

Trong Unix, ch c TT l cc thc th hot ng. Mi TT chy mt chng trnh v c mt lung (thread) kim sot. Ni mt cch khc, TT c mt b m chng trnh, cc thanh ghi ca CPU v khng gian a ch vi cc thnh phn: text (m chng trnh), data (user data v kernel data), stack (user stack v kernel stack). Cc thnh phn to ra bi cnh (context) ca TT. Mi TT trong Unix c khng gian a ch gm ba segment: text, data stack. Text segment cha cc lnh my to thnh chng trnh (tp thc thi) vi trng thI ch c (read only). Data segment cha data bao gm cc bin ca chng trnh, xu, trng (a chiu), v cc d liu khc. Data c hai phn: data c khi ng (cc bin, hng cn thit khi chng trnh bt u chy) v d liu cha khi ng (BSS: Block Started by Symbols). Unix c kh nng chia s m thc thi khi c nhiu ngi dng cng chy mt trnh ng dng. 162 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ V d nh trn hnh, TT A v TT B cng chia s text segment, vic nh x t khng gian nh o ca tng TT n text dng chung do HH v phn cng thc hin. L h a trnh, nn c v s cc TT c lp chy ng thi, mi user c th c vi TT hot ng, do vy con s c th ln n hng trm hay hng ngn. Ngay c khi user cha thc hin g th trn h cng c cc TT hot ng , gi l daemon, c khi ng t ng khi boot my. Cron daemon l mt v d, n c nh thc c sau 1 pht kim tra xem c cng vic g phI lm, nu khng th i ng, daemon khc dng nh thi gian lp biu cho cc TT chy, v.v TT c to ra bi GHT fork(), fork() to ra mt bn sao chnh xc ca TT gc. TT c to ra l TT con v TT thc hin GHT fork() l TT b. Hai TT c khng gian b nh ring bit, nh vy nu TT b thay i cc bin ca n th TT con khng th bit c, v ngc li.

Cc tp m l chia s gia hai TT, c ngha nu c tp m trc khi TT b fork, th tp tip tc m cho c hai sau . Mi thay i trn tp thc hin bi TT no u c TT kia nhn bit, v cc TT khc khng huyt thng tham gia m tp ny cng u (phi) bit n cc thay i . S ging ht nhau (identical) ca nh b nh, cc bin, cc thanh ghi, cng nh cc cc gi tr khc TT b v TT con, dn n mt kh khn: Cc TT lm sao bit c, TT no chy m ca TT b v TT no chy m TT con. iu b mt l ch fork() tr li gi tr 0 cho TT con, v gi tr khc 0, cn gi l PID cho TT b. C hai TT do thng kim tra gi tr tr v v thc thi hnh ng thch hp, nh v d sau: . . . pid = fork(); /* Nu GHT fork() thnh cng, pid > 0 trong TT b*/ if (pid < 0) 163 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ { /* fork () khng c: thiu b nh, Process Table ht u vo*/ . . /* M x l*/ . exit(n); } else if( pid > 0) { /* m TT b y*/ .. } else /*tng ng vi if (pid == 0)*/ { /* m TT con y*/ . . . } . . . TT c nhn bit bng PID, mt TT c th bit PID ca n bng GHT getpid(). PID c dng trong nhiu hon cnh, v d khi TT con kt thc, TT b s nhn c PID ca TT con va kt thc (TT b c th c nhiu TT con). Cc TT con c th to ra cc TT con khc, TT b s c TT chu, TT cht, v.v iu dn n s hnh thnh cy TT (tree of process). Cc TT trong Unix lin lc vi nhau bng c ch trao i thng ip (message) v qua knh truyn data gi l ng dn (pipe). Nguyn tc lm vic ca pipe l mt TT ghi mt xu cc bytes vo pipe v TT kia c cc bytes v n ch c c khi pipe khng rng, kernel s treo (khng cho chy tip) TT ghi nu pipe y. Qu trnh ny gi l s ng b khi thc hin pipe. Cc TT cn lin lc qua ngt mm m thc cht l TT s gi mt tn hiu (signal) cho mt TT khc. x l cc signal, cc TT ni cho kernel bit, cc TT mun g khi c cc signal n v s la chn l b qua signal hay n nhn signal hay TT s hy dit signal . Nu n nhn, TT phi xc nh mt th tc x l signal, sao cho iu khin s chuyn n th tc ny. Qu trnh sau ging nh x l ngt I/O bit. TT ch gi signal n c cc TT thnh vin cng nhm (process group) ca n : TT b v cc tin bi t tng, anh ch em rut, cc con v cc chu. TT cng c th gi signal ti tt c cc thnh vin trong nhm ca mnh bng mt GHT n gin. Signal cn c dng cho mc ch khc, chng hn nh trng hp x l li : chia cho s 0 trong php tnh du phy ng. Cacsignal m POSIX yu cu bao gm: SIGABRT SIGALAR M SIGFPE SIGHUP Sent to abort a process and force a core dump The alarm clock has gone off A floating point error has occurred The phone line the process was using has been hung up 164 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ SIGILL SIGINT SIGQUIT SIGKILL SIGPIPE SIGSEGV SIGTERM SIGUSR1 SIGUSR2 The process has excuted an illegal machine instruction The user has hit the DEL key to interrupt the process The user has hit the key requesting a core dump Sent to kill a process (cannot be caught or ignore) The process has written on a pipe with no readers The process has referenced an invalid memory ddress Used to request that a process terminate gracefully Available for application-defined purpose Available for application-defined purpose

Cc bn Unix c cc signal ca mnh song khng th s dng trn cc h Unix khc (not portable). Mi ngi dng trong Unix c nhn bit bi mt s nguyn gi l s nhn dng ngi dng uid (user identification), s ny c t trong tp /etc/passwd. Khi mt TT c to, th TT s t ng ly uid ca ngi to ra n. Vi uid = 0, th l superuser hay cn gi l root. Root c quyn truy nhp (R/W/X) tt c cc tp trn FS cho d ai to ra tp cng nh rp c bo v nh th no. Cc TT vi uid = 0 c quyn to ra mt s GHT c bo v v cc GHT ny s t chi thc hin i vi cc user bnh thng. Do c s khc bit v hiu lc trn Unix gia superuser v cc ngi dng khc, v to iu kin cho ngi dng c mt s kh nng nht nh, Unix c mt hm chc nng gn cc bit c bit kt hp vi cc tp thc thi, l setuid bit. bit ny l mt phn ca cc ch bo v trn tp. Khi mt chng trnh vi setuid bit = ON, c thc hin, th effective uid (uid hiu lc) cho TT s l uid ca ngi s hu tp thc thi, thay cho uid ca ngi dng kch hot chng trnh . Bng cch , superuser cho php cc ngi dng bnh thng chy nhiu chng trnh trn h bng chnh quyn lc ca mnh, nhng theo cc mc gii hn v kim sot c. C ch setuid dng ph bin trn Unix hn ch mt s cc GHT c kh nng truy nhp su vo h thng va ti nguyn m kernel qun l. Mi TT trong Unix c hai phn, phn user (level) v phn kernel (level). Phn kernel ch hot ng khi c mt GHT kch hot, n c stack v b m chng trnh ring, v iu ny rt quan trng, v mt GHT c th lm dng thc hin TT, thc hin mt cng vic khc (nh i c s liu t a). Kernel duy tr hai cu trc d liu lin quan ti TT: bng cc TT (process table) v cu trc ca ngi dng (user structure u_area). Process table thng tr trong h thng v cha cc thng tin cn thit cho tt c cc TT cho d TT c hay khng (swap out) trong b nh. User structure cng c hon i khi TT kt hp vi cu trc khng trong b nh ( s dng b nh hiu qu hn). Cc thng tin trong process table gm cc hng mc sau: 1. 2. Cc thng s lp biu (scheduling parameters): mc u tin ca TT, lng thi gian dng CPU. Cc thng s ny dng chn mt TT a vo chy. nh b nh: cc con tr vo cc phn on text, data, stack, cc bng cc con tr tr vo a ch vt l trong b nh (nu l c ch cp pht theo phn trang_paging). Nu text segment l chia s, th cc con tr tr vo cc trang chia s. Khi TT khng trong b nh th cc thng tin cn tm li TT cng cha y. Tn hiu: Mt n signal cho bit tn hiu no s c b qua, tn hiu no s tip nhn, tn hiu no tm thi s ngn li v tn hiu no TT ang gi i. Cc thng tin khc: trng thI hin ti ca TT, s kin ang hoI vng, PID 165 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

3. 4.

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ cuat TT, PID ca TT b, UID v GUID ca TT. Thng tin trong user structure u_area bao gm: 1. 2. 3. 4. Cc thanh ghi ca CPU: khi TT b ngt, cc thanh ghi TT ang dng lu y Trng thi ca GHT. Khi mt GHT c pht sinh theo mt m t tp (file descriptor fd) th fd l ch s tm n con tr m t (qua file table) nh v inode trong incore-inode table. Con tr ch n bng c cc thng tin v thi gian CPU, thi gian h thng m TT dng, lm kt ton, dI ti a ca stack cho TT, tng s trang b nh TT c th c cp. Kernel stack: l stack c nh phn kernel ca TT s dng.

L h phn chia thi gian, thut ton lp biu (scheduler) c thit k p ng vi cc TT tng tc. Thut ton c hai mc: mc thp s chn mt TT trong cc TT trong b nh sn sng chy chy tip theo. Mc cao ca thut ton thc hin hon i cc TT gia b nh v a (swap), sao cho cc TT c c hi trong b nh chy. Thut ton mc thp khai thc cc hng i khc nhau m mi hng kt hp vi mt gi tr (mc) u tin nht nh. Cc TT thc hin trong user mode c gi tr dng, cn TT thc hin trong kernel mode (TT thc hin mt GHT) c gi tr m. Cc gi tr cng m th mc u tin kt hp vi n cng cao, gi tr dng cng ln mc u tin cng thp. Ch cc TT ang trong b nh v sn sng chy mi t trong hng i v l niI TT s c chn. Khi scheduler chy, n tm cc hng i bt u vi mc u tin cao nht, v t nht ra TT u tin ca hng v cho TT chgy. TT s chy trong mt lng thi gian ti a nht nh (100ms chng hn, khong 5 tics vi tn s 50 Hz) cho ti khi ht. Mi ln c mt tics, b m s dng CPU ca TT trong process table tng ln 1. Gi tr ny s cng vo mc u tin ca TT chuyn TT xung mc thp hn. Khi ht thi gian ca mnh, TT s c t vo cui hng i v qu trnh s ti din. Chnh v vy ta gi thut ton chia s CPU l lun chuyn (round robin). C sau mi giy mc u tin ca cc TT s c tnh li mt ln: mc u tin mi = (thi gian dng CPU)/2 + mc c bn + nice valule trong mc c bn thng l 0. Tuy nhin ngi dng s iu chnh thnh s dng qua GHT nice().

166 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Khi TT b treo (TT thc hin mt GHT lin quan ti ti nguyn nh I/O a), TT s b loi ra khi hng i. Cho ti khi s kin TT hoi vng n, n s c t vo hng vi mt gi tr m. Vic chn hng no s ph thuc vo s kin m TT hoi vng (I/O a thng cao nht). n ca thut ton ny l lm cho TT thot ra khi kernel mode tht nhanh, tr TT v user mode (kt thc GHT).

167 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Chng V. trnh
(Inter Process Communication_IPC)

Lin lc gia cc tin

1.

Gii thiu

Chng trc cp cc chc nng c bn kim sot TT, t vic to ra TT, ng b hot ng gia cc TT, s dng c ch tn hiu cc TT thng bo cc s kin. Tuy nhin cc c ch vn mi ch l c bn. Chng ny s cp n cc pht trin cao hn v kh nng ng dng khi pht trin cc ng dng t n gin n phc tp. System V IPC c cc c ch nh sau: -pipe (ng ng): khng tn, FIFO: c tn; -thng ip (message): cho php cc TT gi cc khun d kiu c khun dng ti bt k TT no; -vng nh chia s (shared memory): cc TT chia s mt phn khng gian a ch o ca mnh; -nh tn hiu (semaphore): cc TT dng ng b vic thc hin. c s dng thng nht, cc c ch trn chia s cc thuc tnh nh sau: 1. Mi c ch c mt bng vi cc u vo m t (cn gi l cc descriptor) tt c cc thi im (instance) ca c ch ; 2. Mi u vo cha mt kho s (key) m tn ca kho do user chn; 3. Mi c ch cha mt gi h thng get to ra mt u vo mi hoc tm li mt u vo c , v cc thng s cho get k c kho (key) v c (flags). Kernel tm bng tng ng tm mt u vo c tn xc nh bng kho. Cc TT GHT get vi kho IPC_PRIVATE m bo nhn c mt u vo cha s dng. Cc TT c th dng bit IPC_CREATE trng cha c (flag) to mt u vo mi khi u vo ny vi kho trao cho m cha tn ti, hay dng c IPC_EXCL v IPC_CREAT c thng bo li mt khi u vo vi kho trao cho tn ti. GHT get tr li mt m t kernel la chn s dng trong cc GHT khc. 4. i vi mi c ch IPC, kernel dng cng thc sau y tm ch s trong bng cu trc d liu ca mt m t ni trn: index = descriptor modulo (number of entries in table) 5. Mi u vo c cu trc qun l quyn truy nhp bao gm user ID (UID) v group ID (GID) ca TT to ra u vo (tng t nh khi thc hin lm R/W/X trn tp cho u(user), g(group), o(other). 6. Mi u v cn c cc thng tin trng thi, v d PID ca TT cui cng cp nhp mi u vo (TT gi / nhn thng ip, ghp vng nh chia s, ...) v thi gian TT truy nhp, cp nht u vo. 7. Mi c ch c h thng kim sot truy vn trng thi ca mt u vo, t trng thi, hu u vo. Khi TT truy vn trng thI ca mt u vo, kernel 168 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ kim tra TT c c php c hay khng v sau copy d liu t u vo ca bng vo khng gian a ch ca user. Tng t, khi lp cc thng s vo u vo, kernel kim tra UID ca TT, xem c trng hp vi user ID (hay UID ca ngi to ra u vo) hay khng, c phi superuser chy TT ? Kernel sao chp d liu ca user vo u vo ca bng, lp cc UID, GID, quyn R/W/X cng nh cc trng khc ca u vo , tu thuc vo tng kiu c ch. Kernel khng thay i trng ID ca ngi to ra u vo, v GID c user , v vy ngi to ra u vo vn kim sot u vo nh trc. User c th hu u vo nu l superuser hoc nu UID trng hp vi trng UID ca u vo , kernel sau tng s ca descriptor sao cho ln to u vo mi tip theo s c c s descriptor khc. Chnh v vy nu TT truy nhp u vo bng s descriptor c, s c thng bo li. V d m hnh h thng IPC trn Linux:

2. K thut lin lc gia cc TT trong Unix System V


Phn ny s cp cc k thut p dng cho mi c ch nu v cc phin bn Unix h tr , vi bng tm tt sau:

Kiu IPC pipe (no named, half duplex) FIFO(named pipe stream pipe (full duplex)

SVR4

4.3 BSD

4.4+BSD

169 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ naned stream pipe message queue semaphore shered memory amocket stream

2.1.1. PIPE, nguyn tc C ch lin lc gia cc TT cho php cc TT bt k lin lc v ng b vic thc hin vi nhau. Chng ta cng xem xt mt vi phng thc, chng hn -pipe (bn song cng halff duplex) l loi pipe v danh (unnamed pipe) c hn ch l ch dng vi cc TT thuc con chu ca TT pht sinh ra GHT pipe, do vy cc TT khng c cng quan h huyt thng s khng th lin lc qua pipe c. -pipe c tn (named pipe: FIFO) m rng phm vi s dng, loi tr hn ch pipe v danh; - hn ch chung ca pipe: cc TT li khng th lin lc vi nhau qua mng, cng nh khng h tr d dng lin lc a ng dn cho cc tp hp khc nhau ca cc TT tham gia lin lc: khng th thc hin mt qu trnh dn knh (multiplex) trn mt named pipe to ra cc knh ring cho cc i TT lin lc.

1.TT b to pipe[2] trc

2. sau to TT con: pipe sau khi fork()

Sau khi fork, cc m t tp fd[0], v fd[1] ca TT b s c trong TT con v iu g s xy ra ph thuc vo hng thng tin mong mun. c chiu t TT b n TT con, TT b ng fd[0]_read ca TT b, TT con ng fd[1]_write ca TT con. Kt qu TT con c thng tin t fd[0] ca TT con, TT b ghi thng tin vo fd[1] ca TT b. Ngc li t TT con n TT b: TT b ng fd[1], TT con ng fd[0]. Khi c mt u cui ca pipe ng, hai lut sau s p t: Nu c (read()) pipe m u ghi (fd[1]) ng sau khi tt c d liu c ht, th read() s tr li 0, thng bo ht tp (EOF). C th nhn bn fd (m t pipe) cho nhiu TT c th ghi vo pipe, tuy thng thng ch mt c/mt ghi. Nu ghi (write()) vo pipe m u c (fd[0]) ng, th tn hiu SIGPIPE s pht ra. Nu b qua hay bt v x l signal v tr v t hm x l signal, th write() s tr li li EPIPE. 170 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Bin hng PIPE_BUF xc nh ln ca pipe trong kernel, cho nn nu mt TT ghi s bytes nh hn ln ca pipe th s khng c s cch qung d liu khi nhiu TT cng ghi vo pipe. Ngc li d liu ca cc TT s b an xen cch qung. C php to pipe v danh: #include <unistd.h> int pipe (int filedes[2]); return: =0 nu thnh cng,= -1 khi khng to c. V d: to pipe gi d liu t TT b n TT con. (pipe1.c) v gi d liu cho nhau. #include "ourhdr.h"

int main(void) { int n, fd[2]; pid_t pid; char line[MAXLINE]; if (pipe(fd) < 0) /* to pipe[2] trc khi fork()*/ err_sys("pipe error"); if ( (pid = fork()) < 0) /* 1. kim tra xem fork() OK !*/ err_sys("fork error"); else if (pid > 0) { /* 2. Cho code ca TT b: TT b (parent) ng fd[0] ca n */ close(fd[0]); write(fd[1], "hello world\n", 12); /* sau ghi mt d liu vo pipe*/ } else { /* 3. (pid==0) Cho code TT con:, TT con (child) ng fd[1] ca n */ close(fd[1]); n = read(fd[0], line, MAXLINE); /* v c d liu t pipe*/ write(STDOUT_FILENO, line, n); /*v hin thi ni dung ra stdout*/ } exit(0); } V d: TT b c d liu stdin v chuyn vo pipe, TT con c d liu t pipe v x l. Hot ng ca pipe: mt chiu: TT b -> TT con. #include <stdio.h> #include <unistd.h> /* Hm x l ca TT con*/ void do_child(int data_pipe[]) { int c; 171 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ int rc; close(data_pipe[1]); while ((rc = read(data_pipe[0], &c, 1)) > 0) { putchar(c); } exit(0); } /* Hm x l ca TT cha*/ void do_parent(int data_pipe[]) { int c; int rc; close(data_pipe[0]); while ((c = getchar()) > 0) { rc = write(data_pipe[1], &c, 1); if (rc == -1) { perror("Parent: pipe write error"); close(data_pipe[1]); exit(1); } } close(data_pipe[1]); exit(0); } int main() { int data_pipe[2]; int pid; int rc; rc = pipe(data_pipe); if (rc == -1) { perror("pipe create error "); exit(1); } pid = fork(); switch (pid) { case -1: 172 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ perror("fork error"); exit(1); case 0: do_child(data_pipe); default: do_parent(data_pipe); } return 0; }

2.1.2. Cc hm nng cao #include <stdio.h> FILE *popen ( const char *cmdstring, const char *type) return: con tr tp nu OK, NULL nu khng thnh cng; int pclose(FILE *fp); return: trng thI kt thc ca cmdstring, hoc -1 nu li. Hm thc hin to pipe, to TT con, kch hot exec shell thc hin cmdstring, l mt dng lnh ca shell s thc hin bng /bin/sh, sau i lnh kt thc.

Kt qu ca fp = popen (cmdstring, r) Kt qu ca fp = popen (cmdstring, w) V d: Copy tp vo mt chng trnh more (hay cn gi pager) (/usr/bin/more). Lnh shell ${PAGER:-more} ni rng hy dng gi tr ca bin shell PAGER nu c nh ngha v khc NULL, cn th dng bin more. (popen2.c) #define PAGER "${PAGER:-more}" /* environment variable, or default */

int main(int argc, char *argv[]) { char line[MAXLINE]; FILE *fpin, *fpout; if (argc != 2) err_quit("usage: a.out <pathname>"); 173 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ if ( (fpin = fopen(argv[1], "r")) == NULL) err_sys("can't open %s", argv[1]); if ( (fpout = popen(PAGER, "w")) == NULL) err_sys("popen error"); /* copy argv[1] to pager */ while (fgets(line, MAXLINE, fpin) != NULL) { if (fputs(line, fpout) == EOF) err_sys("fputs error to pipe"); } if (ferror(fpin)) err_sys("fgets error"); if (pclose(fpout) == -1) err_sys("pclose error"); exit(0); } Dch v chy: $popen2 /../../tntp Kt qa ging nh khi dng | more 2.1.3. ng Tin trnh (coprocess): To pipe hai chiu Mt ng TT l TT chy ch nn (background) t mt shell m u vo chun (stdin) v u ra chun (stdout) ca n ni ti mt chng trnh khc bng mt pipe. Trong khi popen() cho kt ni mt chiu ti stdin hay t mt stdout ca mt TT khc, th coprocess s cho hai pipe mt chiu ni ti mt TT khc: mt ni vo stdin ca coprocess, mt ni ti stdout ca coprocess. Ta c th ghi vo stdin ca n, y cho coprocess x l, sau c stdout ca n. Xem v du sau: 1. Mt TT to ra hai pipe: mt pipe l stdin ca coprocess, v pipe kia l stdout ca coprocess ; 2. Thao tc: ghi vo stdin v c t stdout ca coprocess

V d 1: minh ho qu trnh trn: 1. To mt chng trnh (coprocess) thc hin mt cng vic, v d cng hai s: c hai 174 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ s stdin, tnh tng, ghi ra ti stdout ca n. 2. To mt trnh khc s s dng coprocess ni trn. Chng trnh to hai pipe vi fd1[ ] v fd2[ ]. Mt cho stdin, v mt cho stdout ca ddd2. TT con gi dup2() chuyn cc m t ca pipe vo cc stdin, stdout ca TT con trc khi gi execl(add2) coprocess lm stdin, stdout ca n.Dch chng trnh vi tn pipe4 v chy. Nu kill add2 trong khi pipe4 chy, th signal s pht sinh. 1.To coprocess: (add2.c: cng hai s). Dch ra thnh tp thc thi vi tn add2 #include <stdio.h> #include <unistd.h> #include "ourhdr.h" int main(void) { int char

n, int1, int2; line[MAXLINE];

while ( (n = read(STDIN_FILENO, line, MAXLINE)) > 0) { line[n] = 0; /* null terminate */ if (sscanf(line, "%d%d", &int1, &int2) == 2) { sprintf(line, "%d\n", int1 + int2); n = strlen(line); if (write(STDOUT_FILENO, line, n) != n) err_sys("write error"); } else { if (write(STDOUT_FILENO, "invalid args\n", 13) != 13) err_sys("write error"); } } exit(0); } 2. To mt trnh khc, dt tn l pipe4.c, s s dng add2: #include #include static void int main(void) { int <signal.h> "ourhdr.h" sig_pipe(int); /* our signal handler */

n, fd1[2], fd2[2]; 175

________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ pid_t pid; char line[MAXLINE]; if (signal(SIGPIPE, sig_pipe) == SIG_ERR) /* ci x l signal*/ err_sys("signal error"); if (pipe(fd1) < 0 || pipe(fd2) < 0) err_sys("pipe error"); /* To ra hai pipe*/

if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid > 0) { /* parent: ng cc fd khng dng**/ close(fd1[0]); close(fd2[1]); while (fgets(line, MAXLINE, stdin) != NULL) { n = strlen(line); if (write(fd1[1], line, n) != n) err_sys("write error to pipe"); if ( (n = read(fd2[0], line, MAXLINE)) < 0) err_sys("read error from pipe"); if (n == 0) { err_msg("child closed pipe"); break; } line[n] = 0; /* null terminate */ if (fputs(line, stdout) == EOF) err_sys("fputs error"); } if (ferror(stdin)) err_sys("fgets error on stdin"); exit(0); } else { /* child : ng cc fd khng dng*/ close(fd1[1]); close(fd2[0]); if (fd1[0] != STDIN_FILENO) { if (dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO) err_sys("dup2 error to stdin"); close(fd1[0]); } if (fd2[1] != STDOUT_FILENO) { if (dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO) err_sys("dup2 error to stdout"); close(fd2[1]); } if (execl("./add2", "add2", (char *) 0) < 0) /* Child kch hot add2 err_sys("execl error"); 176 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

coprocess*/

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ } } static void sig_pipe(int signo) { printf("SIGPIPE caught\n"); exit(1); } V d2 Pipe hai ng #include <stdio.h> #include <unistd.h> #include <ctype.h> void user_handler(int input_pipe[], int output_pipe[]) { int c; int rc; close(input_pipe[1]); close(output_pipe[0]); while ((c = getchar()) > 0) { rc = write(output_pipe[1], &c, 1); if (rc == -1) { perror("user_handler: pipe write error"); close(input_pipe[0]); close(output_pipe[1]); exit(1); } rc = read(input_pipe[0], &c, 1); if (rc <= 0) { perror("user_handler: read error"); close(input_pipe[0]); close(output_pipe[1]); exit(1); } putchar(c); } close(input_pipe[0]); close(output_pipe[1]); exit(0); } void translator(int input_pipe[], int output_pipe[]) 177 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ { int c; int rc; close(input_pipe[1]); close(output_pipe[0]); while (read(input_pipe[0], &c, 1) > 0) { if (isascii(c) && islower(c)) c = toupper(c); rc = write(output_pipe[1], &c, 1); if (rc == -1) { perror("translator: write"); close(input_pipe[0]); close(output_pipe[1]); exit(1); } } close(input_pipe[0]); close(output_pipe[1]); exit(0); } int main() { int user_to_translator[2]; int translator_to_user[2]; int pid; int rc; rc = pipe(user_to_translator); if (rc == -1) { perror("main: pipe user_to_translator error"); exit(1); } rc = pipe(translator_to_user); if (rc == -1) { perror("main: pipe translator_to_user error"); exit(1); } pid = fork(); switch (pid) { 178 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ case -1: perror("main: fork error "); exit(1); case 0: translator(user_to_translator, translator_to_user); default: user_handler(translator_to_user, user_to_translator); } return 0; }

2.2 FIFO FIFO i khi cn gi l named pipe. Vi FIFO, cc TT khng c cng huyt thng vn dng chung c. V FIFO l tp c bit, nn cch to cng ging nh khi to tp. C php ti FIFO nh sau: #include <sys/types> #include <sys/stat.h> int mkfifo ( const char *pathname, moe_t mode); return: 0 nu thnh cng, -1 c li. mode: O_RDONLY, O_WRONLY, O_RDWR Pathname: tn tp s to trong FS Khi to c FIFO, cc thao tc thc hin bng cc hm I/O trn tp : close(), read(), write(), link(), unlink(), C hai cch s dng: 1. cc lnh shell s dng chuyn d liu t pipeline ca n cho pipeline ca lnh shell khc m khng cn to ra tp tm thi; 2. cc ng dng client/server dng chuyn d liu vi nhauuCc v d: V d: 1.To ra mt FIFO c tn fifo1, 2.Chy chng trnh c tn prg3 ch nn, vi d liu vo ly t fifo1 ( dng redirect), 3.Cho chy chng trnh c tn prg1, vi d liu vo ly t tp nfile, lnh tee s copy stdin 179 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ ca n cho c stdout ca n v cho tp c tn trong dng lnh. $mkfifo fifo1 $prog3 < fifo1 & $prog1 < nfile | tee fo1 | prog2

S dng FIFO v tee gi mt xu ti hai TT khc nhau. Client/server s dng FIFO:

Client server lin lc qua FIFO 2.3 Hng thng ip (message queue)

Hng thng ip l mt danh sch lin kt ca cc thng ip c lu trong kernel v nhn bit bi nhn dng hng thng ip (message queue ID). Hm mssget() dng m hay to mi mt hng. Mi thng ip c mt trng kiu nguyn dng, c di khng m v cc bytes d liu. Kernel nh ngha mi cu trc cho cc kiu IPC (message queue, semaphore, shared memory) v qui chiu ti bng mt s nguyn nh dng khng m (gi l ID, identifier). Khi mt cu trc IPC c to ra, th mt kha (key) phi c xc nh (l 180 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ tn ngi dng t chn). Kiu d liu ca key l mt s nguyn di (long integer nh ngha trong <sys/types.h>) v kernel s bin i key thnh ID. Cn c trng c trng thi (flag) vi cc gi tr: bit IPC_CREAT, to mi mt u vo trong hng thng ip vi key cha tn ti. C bn GHT gi thng ip: msgget(): ly (,hay to) mt m t thng ip c ch r hng thng ip dng cho cc GHT khc; msgctl(): c tu chn lp cc thng s v tr v cc thng s kt hp vi mt m t thng ip, v tu chn hu cc m t; msgsnd(): g mt thng ip; msgrcv(): nhn mt thng ip. Kernel lu cc thng ip trn mt hng lin kt cho mi mt m t v dng msgqid lm ch s (index) vo trng cc u hng i thng ip. Thm vo cc php truy nhp ni, cu trc hng i c thm cc trng sau y: -cc con tr tr vo thng ip u tin v thng ip cui cng ca danh sch lin kt; -s cc thng ip v tng s cc bytes d liu trn danh sch lin kt; -s lng ti a cc bytes d liu c th trong danh sch; -PIDs ca cc TT cui cng gi v nhn thng ip; -Tem thi gian cho bit cc thao tc thng ip cui cng nh msgsnd, msgrcv, msgctl.

- to mt m t thng p mi, user thc hin GHT msgget(), kernel tm trng cc hng thng ip km tra xem m t vi key i km c cha. Nu cha c u vo n ng vi key , kernel s cp mt hng thng ip mi, khi ng cc cu trc ca hng v tr li m t ca hng. Trong cc trng hp khc, kernel kim tra quyn truy nhp hng thng ip v thot khi GHT. msgget(key, flag); trong key l kho gn cho hng thng ip, key c th l IPC_PRIVATE cho bit 181 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ hng thng ip l ring ca TT v n i vi cc TT khc. - Mt TT khi cn gi mt thng ip, s thc hin: msgsnd(msgqid, msg, count, flag) trong msg l con tr tr vo cu trc cha thng ip nh sau: { long mtype /*kiu thng ip user t chn, nguyn dng*/ char mtext /*mng vn bn thng ip*/ } count: s bytes cc i tu h; flag: hnh ng kernel s lm g khi vt qu buffer bn trong h thng. Thut ton gi thng ip nh sau: msgsnd() input: (1) message queue descriptor (2) address of message structure (3) size of message (4) flags output: number of bytes sent { . check legality of descritor, permissions; . while ( not enough space to strore message) { if (flags specify not to wait) return; sleep (until event enough space available); } . get message header; . read message text from user space to kernel; . adjust data structure: enqueue message header, message header point to data, count, time stamps, process ID; .wakeup all processes waiting to read message from queue; } Sau khi thc hin kim tra di thng ip, kiu thng ip (nguyn dng) kernel cp vng nh cho thng ip v copy data t vng nh ca user vo . Kernel cp u ca mt hng thng ip (queue header), t header thng ip vo cui danh sch lin kt cc header ca hng thng ip, lp con tr trong header ch vo vn bn thng ip (data message trong hnh). Sau cp nht cc trng s liu (s thng ip, s bytes trong hng thng ip, tem thi gian, ID ca TT gi thng ip) trong header ca hng thng ip (queue header trong hnh). Sau cng kernel nh thc cc TT ang i nhn thng ip gi ti hng . Khi s bytes trong hng nhiu hn gii hn cho php, TT i ng cho ti khi c thng ip khc ly ra khi hng. Nu TT xc nh khng cn i (lp c IPC_NOWAIT), TT thot ngay 182 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ GHT vi bo li. Sau y l cc v d cho thy qu trnh to hng thng ip v cc s dng: V d 1: 1.To hng thng ip: #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int queue_id = msgget(IPC_PRIVATE, 0600); int queue_id = msgget(1234, 0777); 2. Cu trc hng thng ip, phi khai bo trc khi chuyn thng ip struct msgbuf { long int mtype; char mtext[ 1 ]; /*mtype nguyn dng, biu din thng ip, d liu l trng */ }; /* bin thin xc nh dI thng ip*/ v d: To thng ip char * msg_text = Xin cho, v xin cp vng nh: struct msgbuf *msg = (struct msgbuf *) malloc (sizeof(struct msgbuf) + strlen(msg_text)); 3. Gn mt s nguyn tu chn biu din ngha cho kiu thng ip: msg->mtype = 23; 4. Sau copy ni dung vo cu trc ca thng ip strcpy(msg->mtext, msg_text); 5. Sau gi thng ip v hng cc thng ip. V d gi thng ip gia cc TT: /* queue_defs.h: Tp nh ngha cc bin s dng:*/ #ifdef QUEUE_DEFS_H #define QUEUE_DEFS_H #define QUEUE_ID 137 #define MAX_MSG_SIZE 200 #define NUM_MESSAGES 100 #endif /* QUEUE_DEFS_H */ /*sender.c: TT Gi thng ip*/ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> 183 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ #include <sys/msg.h> #include "queue_defs.h" struct msgbuf { long int mtype; char mtext[1]; }; int main(int argc, char* argv[]) { int queue_id; struct msgbuf* msg; int i; int rc; queue_id = msgget(QUEUE_ID, IPC_CREAT | 0777); if (queue_id == -1) { perror("main: msgget error"); exit(1); } printf("message queue created, queue id '%d'.\n", queue_id); msg = (struct msgbuf*)malloc(sizeof(struct msgbuf)+MAX_MSG_SIZE); for (i=1; i <= NUM_MESSAGES; i++) { msg->mtype = (i % 3) + 1; sprintf(msg->mtext, "hello world - %d", i); rc = msgsnd(queue_id, msg, strlen(msg->mtext)+1, 0); if (rc == -1) { perror("main: msgsnd error"); exit(1); } } free(msg); printf("generated %d messages, exiting.\n", NUM_MESSAGES); return 0; } /*TT nhn thng ip: reader.c*/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 184 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ #include "queue_defs.h" struct msgbuf{ long int mtype; char mtext[1]; }; int main(int argc, char *argv[]) { int queue_id; struct msgbuf* msg; int rc; int msg_type; if (argc != 2) { fprintf(stderr, "Usage: %s <message type>\n", argv[0]); fprintf(stderr, " <message type> must be between 1 and 3.\n"); exit(1); } msg_type = atoi(argv[1]); if (msg_type < 1 || msg_type > 3) { fprintf(stderr, "Usage: %s <message type>\n", argv[0]); fprintf(stderr, " <message type> must be between 1 and 3.\n"); exit(1); } queue_id = msgget(QUEUE_ID, 0); if (queue_id == -1) { perror("main: msgget error"); exit(1); } printf("message queue opened, queue id '%d'.\n", queue_id); msg = (struct msgbuf*) malloc(sizeof(struct msgbuf)+MAX_MSG_SIZE); while (1) { rc = msgrcv(queue_id, msg, MAX_MSG_SIZE+1, msg_type, 0); if (rc == -1) { perror("main: msgrcv error"); exit(1); } printf("Reader '%d' read message: '%s'\n", msg_type, msg->mtext); sleep(1); } 185 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ return 0; } V d 2: TT khch: TT gi msgget() nhn c mt m t, vi key a vo MSGKEY: #include #include #include #define <sys/types.h> <sys/ipc.h> <sys/msg.h> MSGKEY long char }; main() { struct msgform msg; int msgid, pid, *pint; msgid = msgget(MSGKEY, 0777); pid = getpid(); pint = (int *) msg.mtext; *pint = pid; /*copy pid into message*/ msg.mtype = 1; /*set message type=integer positive*/ msgsnd(msgid, &msg, sizeof(int), 0); msgrcv(msgid, &msg, 255, pid,0); /*pid is used as the msg type*/ printf(client: receive from pid %d\n, *pint); } TT to mt thng ip di 256 bytes (tuy dng khng ht), copy PID ca n vo phn ni dung ca thng ip, gn kiu thng ip = 1 (l s nguyn dng), sau gi thng ip i bng GHT msgsnd(). TT nhn thng ip bng: count = msgrcv(id, msg, maxcount, type, flag); id: l m t thng ip; msg: a ch cu trc data ca user cha thng ip nhn c; maxcount: kch thc mng data trong msg, type: xc nhkiu thng ip user mun nhn; flag: cho kernel bit phi lm g nu khng c thng ip trong hng; count: s bytes ca thng ip tr li cho user. V thut ton nhn thng ip nh sau: msgrcv() 186 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni 75 mtype; mtext[256];

struct msgform {

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Input: (1) message descriptor (2) address of data array for incoming message (3) size of data array (4) requested message type (5) flags output: number of bytes in returned message { . check permissions; loop: . check legality of message descriptor; /*now find message to trurn to user*/ . if (requested message type = 0) consider first message on queue; . else if (requested message type > 0) consider first message on queue with given type; . else /*type <0*/ -consider first of the lowest typed message on queue, such that its type is < = absolute value of requested type; . if (there is a message) { -adjust message size or return error if user size too small; -copy message type, text from kernel space to user space; -unlink message from queue; -return; } /*no message*/ . if (flags specify not to sleep) return with error; . sleep (event message arrives on queue); . goto loop; } Cc trung hp x l nh sau: Type = 0, ly thng ip u tin trong danh sch lin kt cc headers ca hng i v nu di thng ip <= array[ ] ca user, chuyn thng ip vo cho user; kernel iu chnh li cu trc d liu: gim s m cc thng ip, gim s m cc bytes trn hng, dn tem thi gian nhn thng ip, cp nht PID ca TT nhn, iu chnh danh sch lin kt, tr li khng gian b nh kernel dng, nh thc cc TT trc (ang ng) mun gi thng ip nhng do cha c ch cha. Trong trng hp di ca thng ip > maxcount do user lp, tr li thng bo li, thng ip gi li trong hng. Nu TT b qua li ni trn (khi bit MSG_NOERROR lp trong flag), kernel ct thng ip (= maxcout)v tr li s bytes user yu cu, hu ton b thng ip khi danh sch. TT c th ly thng ip theo type TT mun. Nu type l nguyn_dng, TT s nhn c thng ip u tin ca kiu type . Nu type <0, kernel tm type thp nht ca tt c cc thng ip trn hng nh hn hoc bng gi tr s tuyt i ca type cho v trao cho TT thng ip u tin ca type kiu . V d, hng thng ip c 3 thng ip vi cc kiu l 3, 1, 2 tng ng. Nu TT (user) ly thng ip vi type = -2, kernel s trao thng ip kiu 1 187 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ ( 1<= | 2| ). Trong cc trng hp khi khng c thng ip no tho mn m TT yu cu nhn, kernel t TT vo trng thi ng, tr khi TT lp bit IPC_NOWAIT trong flag thot ra ngay lp tc. Hy xem v d sau y, gi l TT phc v: #include #include #include #define <sys/types.h> <sys/ipc.h> <sys/msg.h> MSGKEY long char }msg; main() { int i; msgid, pid, *pint; extern cleanup(); for( i=0; i <20; i++) signal(i, cleanup); msgid = msgget( MSGKEY, 0777 | IPC_CREAT); for (; ; ) { msgrcv(msgid, &msg, 256, 1,0); pint = (int*)msg.mtext; pid = *pint printf(server: receive from pid %d\n,pid); msg.mtype = pid; *pint = getpid(); msgsnd(msgid, &msg, sizeof(int), 0); } } cleanup() { msgctl(msgid, IPC_RMID, 0); exit(); } Chng trnh TT phc v cho cu trc ca server cung cp dch v cho TT client trc y. TT phc v nhn yu cu t cc TT client, cung cp thng tin t mt database; TT phc v l im n gin truy nhp vo database, h tr d dng lm cho batabase bn vng v an ton. TT phc v to cu trc thng ip bng cch lp c IPC_CREAT trong msgget() v nhn tt c cc thng ip theo kiu 1, yu cu t cc TT client. TT phc v c vn bn thng ip, tm PID ca TT client v t kiu thng ip bng s PID ca TT client . Trong 188 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni 75 mtype; mtext[256];

struct msgform {

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ v d ny, TT phc v gi tr li PID ca mnh cho TT client trong vn bn thng ip, TT client nhn thng ip vi kiu thng ip bng s PID ca n (cc lnh trong vng for(;;)). Bi vy TT phc v nhn ch cc thng ip gi cho n bi cc TT client, v cc TT client nhn ch cc thng ip gi n t TT phc v. Cc TT ny phi hp vi nhau to ra c ch a knh trn mt hng thng ip. Cc thng ip c to ra theo nh dng kiu cp d liu m tp d liu l mt dng cc bytes (byte stream). Tin t type cho php cc TT la chn cc thng ip theo cc kiu ring bit nu mun, l mt c tnh khng c trong cu trc ca h thng tp (FS). TT do c th ly ra cc thng ip kiu c bit t hng thng ip theo trnh t cc thng ip n v kernel bo tr chnh xc th t . Hon ton c th thc hin trao i thng ip mc user kt hp vi h thng tp, nhng vi c ch thng ip, cc TT trao i d liu hiu qu hn nhiu. TT c th truy vn trng thi ca m t thng ip, t trng thi, loi b m t thng ip bng msgctl() vi c php nh sau: msgctl(id, cmd, mstatbuf) id: cmd: mstatbuf: nhn dng ca m t thng ip, kiu lnh, a ch cu trc d liu ca user s cha cc thng s kim sot hay kt qu truy vn (Xem h tr lnh ny HH c chi tit v cc thng s).

Trong v d ca TT phc v TT chn nhn tn hiu (signal()) v gi cleanup() loi thng ip khi hng. Nu TT khng thc hin lnh ny, hoc nhn mt tn hiu SIGKILL, th thng ip s tn ti ngay c khi khng c TT no qui chiu ti thng ip . iu s gy li khi to ra mt hng thng ip mi cho mt key cho v ch to c khi thng ip kiu ny b hu khi hng. 2.4 Vng nh chia s (shared memory region)

Cc TT c th lin lc vi nhau qua mt phn trong khng gian a ch o ca mnh gi l vng nh chia s (shared memory), sau thc hin c / ghi d liu vo . GHT shmget() s to mt min mi ca vng nh chia s hay tr li min nh nu c tn ti. shmat() s gn mt min nh vo khng gian a ch o ca mt TT, shmdt() lm vic ngc li v shmctl() thao tc cc thng s khc nhau kt hp vi mi vng nh chia s. TT c/ghi vo shared memory bng cc lnh nh thng thng vi b nh ni chung. Sau khi mt min c gn vo khng gian ca TT, th min nh mt phn ca b nh ca TT v khng i hi thao tc g c bit. C php ca shmget() nh sau: shmid = shmget(key, size, flag); size: l s bytes ca min. Kernel d trong bng vng nh chia s tm key, nu c key (= entry trong bng) v ch truy nhp cho php, kernel tr li m t (shmid) ca u vo ; nu khng c v nu trong GHT user t flag=IPC_CREAT to vng mi, kernel kim tra li nu kch thc (size) 189 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ yu cu l trong cc gii hn h thng th cp vng nh cho TT gi (bng alloreg() ni trc y). Cc thng s kim sot nh ch truy nhp, kch thc, con tr vo vng nh vo trong bng b nh chia s. t c cho bit cha c b nh (ca TT) no gn vi vng. Khi mt TT gn vng vo b nh ca TT, kernel cp cc page cho vng, lp c cho bit vng s khng c gii tr khi cn mt TT cui cng gn vo thc hin exit(). Nh data trong b nh chia s khng mt i ngay c khi khng c TT no gn vo khng gian nh ca mnh.

Mt TT gn vng nh chia s vo khng gian a ch o ca TT vi GHT shmat(): virtaddr = shmat( id, addr, flags) id do shmget() tr li cho bit min b nh chia s, addr l min a ch o m user mun gn b nh chia s vo, flags xc nh vng s ch c hay kernel c th lm trn (m rng hn) a ch user xc nh, viraddr l a ch o ni kernel gn vng nh chia s vo ( khng cn TT phi xc nh). Thut ton gn vng nh chia s vo khng gian a ch ca mt TT nh sau: Input: output: { (1) shared memory descriptor (2) virtual address to attach shared memory memory to (3) flags virtual address where shared memeory was attached. .check validity of descriptor, permission; .if ( user specified virtual address) { .round off virtual address, as specified by flags; .check legality of virtual address, size of region; 190 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ } .else /*user wants kernel to find good address*/ .kerrnel picks virtual address, error if none available; .attach region to process address space (attachreg()); .if (region being attached for first time) .allocate page table, memory for region (growreg()); .return (virtual address where attached); } Vng nh chia s khng c ph ln cc vng khc trong khng gian a ch ca TT, ng thi vy phi chn rt thn trng (v d khng gn vo gn vi vng data ca TT, TT m rng vng data vi a ch lin tc, khng gn vi nh ca vng stack) sao cho cc vng ca TT khi tng trng khng chen vo . Mt TT g vng nh chia s khi khng gian a ch o ca TT vi GHT shmat(): shmat( addr) Khi thc hin kernel s dng GHT detachreg() cp. V bng min khng c con tr ngc tr vo bng vng nh chia s, nn kernel tm trong bng ny u vo c con tr tr vo min gn v iu chnh lun trng thi gian bit ln cui cng vng g ra (stamp). V d: Mt TT to ra 128 Kbytes vng nh chia s v hai ln gn vo vo khng gian a ch ca n cc v tr khc nhau. TT ghi vo vng gn th nht v c vng th hai (m thc t ch c mt): #include #include #include #define #define <sys/types.h> <sys/ipc.h> <sys/shm.h> SHMKEY 75 K 1024

int shmid; main() { int i, *pint; char *addr1, *addr2; extern char *shmat(); extern cleanup(); for (i = 0; i < 20; i++) signal(i, cleanup); shmid = shmget(SHMKEY, 128*K, 0777 | IPC_CREAT); addr1 = shmat(shmid, 0 ,0); addr2 = shmat(shmid, 0, 0); printf(addr1 0x%x addr2 0x%x\n,addr1, addr2); pint = (int *)addr1; for(i=0;i<256;i++) 191 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ *pint++ = i; pint = (int *) addr1; *pint = 256; pint = (int *) addr2; for(i=0; i<256; i++) printf(index %d\tvalue %d\n, i, *pint++); pause(); } /*Hu vng nh chia s, cmd=IPC_RMID*/ cleanup() { shmctl(shmid, IPC_RMID); exit(); } Tip theo chy mt TT khc gn vo cng b nh chia s (cng kho SHMKEY), ch dng 46 K trong tng s 128 Kbytes, TT ny i cho TT u ghi cc gi tr khc 0 vo t u tin ca vng nh chia s, sau c ni dung. TT u s ngh (pause()) to iu kin cho TT kia thc hin. Khi TT u bt c tn hiu n s g (signal(i, cleanup))vng nh chia s ra khi khng gian ca mnh. #include #include #include #define #define main() { int i, *pint; char *addr; extern char *shmat(); shmid = shmget(SHMKEY, 64*K, 0777); addr = shmat(shmid, 0, 0); pint = (int*) addr; while(*pint == 0) ; for(i=0;i<256;i++) printf(%d\n, *pint++); } TT dng 192 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni <sys/types.h> <sys/ipc.h> <sys/shm.h> SHMKEY 75 K 1024

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ shmctl(id, cmd, shmstatbuf) truy vn trng thi v t cc thng s cho b nh chia s. Id ch ti u vo trong bng b nh chia s, shmstatbuf l a ch cu trc d liu ca user cha cc thng tin trng thI ca vng nh chia s khi truy vn trng thi hay khi t cc thng s, cmd l lnh cn thc hin. V d trong hm cleanup() ni trn. 2.5 C hiu (semaphore)

Cc gi h thng dng c hiu h tr cc TT ng b vic thc hin, bng cc thao tc tn tp cc c hiu. Trc khi p dng c hiu, TT to ra vic kha tp (lock) bng GHT creat(). Nu c li do: tp c trong FS, hay c th tp kha do mt TT khc. Ch bt tin ca cch tip cn ny l cc TT khng bit khi no th c th th liv kha tp c th tnh c b li ng sau khi h thng b s c, hay khi ng li. Thut ton Dekker m t p dng c hiu nh sau: Cc i tng c gi tr nguyn c hai thao tc c bn nht nh ngha cho chng l P v V. Thao tc P gim gi tr ca c hiu nu gi tr > 0, thao tc V tng ga tr . V rng P v V l cc thao tc thuc loi nguyn t (atomic) nn t nht P hay V thnh cng trn c hiu bt k thi im no. Trn System V, P v V vi vi thao tc c th c lm ng thi v vic tng hay gim cc ga tr ca cc thao tc v vy c th > 1. V kernel thc hin tt c cc thao tc nh l cc nguyn t, nn khng mt TT no c th iu chnh gi tr ca thao tc cho ti khi thao tc hon tt. Nu kernel khng th thc hin tt c cc thao tc, c ngha kernel khng lm bt k thao tc no; TT i ng cho ti khi c th lm tt c cc thao tc. C hiu trong System V c cc thnh phn nh sau: gi tr ca c hiu, PID ca TT cui cng thao tc c hiu, Tng s cc TT ang i tng gi tr ca c hiu ln, Tng s cc TT ang i gi tr ca c hiu s bng 0. thao tc c hiu cc TT dng cc GHT sau y: semgt(): semctl(): semop(): to v gn quyn truy nhp tp cc c hiu; thc hin cc thao tc kim sot tp cc c hiu; thao tc gi tr ca cc c hiu.

semgt() to mt mng cc c hiu nh sau: id = semget(key, count, flag); Cc i trong hm nh trc y nh ngha cho cc GHT thng ip.Kernel cp mt u vo trong bng cc c hiu vi con tr tr vo trng cu trc c hiu vi count thnh phn, ng thi cho bit tng s cc c hiu c trong mng, thi im cui cng thc hin semop(), semctl(). Cc TT thao tc c hiu vi semop(): oldval = semop(id, oplist, count); 193 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ id do semgt() tr li, oplist l con tr tr vo mng cc thao tc c hiu, count l kch thc ca mng. oldval l gi tr ca c hiu cui cng thao tc trn tp trc khi thao tc ( do gi semop()) hon tt.

Mi thnh phn ca oplist nh sau: -s ca c hiu cho bit u vo ca mng cc c hiu s c thao tc; -thao tc (g); -cc c. Thut ton nh sau: semop(): inputs: (1) semaphore descriptor; (2) array of semaphore operations, (3) number of element s in array. start value of last semaphore operated on.

Output: { .check legality of semaphore descriptor; start: .read array of semaphore operations fron user to kernel space; .check permissions for all semaphore operations; .for (each semaphore in array) { -if(semaphore operation is positive) { -add operation to semaphore value; -if (UNDO flag set on semaphore operation) update process undo structure; -wakeup all processes sleeping (event semaphore value increases); } 194 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ -else if (seamphore operation is negative) { .if (operation + semaphore value > = 0) { -add operation to semaphore value; -if(UNDO flag set) .update process undo structure; -if(semaphore value 0) .wakeup all procces sleeping (event seamphore value become 0); -continue; } .reverse all semaphore operations already done this system call (previuos iteractions); .if (flags specify not to sleep) return with error; .sleep (event semaphore value increases); .goto start; /*start loop from beginning*/ } -else /*semaphore operation is 0*/ { .if (semaphore value non 0) { -reverse all semaphore operations done this system calls; -if (flags specify not to sleep) return error; -sleep(event semaphore value ==0); -goto start; } } } /*for loop end here*/ /*semaphore operations all succeded*/ .update time stamp, processe IDs; .return value of last semaphore operated on before all succeded; } Kerrnel c mng cc thao tc c hiu, oplist, t a ch ca user v kim tra cc s c hiu l ng v TT quyn c hay thay i c hiu. C th xy ra trng hp l ang vo lc u ny (thao tc oplist), kernel phi i ng cho ti khi s kin ch i xut hin, kernel s khi phc li (c li mng t a ch ca user) cc gi tr ca cc c hiu ang lm d vo lc u v khi ng li GHT semop(). Cng vic ny thc hin hon ton t ng v c bn nht. Kernel thay i gi tr ca mt c hiu theo gi tr ca thao tc (operation): nu dng, tng gi tr ca c hiu v nh thc tt c cc TTang i gi tr c hiu tng.; nu l 0, kernel kim tra gi tr c hiu v nh sau: -nu gi tr c hiu l 0, kernel tip tc vi cc thao tc khc trong mng, ngc li kernel tng tng s cc TT ang ng i gi tr c heu bng 0, v i ng (ng ra l TT semop() i ng, kernel ang thc hin nhn danh semop() !). 195 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Nu thao tc c hiu l m, v gi tr tuyt i ca n <= gi tr ca c hiu,knl cng thm gi tr ca thao tc (hin l m) vo gi tr c hiu. Nu kt qu cng = 0, kernel nh thc tt c cc TT ng ang i gi tr ca c hiu s = 0. Nu gi tr c hiu < gi tr tuyt i ca thao tc c hiu, kernel a TT i ng vi hoi vng (event) rng gi tr c hiu s tng. H khi no TT phi i ng vo lc gia chng ca thao tc c, th iu s ph thuc vo mc u tin ngt; TT s thc khi nhn c tn hiu. V d: Cc thao tc (operation) kha (Locking) v gii kha (Unlocking): #include #include #include <sys/types.h> <sys/ipc.h> <sys/sem.h>

#define SEMKEY 75 int semid; unsigned int count; /*definition of sembuf in the file sys/sem.h * struct sembuf { * unsigned short_num; * short sem_op; * short sem_flg; }; */ struct sembuf psembuf, vsembuf; /*operations for P and V*/ main(argc, argv) int argc; char *argv[]; { int i, first, second; short initarray[2], outarray[2]; extern cleanup(); if (argc == 1) { for (i=0; i<20;i++) signal(i,cleanup); swmid=semget(SEMKEY, 2, 0777 | IPC_CREAT); initarray[0]=intarray[1]=1; semctl(semid, 2, SEALL, initarray); semctl(semid, 2, GETALL, outarray); printf(sem int vals %d\n, outarray[0], outarray[1]); pause(); /* TT di ngu cho toi khi co signal*/ } else if (argv[1][0] ==a) { first = 0; second = 1; 196 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ } else { first =1; second = 0; } semid= semget(SEMKEY, 2, 0777); psembuf.sem_op = -1; /*set semaphore P operation value*/ psembuf.sem_flg= SEM_UNDO; vsembuf.sem_op = 1; /*set semaphore V operation value*/ vsembuf.sem_flg= SEM_UNDO; for(count=0; ;cout++) { psembuf.sem_num=first; semop(semid, &psembuf, 1); psembuf.sem_num=second; semop(semid, &psembuf, 1); printf(proc %d count %d\n, getpid(), count); vsembuf.sem_num=second; semop(semid, &vsembuf, 1); vsembuf.sem_num=first; semop(semid, &vsembuf, 1); } } cleanup() { semctl(semid, 2,IPC_RMID,0); exit(); } Sau khi dch chng trnh, ta c tp thc thi l a.out. User cho chy 3 ln theo trnh t sau y trn terminal: $ a.out & $ a.out a & $ a.out b & Khi chy khng c i u vo, TT to ra tp c hiu vi 2 thnh phn v khi ng vc cc gi tr =1. Sau TT ng (pause()), v thc dy khi c tn hiu, hu c hiu trong cleanup(). Khi chy vi i a, TT A thc hin 4 thao tc c trong chu trnh: gim gi tr ca c hiu 0, gim gi tr ca c hiu 1, thc hin lnh in, sau tng gi tr ca c hiu 1 v c hiu 0. TT s i ng nu n c gim gi tr ca mt c hiu khi c hiu l 0, v vy ta gi c hiu b kho (locked). V rng cc c hiu u khi ng =1 v khng c TT no ang s dng c hiu, TT A s khng bao gi i ng v cc g tr ca c hiu s giao ng gia 1 v 0. 197 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Khi chy vi b, TT B gim c hiu 0 v 1 theo trnh t ngc li ca TT A. Khi TT A v TT B cng chy ng thi, s xy ra tnh hung rng TT A kha c hiu 0 v mun m kha c hiu 1, nhng TT B kha c hiu v mun m kha c hiu 0. Khng t c mun, c hai TT i ng khng th tip tc c na. Ta ni c hai TT b kt (deadlocked) v ch thot khi hon cnh ny khi c tn hiu. loi tr tnh trng nh vy, cc TT c th thc hin nhiu thao tc c hiung thi bng cch khi ng cu trc sembuf nh sau: struct sembuf psembuf[2]: psembuf[0].sem_num = 0; psembuf[1].sem_num = 1; psembuf[0].sem_op = -1; psembuf[1].sem_op = -1; semop(semid, psembuf, 2); psembuf l mng cc thao tc c hiu, tng gi tr c hiu 0 v 1 ng thi. Nu nh chng hn thao tc khng thnh cng, TT ng cho ti khi c hai thnh cng. V d, nu gi tr c hiu 0 l 1, v gi tr c hiu 1 l 0, kernel c th cc gi tr khng b thay i cho ti khi c th gim gi tr ca c hai. TT c th t c IPC_NOWAIT trong semop(); nu khi kernel ri vo trng hp TT ng v phi i gi tr ca c hiu vt qu mt gi tr no , hay c gi tr =0, kernel thot ra khi GHT semop() vi thng bo li. Do vy c th p dng mt kiu c hiu iu kin m bng c hiu TT s khng i ng khi TT khng th thc hin c vic g. Trng hp nguy him l khi TT thc hin thao tc c hiu, chng hn kha mt ngun ti nguyn no , sau thot ra (exit) m khng t li gi tr c hiu. iu ny c th do li ca ngi lp trnh, hay do nhn c tn hiu dn n vic t ngt kt thc mt TT. Trong thut ton lock v unlock cp nu TT nhn c tn hiu kill sau khi gim gi tr ca c hiu th TT khng cn c c hi no tng cc gi tr bi v khng th cn mhn c tn hiu kill na. Hu qu l cc TT khc nhn thy c hiu kha v TT kha c hiu t lu khng cn tn ti na. loi tr vn , mt TT t c SEM_UNDO trong semop(), khi TT thot, kernel s o ngc hiu qu ca tng thao tc c hiu m TT lm. thc thi iu ny, kernel duy tr mt bng vi mt u vo cho mi TT trong h. u vo s tr vo tp cc cu trc undo, m mi cu trc cho mt c hiu m TT s dng. Mi cu trc undo l mt mng b ba gm nhn dng ca c hiu (semaphore ID), s ca c hiu trong tp nhn bit c bi ID, v mt gi tr iu chnh.

198 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Kernel cp ng cu trc undo khi TT ln u tin thc hin semop() vi c SEM_UNDO c lp. Sau vi semop() c c SEM_UNDO lp, kernel s tm cu trc undo cho mt TT c cng nhn dng ca c hiu (semaphore ID), cng s c hiu: khi tm ra cu trc , kernel tr gi tr ca thao tc c hiu vi gi tr iu chnh. Do , cu trc undo cha mt tng ph nh ca tt c cc thao tc c hiu m TT lm trn c hiu m cho c hiu c SEM_UNDO lp. Nu cu trc nh vy khng tn ti, kernel to ra, sp xp mt danh sch cu trc bng nhn dng ca c hiu (semaphore ID), cng s c hiu. Nu gi tr iu chnh = 0, kernel hu cu trc . Khi mt TT thot ra, kernel gi mt th tc c bit x l cu trc kt hp vi TT v thc hin hnh ng xc nh trn c hiu ch ra. Tr li vi thut ton lock_unlock trc , kernel to cu trc undo mi ln khi TT gim ga tr c hiu v hu cu trc mi ln TT tng gi tr c hiu bi v gi tr iu chnh l 0. Di y l cu trc undo khi kch hot chng trnh vi thng s a. semaphore ID semaphore num adjustment sau thao tc th nht semaphore ID semaphore num adjustment sau thao tc th hai semaphore ID semaphore num adjustment sau thao tc th ba Nu TT phi thot t ngt kernel s i qua b ba ni trn v thm gi tr 1 vo mi c hiu, khi phc li gi tr ca chng =0. Trong iu kin thng thng, kernel gim gi tr 199 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni sem ID 0 1 sem ID 0 1 sem ID 1 1 sem ID 0 1

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ iu chnh ca c hiu s1 ln thao tc th ba, tng ng vi vic tng gi tr ca c hiu v hu b b ba gi tr bi v tr s ca iu chnh =0. Sau ln thao tc th 4, TT s khng cn b ba no na v rng cc gi tr ca iu chnh c th u =0. Cc thao tc mng trn c hiu cho php TT loi tr vn kt (deadlock), nhng li rc ri cung nh nhiu ng dng khng cn ti ton b sc mnh ca cc thao tc . Cc ng dng s dng nhiu c hiu c th gii quyt deadlock mc user v kernel s khng cha cc GHT phc tp ho nh vy. GHT semctl() cha ng v s cc thao tc kim sot c hiu. C php nh sau: semctl( id, number, arg); arg c khai bo l mt union: union semunion { int val; struct semid_ds *semstat; /*xem them lenh*/ unsigned short *array; } arg; Kernel thng dch arg trn c s gi tr ca cmd. 6 Lu chung 1. 2. 3. Kernel khng c bn ghi no v TT no truy nhp c ch IPC, thay v cc TT c th truy nhp c ch ny nu TT chc chn c chnh xc ID v khi quyn truy nhp ph hp; Kernel khng th hu mt cu trc IPC khng s dng v kernel khng th bit khi no th IPC khng cn cn na, do vy trong h c th tn ti cc cu trc khng cn cn n; IPC chy trn mi trng ca mt my n l, khng trn mi trng mng hay mi trng phn tn; S dng key trong IPC (ch khng phi l tn tp), c ngha rng cc tin ch ca IPC gi gn trong bn thn n, thun li cho cc ng dng r rng, tuy vy khng c cc kh nng nh pipe v tp. IPC mang li tt cho vic thc hin cho cc ng dng phi hp cht ch, hn l cc tin ch ca h thng tp (dng tp lm phng tin lin lc gia cc TT).

2.7 D theo mt tin trnh (tracing) H Unix cung cp mt tin ch nguyn thy cho vic lin lc gia cc TT dng theo di v kim sot vic thc hin TT v rt tin li cho lm g ri (debug). Mt TT debug s kch hot mt TT, theo di v kim sot vic thc hin TT bng GHT ptrace(), s t im dng trnh, c ghi data vo khng gian a ch o. Vy vic theo di TT bao gm vic ng b TT i d tm (debugger) v TT b d theo (g ri cho TT ) cng nh kim sot vic thc hin ca TT . Ta th m t mt cu trc in hnh ca trnh debugger bng thut ton sau: 200 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ if ((pid = fork()) ==0) /*debugger to TT con kch hot trnh cn trace*/ { /*child l TT b theo di, traced*/ ptrace(0,0,0,0); exec(put the name of traced processs here); /* v d: exec(a.out)*/ } /*debugger process continues here*/ for(;;) { wait((int *) 0); read(input for tracing instruction); ptrace(cmd, pid,...); if(quiting trace) break; } Trnh debugger sinh ra mt TT con, TT con thc hin GHT ptrace, kernel t bit trace u vo ca TT con trong proces table h thng, v n kch hot (exec()) chng trnh cn quan st. Kerrnel thc hin exec nh thng l, tuy nhin cui cng kernel nhn thy bit trace dng (set), v do gi tn hiu TRAP cho TT con. Khi kt thc exec, kernel kim tra tn hiu (nh lm vi tt c cc GHT khc) v tm thy TRAP m kernel va gi cho chnh mnh, kernel thc hin m x l (nh khi thao tc cc tn hiu) nhng l trng hp c bit. V trace bit dng, TT con (ng hn l TT ang b debug_traced proces) nh thc TT b (l trnh debugger ng v ang trong vng lp mc user) khi thc hin wait(), TT con chuyn vo trng thi trace c bit (tng t nh trng thi ng nhng khng ch ra trn lu chuyn trng thi). Debugger tr ra khi wait(), c lnh do user a vo, chuyn thnh mt lot lin tip ptrace() kim sot TT ang debug (con). C php ca ptrace() nh sau: ptrace(cmd, pid, addr, data) trong : cmd: cc lnh nh read (c data), write (ghi data), continue (tip tc) pid: s nh danh ca TT lm debug, data: l mt gi tr nguyn s ghi (tr) li. Khi thc hin ptrace(), kernel thy rng debugger c TT con vi pid ca n v TT con ang trong trng thi trace, kernel dng cc cu trc d liu d c tng th trao i data gia hai TT: copy cmd, addr, data vo cu trc d liu (kho cu trc ngn chn cc TT khc c th ghi d liu), nh thc TT con, t TT con vo trng thi ready to run cn bn thn i ng ch p ng ca TT con. Khi TT con tr li thc hin ( trong ch kernel), n thc hin chnh xc cc lnh cmd, ghi kt qu v cu trc d liu ni trn v sau nh thc TT trnh b (debugger). Tu thuc vo kiu lnh (cmd), TT con c th s quay tr li trng thi d, i lnh mi, hay thot khi x l tn hiu v tip tc thc hin. Cho ti khi debugger ti chy, kernel lu ga tr tr li m TT b d thao trao, b kho cc cu trc d liu, v tr v user. 201 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ Hy theo di hai trnh, mt trnh gi l d theo (trace) v mt trnh g ri (debug). trace: (l TT s b d theo, tn trnh l tracce.c) int data[32]; main() { int i; for i=0;i<32;i++) printf(data[%d] = %d\n, i, data[i]); printf(ptrace data addres 0x%x\n.data); } Khi chy trace ti terminal, cc gi tr ca trng data s l 0. debug: (l TT thc hin d (d theo du vt ca trnh trace, tn trnh l debug.c) #define TR_SETUP 0 #define TR_WRITE 5 #define TR_RESUME 7 int addr; main(argc, argv) int argc; char *argv[]; { int i, pid; sscanf(argv[1], %x, &addr); if ((pid = fork()) == 0) { ptrace(TR_SETUP,0,0,0); execl(trace,trace,0); /*l d theo trnh trace ni trn*/ exit(0); } for(i=0;i<32;i++) { wait((int *) 0); /*ghi gi tr ca i vo addr ca TT c pid*/ exit(0); addr + =sizeof(int); } /*TT b d theo c th tip tc thc hin ti y*/ ptrace(TR_RESUME, pid,1,0); } By gi chy trnh debug vi cc gi tr do trace in ra trc . Trnh debug s lu cc thng s trong addr , to TT con. TT con ny s kch hot ptrace() thc hin cc bc d theo trace, sau cho chy trace bng execl(). Kernel gi cho TT con (trace) tn hiu SIGTRAP vo cui exec()l v trace i vo trng thi d theo (bt u b theo di), i lnh do 202 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ debug chuyn vo. Nu debug ang ng trong wait(), n thc dy v tm thy TT con ang b d theo, debug thot ra khi wait(). debug gi ptrace(), ghi i vo khng gian a ch ca trace ti addr, tng con tr ca addr trong trace. (addr l a ch ca 1 thnh phn trong mng data). Cui cng debug gi ptrace() cho trace chy, v vo thi im ny data cha gi tr 0 ti 31. Dng ptrace() d theo mt TT l c tnh s ng v chu mt s cc hn ch: 1.Kernel phI thc hin 4 chuyn bi cnh trao i 1 t d liu (word data) gia debugger v TT b d theo: kernel -> debugger() khi gi ptrace() cho ti khi TT b d theo tr li cc truy vn, kernel <- > TT b d theo v kernel -> debugger: tr v debugger vi kt qa cho ptrace(). Tuy c chm nh l cn v debuggerr khng cn c cch no truy nhp vo a ch ca TT b d theo. 2.debugger c th d theo nhiu TT con ng thi. Trng hp ti hn l khi ch d theo cc TT con: Nu TT con b d theo li fork(), debugger s khng th kim sot TT chu, v phI thc hin g ri kiu chng trnh rt tinh vi: s xy ra vic thc hin nhiu exec trong khi debugger khng th bit uc tn ca cc trnh lin tc kch hot (l images ca m trnh). 3.debugger khng th d theo mt TT v ang thc hin nu TT li khng pht sinh ptrace() lm cho kernel bit rng TT ng kernel thc hin g ri. Nhc li l TT ang g ri i khi phi hu i v khi ng li, v iu ny li khng lm c khi n chy. 4.C mt s trnh khng th d theo c, chng hn trnh setuid(), v nh vy user s vi phm qui tc an ton khi ghi vo khng gian a ch qua ptrace() v thc thi cc lnh cm. 3. Lin lc trn mng: client/server

Cc chng trnh ng dnh nh th in t (mail), truyn tp t xa (ftp), hay login t xa (telnet, rlogin) mun kt ni vo mt my khc, thng dng cc phng php ni chuyn (ad hoc) lp kt ni v trao i d liu. V d cc chng trnh mail lu vn bn th ca ngi gi vo mt tp ring cho ngi . Khi gi th cho ngi khc trn cng mt my, chng trnh mail s thm tp mail vo tp a ch. Khi ngi nhn c th, chng trnh s m tp th ca ngi v c ni dung th. gi th n mt my khc, chng trnh mail phi kho lo tm tp th my . V rng chng trnh mail khng th thao tc cc tp my kia (remote) trc tip, s c mt chng trnh my kia ng vai tr mt nhn vin pht hnh th (agent) cho cc tin trnh th. Nh vy cc tin trnh ca my gi (local) cn cch thc lin lc vi (agent) my kia (nhn) qua ranh gii ca cc my. Tin trnh ca my gi (local) gi l tin trnh khch (client) ca TT ch (server) my nhn th. Bi v Unix to ra cc TT bng fork(), nn TT server phi tn ti trc khi TT client c lp kt ni. cch thc thng thng l thc hin qua init v sau khi to TT server s s lun c knh lin lc cho ti khi nhn c yu cu phc v v tip theo tun theo cc th tc cn thit lp kt ni. Cc chng trnh client v server s chn mi trng mng v th tc theo thng tin trong cc c s d liu ca ng dng hay d liu c th m c nh trong chng trnh. Vi lin lc trn mng, cc thng ip phi c phn d liu v phn kim iu khin. Phn iu khin cha thng tin a ch xc nh ni nhn. Thng tin a ch c cu trc theo kiu v th tc mng c s dng. Phng thc truyn thng p dng cho kt ni mng lin quan ti GHT ioctl() xc nh cc thng tin iu khin, nhng vic s dng khng thun nht trn cc loi mng. l ch bt cp khi cc chng trnh thit k cho mng ny 203 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ li khng chy cho mng kia. c nhiu n lc ci thin giao din mng cho Unix, s dng lung (stream) l mt c ch thch hp h tr mng, v cc modul th tc c th phi hp linh hot bng cch y vo strem m v cch s dng chuyn cho mc ngi dng. Socket l mt trong cc th hin v c bn phn tip theo. 4. Sockets to ra phng php chung cho vic lin lc gia cc tin trnh cng nh h tr cc giao thc mng tinh xo, Unix ca BSD cung cp mt c ch gi l socket. Ta s lc t cc kha cnh ca socket mc ngi dng (user level).

Socket layer cung cp ghp ni gia GHT v cc lp thp hn; Protocol layer c cc modul giao thc (th tc) s dng lin kt, v d TCP/IP; Device layer c cc trnh iu khin thit b, kim sot hot ng ca thit b mng, v d Ethernet. Cc tin trnh lin lc vi nhau theo m hnh client_server: lin lc c thc hin qua ng dn hai chiu: mt u cui, TT server lng nghe mt socket, cn TT client lin lc vi TT server bng socket u cui ng kia trn my khc. Kernel duy tr mi lin kt v dn d liu t client n server. Cc thuc tnh lin lc chia s chung cho cc socket nh cc qui c gi tn, nh dng a ch ..., c nhm li thnh domain. BSD Unix h tr Unix system domain cho cc TT thc hin lin lc trn mt my v Internet domain cho cc tin trnh thc hin lin lc trn mng dng giao thc DARPA (Defence Advanced Reseach Project Agent). Mi socket c mt kiu ca n, gi l virtual circuit ( hay stream theo thut ng ca BSD) hoc datagram. Virtual circuit (mng o) cho php pht cc d liu tun t v tin cy, gatagram khng bo m tun t, chc chn hay pht p, nhng r tin hn bi khng cn cc thit t t gi, nn cng c ch cho mt s kiu lin lc. Mi h thng c mt giao thc mc nh, v d giao thc TCP (Transport Connect Protocol) cung cp dch v mng o, UDP (User Datagram Protocol) cung cp dch v datagram trong vng Internet. C ch socket bao gm mt s GHT thc hin cc lin lc, bao gm: 1. lp mt im u cui ca lin kt lin lc: sd = socket( format, type, protocol); 204 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ trong : sd l m m t ca socket m cc TT s dng trong cc GHT khc, format nh dng vng lin lc l Unix domain hay Interet domain, type kiu lin lc trn socket: virtual network, hay UDP, protocol cho bit loi th tc kim sot s lin lc. 2. close() s ng socket li. 3. bind (sd, address, length) kt hp (ng gi) mt tn vi m t socket, trong : sd l m t socket. address ch ti mt cu trc xc nh mt nh dng vng lin lc v th tc xc nh trong GHT socket(), length di ca cu trc addres, nu khng c gi tr ny kernel s khng bit addres s di bao nhiu v addres thay i theo vng v th tc. V d, mt a ch trong vng Unix l mt tn tp. Cc TT server s bind() cc a ch ny vo cc socket v thng bo cc tn ca cc a ch t nhn bit cho cc TT client. 4. connect(sd, addres, length) yu cu kernel to ra mt kt ni ti socket. ngha cc i ca GHT nh trn, tuy nhin addres l a ch ca socket ch, m socket ny s to ra mt socket cui khc ca tuyn lin lc. C hai socket phi dng cng mt vng lin lc v cng mt th tc v kernel sp xp cc tuyn lin kt c lp chnh xc. Nu kiu ca socket l datagram, GHT connect() s thng bo cho kernel a ch s dng trong send() sau . Khng c kt ni no c lp vo thi im gi connect(). 5. Khi kernel sp xp chp nhn mt kt ni trn mch o, kernel phi a vo xp hng cc yu cu n cho ti khi kernel c th phc v cc yu cu . Hm listen() s xsac ng di ti a ca hng i ny: listen(sd, qlength); qlength l s cc i cc yu cu cha c phc v. 6. nsd = accept( sd, addres, addrlen) nhn mt yu cu ni vi TT server, vi sd l m t ca socket, addres tr vo mng d liu ca user m kernel s np vo a ch ca TT client ang kt ni; addlen cho kch thc ca mng ni trn. Khi kt thc v tr ra khi GHT, kernel s ghi ph ln ni dung ca addlen bng mt s, cho bit lng khng gian m a ch ly. accept() tr li mt m t ca socket mi, nsd, khc vi sd. TT server c th tip tc lng nghe socket ni trong khi vn lin lc vi TT client trn mt knh lin lc khc nh hnh v di. 7. D liu truyn trn socet kt ni bng send() v recv(): count = send(sd, msg, length, flags); sd, m t ca socket; msg con tr ti vng d liu s truyn I; length l di d liu; count l s bytes thc s truyn. flags c th t gi tr SOF_OOB gi I d liu out-of-band, thng bo rng d liu ang gi I, s khng xem nh phn ca th t chnh tc ca d liu trao i gia cc tin trnh ang lin lc vi nhau. V d, trnh login t xa, rlogin, gi thng ip out-of-band m phng user n phm delete terminal. 205 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

8.

Nhn d liu thc hin bi GHT count = recv(sd, buf, length, flags); buf l mng cho d liu nhn, length l di hoi vng s nhn, count l s bytes cao li cho chng trnh ca user, flags c th t peek ti thng Ip n v kim tra ni dung m khng loi ra khi hng, hay nhn out-of-band. 9. Phin bn cho datagram (UDP) l sendto() v recvfrom() c thm cc thng s cho cc a ch. Cc TT c th dng read() hay write() thay cho send() v recv() sau khi kt ni lp. Do vy, server s quan tm ti vic m phn th tc mng s dng v kch hot cc TT, m cc TT ny ch dng read(), write() nh s dng trn tp. 10. ng kt ni ca socket, dng shtdown(sd, mode); mode cho bit l l bn nhn hay bn gi, hay c hai bn s khng cho php truyn d liu; n thng bo cho cc th tc ng lin lc trn mng, nhng cc m t ca socket hy cn nguyn . M t ca socket s gii tr khi thc hin close(). 11. c c tn ca socket ng gi bi bind(), dng getsockname(sd, name, length); 12. getsockopt() v setsockopt() nhn li v t cc tu chn kt hp vi socket theo vng (domain) v th tc (protocol) ca socket.

struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ 206 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ }; struct sockaddr_in { short int sin_family; /* Address family */ unsigned short int sin_port; /* Port number */ struct in_addr sin_addr; /* Internet address */ unsigned char sin_zero[8]; /* Same size as struct sockaddr */ }; /* Internet address (a structure for historical reasons) */ struct in_addr { unsigned long };
struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; };

s_addr;

/* /* /* /* /*

official name of host */ alias list */ host address type (e.g. AF_INET) */ length of address */ list of addresses, null terminated */

#define h_addr h_addr_list[0] /* 1st address, network byte order */

The gethostbyname() function takes an internet host name and returns a hostent structure, while the function gethostbyaddr() maps internet host addresses into a hostent structure.
struct netent { char *n_name; char **n_aliases; int n_addrtype; unsigned long n_net; }; /* /* /* /* official name of net */ alias list */ net address type */ network number, host byte order */

The network counterparts to the host functions are getnetbyname(), getnetbyaddr(), and getnetent(); these network functions extract their information from the /etc/networks file. For protocols, which are defined in the /etc/protocols file, the protoent structure defines the protocol-name mapping used with the functions getprotobyname(), getprotobynumber(), and getprotoent():
struct protoent { char *p_name; char **p_aliases; int p_proto; }; /* official protocol name */ /* alias list */ /* protocol number */

207 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ * Services available are contained in the /etc/services file. A service mapping is described by the servent structure:
struct servent { char *s_name; char **s_aliases; int s_port; char *s_proto; }; /* /* /* /* official service name */ alias list */ port number, network byte order */ protocol to use */

The getservbyname() function maps service names to a servent structure by specifying a service name and, optionally, a qualifying protocol. V d v mt chng trnh to TT server trong vng Unix (Unix domain): #include #include main() { int sd, ns; char buf[256]; struct sockaddr sockaddr; int fromlen; sd = socket(AF_UNIX, SOCK_STREAM, 0); /*bind name- khong duoc co ki tu null trong ten*/ bind(sd, sockname, sizeof(*sockname) 1); listen(sd, 1); for(; ;) { ns = accept(sd, &sockaddr, &fromlen); if (fork == 0) { /*child*/ close(sd); read(ns, buf, sizeof(buf)); printf(server read %s\n, buf); exit(); } } close(ns); } TT to ra mt socket trong vng ca Unix (Unix system Domain) v ng gi sockname vo socket, sau kch hot listen() xc nh mt hng i dnh cho cc thng ip gi n, sau t quay vng (for(;;)), nhn thng ip n. Trong chu trnh ny accept() s ng yn cho ti khi th tc xc nh nhn ra rng mt yu cu kt 208 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni <sys/types.h> <sys/socket.h>

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ ni c dn thng ti socket vi tn ng gi. Sau accept() tr li mt m t mi (ns) cho yu cu s n. TT server to TT con lin lc vi TT client: TT b v TT con cng ng cc m t tng ng vi mi TT sao cho cc TT s khng cn tr qu trnh truyn thng (traffic) ca cc TT khc. TT con thc hin hi thoi vi TT client (read()) v thot ra, trong khi TT server quay vng i mt yu cu kt ni khc (accept()). Mt cch tng qut, TT server c thit k chy vnh cu v gm cc bc: 1. To ra mt socket ca n vi khi iu khin (Transmision Control Block_TCB) v tr li mt s nguyn, sd; 2. Np cc thng tin v a ch vo cu trc d liu; 3. ng gi (bind): copy a ch ca socket v TCB, h gn cho server mt cng; 4. Lp hng i c th phc v cho 5 client; Cc bc sau y lp li khong dng: 5. i TT client, Khi c to mt TCB mi cho client, np a ch socket , v cc thng s khc ca client vo ; 6. To mt TT con phc v TT client, TT con tha k TCB mi to v thc hin cc lin lc vi TT client: i nhn thng ip, ghi v thot ra.

To TT client: #include #include main() { 209 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni <sys/types.h> <sys/socket.h>

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ int sd, ns; char buf[256]; struct sockaddr sockaddr; int fromlen; sd = socket(AF_UNIX, SOCK_STREAM, 0); /* connect to -name. Ki tu NULL khong thuoc vao name*/ if(connect(sd, sockname, sizeof(sockname) 1) == -1) exit(); write(sd, hi my love,10); } Sau khi to ra mt socket c cng vng tn (Uinx name) nh ca server, TT pht sinh yu c kt ni (connect()) vi sockname ng gi nh ca bn TT serv. Khi connect() thot v kt ni thnh cng, TT client s c mt mng (knh) o lin lc vi TT server, sau gi i mt thng ip (write()) v thot. Qa trnh xc lp lin lc gia TT client v TT server thng qua gi cc sch v ca socket c m t nh sau: Khi TT server phc v kt ni trn mng, vng tn khai bo l Internet domain, s l: socket( AF_INET, SOCK_STREAM,0); v bind() s ng gi a ch nng ly t my ch phc v tn (name server). H thng BSD c th vin GHT thc hin cc chc nng ny. Tng t nh vy cho i th hai ca connect() trong TT client s cha thng tin a ch cn nhn bit my tnh trn mng, hay a ch nh tuyn (routing addres) gi thng ip chuyn qua cc my tnh mng, v cc thng tin h tr khc nhn bit cc socket c bit trn my ch. Nu server lng nghe mng, v c cc TT cc b, TT serv s dng hai socket v GHT elect() xc nh TT client no yu cu kt ni. Cc v d khc /*client1.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> int main() { int sockfd; int len; struct sockaddr_un address; int result; char ch = 'A'; sockfd = socket(AF_UNIX, SOCK_STREAM, 0); address.sun_family = AF_UNIX; 210 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ strcpy(address.sun_path, "server_socket"); len = sizeof(address); result = connect(sockfd, (struct sockaddr *)&address, len); if(result == -1) { perror("oops: client1 problem"); exit(1); } write(sockfd, &ch, 1); read(sockfd, &ch, 1); printf("char from server = %c\n", ch); close(sockfd); exit(0); } /server1.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> int main() { int server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_un server_address; struct sockaddr_un client_address; unlink("server_socket"); server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0); server_address.sun_family = AF_UNIX; strcpy(server_address.sun_path, "server_socket"); server_len = sizeof(server_address); bind(server_sockfd, (struct sockaddr *)&server_address, server_len); listen(server_sockfd, 5); while(1) { char ch; printf("server waiting\n"); client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len); read(client_sockfd, &ch, 1); ch++; write(client_sockfd, &ch, 1); 211 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________ close(client_sockfd); } } 5. Tm tt v bi tp

Chng ny cp cc k thut kim sot v g ri TT chy trn my, v cc phng thc cc TT lin lc vi nhau. Ptrace() theo di TT l mt tin ch t nhng t gi i vi h thng v tn nhiu thi gian v x l tng tc, thc hin nhiu qu trnh chuyn bi cnh, lin lc ch thc hin gia TT b v TT con Unix Systen V cho cc c ch lin lc bao gm thng ip, c hiu, v vng nh chia s. C iu tt c ch dng cho cc mc ch c bit v cng khng th p dng trn mi trng mng. Tuy nhin tnh hu ch rt ln v mang li cho h thng mt tnh nng cao hn so vi cc c ch khc. Unix h tr lin kt mng mnh, h tr chnh thng qua tp GHT ioctl() nhng s dng li khng nht qun cho cc kiu mng, do BSD a ra socket, dng vn nng hn trn mng. Stream l cng c c dng chnh trn Unix System V. Bi tp: 1. Vit mt chng trnh so snh chuyn data s dng b nh chia s v s dng thng ip. Trnh dng b nh chia s c s dng c hiu ng b vec hon tt c v ghi. 2. Chng trnh (nghe trm) sau y lm g ? #include <sys/types.h> #include <sys/ipc.h> #include <sys/mes.h> #define ALLTYPES 0 main() { struct msgform { long mtype; char mtext[1024]; } msg; register unsigned int id; for (id=0; ; id++) while(msgrecv(id, &msg, 1024, ALLTYPES, IPC_NOWAIT) > 0) ; } 3. Vit li chng trnh Cc thao tc (operation) kha (Locking) v gii kha (Unlocking) phn 2.2 dng c IPC_NOWAIT sao cho cc thao tc c hiu (semaphore) l c iu kin. Cho bit nh vy lm sao loi tr c tnh trng kt (deadlock). % 212 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

i hc Dn Lp Thng Long KIN TRC UNIX/LINUX ___________________________________________________________________________

Ht phn c bn v Unix .%

213 ________________________________________________________________________ Hunh Thc Cc, Vin CNTT, VKHCN VN, H ni

You might also like