RPC (Remote Procedure Call)

Một phần của tài liệu Mô phỏng giải thuật phân tán (Trang 54 - 62)

MÔ PHỎNG GIẢI THUẬT PH N TÁN Â

3.3. RPC (Remote Procedure Call)

Birrel và Nelson năm 1984 là hai người đầu tiên đưa ra một ý tưởng hoàn toàn khác về xử lý truyền thông. Trước đó người ta thường sử dụng các thủ tục send và receive nhưng các thủ tục này không che giấu truyền thông mà điều này lại cần thiết để đạt được tính trong suốt trong một hệ phân tán. Ý tưởng đưa ra đơn giản song thực hiện có nhiều điểm tinh tế bên trong.

Birrel và Nelson đã đề xuất cho phép các chương trình gọi những thủ tục đặt trên các máy khác. Khi một tiến trình trên máy A gọi một thủ tục trên máy B, tiến trình gọi trên máy A sẽ bị treo và thủ tục được gọi được thực hiện trên B. Dữ liệu từ tiến trình gọi tới tiến trình bị gọi được vận chuyển qua các tham số sau đó kết quả được truyền trở lại. Không hề có thông điệp vận chuyển nào là hiển với người lập trình.

Dù ý tưởng đơn giản nhưng có những khó khăn nhất định khi thực hiện.

Do thủ tục gọi và thủ tục được gọi chạy trên các máy khác nhau nên chúng

Một biến thể của RPC là RMI được sử dụng trong các ngôn ngữ lập trình hướng đố ượngi t để g m ọi ột đối ượng t êtr n một máy khác.

3.3.1. Các thủ tục RPC cơ bản

Đầu tiên, chúng ta đi thảo luận các l gọiời thủ t thông thường, sau ục đó s ẽ đi giải thích ơ chế ủa ác thủ ục ày được chia thành c c c c t n ác phần và được thực ện trên các máy hi khác nhau.

3.3.1.1 Lời gọi thủ tục thông thường

Để hiểu c ơ chế hoạt động của RPC, việc quan trọng nhất là hiểu rõ ràng c ơ chế hoạt động ủa ác ời ọi thủ ục th ng thường c c l g t ô .

Biến địa phương của chương trình chính

Biến địa phương của chương trình chính bytes

buf fd

return address

read’s local variables

Bả 3 1 Bả(a) bộ hớ ớ à (b) i hủ

Xem xét l g ời ọi sau:

count = read(fd,buf,nbytes);

Stack pointer

với fd là một số nguyên thay thế cho một file, buf là một vùng đệm chứa dữ liệu đọc từ file, nbyte là số byte đọc từ file ra vùng đệm. Nếu lời gọi nằm trong chương trình chính thì bộ nhớ stack trước khi lời gọi được thể hiện trong hình 5a. Để thực hiện lời gọi, các tham số được đẩy vào stack như trên hình 5b. Sau khi hàm read kết thúc, các tham số sẽ được trả lại và được xoá trong stack.

M s i r ột ố đ ều ất đáng ú ý v ch ới việc ọi thủ tục thông thường là: Thứ g nhất, các tham số khi truyền vào ở dạng tham biến và tham trị. Các tham trị, ví dụ như fd hoặc nbyte, thì giá trị của các tham số sẽ được đẩy vào stack như trong hình 5b. Trong chương trình con các giá trị này có thể bị thay đổi nhưng sẽ không có sự ảnh hưởng tới tham số truyền vào.

Các tham biến là các con trỏ chứa địa chỉ của các biến, chứ không phải giá trị của biến. Trong hàm read, tham số buf là địa chỉ của vùng nhớ đệm sẽ chứa dữ liệu được đọc từ file. Khi có lời gọi hàm thì địa chỉ của vùng nhớ đệm này được đẩy vào stack. Mọi thay đổi của vùng đệm sẽ ảnh hưởng đến kết quả của tham số của chương trình gọi. Cơ chế hoạt động khác nhau giữa tham biến và tham trị rất quan trọng trong RPC.

