banner
 .::Others::. Lập trình an toàn với Ada - 10 Go to original post Author: NQL05 - Translator:  - Entry Date: 13/02/2009 11:11:05
Người đọc – người viết

Người đọc – người viết (readers & writers) là một vấn đề tiêu biểu của lập trình song song, thực chất như sau. Cho một đối tượng toàn cục trên đó có nhiều luồng làm việc. Có hai loại luồng. Loại thứ nhất, người đọc, là những luồng chỉ đọc đối tượng ấy. Loại thứ hai, người viết, là những luồng có thể đọc và viết vào đối tượng ấy. Khi trên đối tượng chỉ có nhiều người đọc làm việc thì không có vấn đề gì. Nhưng khi trên đối tượng có một người viết và bắt đầu viết vào nó thì có thể làm cho dữ liệu không nhất quán trong một khoảnh khắc nào đó. Nếu trong khoảnh khắc bất hạnh ấy, một người đọc tiến hành đọc dữ liệu thì hậu quả thật khôn lường. Nếu có nhiều người viết cùng viết vào đối tượng thì tình hình còn tồi tệ hơn.

Vậy chúng ta phải đảm bảo sao cho tại mỗi thời điểm, dữ liệu không cho phép nhiều người viết cùng làm việc, không cho phép người đọc và người viết cùng làm việc, chỉ cho phép nhiều người đọc, hoặc một người viết làm việc.

Trong các ngôn ngữ lập trình thông thường, việc này giải quyết được bằng một mutex và một semaphore. Còn trong Ada, giải pháp đã được thiết đặt ngay trong các kết cấu của ngôn ngữ.

Giải pháp ấy là các kiểu có bảo vệ (protected). Trong đoạn nói về phân trình và tham số, ta đã biết rằng hàm trong Ada chỉ được phép đọc mà không được phép viết vào tham số của mình, còn thủ tục thì được phép vừa đọc vừa viết. Nhất quán với nguyên tắc đó, các tác giả Ada đã xây dựng ngữ nghĩa cho các kiểu có bảo vệ. Một kiểu có bảo vệ gồm có dữ liệu và một bộ các phân trình làm việc trên dữ liệu. Trong đó, hàm chỉ được phép đọc dữ liệu, thủ tục thì còn được phép viết dữ liệu. Bộ thừa hành (run-time) đảm bảo khi đang thi hành một thủ tục của đối tượng có bảo vệ thì không thi hành bất cứ phân trình nào khác. Nói cách khác, chuỗi hành động trong thủ tục ấy tương đương với một hành động không thể chia nhỏ được (atomic). Thí dụ sau đây trình diễn một kiểu tài khoản an toàn với đa luồng.

Code:


protected type Account is         -- spec

procedure Deposit (A : Money);
procedure Withdraw (A : Money);
function Balance return Money;
private
Current_Balance : Money := 0.0;
end Account;

protected body Account is
procedure Deposit (A : Money) is
begin
Current_Balance := Current_Balance + A;
end;

procedure Withdraw (A : Money) is
begin
Current_Balance := Current_Balance - A;
end;

function Balance return Money is
begin
return Current_Balance;
end;
end Account;


Khai báo được tách rời thành hai phần: phần đặc tả (spec) xác định giao diện, và phần thân (body) chứa chi tiết thực thi. Trên một biến toàn cục kiểu Account, nhiều luồng có thể đồng thời gọi hàm Balance và mọi chuyện diễn ra song song. Nhưng nếu một luồng nào đó gọi thủ tục Deposit hay Withdraw, nó phải chờ mọi luồng khác hoàn thành công việc của mình. Các luồng gọi thủ tục là người viết, còn các luồng gọi hàm là người đọc. Việc phân loại luồng như vậy là tùy theo thời điểm. Một luồng có thể lúc là người đọc, lúc khác là người viết. Thí dụ:
Code:


declare

A : Account;
-- khai báo nhiều tác vụ làm việc với A
begin
if A.Balance >= 10_000_000.0 then
A.Withdraw(100_000.0);
end if;
end;



Khi một tác vụ chỉ muốn gửi dữ liệu cho tác vụ khác mà chúng không muốn đồng bộ với nhau, dữ liệu được gửi qua một bộ đệm (buffer) là bộ nhớ kiểu FIFO. Nếu chỉ có cơ cấu điểm hẹn thì ta sẽ phải tạo ra thêm một tác vụ thứ ba nữa quản lý bộ đệm. Nhưng với cơ cấu kiểu có bảo vệ ta chỉ cần khai báo bộ đệm là một kiểu có bảo vệ và không cần đến tác vụ thứ ba nào nữa. Kiểu có bảo vệ giúp làm giảm số lượng tác vụ một cách đáng kể. Hơn nữa, hàm và thủ tục bảo vệ có thể thi hành trong khung cảnh (context) của tác vụ nào cũng được, nhờ đó giảm rất nhiều số lần chuyển cảnh (context switch). Kiểu có bảo vệ là một cơ cấu mới hết sức hiệu quả để giải quyết an toàn vấn đề liên lạc không đồng bộ và còn hàng loạt vấn đề khác của lập trình song song.
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Other posts in the same group:

Lập trình an toàn với Ada - 10
Go to top Go to original post  

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|