Ví dụ thử nghiệm

Một phần của tài liệu Kiểm chứng hình thức cho hệ thống tương tranh sử dụng ngôn ngữ đặc tả CSP # và công cụ pat (Trang 65)

4 Kiểm chứng thử nghiệm với PAT

4.3Ví dụ thử nghiệm

Trong phần thử nghiệm này luận văn tiến hành mô hình hóa và kiểm chứng cho bài toán xử lý tương tranh cổ điển: các nhà hiền triết. Sử dụng bộ công cụ PAT phiên bản 3.3.4

Mô tả bài toán

Các nhà hiền triết ngồi xung quanh một chiếc bàn tròn với một đĩa thức ăn lớn đặt ở giữa bàn. Giữa hai nhà hiền triết bất kì có đặt một chiếc dĩa, như thế với mỗi

nhà hiền triết có một dĩa phía bên tay trái và một dĩa phía bên tay phải. Giả sử rằng nhà hiền triết chỉ có thể ăn khi có đủ 2 dĩa và chỉ có thể sử dụng các dĩa nằm ngay bên trái hoặc phải. Tiếp tục giả sử rằng một nhà hiền triết chỉ bỏ dĩa xuống khi đã ăn xong lượt.

Mục tiêu

Đặc tả mô hình bài toán các nhà hiền triết với ngôn ngữ CSP# và kiểm chứng đặc tả mô hình đó với một số tính chất như: khả năng bế tắc (ví dụ như trạng thái khi mỗi nhà hiền triết đều có 1 dĩa và đều chờ vô hạn), khả năng đói (có một nhà hiền triết không bao giờ được ăn), kiểm tra làm mịn (các nhà hiền triết có hoạt động đúng với luật mong muốn không?).

Đặc tả mô hình thứ nhất

//@@MoHinh1@@

//N - 2 nhà hiền triết #define N 2;

Phil(i) = get.i.(i+1)%N -> get.i.i -> eat.i

-> put.i.(i+1)%N -> put.i.i -> Phil(i);

Fork(x) = get.x.x -> put.x.x -> Fork(x) [] get.(x-1)%N.x -> put.(x-1)%N.x -> Fork(x);

College() = ||x:{0..N-1}@(Phil(x)||Fork(x));

Implementation() = College() \ {get.0.0,get.0.1,put.0.0

,put.0.1,eat.1,get.1.1,get.1.0,put.1.1,put.1.0}; Specification() = eat.0 -> Specification();

#assert College() deadlockfree; #assert College() |= []<> eat.0;

#assert Implementation() refines Specification();

Đặc tả trên định nghĩa một hằng toàn cục N = 2 đại diện cho số nhà hiền triết trong hệ thống. Tiếp theo mỗi đối tượng trong hệ thống được mô hình hóa bởi một tiến trình, nhà hiền triết được mô hình hóa bởi tiến trìnhPhil(), dĩa được mô hình hóa bởi tiến trình Fork(). Giả định rằng các nhà hiền triết và dĩa được đánh số từ 0 đếnN −1

Phil(i) = get.i.(i+1)%N -> get.i.i -> eat.i

-> put.i.(i+1)%N -> put.i.i -> Phil(i);

Tiến trìnhPhil(i)trên mô hình hoạt động của nhà hiền triết.Phillà tên tiến trình vàilà tham số tiến trình đại diện cho nhà hiền triết thứ i. Sự kiệnget.i.(i+1)%N

mô hình hành động lấy dĩa bên phía tay trái của nhà hiền triết thứi. Sự kiệnget.i.i

mô hình hành động lấy dĩa phía tay phải của nhà hiền triết thứi. Sự kiện eat.imô hình hành động ăn của nhà hiền triết thứi. Sự kiện put.i.(i+1)%Nput.i.imô hình hành động bỏ dĩa bên tay trái và tay phải xuống của nhà hiền triết thứi. Do đó quy trình là: Nhà hiền triết lấy dĩa bên tay trái, lấy dĩa bên tay phải, ăn, bỏ dĩa bên tay trái và bỏ dĩa bên tay phải xuống.

Fork(x) = get.x.x -> put.x.x -> Fork(x) [] get.(x-1)%N.x -> put.(x-1)%N.x -> Fork(x);

Tiến trình Fork(i) trên mô hình đối tượng dĩa trong hệ thống. Tiến trình sử dụng phép lựa chọn[] cho biết một dĩa có thể được lấy bởi nhà hiền triết bên trái hoặc bên phải nó. Lưu ý là các sự kiện cũng là các sự kiện trong tiến trìnhPhil(i). College() = ||x:{0..N-1}@(Phil(x)||Fork(x));

Tiến trình trên mô hình toàn bộ hệ thống. Các thành phần xử lý theo dạng kết hợp song song đồng bộ, các sự kiện chung trở thành rào cản đồng bộ giữa các tiến trình. Ví dụ, sự kiện get.0.1 chỉ có thể xảy ra khi tiến trình Phil(0) và tiến trình

Fork(1)cùng sẵn sàng.