3.3.1.2 Client Stubvà ServerStub

Mục đích đầu tiên của RPC là tạo ra các thủ tục phân tán được sử dụng giống như một thủ tục chạy trên cùng một máy. Nói cách khác là mong muốn RPC trong suốt với lời gọi thủ tục trong hệ phân tán. Ví dụ trong một chương trình có một lời gọi thủ tục read, nếu việc thực hiện trên một máy tính thì thủ

Việc thực hiện một thủ tục trong hệ phân tán thực hiện trong suốt với cơ chế giống như mô tả ở trên. Khi một thủ tục read phân tán được gọi, tức là thủ tục này sẽ được chạy trên một máy khác, thì một phiên bản khác của thủ tục read được đặt vào thư viện. Phiên bản này được gọi là client stub. Phiên bản này không thực hiện ngay trên máy gọi mà thay vào đó thủ tục này sẽ đóng gói các tham số của thủ tục vào một message và yêu cầu gửi message này đến cho server. Sau đó client stub sẽ gọi thủ tục receive và chờ cho đến khi có phản hồi dữ liệu từ server.

Client

Server

Gọi thủ tục

Chờ kết quả

Gọi thủ tục và tính toán kết quả

Trả lại kết quả

Yêu cầu Trả lời

Time

Hình 3.1. Nguyên lý RPC giữa Client và Server

Khi một message đến server, hệ điều hành của server sẽ gửi message này đến một thủ tục, thủ tục này gọi là server stub. Một server stub là một tiến trình của server để liên kết với một client. Thông thường server stub sẽ gọi thủ tục receive để chờ message yêu cầu từ phía client. Khi message đến server stub sẽ mở message ra để lấy các tham số và gọi thủ tục của server một các thông thường. Trên quan điểm của server, thì lời gọi hàm này như là được gọi trực tiếp từ client, các tham số và địa chỉ quay về đều nằm trong stack. Server sẽ thực hiện thủ tục được gọi và sẽ trả lại kết quả cho thủ tục gọi nó một cách

bình thường. Cho ví dụ, trong trường hợp thủ tục read, server sẽ ghi dữ liệu vào bộ đệm buf, dữ liệu này được trả cho server stub.

Khi server stub nhận điều khiển trở lại sau khi thủ tục kết thúc thì server stub sẽ thực hiện đóng gói các kết quả lại thành một message và gọi thủ tục send để gửi message này về cho client. Sau đó, server stub sẽ lại gọi lại thủ tục receive và chờ yêu cầu tiếp sau.

Khi một message trả về cho client, hệ điều hành của client sẽ gửi message này cho client stub. Client stub sẽ mở message để lấy ra các kết quả và gửi kết quả này lên lại cho thủ tục của client.

Tóm ại, một ời ọi thủ ục ph n tán được thực hiện theo các b l l g t â ước sau:

• Thủ tục của client s gọi client stub bình thường. ẽ

• Client stub đóng g c ói ác tham số thành m ột message và g ọi thủ t ục send ủa ệ điều h c h ành client.

• H i hệ đ ều ành client sẽ gửi t ín nhắn n ày đến h iều hệ đ ành erver. s

• H i hệ đ ều ành erver sẽ ửi ữ liệu ày n cho s ver stub. s g d n lê er

• Server stub mở message để x ác định c ác tham s và gọi th tục ố ủ tương ứng ủa erver. c s

• Server thực hiện thủ ục được ọi t g và trả ại ết quả cho server l k stub.

• Server stub đóng g c k ói ác ết quả ại thành l một message và gọi

• Client stub mở message để lấy kết quả và ltrả ại cho thủ ục ủa t c client.

3.3.2. Truyền tham số

Ch nức ăng của client stub sẽ mang các tham số ủa nó để c đóng gói thành một message và g ửi message tới server stub. Trong phần ày, ta sẽ đề n c ập đến phần truyền tham số trong lời gọi thủ t phâục n tán.

