Bài viết này cung cấp một số phương pháp đã được sử dụng trong cập nhật phần mềm động cùng ưu, nhược điểm của từng phương pháp. Phần mềm động (dynamic software update) - cho phép các hệ thống đang chạy được cập nhật nhanh chóng mà không bị gián đoạn dịch vụ, việc này làm cho sự tương tác của người dùng với ứng dụng không bị gián đoạn khi thực hiện cập nhật ứng dụng lên phiên bản mới.
Trang 1Chuyển Trạng Thái Trong Cập Nhật Phần Mềm Động Sử Dụng
Phương Pháp Cập Nhật Tại Chỗ
Dương Thị Mai Nga! và Huỳnh Ngọc Thọ 2
12 Đại học Công nghệ Thông tin và Truyền thông Việt Hàn — Đại học Đà Nẵng
{dtmnga, hntho}@vku.udn.vn
Tóm tắt Chúng ta đều biết các phần mềm đều có các thay đôi trong suốt vòng đời hoạt động của mỉnh Những thay đổi đó có thể do phát hiện lỗi trong quá trình vận hành; có thể do thêm hoặc bớt một số chức năng dé phù hợp với nhu cầu thực tế hiện tại, Vì vậy cập nhật phần mềm là hoạt động thường
xuyên diễn ra
Theo cách truyền thống, việc cập nhật thường yêu cầu dừng và khởi động lại ứng dụng Với cách này, tương tác của người dùng với ứng dụng sẽ bị gián đoạn Nhiều ứng dụng không thể tạm dừng hoặc không muốn tạm dừng Ví dụ với các hệ thống quan trọng (hệ thống ngân hàng, bệnh viện, .), việc gián đoạn này là không chấp nhận được Với các hệ thống này người ta thực hiện cập nhật phần mềm động (dynamic software update) - cho phép các hệ thống đang chạy được cập nhật nhanh chóng mà không bị giản đoạn dịch vụ, việc này làm cho sự tương tác của người dùng với ứng dụng không bị gián đoạn khi thực hiện cập nhật ứng dụng lên phiên bản mới
Bài viết này cung cấp một số phương pháp đã được sử dụng trong cập nhật phần mềm động cùng ưu, nhược điểm của từng phương pháp
Từ khóa: cập nhật động, chuyên trạng thái, cập nhật phần mềm động
Abstract Softwares always change throughout their life cycle Such changes may be caused by error detection during operation; may be due to adding or removing some features to suit the current require- ments, So software update is a regular activity
Traditionally, updating often requires stopping and restarting the application In this way, the user's interaction with the application will be interrupted Many applications can't pause or don't want to pause For example with critical sytems (banking systems, hospitals, etc.), this interruption is unac- ceptable The dynamic software update is performed with these systems - allowing running systems to
be updated quickly without service interruption
This article provides some methods that have been used in dynamic software updates and the ad- vantages and defects of each method
Keywords: live update, state transfer, dynamic software update
1 Dat van dé
Việc nâng cấp bằng cách dừng/ khởi động lại ứng dụng vẫn đang là phương pháp cập nhật của đại đa số ứng dụng hiện nay Nhiều hệ thống yêu cầu phải hoạt động liên tục nhưng dù sao cũng phải được cập nhật
để sửa lỗi và thêm các tính năng mới Các nhà cung cấp dịch vụ internet, nhà cung cấp thẻ tín dụng, cửa hàng trực tuyến, .luôn phải duy trì hoạt động 24/7, một giờ ngừng hoạt động có thé tiêu tốn hàng trăm nghìn, thậm chí hàng triệu đô la [T], [2] Ngày nay, nhiều hệ thông muốn nâng cấp trực tuyên thay vì phải dừng và khởi động lại mỗi khi nó được điều chỉnh, một ví dụ dễ nhận thay là các hệ điều hành Ngay cả các ứng dụng iPhone và Android cũng hỗ trợ cập nhật động: khi người dùng thoát khỏi ứng dụng đang chạy, trạng thái của nó có thê được lưu lại để kiểm soát; nêu người dùng quay trở lại ứng dụng sau khi nâng cấp nó, phiên bản mới có thê khôi phục các trạng thái đã được lưu lại trước đó
Trong quá trình cập nhật, một vấn đề được quan tâm là việc chuyền các trạng thái từ phiên bản cũ sang phiên bản mới Việc chuyền trạng thái thực hiện chuyền nội dung các biến ở phiên bản cũ sang các biến ở phiên bản mới
Trang 2Bài viết giới thiệu một số phương pháp đã được sử dụng rộng rãi trong cập nhật phần mềm động là phương pháp dựa trên điểm cập nhật và phương pháp cập nhật mọi lúc (bao gôm POLUS và Ginseng) Đông thời bài viết cũng phân tích ưu điểm, hạn chê của từng phương pháp và đề xuât hướng giải quyết
2 Phương pháp dựa trên điểm cập nhật (update-point based approach)
[3] giới thiệu phương pháp cơ bản cho việc cập nhật phần mềm động và đã được triên khai trên máy trạm Sun 3/60 chạy SunOS, ap dụng chuyên đôi cho các ứng dụng viết băng ngôn ngữ C, tuy nhiên có thê mở rộng cho các ngôn ngữ hướng thủ tục khác Ở đây việc phát triển phiên bản mới của ứng dụng được thực hiện và kiêm định riêng, hệ thống chỉ đảm bảo các thay đôi được cải đặt vào đúng thời điểm sao cho việc chuyên đổi xảy ra đúng đắn
Khi một phiên bản mới của phần mềm được cài đặt, một tiên trình mới (new process) được tạo ra ứng với phiên bản mới Nếu không còn hàm nào thay đổi giữa các phiên bản thì các trạng thái của phiên bản cũ
sẽ được chuyền sang phiên bản mới, sau đó tiến trình cũ sẽ được loại bỏ Cụ thê, các trạng thái sẽ được chuyên vào một thời điểm thích hợp trong quá trình chuyên từ phiên bản cũ sang phiên bản mới Người dùng hầu như sẽ không thây sự gián đoạn trong hoạt động của ứng dụng
Các mô đun chính của hệ thống duoc trình bảy ở Hình 1 Tất cả các lệnh liên quan đến việc cập nhật động được thực hiện ở Modifcation Shell
Modification Shell
Symbol Table
Hinh 1 Các mô đun chính của hệ thống
Danh sách các lệnh cùng với bản tóm tắt chức năng của chúng được liệt kê ở Bảng l
Bảng 1 Các câu lệnh cua Modification Shell
Thay thê chương trình đang chạy băng zew-prog, các hàm thay đôi
re new-prog routines [init Prog [nit] duoc chi ra trong file routines va init la routine khoi tao ban dau ; yay a x
run prog [arg], .] Chay chuong trinh prog
tty [tty-name] Thiết lap thiét bi dau cuoi & tty-name
Dé chuyén trang thai, tiến trình của phiên bản cũ được thực thị để gọi thư viện nơi lưu trữ các thông tin
về dữ liệu và địa chỉ ngăn xếp Những thông tin này được lưu trữ trong các biên và hệ thông thay thê biết
rõ các biên này Hệ thông sẽ đọc những thông tin này và viết chúng vào các biên tương ứng trong tiên trình
Trang 3của phiên bản mới Tiến trình mới sau đĩ được thực thi để gọi thư viện nơi điều chỉnh dữ liệu và khơng gian ngăn xếp tương ứng với những thơng tin trên Sau đĩ các thanh ghi máy (machine registers) được sao chép Với bộ đếm chương trình (program counter), giá trị mới của nĩ được xác định bằng cách tìm địa chỉ mới của chương trình trong Swbọ 7abie cho phiên bản mới và điều chỉnh Sau khi việc chuyên trạng thái kết thúc, tiền trình cũ sẽ được loại bỏ và tiến trình mới tiếp tục hoạt động
Tuy nhiên vẫn cịn một số vấn đề trong chuyền đổi trạng thái mà [3] chưa giải quyết được:
e© Duy trì tính nhất quán của các con trỏ khi thực hiện sao chép dữ liệu từ phiên bản cũ sang phiên bản TỚI;
e Quyết định thời điểm thực hiện chuyền trạng thái để đảm bảo việc chuyền đổi qua phiên bản mới được thực hiện đúng đắn;
e Dam bao su ding dang cua các tập tin I/O sau thay đơi;
e Xu ly su thay đổi ở gia tri tra vé va dinh dang tham số của hàm;
e©_ Xử lý việc thêm, xĩa dữ liệu tồn cục;
Ngồi ra phương pháp dựa trên điểm cập nhật này cịn cĩ một số nhược điểm cơ bản: Thứ nhất là khả nang tim thay điểm cập nhật hợp lí phụ thuộc nhiều vào khả năng phân tích của trình biên dịch hoặc lập trình viên Với các ngơn ngữ lập trình linh hoạt như C, trình biên dịch thường gặp nhiều khĩ khăn trong
việc phân tích con trỏ và phân tích bí danh Mặc dù đã cĩ đề xuất nhằm hỗ trợ trình biên dịch [4] tuy nhiên
đề xuất này chỉ dành cho các ứng dụng đơn luỗng và nĩ khơng duy trì khả năng tương thích nhị phân Do
đĩ, nĩ khơng áp dụng được cho các tập tin nhị phân đã được biên dịch và phần mềm hiện đang chạy Thứ hai, rất khĩ tìm điểm cập nhật cho phần mềm đa luỗồng, nêu một điểm cập nhật khơng thê phát hiện kip thời, một vài cập nhật liên quan tới bảo mật sẽ bị trì hỗn khiến hệ thơng dé bi tan cơng Thứ ba, người vận hành
cĩ thể khơng kiêm sốt được quá trình cập nhật động do khơng biết được thời điểm thực hiện cập nhật Do
đĩ cĩ thê dẫn đến vấn đề một bản cập nhật mới vơ tình được áp dụng khi bản cập nhật hiện tại đang được
tiến hành
Hơn nữa trong nghiên cứu của mình, Gupta [5] đã sử dụng các phương pháp hình thức đề hiểu rõ hơn
về tính hợp lệ của việc cập nhật động và đã chứng minh rằng việc tìm kiếm các điểm cập nhật an tồn thể thực thi việc cập nhật nĩi chung là khơng thê giải quyết được
3 Cập nhật bất kì lúc nào
3.1 POLUS (POwerful Live Updating System)
Nhận thức được những khĩ khăn trong cách tiếp cận dựa trên điểm cập nhật, [6] trình bày phương pháp cho phép thực hiện bản cập nhật bát kì lúc nảo [6] giới thiệu POLUS, một cơng cụ hỗ trợ việc bảo trì phần mềm, trong đĩ cĩ việc cập nhật lên phiên bản mới Với POLUS, cả mã nguồn và dữ liệu của phiên bản cũ
và phiên bản mới đều được phép cùng tơn tại [6] đã ứng dụng POLUS để thực hiện cập nhật ba ứng dụng may chu phé bién: vsftpd (a commonly used FTP daemon), sshd (secure shell daemon) in OpenSSH suite
va apache HTTP server
POLUS được thiết kế đề hỗ trợ các cập nhật phần mềm liên quan tới mã nguồn, dữ liệu và thỏa mãn các tiêu chí sau:
e Kha nang tuong thich nhi phan (Binary Compatibility)
e H6 tro da luéng (Multithreading Support)
e Khơi phục các trạng thái bị hỏng (Recovery of Tainted State) do các lỗi bên trong phần mềm hoặc do các cuộc tân cơng từ bên ngồi
e Tinh kha dung va kha nang quan ly (Usability and Manageability)
© Chi phi thap (Low Overhead)
POLUS gồm ba thành phân:
® Patch construcfor: cĩ dạng như một trinh biên dịch, nơi phát hiện sự khác biệt về ngữ nghĩa giữa hai phiên bản phân mém kê tiếp
Trang 4e Patch injector: nơi thực hiện tiến trình để áp dụng các bản cập nhật
e_ Runtime library: cung cấp một số hàm tiện ích để quản lý các bản vá POLUS cho Patch injector
Về chuyền đổi trang thái, ý tưởng chính của [6] là cho phép cùng tồn tại cả dữ liệu phiên bản cũ vả phiên bản mới và duy trì sự kết hợp bằng cách gọi một số hàm đồng bộ trạng thái bất cứ khi nào có yêu câu truy cập để ghi vào một trong hai phiên bản Khi không có hàm nảo thao tác với dữ liệu phiên bản cũ, quá trình cập nhật được kết thúc một cách an toàn POLUS chỉ quan tâm tới các trạng thái toàn cục (như các biến toàn cục) mà không quan tâm tới các trạng thái cục bộ (ví dụ như ngăn xếp cục bộ, biến cục bộ) và xem các hàm thao tác với trạng thải như các hộp đen POLDUS được thiết kết để hỗ trợ cả ứng dụng đơn luồng
va da luéng
Việc cho phép cả dữ liệu cũ và đữ liệu mới đều được phép cùng tồn tại là vì các hàm thao tác với dữ liệu
cũ vẫn còn hoạt động nên có thê có các truy cập đồng thời vào thể hiện cũ và thê hiện mới của biến POLUS đảm bảo sự gắn kết giữa chúng bằng cách sử dụng các hàm đồng bộ hóa trạng thái được cung cấp bởi Patch constructor
Khi một bản cập nhật động được thực thi, Patch injector sé bao vé ca thể hiện cũ và mới của hai phiên
bản và liên kết với trình xử lý tín hiệu để bắt các lần ghi vào từng thê hiện của từng phiên bản Trinh xử lý
tín hiệu sẽ gọi các hàm đồng bộ hóa trạng thái trơng ứng đề chuyên các trạng thái đã sửa đổi từ phiên bản này sang phiên bản khác
[6] đã chứng minh rằng POLUS có thê thực hiện việc cập nhật cho các phần mềm máy chủ thực, lớn và phức tạp mà không làm gián đoạn dịch vụ của chúng
Tuy nhiên POLUS cũng còn một số hạn chế khi sử dụng Thứ nhất, không phải hệ thông nào cũng đủ không gian nhớ cho phép lưu trữ cùng lúc trạng thái của phiên bản cũ và phiên bản mới nên không áp dụng được với tất cả các trường hợp Thứ hai, do việc vẫn duy trì khả năng tương thích nhị phân đề hỗ trợ các
hệ thống cũ hoặc các hệ thông đã hoạt động, điều này khiến việc triển khai POLUS thêm phần phức tạp và
có thê gây khó khăn cho việc xử lý một số vòng lặp vô hạn trong quá trình cập nhật (mặc dù việc cập nhật các hàm có lời gọi các vòng lặp như vậy là khá hiếm trong thực tê)
3.2 Ginseng
Ginseng[4] thực hiện cập nhật phần mềm động cho các ứng dụng viết bằng ngôn ngữ C Phần mềm được biên địch một cách đặc biệt để chúng có thé chủ động tạo ra các bản vá và thực hiện cập nhật một cách tự động Ginseng đảm bảo dữ liệu luôn được cập nhật day du va dung dan
[4] đã sử dụng Ginseng để xây dựng và tự động áp dụng các bản vá cho ba chương trình máy chủ nguồn mo: Very Secure FTP daemon, OpenSSH sshd daemon, va GNU Zebra
Ginseng da phat triển một vải kỹ thuật mới bao gồm các cách mới đề xử lý việc chuyên đổi dữ liệu của các biến có sự thay đôi kiêu dữ liệu, cho phép cập nhật động các vòng lặp vô hạn (công việc vẫn còn khó khăn khi sử dụng POLUST6]) và cho phép cập nhật một cách có hiệu quả các chương trình với việc sử dụng con trỏ hảm
[4] cũng đã phát triển các công cụ đề tự động tạo ra bản vá động bằng cách so sánh hai phiên bản chương trình nhằm giảm công việc của lập trình viên Quan trọng hơn, Ginseng thực hiện hai phân tích để xác định thời điểm thực hiện việc cập nhật được an toản trong khi ứng dụng vẫn đang hoạt động Cơ sở lý thuyết cho việc phân tích này đã được trình bày ở [7]
Ginseng bao gồm ba thành phần:
e© Compiler: tao ra tập tin thực thi có thê cập nhật (v1) và một số thông tin phân tích, thông tin nguyên mẫu
từ phiên bản ban đầu (vI.c); sau đó tạo ra bản vá động từ tập tin lưu trữ sự khác biệt (p2.c) và thông tin
phiên bản hiện tại
e Patch generator: tạo ra tập tin p2.c thê hiện sự khác biệt giữa hai phiên bản chương trình (vI.c và v2.c)
e Runtime system: liên kết các bản vá động vào chương trình đang chạy, hoàn thành cập nhật trực tuyên
Đề thực hiện chuyên trạng thái, đầu tiên Patch generator xác định các thông tin thay đôi giữa các phiên bản (như các biến toàn cục, các hàm hoặc kiểu dữ liệu) Sau đó, với từng thông tin thay đổi này, Patch generator tạo ra một hàm chuyên đôi thực hiện chuyên dữ liệu từ mô tả cũ sang mô tả mới Compiler thực hiện chèn mã nguồn vào chương trình để chương trình thực hiện những hàm này sau một bản vá động
Trang 5Người dùng có thê tự tạo các hàm chuyên đổi trạng thái tùy chọn va được thực thị vào thời điểm cập nhật
để chuyên đổi trạng thái toàn cục Người dùng cũng có thê điều chỉnh hàm chuyên đổi kiêu dữ liệu
Ví dụ, nều một kiêu cầu trúc muốn mở rộng thêm một trường, Patch generator sẽ tạo ra mã nguồn đề sao chép các trường chung và thêm khởi tạo mặc định cho các trường mới được thêm vào Cách tiếp cận này tạo ra bản vá một cách hiệu quả, tuy nhiên yêu cầu một vài điều chỉnh thủ công Sau khi bản vá được tạo
và trình chuyên đổi trạng thái/ kiểu dữ liệu đã được viết, chúng chuyển kết quả cho Ginseng, và kết qua cuối cùng được biên dịch sang thư viện dùng chung đề có thê liên kết vào chương trình đang chạy
Có thê thây Ginseng đã cải thiện đáng kê so với công việc trước đây của họ [§] - yêu cầu chỉ định khi nào cần cập nhật Hơn nữa, Ginseng đã cho thấy tính thực tiễn của nó bằng cách áp dụng vào ba ứng dụng máy chủ lớn đã nêu ở trên
Tuy nhiên, việc sử dụng chuyên đôi trình biên dịch không đáp ứng yêu cầu về khả năng tương thích nhị phân và hạn chế với các ứng dụng đã biên dịch và hiện đang hoạt động Hơn nữa, cho đến nay Ginseng và tiền thân của nó chỉ áp dụng cho phần mềm don luéng
3.3 Bảng tông hợp
Từ những phân tích ở trên có thể tổng hợp lại các ưu, nhược điểm của từng phương pháp trong bảng sau:
Bảng 2 Tông hợp các phương pháp
Tiêu chí POLUS Ginseng điểm cập nhật
phân
Hỗ trợ các tập tin đã được
đang hoạt động
we pho pho 4g | Cothecap | Co thé cap Trình biên dịch hoặc
Thor diem tiến hành cập | nhậtbátkỳ | nhậtbátkỳ | lập tình viên xác định ạt ; ` ; ` +k ˆ ˆ
4 Kếtluận
Với các phương pháp đã giới thiệu ở trên, để thực hiện cập nhật phần mềm động thì khi có bản phát hành mới chúng ta cần tạo ra bản vá động chứa các hàm mới, các biến toàn cục mới, mã chuyên đổi trạng thái trong đó điều chỉnh cả đữ liệu và trạng thái điều khiến Bản vá này được tải vào chương trình đang chạy và việc thực thi mã cũ được chuyên hướng sang mã mới Chuyên hướng như vậy được kích hoạt bằng cách biên dịch chương trình gốc một cách đặc biệt như trong Ginseng [4] hoặc ép buộc trên hệ thống đang hoạt động như ở POLUST6]
Mặc dù phương pháp cập nhật tại chỗ và cập nhật mọi lúc được sử dụng pho bién, tuy nhién vẫn có một
số nhược điểm sau: (1) các trình biên dịch được sử dụng để hỗ trợ cập nhật tại chỗ đôi khi sử dụng các phân tich tinh dé dam bảo tính toàn vẹn ngữ nghĩa khi thực hiện các phép biến đổi chương trình, điều nảy sẽ buộc một số chương trình phải thay đổi để được biên dịch chính xác; (2) suy đoán về hành vi của chương trình được cập nhật đặt thêm gánh nặng cho lập trình viên khi phải suy luận về chương trình, các điểm trong chương trình có thê xảy ra cập nhật, mã thay đổi trong bản vá và mã chuyên đối trạng thái; (3) tat cả trạng thái của chương trình mới phải được khởi tạo một cách rõ ràng, thậm chí cả những trạng thái không có ở phiên bản cũ Những hạn chế này có thê được giải quyết bằng cách thực hiện cập nhật dựa trên chuyên trạng thái (state transfer-based updating)
Trang 6Tài liệu tham khảo
1 D Oppenheimer, A Brown, J Beck, D Hettena, J Kuroda, N Treuhaft, D A Patterson, and K Yelick Roc-1:
Hardware support for recovery-oriented computing IEEE Trans Comput., 51(2): 100-107, 2002
§S Parker A simple equation: IT on = Business on The IT Journal, Hewlett Packard, 2001
Deepak Gupta, Pankaj Jalote: On-line Software Version Change UsingState Transfer Between Processes
SOFTWARE—PRACTICE AND EXPERIENCE, VOL 23(9), 949-964 (SEPTEMBER 1993)
IL Neamtiu, M Hicks, G Stoyle, and M Oriol Practical dynamic software updating for c In Proc PLDI, pages
72— 83, June 2006
D Gupta, P Jalote, and G Barua A formal framework for on-line software version change IEEE Transaction on Software Engineering, 22(2):120—131, February 1996
Haibo Chen, Jie Yu, Rong Chen, Binyu Zang, and Pen-Chung Yew Polus: A powerful live updating system In ICSE, pages 271-281, 2007
G Stoyle, M Hicks, G Bierman, P Sewell, and I Neamtiu Mutatis Mutandis: Safe and predictable dynamic software updating In Proc POPL, 2005
M W Hicks, J T Moore, and 8 Nettles Dynamic software updating In Proc PLDI, pages 13-23, 2001
H Chen, R Chen, F Zhang, B Zang, and P.-C Yew Live updating operating systems using virtualization In Proc VEE, pages 35-44, Ottawa, Canada, June 2006