Automat của hàng đợi trong bộ điều khiển

Một phần của tài liệu Hướng dẫn sử dụng UPPAAL 4.0 (Trang 25 - 27)

8 Các demo khác trong Uppaal

4.5Automat của hàng đợi trong bộ điều khiển

- textttA[] Train1.Cross+Train2.Cross+Train3.Cross+Train4.Cross<=1: Không có lúc nào có nhiều hơn một tàu qua cầu. Biểu thức này dựa vào việc Train1.Cross nhận giá trị True và False tương ứng là 1 và 0.

– A[] Queue.list[N-1] == 0: Không bao giờ có N tàu trong hàng đợi, tức là mảng sẽ không bao giờ bị tràn. Thực ra, để kiểm tra, mô hình sẽ định nghĩa N là một số hữu hạn tàu + 1 để kiểm tra tính chất này. Có thể dùng một hàng đợi có kích thức bằng số tàu và kiểm tra tính chất này như sau:A[] (Gate.add1 or Gate.add2) imply Queue.len < N-1với trạng thái add1 và add2 là các trạng thái duy nhất trong mô hình mà từ đó sự kiện add! có thể xảy ra.

Tính liveness của hệ được kiểm chứng với biểu thức: Train1.Appr –> Train1.Cross: mỗi khi một tàu đi tới cầu, nó chắc chắn phải qua được cầu.Cuối cùng, để kiểm tra Automat có bị rơi vào trạng thái deadlock hay không, ta kiểm tra bằng biểu thức: A[] not deadlock.

Giả sử ta mắc một lỗi khi tạo hàng đợi, ví dụ như viết e:=list[1] (trong khuôn mẫu IntQueue) thay vì viết e:=list[0] ứng với sự kiện hd?. Chúng ta sẽ cho rằng hệ sẽ bị mất hết các tính chất trên do việc đánh số thứ tự sai. Tuy nhiên, mọi tính chất vẫn được giữ nguyên, chỉ ngoại trừ tính liveness. Việc kiểm chứng cho một phản ví dụ đó là trường hợp có một tàu đi qua cầu còn những tàu còn lại phải dừng lại. Khi tàu đã vượt xong, hàng đợi được dịch và tàu đầu hàng đợi bắt đầu khởi động để qua cầu. Tàu được khởi động này sẽ không bao giờ là tàu đầu tiên (đánh số 0) mà là tàu đánh số 1, bởi vậy tàu ở đầu hàng đợi (đánh số 0) không bao giờ được khởi động lại nên sẽ không bao giờ được qua cầu.

Chương 5

Ví dụ 2: Fischer’s Protocol

5.1 Nội dung bài toán

Giao thức Fisher là một luật đặt ra theo thời gian được thiết kế để n quá trình khác nhau sử dụng chung một tài nguyên bằng cách loại trừ lẫn nhau dựa vào việc khéo léo sử dụng một khoảng trễ và một qui tắc chuyển lượt.

5.2 Mô hình hóa trên Uppaal

Automat của giao thức được thể hiện ở Hình 5.2. Trong aptomat này, id là một biến toàn cục. Từ trạng thái ban đầu, các quá trình chuyển tới trạng thái req, nếu như id==0. Việc kiểm tra id==0 để chắc rằng đang không có quá trình nào sử dụng vùng dữ liệu chung. Các quá trình ở trạng thái req trong một khoảng từ 0 - k đơn vị thời gian, rồi chuyển tới trạng thái wait. Khi chuyển trạng thái, nó gán id:=pid (ví dụ quá trình n khi chuyển đến trạng thái wait sẽ gán id:=n). Tại đây quá trình phải đợi ít nhất k đơn vị thời gian (x>k, với k là một hằng số, trong demo này là 2), trước khi được tiến vào sử dụng vùng chung (chuyển tới trạng thái CS) khi id==pid và tất cả các quá trình đều có biến cục bộ x>k. Giao thức cho phép quá trình có id trùng với id hiện thời được phép chuyển tới trạng tháiCS, vì vậy luôn chỉ có một quá trình được phép. Khi đã sử dụng xong tài nguyên chung, quá trình này sẽ reset biến id:=0 để cho phép các quá trình khác có thể sử dụng tài nguyên chung. Khi các quá trình ở trạng tháiwait, nó có thể về lại trạng tháireq sau khi một quá trình đã ra khỏi trạng thái CS.

5.3 Kiểm chứng

Để kiểm chứng tính an toàn của giao thức, ta kiểm tra sự loại trừ lẫn nhau trong việc tiến vào trạng tháiCS bằng biểu thức:

CHƯƠNG 5. VÍ DỤ 2: FISCHER’S PROTOCOL 5.3. KIỂM CHỨNG

Một phần của tài liệu Hướng dẫn sử dụng UPPAAL 4.0 (Trang 25 - 27)