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ể hoá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ể hoá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ẽ thoá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 toá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. Ngoà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 toá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.