Bài toán deadlock trong SPIN

Một phần của tài liệu Ứng dụng của spin để kiểm chứng sự tuân thủ thể thức tương tác của chương trình (Trang 50)

Deadlock là trạng thái khi các tiến trình trong một hệ thống song song không thể tiến hành được một hành động nào, chúng dừng ở vị trí không mong muốn của chương trình. Chẳng hạn, khi có hai tiến trình không kết thúc chạy song song với nhau, cả hai tiến trình đều tiến hành lệnh gửi thông báo trên một kênh đồng bộ (có dung lượng bằng 0) đồng thời thì sẽ deadlock vì cả hai đều chờ nhận

mà không có tiến trình nào chịu nhận. Cụ thể, khi mô tả dịch vụ s của một thành phần là tên của một thông báo trên kênh khớp nối đồng bộ K giữa thành phần và môi trường, việc gọi dịch vụ s bởi lệnh K?s của môi trường, việc cung cấp dịch vụ

s của thành phần bởi lệnh K!s. Nếu môi trường không tuân thủ thể thức của thành

phần thì sẽ có trường hợp môi trường tiến hành lệnh K!s nhưng thành phần không tiến hành lệnh K?s nên môi trường phải chờ ở lệnh này và thành phần cũng không

tiến hành được lệnh thông tin nào từ môi trường, do đó deadlock xảy ra.

Một số chương trình bao gồm các vòng lặp nhưng nó không chứa lệnh goto hoặc lệnh break, vì vậy chương trình không bao giờ chấm dứt, nó cũng rơi vào

trạng thái deadlock.

Xét một chương trình Promela của bài toán loại trừ lẫn nhau:

1 bool wantP = false, wantQ = false; 2 3 active proctype P() { 4 do 5 :: printf("Noncritical section P\n"); 6 wantP = true; 7 !wantQ;

8 printf("Critical section P\n"); 9 wantP = false 10 od 11 } 12 13 active proctype Q() { 14 do 15 :: printf("Noncritical section Q\n"); 16 wantQ = true; 17 !wantP; 18 printf("Critical section Q\n"); 19 wantQ = false 20 od 21 }

Trong chương trình trên, cả hai biến wantP và wantQ được thiết lập là true

(tại dòng 6 và dòng 16) và sau đó hai tiến trình P( ) và Q( ) bị chặn và chờ đợi bởi

lệnh (dòng 7 và 17) để thiết lập giá trị của biến là false. Lưu ý rằng trong

Promela, !wantQ và !wantP được thể hiện là các điều kiện. Các điều kiện này là true chỉ khi các giá trị của các biến bool wantP và wantQ có giá trị là false. Do đó

chương trình rơi vào trạng thái deadlock hay trạng thái cuối không hợp lệ (trạng thái cuối hợp lệ là trạng thái ở dòng 11 và 21 nhưng không bao giờ đạt tới ở chương trình này do không có lệnh thoát ra khỏi chu trình).

Khi chạy xác minh chương trình trên với ISPIN sẽ xuất hiện thông báo

trong cửa sổ pan.out: invalid end state (at depth 8). Xét chương trình guinhan như sau:

1 mtype = {s, r}; 2 chan k = [0] of {mtype}; 3 proctype sen(){ 4 k!s; 6 } 7 proctype rec(){ 8 k?r; 9 } 11 init{ 12 run sen(); 13 run rec() 14 }

Chương trình guinhan trên với hai tiến trình sen và rec thực hiện chạy song song trên một kênh dữ liệu đồng bộ k. Tiến trình rec yêu cầu thông điệp r, tuy

nhiên tiến trình sen không gửi r mà gửi s, do đó rec không nhận được r và sen truyền s thì rec cũng không nhận được s vì không có lệnh nhận s. Chương trình rơi vào deadlock. Khi chạy Verification chương trình trên trong ISPIN thì báo deadlock trong cửa sổ pan.out là: Invalid endstate (at depth 1) và errors (lỗi) 1.

Hình 3.8. Báo cáo deadlock và vi phạm của chương trình guinhan

Theo mặc định, một số tiến trình không dừng ở lệnh cuối cùng, chúng sẽ được cho là deadlock.

Trong SPIN thì deadlock sẽ xảy ra khi chương trình hay một tiến trình nào đó chấm dứt không ở trạng thái kết thúc, nó sẽ bị dừng do không có lệnh nào có thể được tiến hành. Trạng thái deadlock là chương trình dừng ở thời điểm không thích hợp. Từ đặc điểm này của SPIN chúng ta có thể áp dụng để giải quyết một số bài toán, trong đó có bài toán kiểm chứng sự tuân thủ hoặc không tuân thủ thể thức của chương trình. Cụ thể, khi mô tả dịch vụ s của một thành phần là tên của một thông báo trên kênh khớp nối đồng bộ K giữa thành phần và môi trường, việc gọi dịch vụ s bởi lệnh K?s của môi trường, việc cung cấp dịch vụ s của thành phần bởi lệnh K!s. Nếu môi trường không tuân thủ giao thức của thành phần thì sẽ có trường hợp môi trường tiến hành lệnh K!s nhưng thành phần không tiến hành lệnh K?s nên môi trường phải chờ ở lệnh này và thành phần cũng không tiến hành được lệnh thông tin nào từ môi trường. Do đó deadlock xảy ra.

3.5. Kết luận

Bộ công cụ kiểm chứng mô hình SPIN với ngôn ngữ mô hình hóa Promela là

công cụ kiểm chứng mô hình đơn giản, ngôn ngữ trực quan. Hệ thống kiểm chứng sẽ quyết định khi nào nào mô hình thỏa mãn yêu cầu đặt ra bằng cách thăm qua (traversal) các trạng thái của automata đó.

Dựa vào các thể thức tương tác của chương trình, của thành phần được đặt ra trong đặc tả giao diện của chương trình và thành phần và quan trọng là mô hình hóa các thể thức này trong công cụ kiểm chứng SPIN chúng ta có thể kiểm chứng được sự tuân thủ hoặc không tuân thủ thể thức của chương trình một cách chính xác.

CHƯƠNG 4. KIỂM CHỨNG SỰ TUÂN THỦ THỂ THỨC TƯƠNG TÁC CỦA CHƯƠNG TRÌNH BẰNG SPIN

Một phần của tài liệu Ứng dụng của spin để kiểm chứng sự tuân thủ thể thức tương tác của chương trình (Trang 50)

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

(69 trang)