Chương 5
Thực Nghiệm
5.1.Mô tả bài toán
5.1.1.Mô hình máy hữu hạn trạng thái
Mô hình máy hữu hạn trạng thái (FSM – Finite State Machine) đƣợc sử dụng để mô tả hoạt động của nhiều hệ thống trong thực tế. Mô hình máy hữu hạn trạng thái bao gồm một số hữu hạn các trạng thái, các bƣớc chuyển trạng thái (sang một trạng thái khác).
Ta đề xuất cách thức để chuyển FSM sang mô hình Promela nhƣ sau
Các bƣớc chuyển trạng thái đƣợc khai báo trong một biến kiểu mtype
Thông tin về sự chuyển trạng thái đƣợc truyền trên một biến message kiểu kênh nhận thông điệp thuộc loại mtype trên, kênh message sẽ gửi thông điệp trong tiến trình coltrol() là tiến trình điều khiển hoạt động của máy trạng thái.
Trạng thái của máy đƣợc thể hiện bởi biến state có giá trị đƣợc thay đổi trong tiến trình action(), kênh message sẽ nhận thông điệp trong tiến trình action().
Mỗi khi tiến trình điều khiển coltrol() gửi một thông điệp về sự chuyển trạng thái, dựa vào thông điệp nhận đƣợc và giá trị hiện tại của state,
state sẽ đƣợc gán một giá trị mới tƣơng ứng với trạng thái mới.
5.1.2.Ví dụ về mô hình máy hữu hạn trạng thái
Ta xem xét một cái đèn có 3 trạng thái: tắt (off), sáng yếu (low), sáng mạnh (high) với công tắc có hai nút up và down. Hoạt động của đèn đƣợc thể hiện bởi mô hình máy hữu hạn trạng thái nhƣ sau:
CHƢƠNG 5: THỰC NGHIỆM
Hình 5.1.Mô hình máy hữu hạn trạng thái mô tả hoạt động của đèn
Mô hình promela mô tả hoạt động của đèn đƣợc xây dựng nhƣ sau: mô hình promela gồm 2 tiến trình: lamp() và switch() (lần lƣợt tƣơng ứng với active() và
control()). Để thể hiện tƣơng tác giữa công tắc và bóng đèn hai tiến trình trao đổi thông tin qua kênh updown nhận và gửi thông điệp thuộc kiểu
mtype = { up, down }
Mô hình promela của cái đèn (file lamp.pml):
byte state=0; mtype={up,down};
chan updown=[0] of {mtype}; proctype lamp(){ do ::atomic {updown?up->if ::state=0 -> state=1 ::state=1->state=2 ::state=2->state=2 ::else -> skip fi off down up up down up low low high
CHƢƠNG 5: THỰC NGHIỆM ::state=1->state=0 ::state=2->state=1 ::else -> skip fi } od } proctype switch(){ do ::updown!up; ::updown!down; od } init{ atomic{ run lamp(); run switch();} }
Trong mô hình trên giá trị của biến state là 0, 1, 2 lần lƣợt mô tả ba trạng thái của đèn là off, low, high. Với mô hình này, trong Spin ta chạy chế độ random, để có thể kiểm tra lỗi của bản thân chƣơng trình Promela.
Trong chế độ này, khi tiến trình init đƣợc thực thi, Spin giả lập hoạt động của đèn, chuỗi các tín hiệu up và down đƣợc sinh ra một cách tùy ý (nhờ sự thực thi tiến trình
switch()) và từ đó trạng thái của đèn thay đổi (nhờ sự thực thi tiến trình lamp()). Chƣơng trình không có lỗi cú pháp và Spin dừng sau khi đạt tới giới hạn 250 bƣớc.
CHƢƠNG 5: THỰC NGHIỆM
Hình 5.2.Kết quả khi chạy giả lập mô hình hệ thống đèn ở hình 5.1
5.2.Thực nghiệm
Phần thực nghiệm đã xây dựng đƣợc công cụ nhận môt mô tả thô của hệ thống ở dạng máy hữu hạn trạng thái và chuyển đổi thành mô hình promela để kiểm chứng trong Spin.
Mô tả ban đầu của hệ thống là một file input.txt đã đƣợc tạo trƣớc, trong đó mỗi bƣớc chuyển trạng thái đƣợc viết trên một dòng: nếu hệ thống đang ở before_state
mà nhận đƣợc tín hiệu message_1 thì hệ thống sẽ đƣợc chuyển sang after_state.
before_state:message_1:after_state
CHƢƠNG 5: THỰC NGHIỆM
định nghĩa kiểu mtype đƣợc sinh ra. Sau đó chƣơng trình đọc lại file input.txt lần thứ hai và sinh ra đoạn mã nằm trong tiến trình action() thể hiện các hành vi của hệ thống khi nhận đƣợc các thông điệp chuyển trạng thái. Nhờ các bƣớc chuyển trạng thái đã đƣợc ghi lại, chƣơng trình sinh tiếp ra đoạn mã nằm trong tiến trình control(). Cuối cùng, đoạn mã khởi tạo hai tiến trình control() và action() (đƣợc đặt trong
init()) đƣợc sinh ra. Bảng thể hiện giá trị của biến state tƣơng ứng với mỗi trạng thái cũng đƣợc in ra ở dạng chú thích (nằm trong cặp dấu /* và */)
Ta đƣa vào chƣơng trình 1 file chỉ bằng cách đổi tham số trong hàm
read (inputFile, outputFile)
5.2.1.Áp dụng kiểm chứng mô hình hệ thống đèn
Mô tả ban đầu của mô hình cái đèn ở hình 5.1 đƣợc lƣu trong file state.txt có dạng: off:up:low off:down:off low:up:high low:down:off high:up:high high:down:low
Ta đƣa tham số cho hàm read():
read (lamp.txt, lampcode.txt);
và chạy chƣơng trình, chƣơng trình sẽ tạo ra file lampcode.txt với nội dung tƣơng đƣơng với đoạn mã trong phần 4.1.2 mô hình hóa cái đèn (phụ lục A).
Sau khi chạy giả lập ở chế độ random nhƣ ở phần 5.2.2 ta cần kiểm tra tính chất mà hệ thống cần thỏa mãn bằng việc chạy verify. Tính chất cần kiểm chứng trong trƣờng hợp này là: khi đèn ở trạng thái high, cần phải qua trạng thái low rồi mới có thể về trạng thái off.
CHƢƠNG 5: THỰC NGHIỆM
[] !((state = = 2) && (state != 1) U (state = =0))
(không bao giờ xảy ra trƣờng hợp biến state bằng 2 và, nó luôn khác 1 cho tới khi nó bằng 0)
Ta thêm vào mô hình promela định nghĩa các kí hiệu
#define a0 (state = = 0) #define a1 (state != 1) #define a2 (state = = 2)
Biểu thức LTL đƣa vào Spin là [] !(a2 && (a1 U a0))
Spin sẽ sinh ra cấu trúc never claim, ta thêm nó vào chƣơng trình (phụ lục B) và chạy verify, kết quả cho thấy không có lỗi vi phạm do vậy hệ thống thỏa mãn tính chất cần kiểm tra.
CHƢƠNG 5: THỰC NGHIỆM
5.2.2.Áp dụng kiểm chứng mô hình không đáp ứng thuộc tính
Hình 5.4.Mô hình sai của hệ thống đèn
Ta xem xét một mô hình của hệ thống đèn không thỏa mãn tính chất đã nêu trong phần 5.2.1.Trong mô hình trên từ trạng thái high, cái đèn có thể chuyển về trạng thái off mà không qua trạng thái low. Tệp mô tả các trạng thái của đèn lamp2.txt:
off:up:low off:down:off low:up:high low:down:off high:up:high high:down:off
Sau khi dùng công cụ để chuyển mô hình trên sang mã promela (phụ lục C) và thêm cấu trúc never claim để kiểm chứng tính chất nhƣ đã nêu ở 5.2.1 ta có mô hình promela cho mô hình 2 của cái đèn (phụ lục D) và chạy verify, kết quả cho thấy Spin báo lỗi vi phạm, suy ra mô hình vừa đƣa vào không thỏa mãn tính chất cần kiểm tra.
off low high
down
up up
down
down down
CHƢƠNG 5: THỰC NGHIỆM