Chƣơng 1 : Mở đầu
4.3 Mở rộng Spin và Promela với thời gian rời rạc
4.3.1 Mơ hình thời gian rời rạc
Trong mơ hình thời gian rời rạc (discrete-time model) thời gian đƣợc chia thành các khoảng với độ dài bằng nhau và đƣợc đánh bởi số tự nhiên, các hành động đƣợc thực hiện trong các khoảng thời gian giữa các sự kiện thuộc về các khoảng thời gian khác nhau. Thời gian thiết lập giữa các sự kiện đƣợc do bởi các tick của một đồng hồ số toàn cục (global digital clock), đồng hồ này sẽ tăng 1 cho mỗi tick [5]. Trong một khoảng một đơn vị thời gian chúng ta chỉ có thể phân biệt trật tự giữa các sự kiên. Tiến trình thời gian có thứ tự ƣu tiên thấp nhất. Tiến trình thời gian đƣợc thực hiện nếu tất cả các tiếnt trình của hệ thống đã kết thức các hành động đƣợc lập lịch cho đơn vị thời gian hiện tại.
Hình 4.1 mơ tả mơ hình thời gian. Thời gian thiết lập giữa hai sự kiện A và B xảy ra tại khoảng thời gian thứ i và sự kiện C và D thuộc về khoảng thời gian thứ i+3. Tuy nhiên chúng ta không thể đo khoảng cách giữa các sự kiện A và B hay giữa C và D. Ta chỉ có thể biết sự kiện A xảy ra trƣớc sự kiện B và sự kiện C xảy ra trƣớc sự kiện D.
Trong các phƣơng pháp liệt kê không gian trạng thái đƣợc sử dụng trong Spin, kiểm chứng có thể đƣợc kiểm tra tất cả các giả lập có thể của hệ thống. Trong đó giả lập có thể đƣợc xem xét tính đúng đắn của hệ thống, vì vậy chúng ta cần mơ tả sự thực hiện thời gian rời rạc cho mục đích giả lập. Ý tƣởng cơ bản để thực hiện theo từng đơn vị thời gian. Việc thực hiện của các lệnh trong Spin là không đồng bộ và xen kẽ lẫn nhau, vì vậy vấn đề cơ bản tránh việc giao nhau các hành động thuộc các đơn vị thời gian khác nhau. Một cách để tránh vấn đề này bằng cách ràng buộc mỗi tiến trình dừng thực hiện sau khi nó đã thực hiện các hành động trong đơn vị thời gian, đợi một tín hiệu từ hệ thống thơng báo một đơn vị thời gian mới. Việc đồng bộ đƣợc tạo bởi tiến trình đặt tên là “daemon”, tiến trình này khơng phải là một phần của hệ thống đƣợc mơ hình hóa, tiến trình này ln đợi và chỉ kích hoạt khi các tiến trình khác của hệ thống bị khóa. Tiến trình daemon truyền đến hệ thống đơn vị thời gian kế tiếp bằng cách gửi tín hiệu giải khóa đến các tiến trình khác.
4.3.2 Cú pháp Spin với mơ hình thời gian rời rạc
Chúng ta thực hiện lƣợc đồ đồng bộ bằng cách mở rộng Promela với một loại biến mới timer tƣơng ứng với bộ đếm ngƣợc thời gian, ba lệnh set, expire, và tick thực hiện trên biến mới này và một tiến trình đặc biệt Timer đóng vai trị của tiến trình daemon sử dụng lệnh tick để giảm giá trị timer. Việc thực hiện ở trên mức ngƣời dùng mà không phải thay đổi nào trong mã lệnh của spin. Chẳng hạn với định nghĩa một đoạn lện và tiến trình timer nhƣ sau:
#define timer int
inline set(tmr,val){tmr=val;}
inline expire(tmr) {(tmr==0);} /*timeout*/
inline tick(tmr) {if :: tmr>=0 -> tmr=tmr-1 :: else fi} proctype Timers()
{ do :: timeout -> atomic{ tick(tmr1); tick(tmr2) } od }
Macro đầu tiên định nghĩa timer nhƣ là loại số nguyên. Hàm Set của Timer gán biến tmr đến giá trị val. Macro expire kiểm tra và trả về true khi tmr bằng 0. Macro tick đƣợc sử dụng chỉ trong tiến trình Timers và tiến trình này giảm giá trị của tmr nếu nhƣ giá trị tmr lớn hơn 0. Macro Timer với vịng lặp vơ tận nhận ra thời gian trơi qua. Tiến trình này chạy đồng thời với các tiến trình khác của hệ thống. Ý tƣởng cơ bản sử
dụng Timeout[6] là biến có sẵn trong Promela, timeout có giá trị true khi khơng có một lệnh nào trong hệ thống có thể thực hiên. Với cơ chế này cũng đảm bảo khơng có tiến trình nào thực hiện một hành động trong khoảng đơn vị thời gian kế tiếp cho đến khi các tiến trình đã thực hiện trong đơn vị thời gian hiện tại.
Trong một tiến trình các lệnh đƣợc chia thành các khoảng đơn vị thời gian bằng các hàm set và expire tại đầu và cuối. Ví dụ : giả thiết đã khai báo timer tmr và A, B và C là các lệnh khơng khóa.
set(tmr,1); A; B; expire(tmr); C
Trình tự này nghĩa là A và B đƣợc thực hiện trong cùng một khoảng đơn vị thời gian, C sẽ thuộc về đơn vị thời gian kế tiếp. Lệnh exprire là nơi đồng bộ đợi biến tmr trở về 0. Việc này chỉ đƣợc thực hiện bởi Timers, khi Timer kích hoạt thì biến tmr giảm, đảm bảo C sẽ đƣợc thực hiện trong đơn vị thời gian kế tiếp. Thực tế, set chỉ là việc gán nhãn của khoảng thời gian, và có thể hốn đổi vị trí các lệnh trong cùng khoảng đơn vị thời gian (trong vị dụ trên A và B có thể hốn đổi).
Trong trƣờng hợp có các khoảng thời gian trống, ta tối ƣu hóa trình tự thực hiện: set(tmr,1);expire(tmr);set(tmr,1);expire(tmr);...;set(tmr,1);exp ire(tmr);
dƣới dạng đơn giản:
set(tmr,val); expire(tmr);
Để thuận tiện sử dụng cho việc mơ hình hóa sự chậm trễ khác nhau. Delay xác định và không xác định đƣợc thực hiện bởi macro nhƣ sau:
inline delay(tmr,val) {set(tmr,val); expire(tmr);}
inline udelay(tmr) {do :: delay(tmr,1); ::break; od } /* unbounded delay */
Với độ trễ khơng xác định giới hạn, một vịng lặp với lựa chọn không xác định sẽ thốt khỏi vịng lặp khi nào và tiến trình sẽ tiếp tục thực hiện lệnh mới. Tƣơng tự cũng có thể mơ hình hóa sự chậm trễ không xác định với giới hạn trên và các giới hạn dƣới[14].
inline bdelay(tmr,val,auxtmr) { set(tmr,val);
do
:: expire(tmr) -> break
:: else -> if :: break; :: delay(auxtmr,1); fi od
Với việc mở rộng thời gian trong Spin chỉ ra rằng có thể mơ hình hóa Otomat dƣới dạng tích hợp thời gian.
Cũng cần lƣu ý rằng, bởi vì sự độc lập của việc thực hiện thời gian với các phần khác của mã nguồn Spin thúc đẩy giới thiệu các tính năng mới. Ví dụ, một lịch trình cho một số các tiến trình chạy trên một bộ xử lý duy nhất có thể đƣợc mơ hình hóa một cách tự nhiên giống nhƣ một tiến trình master đồng bộ với các tiến trình khác bằng cách cho phép các tiến trình khác quyền thực hiện với cơ chế khai báo Provided của và đƣợc giới thiệu trong phiên bản 3.0 của Spin.
4.4 Kết luận RtSpin và DtSpin
Mơ hình thời gian cho phép đặc tả lƣợng lớn bài toán hệ thống thời gian thực. Ngữ nghĩa đặc tả của RtSpin dựa trên hệ thống chuyển trạng thái theo thời gian với lý thuyết của chƣơng 3 mơ hình otomat thời gian với đồng hồ thời gian thực. Vấn đề kiểm chứng đƣợc suy dẫn đến việc kiểm trả các đƣờng đi đúng có thể (ngơn ngữ của hệ thống) là rỗng. Tuy nhiên khi thêm các đồng hồ thƣờng sẽ tăng kích thƣớc khơng gian trạng thái. Với RtSpin khơng tƣơng thích với thuật tốn giảm khơng gian trạng thái (partial-order deduction) nên không gian trạng thái thƣờng tăng lên nhanh chóng. Hơn nữa giá trị đồng hồ là giá trị thực nên rất cồng kềnh. Ngồi ra RtSpin khơng đƣợc cập nhật với Spin kể từ bản 3.0.
Dtspin với ý tƣởng chính sử dụng tiến trình theo dõi ngầm để thực hiện thời gian trơi. Với ý tƣởng đó ta sử dụng câu lệnh có sẵn trong Spin “timeout” cho tiến trình này. Điểm quan trọng của DtSpin là tƣơng thích với thuật tốn giảm khơng gian trạng thái. Hơn nữa ta có thể tích hợp với Spin phiên bản mới bằng cách mở rộng ngôn ngữ với các lệnh thời gian thông qua các định nghĩa macro.
Chương 5 Thực nghiệm Spin với hệ thống thời gian thực
Trong phần này chúng ta đƣa ra các thực nghiệm tích hợp thời gian thực với Spin trong mơ hình thời gian thời gian thực và thời gian rời rạc.