Mở rộng Spin với thời gian thực

Một phần của tài liệu Kiểm chứng các tính chất thời gian thực cho hệ thống đồng thời bằng RT-SPIN (Trang 51)

4.2.3.1Cú pháp

Đầu tiên ta thêm kiểu clock trong phần khai báo biến của chƣơng trình Promela. Các biến Clock có thể là mảng hay 1 biến đƣợc khai báo toàn cụ. Chẳng hạn ta có thể khai báo :

clock x, y, z[5];

Kế tiếp mỗi lệnh đƣợc mở rộng với phần lựa chọn về thời gian theo cú pháp nhƣ sau:

stmnt ::= untimed_stmnt I timed_stmnt timed_stmnt ::= 'when' '{'µ'}' untimed_stmnt | 'reset' '{' R '}' untimed.stmnt

| 'when' '{' µ'}' 'reset' '{' R '}' untimed_stmnt R ::= clock ',' R

µ ::= ineq ',' µ

ineq ::= clock op int I clock op clock '+' int op ::= '<' | '>' | '<=' | '>=' | '=='

Ví dụ một số lệnh bao gồm thời gian

When {x<4,x>=2} reset{x} B!mymesg; When {z<1,y>=1} reset{x,z} a = a*b; When {x[i] == 1} goto errror;

Điều kiện bảo đảm µ đƣợc biên dịch bằng phép nối của các phép so sánh trong điều kiện. Chẳng hạn “When {x<4,x>=2}” cũng đƣợc hiểu “When {x<4 Λ x>=2}”. Tuy nhiên đối với phép hoặc thì không thể thể hiện bởi một lệnh. Thay thế ta dùng lệnh rẽ nhánh không xác đinh nhƣ sau:

If ' :: when {x<4} reset{x} stmnt_part :: when {x>=4} reset{x} stmnt_part fi '

4.2.3.2Ngữ nghĩa Realtime-promela

Ngữ nghĩa của chƣơng trình Ρ Promela với thời gian thực là hệ thống chuyển trạng thái có thời gian TTS (timed transition system) (QT, →T). Các trạng thái của QT dƣới dạng (q,v) với q đƣợc định nghĩa trong phần Promela không bao gồm thời gian và v là giá trị đồng hồ. Một lệnh chứa thời gian (st, R, μ) đƣợc thực hiện tại (q,v) nếu st là đƣợc thực hiện tại q và v Є μ. Bƣớc chuyển →T bao gồm hai loại:

1 Chuyển hành động ((q,v),(q’,v’)) đƣợc định nghĩa trong phần trƣớc. Mỗi bƣớc chuyển nhƣ vậy liên kết với một cặp (hay bộ ba) của các lệnh có chứa thời gian (st0 , R0, μ0 ), (sti , Ri, μi ) (tƣơng ứng (stj , Rj, μj )) đƣợc thực hiện tại (q,v) (trong đó v Є μ0 Λ μi Λ μj . R là R0 U Ri (tƣơng ứng R0 U Ri U Rj ) thì v’ = v[R:= 0].

2 Bƣớc chuyển thời gian ((q,v), (q, v+δ) vơi δ Є R+.

Trạng thái khởi đầu của T là (q0 ,0) , 0 = (0,…,0) Є R+|C| Tính đúng đắn của chƣơng trình Promela với thời gian thực hoàn toàn giống với chƣơng trình không chứa thời gian thực ngoại trử thay thế T chúng ta xem xét (QT, →T

).

4.2.4 Định nghĩa TBA dựa trên chương trình Promela thời gian thực

Mục tiêu của chúng ta nhằm giảm việc kiểm chứng tính đúng đắn của chƣơng trình Promela thời gian thực bằng kiểm chứng ngôn ngữ TBA là trống (emptyness). Với mỗi chƣơng trình Promela P ta định nghĩa 2 Otomat TBA Apω và Apdlock và kiểm chứng tính đúng đắn của hai Otomat này.

Apω≝ (Σ, Q, Tr, {q0}, F, C) trong đó Q, q0 đƣợc mô tả trong phần trƣớc, C là tập các đồng hồ đƣợc khai báo, F = {q | accept(q) ≠ Ø} và (q,σ,q’,R,μ) Є Tr nếu σ = s và μ = μ0 Λ μi , R = R0 U Ri (hay tƣơng ứng μ0 Λ μi Λ μj , R0 U Ri U Rj trong trƣờng hợp truyền thông báo đồng bộ).

Tƣơng tự Apdlock≝ (Σ’ , Q U {end}, Tr’, {q0}, F’, C) với Σ’ = Q U {σend}, F’ = {end} và end ! Є Q. Tr’ = Tr U bƣơc chuyển (q, σend, end, Ø, true) cho mỗi trạng thái deadlock q, cùng với vòng lặp loop (q, σend, end, Ø, true).

Từ định nghĩa có thể đƣa rác bổ đề nhƣ sau[15]:

P là deadlock free nếu L(Apdlock) = Ø. P là ω-correct nếu L(Apω) = Ø.

L là ngôn ngữ thời gian. Phép chiếu không thời gian trên L đƣợc định nghĩa unt(L) = { σ | ∃ 𝜏 (σ, 𝜏) Є L}. Khi đó unt(L) = Ø nếu L = Ø. Vì vậy dẫn đến bài toán kiểm tra tính rỗng của unt(L(Apdlock)) và unt(L(Apω)).

Mỗi Otomat TBA A tồn tại một Otomat BA U chấp nhận unt(L(A)).

Rõ ràng U có một không gian trạng thái mở rộng, mỗi trạng thái (q, α) , một phần từ trạng thái q của Otomat A, tập α của các giá trị đồng hồ đƣợc kích hoạt.

Vì thời gian là liên tục nên không gian trạng thái là vô hạn. Để trình diễn chẳng hạn một tập, không gian giá trị R|C| đƣợc chia thành số hữu hạn các lớp bằng nhau. Hai thành phần v và v’ của lớp α là tƣơng đƣơng theo nghĩa nếu v thuộc về một thực hiện chấp nhận đƣợc (so,vo) σ1,τ1 (sl,vl) σ2,τ2 … σi,τi (si,v) σi+1,τi+1 (si+1,vi+1)...sau đó nó có thể đƣợc thay thế bằng (so,vo) σ1,τ1 (sl,vl) σ2,τ2 … σi,τi (si,v’) σi+1,τi+1 (si+1,v’i+1)...để cho ánh xạ không thời gian của hai thực hiện là giống nhau.

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. (adsbygoogle = window.adsbygoogle || []).push({});

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 luôn đợ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ể 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. (adsbygoogle = window.adsbygoogle || []).push({});

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.

5.1 Thực nghiệm kiểm chứng giao thức truyền và nhận thông báo song song Giao thức này là một giao thức đơn giản nhƣng về khía cạnh thời gian là phức Giao thức này là một giao thức đơn giản nhƣng về khía cạnh thời gian là phức tạp với các hoạt động đúng đắn của giao thức phụ thuộc vào khoảng thời gian [16].

Bài toán: Giao thức bao gồm 4 thành phần: thành phần gửi (Sender), thành phần nhận (Receiver), Kênh dữ liệu (kênh K), kênh truyền thông báo (L). Bài toán đặt ra cần thiết lập thời gian cho thành phần gửi để đảm bảo bên nhận đủ các bản tin từ bên gửi.

Đặc tả: Giao thức này đƣợc áp dụng trong giao thức tầng data-link một chiều trên các kênh truyền không đảm bảo có thể gián đoạn hay mất mát dữ liệu. Trong giao thức này có bốn thành phần trong thực hiên: bên gửi, bên nhận, kênh dữ liệu K và kênh thông báo L. Bên gửi nhận dữ liệu từ tầng trên và gửi dữ liệu, gán nhãn với một số đƣợc chuyển giữa o và 1 qua kênh K. Sau đó đợi nhận một thông báo từ kênh L. Nếu sau một khoảng thời gian không nhận đƣợc thông báo thì bên gửi hết thời gian và gửi lại dữ liệu cũ. Nếu dữ liệu nhận đƣợc không mất mát và đƣợc gán nhãn với số thứ tự mong muốn kênh nhận sẽ chuyền dữ liệu lên tầng trên và gửi một thông báo đến bên gửi qua kênh L.

Hình 5.1: Các thực thể của giao thức gửi và nhận song song

Theo quan sát ta thấy khoảng thời gian time-out của bên gửi nên lớn hơn tổng độ trễ trên các kênh và thời gian xử lý thông tin của tiến trình bên nhận. Nếu thiết lập thời gian chờ cho tiến trình gửi quá bé có thể là nguyên nhân gây mất mát khung dữ liệu theo kịch bản: Tiến trình gửi gửi một frame và timesout quá sớm. Điều này gây nên gửi lại frame dữ liệu đã đƣợc gửi trƣớc đó. Tiến trình nhận nhận đƣợc hai frame và gửi hai thông báo. Khi đó tiến trình gửi nhận đƣợc thông báo cho frame đầu tiên nó

nghĩ rằng thông báo của frame gửi thứ hai. Sau khi nhận đƣợc thông báo từ tiến trình nhận, tiến trình gửi sẽ gửi frame kế tiếp và frame này bị mất trên kênh truyền dữ liệu. Trong khi đó thông báo thứ hai đến và tiến trình gửi nhầm lẫn thông báo này là của frame vừa gửi vì vậy sẽ không gửi lại frame này.

Mô hình hóa giao thức với real-time Spin. Đầu tiên ta lần lƣợt định nghĩa độ trễ trên các kênh tƣơng ứng K, L, R. Hằng To là khoảng thời gian sender timeout sau khi gửi một tin đến bên nhận mà không nhận đƣợc thông báo thì sẽ tiếp tục gửi tin kế tiếp. Ta cũng khai báo các biến toàn cụ đồng hồ tƣơng ứng với các tiến trình bên gửi, bên nhận, kênh K, kênh L. #define dK 3 #define dL 3 #define dR 1 #define To 9 #define MAX 8 clock sc, rc, kc, lc;

Với mỗi thực thể của giao thức có một timer, chẳng hạn tiến trình gửi (sc) , tiến trình nhận (rc), kênh K (kc) và kênh L (lc). Mặc dù các timer đƣợc sử dụng cục bộ trong mô hình nhƣng đƣợc khai báo ở mức toàn cục để có thể đƣợc truy cập. Các định nghĩa của kênh StoK, KtoR, RtoL và LtoS có dung lƣợng kênh bằng 0 nghĩa là các kênh truyền đồng bộ. StoK, KtoR, RtoL và LtoS đƣợc sử dụng nhƣ các kênh phụ trợ, bởi các kênh không đƣợc mô hình hóa nhƣ proctype là các tiến trình riêng rẽ. Các kênh StoK và KtoR là đầu vào và ra của kênh K, RtoL và LtoS là đầu vào và ra của kênh L.

mtype = {data, ack, err}

chan StoK = [0] of {mtype, byte, bit}; chan KtoR = [0] of {mtype, byte, bit}; chan RtoL = [0] of {mtype, bit};

chan LtoS = [0] of {mtype, bit};

Trong mô hình để đơn giản tiến trình gửi tạo một tin với nội dung mt = (mt+1)%MAX. Tin cũng kèm theo một số thứ tự đƣợc gửi đến kênh K. Sự kiện này đƣợc gãn nhãn bởi việc thiết lập thời gian sc. Giao thức này với các tin bao gồm hai trƣờng – trƣờng kiểu byte và một trƣờng kiểu bit tƣơng ứng với nội dung tin và bit chuyển đổi. Bên gửi bao gồm 3 nhãn R_h thiết lập nôi dung tin, nhãn S_f thiết lập lại đồng hồ và bắt đầu gửi dữ liệu. Nhãn W_s với 3 lựa chọn dựa trên các ràng buộc nếu

Một phần của tài liệu Kiểm chứng các tính chất thời gian thực cho hệ thống đồng thời bằng RT-SPIN (Trang 51)