3.3.2.1 Truyền tham trị

Truyền tham tr trong mị ột message được g là ọi parameter marshaling.

X m ví d ét ột ụ đơn giản ếu n có l g ời ọi thủ ục ph n tán add(i,j), thủ ục t â t n ày nhận hai số nguy n ê i, j và ả lại tổng của 2 giá ntr trị ày. Lời g ọi thủ ục t add, được thể hiện trong hình 3.2. Client stub sẽ đóng g ói 2 tham số n v ày ào m ột message, ngoài ra client stub cũng đặt c t ả ên hoặc s ố đại diện c thủ t ủa ục v ào message bởi vì server cung cấp cho một v ài thủ t ục khác nhau, v phải à x ác định ột thủ ục khi gọi. m t

Hệ điều hành client k=add(i,j) proc:”add”

int: i int: j Tiến trình client

Hệ điều hành client k=add(i,j) proc:”add”

int: i int: j Tiến trình server

Thực hiện thủ tục add

client stub server stub

proc:”add”

int: i int: j 1.Client goi

thủ tục

2. Client stub tạo message

3. Message được gửi qua mạng

4. Server stub mở message

5. Server gọi thủ tục add

Hình 3.2. Các bước thực hiện một thủ tục RPC

Khi message đi đến server, s ver stub sẽ ác định xem thủ ục n er x t ào được gọi và gọi thủ t đó cùng với các ục tham số ừ message. Khi server thực t hiện xong thủ ục sẽ ả t tr lại iều khiển và kết qu lại cho server stub, kết đ ả quả s ẽ được đóng ói ào g v m ột message và g l ửi ại cho client stub. Client stub sẽ m ở message và nhận ại k l ết quả đồng thời g ửi trả cho thủ ục g . t đã ọi

3.3.2.2 Truyền tham biến

M v r ột ấn đề ất phức ạp được đặt ra l àm t à l thế ào n để truyền được ột m tham biền? Truyền tham biến là truyền tham s con trố ỏ, giá trị của một con trỏ thực chất là một á gi trị địa chỉ. V ụ trong thủí d tục read có tham s ốbuf là một tham biến và nó là địa chỉ ủa v c ùng nhớ đệm để chứa gi trị, nếu m á ở áy client địa chỉ của vùng nhớ này là 1000 thì ôkh ng thể truyền 1000 sang cho server vì có thể ùng nhớ 1000 đang được ử ụng ởi v s d b m ột chương ìnhtr khác ủa c s ver. er

M ột giải pháp được đưa ra là không cho phép truyền tham biến và con trỏ. Với tham số buf của ủ tục read, client stub đã biết th buf là một mảng các character. Giả ử s tại thời đ ểm g h i ọi àm, client stub đã biết chính ác s x ố phần t c mử ủa ảng. Client stub sẽ sao chép toàn ộ ảng ào essage và g nó b m v m ửi đến server. Sau khi server kết thúc thủ ục t được ọi, server stub sẽ lại g sao chép mảng ào essage v v m à g ửi trả lại cho client.

3.3.2.3 Đóng g cói áctham s

Trong các phần êtr n có phần đóng gói các tham số thành một message, để có thể hiểu được c mác essage n ì c ày th ả client và server cùng phải biết

sau: đầu tiên là vùng byte dành cho một biến số nguyên , tiếp theo là vùng x byte dành cho biến số thực và tiếp đến để đóng gói mảng số nguyên thì số y phần tử của mảng z sẽ được lưu vào trước rồi mới đến các phần tử của mảng z.

foobar(int x, float y,int z[5]) {

...

}

x y 5 z[0]

z[1]

z[2]

z[3]

z[4]

Bảng 3.2. Tin nhắn sau khi đóng gói tham số

(a) (b)

Chương 4:

Một phần của tài liệu Mô phỏng giải thuật phân tán (Trang 54 - 62)

Tải bản đầy đủ (PDF)

(85 trang)