Xem mẫu

  1. Chương II GIỚI THIỆU CÁC KỸ NĂNG BỔ TRỢ TRONG VIỆC PHÁT TRIỂN MÃ NGUỒN I-Giao diện Sockets (The Sockets Interface) Sockets ñöôïc giôùi thieäu laàn ñaàu tieân vaøo naêm 1981 nhö laø moät phaàn cuûa heä thoáng phaân phoái phaàn meàm Berkeley 4.2 vaø ñöôïc duøng nhö moät giao dieän cho moät öùng duïng neàn quan troïng. Hieän giôø, sockets ñaõ ñöôïc ñaët vaøo UNIX System phieân baûn V nhö laø moät phaàn cuûa söï hôïp nhaát BSD/System V. Socket thöïc ra laø moät khoái xaây döïng cô baûn (basic building block) cho vieäc giao tieáp (communication). Socket laø moät ñaàu cuoái (endpoint) cuûa giao tieáp vaø coù theå ñöôïc gaén cho m oät caùi teân (bound). Moãi socket ñang söû duïng coù moät kieåu (type) vaø coù moät hay nhieàu process lieân keát. Caùc sockets toàn taïi trong caùc vuøng giao tieáp (communication domains). Vuøng giao tieáp l aø söï tröøu töôïng hoùa bao haøm caû moät caáu truùc ñòa chæ hay hoï ñòa chæ (addressing structure – address family) vaø moät taäp caùc giao thöùc (protocols) thöïc hieän caùc kieåu sockets naèm trong vuøng ñoù hay coøn goïi laø hoï giao thöùc (protocol family). Communication domains ñöôïc ñöa ra nhaèm chöùa ñöïng caùc thuoäc tính chung cuûa caùc quaù trình giao tieáp thoâng qua sockets. Moät thuoäc tính nhö vaäy laø sô ñoà ñöôïc duøng cho teân sockets. Chaúng haïn, trong UNIX domain, sockets ñöôïc ñaët teân laø teân ñöôøng daãn trong UNIX. Ví duï, moät socket coù theå coù teân laø /dev/foo. Caùc sockets thoâng thöôøng chæ trao ñoåi döõ lieäu vôùi caùc sockets trong cuøng moät dom ain (cuõng coù theå trao ñoåi giöõa caùc sockets khaùc domains, nhöng phaûi caàn coù caùc quaù trình dòc h.). Giao dieän socket cuûa heä thoáng UNIX cung caáp nhieàu vuøng giao tieáp ñoäc laäp: ví duï nhö UNIX domain cho caùc giao tieáp treân cuøng heä thoáng (on-system communication); Internet domain 10
  2. ñöôïc duøng bôûi caùc process giao tieáp söû duïng giao thöùc giao tieáp chaån DARPA. Caùc coâng cuï giao tieáp neàn taûng ñöôïc cung caáp bôûi caùc domains ñaõ coù söï taùc ñoäng raát lôùn trong vieäc thöï c thi caùc heä thoáng beân trong (internal system) cuõng nhö giao dieän socket cung caáp cho user. 1-Kiểu Socket (Socket Types) Sockets coù caùc kieåu phaûn aûnh caùc thuoäc tính giao tieáp cho pheùp ñoái vôùi user. Caùc quaù trình ñöôïc coi laø chæ giao tieáp giöõa nhöõng sockets cuøng kieàu, maëc duø khoâng coù gì ngaên ca ûn söï giao tieáp giöõa caùc sockets thuoäc caùc kieåu khaùc nhau. Coù nhieàu kieåu sockets hieän haønh: a-Stream socket: Stream socket cung caáp cho luoàng döõ lieäu 2 chieàu (bidirectional), ñaùng tin caäy (reliable), coù thöù töï (sequenced) vaø khoâng laäp laïi (unduplicated). Luoàng döõ lieäu naøy khoâ ng coù bieân giôùi giöõa caùc records. Moät caëp stream sockets ñöôïc noái vôùi nhau cung caáp moät giao dieän gioáng heät giao dieän cuûa pipes. b-Datagram socket: Datagramsocket cung caáp moät luoàng döõ lieäu 2 chieàu nhöng khoâng ñaûm baûo coù thöù töï, tin caäy vaø coù theå laëp laïi. Nghóa laø, moät process nhaän message treân moät datagram socket coù theå tìm thaáy message ñoù treân hai laàn vaø coù theå coù thöù töï khaùc vôùi thöù töï maø noù ñaõ ñöôïc gôûi ñi. Moät ñaëc tröng quan troïng cuûa datagram socket laø bieân giôùi giöõa caùc records trong döõ lieäu gôûi ñöôïc baûo toaøn. Datagram socket coù moâ hình raát gaàn guõi vôùi caùc tieän ích trong caùc maïng chuyeån maïch goùi hieän thôøi (packet switched networks) nhö Ethernet. c-Raw socket: Raw socket cung caáp söï truy xuaát vaøo caùc giao thöùc giao tieáp neàn coù hoå trôï socket. 11
  3. Nhöõng socket naøy thöôøng laø datagram oriented maëc duø tính chaát chính xaùc cuûa chuùng phuï thuoäc vaøo giao dieän ñöôïc cung caáp bôûi protocol. Raw socket khoâng coù yù ñònh trang bò chung cho caùc user maø chæ daønh cho caùc user muoán phaùt trieån caùc giao thöùc giao tieáp môùi hoaëc m uoán truy xuaát saâu theâm vaøo caùc tieän ích bí maät (esoteric facilities) cuûa giao thöùc ñaõ coù. 2-Tạo socket: Söû duïng lôøi goïi heä thoáng socket() ñeå taïo moät socket. S= socket( domain, type, protocol); Lôøi goïi treân seõ yeâu caàu heä thoáng taïo ra moät socket trong moät domain chæ ñònh vaø coù kieåu chæ ñònh. Neáu protocol vaãn khoâng ñöôïc xaùc ñònh (giaù trò 0) thì heä thoáng seõ ch oïn moät protocol thích hôïp maø coù theå chöùa ñöïng domain ñaõ cho vaø hoå trôï cho kieåu socket ñöôïc yeâu caàu. Moät descriptor (moät soá nguyeân nhoû) ñöôïc duøng sau lôøi goïi heä thoáng nhö laø moät soá hieäu ñeå t höïc hieän caùc thao taùc treân socket ñaõ taïo ra. Caùc domains ñöôïc ñònh nghóa nhö nhöõng haèng soá trong file . Ví duï, UNIX domain laø AF_UNIX, Internet domain laø AF_INET. Caùc kieåu cuûa socket cuõng ñöôïc ñònh nghóa trong file . Ví duï, stream socket laø SOCK_STREAM, datagram socket laø SOCK_DGRAM, raw socket laø SOCK_RAW. Ñeå taïo moät socket stream trong Internet domain ta coù theå goïi: S = socket (AF_INET, SOCK_STREAM, 0); Socket call coù theå thaát baïi do nhieàu nguyeân nhaân. Chaúng haïn, söï coá thieáu boä nhôù (ENOBUFS), söï coá khoâng hieåu protocol (EPROTONOSUPPORT), hoaëc söï coá khoâng coù kieåu socket yeâu caàu (EPROTOTYPE). 3- Đặt tên cho socket 12
  4. Moät socket khi taïo ra khoâng coù teân. Caùc process khoâng theå truy caäp socket, vaø do ñ où khoâng coù message naøo ñöôïc nhaän treân noù, moãi khi noù chöa ñöôïc ñaët teân. Caùc quaù trình gi ao tieáp ñöôïc raøng buoäc bôûi moät lieân keát. Trong Internet domain, lieân keát naøy laø local, fore ign addresses vaø local, foreign ports. Trong UNIX domain lieân keát naøy laø local, foreign pathnames. Ñeå ñaët teân cho socket, ta duøng lôøi goïi heä thoáng: bind (s, name, namelen); Ví duï, Muoán ñaët teân cho socket trong Internet address, ta coù theå goïi: #include #include … struct sockaddr_in sin; … bin (s, (struct sockaddr_in *) &sin, sizeof sin ); 4-Thiết lập cầu nối (Connection Establishment) Söï thieát laäp caàu noái thöôøng laø khoâng ñoái xöùng, vôùi moät process laø client vaø process ki a laø server. Server, khi muoán cung caáp caùc dòch vuï naøo ñoù, phaûi ñaët teân cho socket vôùi moät ñòa chæ ñaõ bieát töông öùng vôùi dòch vuï vaø sau ñoù laéng nghe noät caùch thuï ñoäng treân socket naø y. Coøn client yeâu caàu caùc dòch vuï maø server cung caáp baèng caùch thieát laäp moät caàu noái tôùi socket cuûa server bôûi lôøi goïi heä thoáng connect() . Ví duï, trong Internet domain, lôøi goïi heä thoáng coù theå laø: 13
  5. Struct sockaddr_in server; … connect (s, (struct sockaddr *) &server, sizeof server); Coù theå caàu noái khoâng theå ñöôïc thieát laäp do nhieàu nguyeân nhaân. Chaúng haïn: -ETIMEDOUT: Heát thôøi gian qui ñònh cho vieäc coá gaéng thieát laäp caàu noái tôùi server (timeout) khi host maø server chaïy treân ñoù bò down hoaëc söï truyeàn taûi treân maï ng bò truïc traëc do caùc nguyeân nhaân khaùc veà phaàn cöùng (card maïng bò hoûng…). -ECONNREFUSE: Host töø choái dòch vuï ñöôïc yeâu caàu khi server process chöa chaïy hoaëc teân dòch vuï ñöôïc yeâu caàu khoâng ñuùng. Ñeå nhaän ñöôïc yeâu caàu keát noái töø client, server phaûi thöïc hai böôùc sau khi ñaõ ñaët teân cho sockket: -Laéng nghe caùc yeâu caàu keáu noái töø client gôûi tôùi (listen ()). -Khi coù moät yeâu caàu keát noái gôûi tôùi, coù theå chaáp nhaän yeâu caàu naøy ( accept()). Ví duï, trong Internet domain, hai böôùc treân coù theå laø: Struct sockaddr_in from; … listen(s, 5); fromlen = sizeof from; newsock = accept (s, (struct sockaddr *) &from, fromlen); 14
  6. 5-Truyền dữ liệu: Vôùi moät caàu noái ñaõ ñöôïc thieát laäp, vieäc truyeàn döõ lieä u coù theå baét ñaàu. Coù nhieàu caùch goïi ñeå thöïc hieän vieäc gôûi (sending) vaø nhaän (receiving) döõ lieäu. Thöïc hieän vieäc truyeàn döõ lieäu baèng lôøi goïi read () vaø write (). Read (s, buf, sizeof buf); Write (s, buf, sizeof buf); Thöïc hieän vieäc truyeàn döõ lieäu baèng lôøi goïi send () vaø recv() Send (s, buf, sizeof buf, flags); Recv (s, buf, sizeof buf, flags); Giaù trò cuûa flags laø raát quan troïng (flags ñöôïc khai baùo nhö nhöõng haèng soá trong file ). Noù cho pheùp ta tröïc tieáp bieán ñoåi noäi dung döõ lieäu treân socket sau lôøi goïi send () hoaëc recv (). Ví duï, Flags = MSG_PEEK cho pheùp ta chæ doø treân socket xem ñaõ coù döõ lieäu hay chöa, noäi dung döõ lieäu ñoù laø gì, maø khoâng thay ñoåi noäi dung d öõ lieäu sau lôøi goïi. Do ñoù, lôøi goïi recv() hay read () coù theå nhaän laïi döõ lieäu treân socket sau khi doø. Ñieàu naøy trang bò khaû naêng kieåm tra döõ lieäu tröôùc khi nhaän. 6-Đóng socket: Sau khi thöïc hieän xong vieäc truyeàn döõ lieäu vaø khoâng caàn duøng ñeán socket nöõa, ta neân ñoùng socket laïi baèng lôøi goïi heä thoáng: Close (s); 15
  7. Sau khi lôøi goïi ñöôïc thöïc hieän, döõ lieäu coøn chöa xöû lyù treân socket seõ chæ ñöôïc xöû lyù sau moät thôøi gian nhaát ñònh, sau thôøi gian naøy neáu döõ lieäu vaãn chöa xöû lyù xong vì moät lyù do naøo ñoù thì noù seõ bò maát. Neáu muoán taát caû döõ lieäu treân socket seõ ñöôïc xöû lyù tröôùc khi soc ket bò ñoùng, ta neân thöïc hieän lôøi goïi shutdown(). Shutdown (s, how); Giaù trò how seõ quyeát ñònh vieäc xöû lyù döõ lieäu tröôùc khi ñoùng socket s. 7-Socket kết không kết nối (connectionless sockets) Caùc böôùc treân ñöôïc giôùi thieäu cho caùc sockets höôùng keát noái (connection -oriented sockets). Coøn ñoái vôùi caùc datagram sockets duøng trong kyõ thuaät truyeàn döõ lieäu khoâng keát noái ñaëc tröng cho caùc maïng chuyeån maïch goùi, giao dieän ñöôïc cung caáp laø ñoái xöùng. Nghóa laø c aùc processes coù theå ñoùng hai vai troø client vaø server maø khoâng caàn thieát laäp moät caàu noái giöõa chuùng. Thöïc ra, ñòa chæ nguoàn vaø ñích ñaõ ñöôïc chöùa trong message truyeàn ñi treân socket. Caùc böôùc taïo vaø ñaët teân cho socket laø caàn thieát cho vieäc truyeàn döõ lieäu theo kieàu datagram. Thaäm chí khoâng caàn ñaët teân cho socket cuõng ñöôïc, luùc ñoù heä thoáng töï ñoäng laáy teân cuûa host cuïc boä cho socket. Caùc böôùc thieát laäp caàu noái ôû client vaø laéng nghe treân socke t ôû server laø khoâng caàn thieát nöõa (Tröø khi mong muoán caùc goùi döõ lieäu truyeàn ñi theo nhöõn g ñòa chæ nhaát ñònh vaø khoâng thay ñoåi trong moät khoaûng thôøi gian daøi). Vieäc gôûi vaø nhaän caùc goùi (packets) döõ lieäu coù theå ñöôïc thöïc hieän bôûi caùc lôøi goïi sau: Sendto (s, buf, buflen, flags, (struct sockaddr *) &to, tolen); Recvfrom (s, buf, buflen, flags, (struct sockaddr *)&from, &fromlen); 8-Input/Output Multiplexing Ta coù theå multiplex caùc yeâu caàu I/O ñoái vôùi caùc sockets (hoaëc files) bôûi lôøi goïi heä 16
  8. thoáng select(). Select() seõ traû veà 3 con troû tôùi 3 taäp caù c socket coù theå doïc, ghi döõ lieäu vaø caùc exceptional conditions chôø xöû lyù. Ví duï veà caùch söû duïng lôøi goïi select #include #include #include … fd_set readmask, writemask, exceptmask; struct timeval timeout; … select (nfds, & readmask, & writemask, & exceptmask, &ttimeou); Ta coù theå theâm vaøo hoaëc gôû boû moät socket vaøo 3 taäp treân bôûi caùc macro sau: FD_SET(fd, &mask), FD_CLR(fd, &mask), hoaëc xoùa roãng moät taäp bôûi FD_ZERO(&mask). Tham soá timeout seõ xaùc ñònh xem cheá ñoä cuûa söï choïn löïa: 0 – kieåu poll, #0 – Traû veà sau khoaûng thôøi gian timeout, NULL – block. Tham soá nfd = MAX(descriptors) + 1, chính laø khoaûng giaù trò cho caùc sockets. Ñeå kieåm tra xem moät socket coù thuoäc taäp caùc socket ñöôïc choïn löïa khoâng, ta coù theå duøng macro FD_ISSET(fd, &mask). 17
  9. Coù raát nhieàu lôøi goïi cho caùc thao taùc ñöôïc cung caáp bôûi giao dieän giao tieáp qua socket caàn thieát trong quaù trình phaùt trieån caùc öùng duïng tru yeàn döõ lieäu giöõa caùc processes treân maïng coù theå tham khaûo chi tieát trong boä saùch AT&T UNIX System V Release 4, Programmers’s Guide: Networking Interfaces cuûa nhaø xuaát baûn Pretice Hall. II- Semaphores Semaphore laø moät kyõ thuaät ñaûm baûo cho taøi nguyeân duøng chung (shared resource) an toaøn veà maët döõ lieäu ñoái vôùi söï truy caäp ñoàng thôøi cuûa caùc process. Laáy moät ví duï, tr eân heä thoáng ñöôøng ray, moät semaphore ñaûm baûo cho caùc ñoaøn taøu ñang vaän haønh khoâng ñuïng nha u ôû caùc vuøng giao nhau. Trong maùy tính cuõng töông töï nhö vaäy. Neáu moät process khoâng kieåm tra semaphore tröôùc khi truy caäp taøi nguyeân duøng chung thì söï hoãn loaïn (chaos) veà döõ lieäu seõ xaûy ra. Ta coù theå laáy moät ví duï veà söï nguy hieåm khi xaûy ra söï hoãn loaïn veà döõ lieäu khi truy caäp taøi nguyeân duøng chung maø khoâng duøng kyõ thuaät semaphore. Giaû söû ta coù moät ñoaïn chöông trình ruùt tieàn khoûi nhaø baêng theo taøi khoaûn khai baùo, vôùi bieán duøng chung cho caùc pr ocess laø deposit laø soá tieàn kyù quyõ hieän haønh cuûa taøi khoaûn khai baùo. int deposit; void withdraw(int account, double money) { if (checkInAccount(account)) { deposit = getLastDeposit(account); if (deposit >= money) 18
  10. deposit -=money; depositMoney(deposit); } } Giaû söû coù 2 ngöôøi cuøng ruùt tieàn taïi 2 ATM khaùc nhau cuøng moät luùc, nghóa laø withdraw() ñöôïc goïi cuøng 1 luùc cho hai quaù trình P1, P2. P1: coøn 100, ruùt 50 , withdraw (1111, 50), coøn 50 P2: coøn 300, ruùt 70, withdraw (2222, 70), coøn 230 Giaû söû P1 goïi tröôùc 1 chuùt, caùc böôùc kieåm tra ñieàu hôïp leä vaø caùc böôùc xaûy ra nhö sau: …deposit = getLastDeposit (1111) = 100 P1: 100 > 50 Trao quyeàn cho P2 …deposit = getLastDeposit (2222) = 300 300 > 70 Trao quyeàn cho P1 deposit = 300 – 50 = 150 depositMoney(150) Keát thuùc P1 vaø Trao Quyeàn cho P2 19
  11. deposit = 150 – 70 = 80 depositMoney(80) Keát thuùc P2 Nhö vaäy, sau cuøng giaù trò coøn laïi cuûa taøi khoaûn 1111 laïi laø 150, vaø taøi khoaûn 2222 la ø80. Chæ laø töôûng töôïng nhöng thaät laø nguy kieåm. Moïi vieäc seõ ñöôïc giaûi quyeát neáu nhö ta ñöôïc tìm caùch ngaên caûn chæ coù moät process ñöôïc pheùp truy caäp taøi nguyeân chung moãi luùc maø thoâi. Semaphore seõ giaûi quyeát vieäc naøy nhö sau: sem = createSemaphore(); /* Taïo semaphore*/ … enterCriticalSection(sem); /* Vaøo vuøng tranh chaáp , khoâng cho pheùp caùc process khaùc truy caäp vaøo*/ deposit = getLastDeposit(account); if (deposit >= money) deposit -=money; depositMoney(deposit); leaveCriticalSection(sem); /* Ra khoûi vuøng chanh chaáp, cho pheùp caùc process truy caäp vaøo*/ releaseSemaphore(sem); /* Giaûi phoùng semaphore */ 20
  12. Khoaûng thôøi gian chuyeån tieáp giöõa caùc leänh vó moâ ñieàu coù theå laø ñieåm maø caùc proces s coù theå trao quyeàn cho nhau, vaø do ñoù nguy cô daãn ñeán söï hoãn loaïn veà döõ lieäu cuûa taøi n guyeân duøng chung toàn taïi trong caùc khoaûng thôøi gian nhoû naøy. Nhö vaäy , ñeå xaây döïng semaphore, ta khoâng theå duøng caùc leänh vó moâ ñöôïc maø phaûi duøng caùc lôøi goïi trang bò bôûi kernel, ôû ñoù chuùng ñöôïc baûo veä khoûi söï taùc ñoäng cuûa caùc process. System V coù trang bò caùc lôøi goiï heä thoá ng thao taùc treân semaphore nhö sau. -Taïo semaphore int semget (key, nsems, flags) /* return semaphore-set-ID or –1 on error */ key_t key; /* get semaphore-set-ID*/ int nsems; /* semaphore-set key */ int flags; /* option flags */ -Thao taùc treân semaphore int semop (sid, ops, nops) /* return semaphore value prior to last operation or –1 on error*/ int sid; /* semaphore-set-ID*/ struct sembuf (*ops)[]; /* pointer to array of operations*/ int nops; /* number of operations */ -Huûy semaphore int semctl (sid, snum, command, arg) /* return value depending on command or –1 on error*/ int sid; 21
  13. int snum; /* semaphore number */ int cmd; /* command */ char *arg; /* argument */ Caùc haøm yeâu caàu ôû treân coù theå ñöôïc xaây döïng nhö sau: int createSemaphore() { int key =0; /* Taïo semaphore nhò phaân, do ñoù tham soá thöù 2 laø 1*/ return semget((key_t) key, 1, 0666 | IPC_CREAT ); } void enterCriticalSection(int sem) { struct sembuf sb; sb.sem_num = 0; sb.sem_op = -1; sb.sem_flg = 0; 22
  14. semop(sem, &sb, 1); } void leaveCriticalSection(int sem) { struct sembuf sb; sb.sem_num = 0; sb.sem_op = +1; sb.sem_flg = 0; semop(sem, &sb, 1); } releaseSemaphore(int sem) { semctl ( sem, 0, IPC_RMID , 0 ); } III-Shared Memory 23
  15. Laøm sao ñeå moät bieán coù theå duøng chung cho moïi process. Nghóa laø moãi söï taùc ñoäng leân giaù trò cuûa bieán ñoù bôûi moät process ñeàu theå hieän ôû moïi process khaùc maø coù tham khaûo ñeán bieán naøy. Ñieàu naøy khoâng theå thöïc hieän ñöôïc vôùi vieäc khai baùo bieán thoâng thöôøng cho d uø coù khai baùo toaøn cuïc. Bôûi vì moãi process coù vuøng nhôù rieâng cuûa noù, caùc process khoâng theå tham khaûo vuøng nhôù cuûa nhau ñöôïc. Do ñoù maëc duø bieán ñöôïc khai baùo toaøn cuïc nhöng moãi khi si nh ra process con, caùc tính chaát cuûa bieán naøy ñöôïc sao cheùp vaøo vuøng nhôù daønh rieâng cho pro cess con ñoù, moïi söï thay ñoåi giaù trò treân bieán naøy ôû process cha vaø ôû process con töø luùc ñoù khoâng coøn taùc ñoäng leân nhau nöõa (Tröø tröôøng hôïp thao taùc vôùi ñòa chæ I/O, nhöng luùc ñoù haäu qu aû laø do baûn chaát cuûa heä thoáng). Nhö vaäy, ñeå coù ñöôïc moät vuøng nhôù chöùa bieán khai baùo sao cho moïi process coù theå truy caäp tôùi, heä thoáng phaûi cho pheùp caáp phaùt moät vuøng nhôù naèm ngoaøi taát caû caùc vuøng nhôù cuû a caùc process (taát nhieân phaûi naèm trong vuøng nhôù cuûa process ñaàu tieân khi he ä thoáng khôûi ñoäng.), vaø moãi luùc moät process naøo ñoù muoán truy caäp vaøo vuøng nhôù naøy chæ vieäc aùnh xaï noù vaøo kho âng gian ñòa chæ cuûa process. Ôû ñaây, ta giôùi haïn vôùi caùc process treân cuøng moät host. Muoán söû duïng döõ lieäu cuûa vuøng nhôù chung chính xaùc, ta phaûi duøng kyõ thuaät semaphore. Vieäc öùng duïng shared memory vaø semaphore vaøo truyeàn döõ lieäu giöõa caùc process treân cuøng moät host seõ tieát kieäm moät soá thôøi gian ñaùng keå so vôùi vieäc duøng socket hoaëc mess age. Caùc lôøi goïi gôûi vaø nhaän döõ lieäu seõ ñöôïc xaây döïng laïi döïa treân vieäc ñoïc ghi treân moät vuøng n hôù chæ ra trong shared memory vaø kyõ thuaät semaphore ñaûm baûo sao cho receiver khoâng ñoïc döõ lieäu töø shared memory quaù sôùm hoaëc sender khoâng ghi döõ lieäu vaøo shared memory cho tôùi khi naøo receiver ñaõ ñoïc hoaøn taát. System V coù cung caáp moät soá lôøi goïi thao taùc vôùi shared memory nhö sau: -Xin caáp phaùt vuøng nhôù duøng chung kích thöôùc nbytes bytes. 24
  16. int segid = shmget (key_t key, int nbytes, int flags); -aùnh xaï shared memory vaøo khoâng gian ñòa chæ maø process quaûn lyù ñeå truy caäp. char *shmat (int segid, char *addr, int flags); -Boû aùnh xaï int shmdt (char *addr); -Giaûi phoùng shared memory int shmctl (int segid, int cmd, struct shmid_ds *sbuf); vôùi cmd = IPC_RMID Ta coù theå gaây ra caùc loãi khoù tìm khi duøng keøm shared memory vôùi caùc leänh caáp phaùt vuøng nhôù ñoäng nhö malloc(), new()… Shared memory ñöôïc caáp phaùt vôùi kích thöôùc yeâu caàu xaùc ñònh ngay ban ñaàu, cho neân raát hôïp vôùi daïng stack, array. Caùc loãi coøn coù theå xaûy ra khi trong caùc caáu truùc ta laïi duøng khai baùo con troû. Thay vì duøng kieåu con troû ta neân duøng k ieåu tónh. Ví duï, thay vì duøng char * string; ta neân duøng char srting[256]; Caùc gôïi yù laøm sao ñeå söû duïng shared memory cho hieäu quaû coù theå tham khaûo trong cuoán Advanced Unix Programming cuûa Marc J. Rochkind do Prentice-Hall xuaát baûn naêm 1984. 25
nguon tai.lieu . vn