Implementation() = College() \{get.0.0,get.0.1,put.0.0,put.0.1, eat.1,get.1.1,get.1.2,put.1.1, put.1.2,eat.2,get.2.2,get.2.3, put.2.2,put.2.3,eat.3,get.3.3, get.3.4,put.3.3,put.3.4,eat.4, get.4.4,get.4.0,put.4.4,put.4.0}; Tiến trình trên hành xử giống như tiến trìnhCollege()ngoại trừ việc tất cả các sự kiện không phảieat.0 được ẩn đi.

Specification() = eat.0 -> Specification();

Tiến trình trên lặp lại sự kiệneat.0. Tiến trình này nhằm mục đích thử nghiệm kiểm chứng tính chất làm mịn.

#assert College() deadlockfree; (adsbygoogle = window.adsbygoogle || []).push({});

#assert College() |= []<> eat.0;

Khẳng định trên kiểm tra hệ thống (đại diện bởi tiến trìnhCollege()) có thỏa mãn thuộc tính thời gian tuyến tính "always eventually eat.0" không. Tức là, nhà hiền triết thứ 0 không bao giờ bị đói.

#assert Implementation() refines Specification();

Khẳng định trên kiểm tra tiến trìnhImplementation()có phải làm mịn theo ngữ nghĩa vết từ tiến trình S peci f ication() không. Nói cách khác, tất cả các vết của tiến trình Implementation() phải được chấp nhận bởi tiến trình S peci f ication(). Bởi vì các vết củaS peci f ication()chỉ là các chuỗi sự kiệneat.0. Khẳng định này đơn giản chỉ ra rằng có khả năng trong tiến trình Implementation()nhà hiền triết thứ 0 ăn (có thể vô hạn).

Từ đặc tả mô hình hệ thống thứ nhất, tiến hành mô phỏng và sinh đồ thị trạng thái đầy đủ bằng PAT như Hình 4.3

get.0.1 get.1.0 get.0.1 get.1.1 eat.1 put.1.0 put.1.1 get.0.0 get.1.0 eat.0 put.0.1 put.0.0 4 2 1 10 9 6 5 3 7 8

Hình 4.3: Biểu đồ trạng thái đầy đủ của mô hình ứng với đặc tả 1

Tiến hành kiểm tra các khẳng định trên, công cụ PAT cho kết quả chi tiết như sau

The Assertion (Implementation() refines Specification()) is VALID.

********Verification Result********

The Assertion (College() |= []<> eat.0) is NOT valid. A counterexample is presented as follows.

<init -> get.0.1 -> get.1.0>

********Verification Result********

The Assertion (College() deadlockfree) is NOT valid. The following trace leads to a deadlock situation.

<init -> get.0.1 -> get.1.0>

Theo kết quả kiểm chứng trên, mô hình hệ thống ứng với đặc tả thứ nhất có bao gồm trạng thái bế tắc. Kết quả kiểm chứng chỉ ra một trường hợp cụ thể ứng với hành vi dẫn tới trạng thái bế tắc như sau:

<init -> get.0.1 -> get.1.0>

Hành vi này dẫn tới trạng thái bế tắc số 4 trên biểu đồ trạng thái đầy đủ của mô hình trong Hình 4.3

Với khẳng định College() |= []<> eat.0 kết quả là không hợp lệ. Cụ thể nếu trong trường hợp thực thi <init -> get.0.1 -> get.1.0> hệ thống sẽ rơi vào trạng thái bế tắc và do đó nhà hiền triết thứ 0 sẽ không được ăn.

Khẳng định làm mịnImplementation() refines Specification()là hợp lệ.

Đặc tả mô hình thứ hai

Có thể sửa đổi đặc tả mô hình thứ nhất để hệ thống không xảy ra bế tắc như sau //@@MoHinh2@@

#define N 2;

Phil(i) = get.i.(i+1)%N -> get.i.i -> eat.i

-> put.i.(i+1)%N -> put.i.i -> Phil(i); Fork(x) = get.x.x -> put.x.x -> Fork(x)

[] get.(x-1)%N.x -> put.(x-1)%N.x -> Fork(x); Phil0 = get.0.0 -> get.0.1 -> eat.0

-> put.0.0 -> put.0.1 -> Phil0;

College() = Phil0|| Fork(0)||(||x:{1..N-1}@(Phil(x)||Fork(x))) ;

#assert College() deadlockfree; Chi tiết kết quả kiểm chứng trong PAT: ********Verification Result********

The Assertion (College() deadlockfree) is VALID. (adsbygoogle = window.adsbygoogle || []).push({});

Kết quả kiểm chứng trên đặc tả mô hình này chỉ ra không còn trạng thái bế tắc tồn tại trong hệ thống. Một cách trực quan, tức là đồ thị trạng thái đầy đủ không tồn tại trạng thái chỉ có dịch chuyển vào mà không có dịch chuyển ra như hình 4.4.

get.0.0 get.1.0 get.1.1 eat.1 put.1.0 get.0.0 put.1.1 put.1.1 get.0.1 eat.0 put.0.0 put.0.1 get.1.0 put.0.1 9 7 5 4 6 8 3 11 2 10 1

Hình 4.4: Biểu đồ trạng thái đầy đủ của mô hình ứng với đặc tả 2

Một phần của tài liệu Kiểm chứng hình thức cho hệ thống tương tranh sử dụng ngôn ngữ đặc tả CSP # và công cụ pat (Trang 65)