CHƯƠNG 1 - TỔNG QUAN VỀ XÂY DỰNG PHẦN MỀM CHỊU LỖI 1.1 Độ tin cậy phần mềm Độ tin cậy là một thuộc tính có thể đánh giá một cách định lượng. Độ tin cậy của hệ thống là xác suất mà dịch vụ của hệ thống được cung cấp một cách chính xác như đặc tả. Độ tin cậy là một trong những thuộc tính quan trọng nhất để đánh giá chất lượng phần mềm. Một cách chính xác thì khái niệm độ tin cậy phần mềm được định nghĩa là [7]: “Độ tin cậy là xác suất hoạt động không lỗi của phần mềm trong một khoảng thời gian nhất định ở trong một môi trường cho trước, với một mục đích cụ thể.
” Nhận xét: • Khái niệm độ tin cậy ở đây đã xem xét cả khía cạnh môi trường và mục đích sử dụng của hệ thống. Chúng ta không thể giả định rằng độ tin cậy của một hệ thống coi là bằng nhau ở các môi trường khác nhau với những mục đích sử dụng khác nhau. Một ví dụ minh hoạ là độ tin cậy của phần mềm gõ văn bản được sử dụng trong môi trường văn phòng, nơi mà người dùng không quan tâm đến hoạt động của phần mềm như thế nào (họ chỉ tập trung làm theo hướng dẫn để đạt được hiệu quả công việc) cao hơn rất nhiều so với khi sử dụng phần mềm này trong môi trường đại học – nơi mà các sinh viên có thể tìm hiểu ra các giới hạn biên của phần mềm và sử dụng hệ thống một cách không mong đợi nhằm tìm ra lỗi. • Độ tin cậy bị ảnh hưởng bởi các hỏng hóc hệ thống.
Các hỏng hóc có thể xảy ra là hỏng hóc khi cung cấp dịch vụ, hỏng hóc cung cấp dịch vụ không như yêu cầu, hỏng hóc cung cấp dịch vụ không an toàn hay không bảo mật. Một vài hỏng hóc là kết quả của lỗi đặc tả hoặc do các hỏng hóc xảy ra ở các hệ thống liên kết. Tuy nhiên, đa số các hỏng hóc là hậu quả của hành động lỗi hệ thống, được gây ra bởi các sai sót trong hệ thống. Các biện pháp để nâng cao độ tin cậy của phần mềm được chia thành hai nhóm chính: nhóm thứ nhất áp dụng trong quá trình xây dựng phần mềm (biện pháp tránh lỗi, biện pháp chịu lỗi); nhóm thứ hai được áp dụng sau khi phần mềm đã được xây dựng xong (biện pháp loại bỏ lỗi và biện pháp dự đoán lỗi).
Do đó có bốn kỹ thuật thông dụng sau được áp dụng để xây dựng phần mềm có độ tin cậy cao [19]: 1. Kỹ thuật tránh lỗi Đào Ngọc Kiên - Lớp Cao Học CNTT 06-08 – ĐH Bách Khoa Hà Nội 14 Nghiên cứu kỹ thuật xây dựng phần mềm chịu lỗi áp dụng cho hệ thống nhúng 2. Kỹ thuật loại bỏ lỗi 3. Kỹ thuật dự đoán lỗi 4.
Kỹ thuật chịu lỗi Kỹ thuật tránh lỗi Kỹ thuật này được thực hiện trong quá trình xây dựng phần mềm nhằm giảm bớt lỗi xảy ra sau này khi phần mềm hoạt động. Nó góp phần xây dựng phần mềm tin cậy hơn thông qua các giai đoạn xây dựng phần mềm, bắt đầu từ thiết lập các yêu cầu kỹ thuật của phần mềm, cho đến khi thiết kế kiến trúc, lựa chọn các phương pháp lập trình phù hợp, lựa chọn ngôn ngữ lập trình, các công cụ trợ giúp phát triển phần mềm. Kỹ thuật loại bỏ lỗi Kỹ thuật này được thực hiện tại giai đoạn kiểm tra, kiểm soát phần mềm sau khi nó đã được phát triển. Nó tiến hành tìm kiếm các lỗi vẫn còn tồn tại thông qua các biện pháp kiểm tra, kiểm soát rồi sau đó tìm cách loại bỏ chúng ra khỏi hệ thống.
Một số phương pháp được sử dụng để loại bỏ lỗi phần mềm như: phương pháp kiểm thử (testing) phần mềm, phương pháp kiểm tra lại mã nguồn của phần mềm. Kỹ thuật dự đoán lỗi Kỹ thuật này được sử dụng trong khi kiểm tra lại phần mềm sau khi được phát triển để dự đoán các lỗi của phần mềm có thể xảy ra trong quá trình hoạt động. Nó sử dụng các công thức biểu diễn sự liên quan của lỗi và hỏng hóc, đến môi trường hoạt động của phần mềm như hệ điều hành, dữ liệu của phần mềm. Kỹ thuật chịu lỗi Kỹ thuật này đảm bảo rằng các sai sót trong hệ thống không gây ra lỗi hệ thống hay đảm bảo rằng các lỗi hệ thống không gây ra những hỏng hóc hệ thống.
Sự kết hợp các kỹ thuật tự kiểm tra trong hệ thống và việc sử dụng các module dư thừa là những ví dụ của kỹ thuật chịu lỗi. Đào Ngọc Kiên - Lớp Cao Học CNTT 06-08 – ĐH Bách Khoa Hà Nội 15 Nghiên cứu kỹ thuật xây dựng phần mềm chịu lỗi áp dụng cho hệ thống nhúng Hình 1.1 Kỹ thuật nâng cao độ tin cậy phần mềm trong các pha phát triển Hình trên mô tả quan hệ giữa bốn phương pháp, giai đoạn thực hiện nhằm đạt được độ tin cậy phần mềm. Lỗi có thể tồn tại sau quá trình phát triển và kiểm tra. Những lỗi đó cần phải chú ý trong quá trình hoạt động bằng kỹ thuật chịu lỗi.
Kỹ thuật dự đoán lỗi có thể áp dụng ở tất cả các pha trong vòng đời phần mềm bằng cách dự đoán và ước lượng lỗi. Như trên đã nói, việc xây dựng phần mềm khó tránh khỏi lỗi xảy ra trong quá trình hoạt động. Cho dù phần mềm đó được thiết kế và phát triển bởi các nhà khoa học, các nhà lập trình suất sắc nhất và được sử dụng các công cụ trợ giúp hiện đại nhất thì cũng không thể khẳng định rằng phần mềm không có lỗi. Thêm nữa, tăng cường tính tin cậy của phần mềm là một thách thức rất lớn nếu so sánh với việc làm đó đối với phần cứng.
Thông thường lỗi phần cứng là các lỗi vật lý mà con người có thể biết rõ đặc điểm hoặc có thể nhận biết trước được lỗi phần cứng khi nó xảy ra. Trái lại, lỗi phần mềm không phải là lỗi vật lý, nó không bị cháy, nổ hoặc méo mó như phần cứng, rất khó để nhìn thấy, nhận thức được và quan trọng nhất là rất khó để khắc phục lỗi phần mềm. Lỗi phần mềm xảy ra trong nhiều trường hợp khác nhau, có thể phần mềm được xây dựng theo đúng yêu cầu đặt ra nhưng bản thân yêu cầu đó đã được hiểu sai so với bài toán thực tế, có thể phần mềm được thiết kế và phát triển sai so với yêu cầu, có thể do lỗi lập trình của người phát triển, hoặc cũng có thể do môi trường tác động. Có một điều cần lưu ý rằng, không giống như lỗi do phần cứng, quá trình thay đổi hoặc sửa chữa lỗi phần mềm có thể sinh ra các lỗi mới khác.
Để khắc phục phần mềm có lỗi không chỉ đơn giản như phần cứng (thay thế phần cứng khác), vì việc này có thể làm phần mềm càng bị lỗi nhiều hơn. Đào Ngọc Kiên - Lớp Cao Học CNTT 06-08 – ĐH Bách Khoa Hà Nội 16 Nghiên cứu kỹ thuật xây dựng phần mềm chịu lỗi áp dụng cho hệ thống nhúng Để hiểu rõ hơn về vấn đề này, chúng ta sẽ xem xét ba khái niệm quan trọng liên quan đến hoạt động không đúng của phần mềm đó là lỗi (error), sai sót (fault) và hỏng hóc (failure). Khái niệm Mô tả Hỏng hóc hệ thống Sự kiện xảy ra tại một thời điểm khi mà hệ thống (system failure) không cung cấp dịch vụ như người dùng mong đợi Lỗi hệ thống (System Là một trạng thái của hệ thống dẫn đến những hành vi error) hệ thống không được mong đợi bởi người dùng. Sai sót hệ thống Là một đặc tính của hệ thống dẫn tới trạng thái lỗi của (system fault) hệ thống.
Nó chính là một tiến trình, một bước hay một định nghĩa dữ liệu không đúng trong một chương trình hoặc khiếm khuyết của thành phần, thiết bị phần cứng. Sai sót hay nhầm lẫn Là những hành vi sai sót của con người tao ra lỗi của con người(Human trong hệ thống khi sử dụng những phương pháp, công error or mistake) cụ hay thông tin để giải quyết vấn đề.1 Các khái niệm liên quan đến độ tin cậy phần mềm Mối quan hệ giữa fault, error và failure được mô tả như sau [8]: kích hoạt lan truyền gây ra. Fault Error Failure Fault .2 Mối quan hệ giữa fault, error và failure Đào Ngọc Kiên - Lớp Cao Học CNTT 06-08 – ĐH Bách Khoa Hà Nội 17 Nghiên cứu kỹ thuật xây dựng phần mềm chịu lỗi áp dụng cho hệ thống nhúng Hình 1.3 Mối quan hệ giữa fault, error và failure Việc phần mềm bị lỗi có thể xuất phát từ nhiều nguyên nhân khác nhau: có thể phần mềm được xây dựng theo đúng yêu cầu đặt ra nhưng bản thân yêu cầu đó đã được hiểu sai so với bài toán thực tế hoặc cũng có thể phần mềm được thiết kế và phát triển sai so với yêu cầu đặt ra. Tuy nhiên, chúng ta cần phải lưu ý rằng: không giống như lỗi do phần cứng, đối với lỗi phần mềm thì quá trình thay đổi hoặc sửa chữa lỗi có thể sinh ra các lỗi mới.
Việc khắc phục sự phát sinh lỗi phần mềm không chỉ đơn giản như phần cứng (bằng cách thay thế các phần cứng khác), bởi lẽ nếu thay thế phần mềm bị lỗi bởi phần mềm khác có thể sẽ gây ra càng nhiều lỗi hơn. Ngoài ra, theo các nghiên cứu gần đây thì trong phần mềm tồn tại một loại lỗi gọi là lỗi phần mềm chuyển tiếp (transient fault) [9]. Đây là các lỗi không dự đoán được trong quá trình thiết kế phần mềm mà chúng chỉ xuất hiện khi hệ thống được đưa vào hoạt động, do đó mục tiêu xây dựng phần mềm không lỗi càng trở nên khó khăn hơn. Để giải quyết vấn đề này, người ta buộc phải nghĩ đến hướng tiếp cận khác để xây dựng hệ thống có độ tin cậy cao.
Đó là: thay vì cố gắng xây dựng phần mềm không có lỗi với các chi phí cao và mất nhiều thời gian, người ta đồng thời phát triển hệ thống với các kỹ thuật phát triển phần mềm nhanh (rapid software development) cùng với việc áp dụng các kỹ thuật phần mềm chịu lỗi nhằm nâng cao hiệu năng của hệ thống.[10] Từ đó, phần mềm chịu lỗi (fault-tolerant software) được định nghĩa là phần mềm có khả năng hoạt động và cung cấp các dịch vụ ngay cả khi gặp lỗi.