Tải bản đầy đủ (.docx) (48 trang)

xây dựng hệ thống giải bài toán smt hiệu năng cao – phần máy chủ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (572.31 KB, 48 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Đỗ Ngọc Thiện
XÂY DỰNG HỆ THỐNG GIẢI BÀI TOÁN SMT
HIỆU NĂNG CAO – PHẦN MÁY CHỦ
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công Nghệ Thông Tin
Cán bộ hướng dẫn: TS. Trương Anh Hoàng
Cán bộ đồng hướng dẫn: TS. Phạm Ngọc Hùng
HÀ NỘI - 2010
Xây dựng hệ thống giải bài toán SMT hiệu năng cao – Phần máy chủ 2010
LỜI CẢM ƠN
Trước tiên, tôi xin gửi lời cảm ơn và lòng biết ơn sâu sắc đến Tiến sĩ Trương Anh
Hoàng và Tiến sĩ Phạm Ngọc Hùng, những người đã tận tình chỉ bảo, hướng dẫn tôi
trong suốt quá trình thực hiện khoá luận tốt nghiệp.
Tôi xin bày tỏ lời cảm ơn sâu sắc đến các thầy cô giáo đã giảng dạy tôi trong suốt
bốn năm học qua, đã cho tôi nhiều kiến thức quý báu để tôi vững bước trên con đường
học tập của mình.
Tôi xin gửi lời cảm ơn chân thành tới các anh chị cao học, các bạn trong nhóm
tìm hiểu bài toán SMT và tìm hiểu cách xây dựng hệ thống giải quyết bài toán SMT
hiệu năng cao đã nhiệt tình giúp đỡ tôi trong quá trình tham gia nghiên cứu khoa học và
làm khoá luận tốt nghiệp.
Tôi xin gửi lời cảm ơn tới các bạn trong lớp K51CB và K51CNPM đã ủng hộ
khuyến khích tôi trong suốt quá trình học tập tại trường.
Và cuối cùng, tôi xin bày tỏ niềm biết ơn vô hạn tới bố mẹ và những người bạn
thân luôn bên cạnh, động viên tôi trong suốt quá trình thực hiện khoá luận tốt nghiệp.
Hà Nội, ngày 13 tháng 05 năm 2010.
Sinh Viên
Đỗ Ngọc Thiện
Xây dựng hệ thống giải bài toán SMT hiệu năng cao – Phần máy chủ 2010
TÓM TẮT NỘI DUNG


Việc giải quyết các bài toán Satisfiability Modulo Theories (SMT) được nghiên cứu
rất nhiều trên khắp thế giới. Hiện nay, trên thế giới đã có rất nhiều bộ giải quyết các bài
toán (hay còn gọi là Solver) SMT từ một tệp SMT đã được xây dựng trên thế giới, trong
đó phải kể đến CVC3, Z3, Yieces, IASolver, SatSolver,… Và mỗi Solver đó đều có những
đặc trưng và thế mạnh riêng trong mỗi trường hợp của bài toán SMT. Trong nhiều năm
qua, bài toán giải quyết bài toán SMT hiệu năng cao đã được xây dựng, đặc biệt nó là đề
tài tìm hiểu, nghiên cứu của rất nhiều trường đại học của các nước trên thế giới. Do vậy,
việc xây dựng bước đầu của hệ thống giải quyết bài toán SMT hiệu năng cao là điều quan
trọng để những người phát triển khác về sau có thể nâng cấp, phát triển hệ thống tốt hơn.
Dựa trên những ưu điểm của các Solver, chúng ta xây dựng một hệ thống có cơ chế kết
nối các ưu điểm đó của Solver để có thể tìm ra được kết quả cho bài toán SMT một cách
nhanh chóng.
Trong khóa luận tốt nghiệp này, một hệ thống giải quyết bài toán SMT hiệu năng
cao mã nguồn mở được bước đầu được xây dựng nên. Hi vọng, cùng với những người
phát triển khác sau này của hệ thống, trường ta sẽ có một hệ thống giải quyết bài toán
SMT tốt hơn, mang tên trường Đại Học Công Nghệ.

Xây dựng hệ thống giải bài toán SMT hiệu năng cao – Phần máy chủ 2010
MỤC LỤC
Xây dựng hệ thống giải bài toán SMT hiệu năng cao – Phần máy chủ 2010
BẢNG KÍ HIỆU, CHỮ VIẾT TẮT
Kí hiệu Diễn giải
File Tệp
Request Yêu cầu người dùng
SMT Satisfiability Modulo Theories
Server Máy chủ
Solver Bộ giải bài toán SMT
Timeout Thời gian tối đa để giải bài toán SMT
User Người sử dụng
Xây dựng hệ thống giải bài toán SMT hiệu năng cao – Phần máy chủ 2010

DANH MỤC CÁC BẢNG SỬ DỤNG
Xây dựng hệ thống giải bài toán SMT hiệu năng cao – Phần máy chủ 2010
DANH MỤC CÁC HÌNH VẼ, BIỂU ĐỒ SỬ DỤNG
CHƯƠNG 1. MỞ ĐẦU
1.1. Giới thiệu
Các bài toán lý thuyết mô đun về tính thỏa được (Satisfiability Modulo Theories –
SMT) luôn được quan tâm và tìm hiểu trên khắp thế giới trong nhiều năm qua. Việc giải
các bài toán SMT đó là việc kiểm tra tính thỏa được của các biểu thức logic dựa trên các
thuyết nền tảng. Các bộ giải quyết bài toán SMT đã được xây dựng rất nhiều quốc gia từ
rất sớm, khoảng đầu những năm 1980. Từ đó đến nay, chúng ta đã xây dựng được rất
nhiều bộ giải quyết khác nhau. Trong các bộ Solver đã được xậy dựng, ta phải kể đến các
Solver như : CVC, CVC Lite, ICS (SRI), MathSAT, STP, UCLID, Yices (SRI), Zap
(Microsoft), Z3 (Microsoft),…
Hiện tại, nhiều trường đại học nổi tiếng đã nghiên cứu và xây dựng nên các hệ thống
để giải quyệt bài toán SMT. Điều chúng ta cần ở hệ thống giải quyết bài toán SMT đó là
vấn đề hiệu năng, thời gian trả lời kết quả của bài toán. Thách thức của chúng ta ở đây là
xây dựng một hệ thống kết hợp các bộ giải toán SMT để tận dụng các ưu điểm của các
Solver, giải quyết bài toán SMT nhanh chóng. [1]
1.2. Phát biểu bài toán giải quyết bài toán SMT hiệu năng cao– phía máy chủ
Mỗi Solver đều có một thế mạnh cho riêng trong từng dạng của bài toán SMT. Để
đem lại cho người dùng kết quả của bài toán SMT nhanh chóng và chính xác, ta cần xây
dựng một hệ thống cho phép tận dụng tối ưu các thế mạnh của các Solver. Hệ thống dự
kiến bao gồm 3 phần chính đó là: phần máy chủ (còn gọi là Server), Solver, và phần
người sử dụng. Khi phần thực thi các Solver và User được xây dựng, ta cần phải xây dựng
phần Server cho phép chuyển giao bài toán từ phía User đến các Solver, và chuyển kết
quả từ Solver về cho người dùng. Đồng thời, ngắt việc thực thi các bài toán SMT ở các
Solver khác sau khi nhận được kết quả nhanh nhất từ Solver. Việc xử lý chuyển giao bài
toán và kết quả của Solver phải được thực hiện song song và phải có cơ chế sao cho phục
vụ người dùng một cách hiệu quả nhất. Kết quả từ các Solver được biểu diễn theo cách
đặc trưng của Solver đó, chúng ta cần chuyển đổi chúng về một dạng để người dùng có

8
thể dễ hiểu hơn. Việc xây dựng Solver cũng phải rõ ràng, dễ hiểu để người phát triển hệ
thống tiếp theo có thể nâng cấp hệ thống một cách dễ dàng, hiệu quả.
1.3. Kết quả đã đạt được
Hệ thống giải bài toán SMT hiệu năng cao theo như trong trình bày luận văn đã
được xây dựng và bước đầu cho kết quả khá tốt ở các bài toán đưa ra. Hiện tại, hệ thống
đang sử dụng 2 Solver đó là Z3 và Yieces và hỗ trợ 2 cách nhập bài toán SMT đó là bằng
file hoặc sử dụng API. Hệ thống cho thấy thời gian giải bài toán SMT là tương đương với
thời gian nhanh nhất giải bài toán đó của 2 Solver. Tuy vậy, hệ thống còn chưa hỗ trợ
được nhiều Solver và mới chỉ duy nhất hỗ trợ một định dạng file “.smt”.
1.4. Các nội dung chính của luận văn
Bài luận văn “Xây dựng hệ thống giải bài toán SMT hiệu năng cao – Phần máy chủ”
bao gồm 7 chương:
- Ở chương 1, chương mở đầu của luận văn, chúng ta sẽ bước đầu biết đến SMT,hiểu được
bài toán đặt ra cho hệ thống giải bài toán SMT hiệu năng cao và các kết quả đã đạt được
của việc xây dựng hệ thống.
- Ở chương 2, giới thiệu về SMT, SMT Solver trình bày về SMT và SMT Solver, các ứng
dụng của việc giải bài toán SMT
- Ở chương 3, phân tích hệ thống và hướng giải quyết, chương này mô tả các thành phần
của hệ thống giải bài toán SMT hiệu năng cao, các yêu cầu của người sử dụng. Đồng thời
ta cũng nắm bắt được các lựa chọn để xây dựng nên hệ thống, cơ chế hoạt động của hệ
thống.
- Ở chương 4, thiết kế tổng thể của hệ thống, chương 4 cho ta nắm bắt được các thành
phần, cách hoạt động mà mối quan hệ giữa các thành phần của hệ thống thông qua biểu
đồ ca sử dụng và biểu đồ hoạt động của hệ thống.
- Ở chương 5, thiết kế chi tiết server, chương này trình bày về các lớp xây dựng nên Server
và cách xây dựng các lớp đó.
- Ở chương 6, cài đạt và thực nghiệm, chương này trình bày về cách thức cài đặt, thực thi
hệ thống và những yêu cầu của hệ thống về môi trường phần cứng phần mềm. Chương 6
cũng đưa ra bài toán thực nghiệm của hệ thống và đánh giá kết quả thực nghiệm của hệ

thống.
9
- Ở chương 7, kết luận, chương này trình bày về kết luận của việc xây dựng hệ thống giải
bài toán SMT hiệu năng cao và các hướng phát triển tiếp theo của hệ thống.
CHƯƠNG 2. GIỚI THIỆU VỀ SMT, SMT SOLVER
2.1. Giới thiệu về SMT
SMT là viết tắt của Satisfiability Modulo Theories - các lý thuyết mô đun về tính
thỏa được, là một tập hợp của các phương pháp nghiên cứu tự động kiểm tra tính thỏa
mãn của các biểu thức tiền tố với nền tảng một số thuyết “T” nào đó.
Điều khác biệt giữa SMT và các hệ thống tự động suy luận thông thường đó là sử
dụng thuyết nên tảng được gọi là các lý thuyết mô đun về tính thỏa được và sử dụng các
phương pháp suy luận đặc trưng của thuyết đó. Bằng cách sử dụng sự đặc trưng và giới
hạn của ngôn ngữ để giải quyết các biểu thức, các phương thức đặc biệt được thực thi
trong các Solver đem lại hiệu quả cao hơn trong thực tế so với các định lý toán học với
mục đích thông thường.
Trong khi, kĩ thuật SMT trong truyền thống chỉ dùng để hỗ trợ kiểm tra các phần
mềm suy diễn thì ngày nay chúng được tìm thấy ở một số ứng dụng khác trong khoa học
máy tính chẳng hạn như: lập kế hoạch, kiểm tra các mô hình và tự động tạo ra các mẫu
kiểm tra. Thông thường, các thuyết hay được quan tâm là các thuyết về biểu thức, số học,
bit vector, kiểu dữ liệu đại số…. [2] [3]
Thông thường, các bài toán SMT thường được biểu diễn theo quy tắc chuẩn SMT,
và được lưu ra tệp để cho các Solver thực hiện giải bài toán.
2.2. Giới thiệu về SMT Solver
Các bộ giải quyết bài toán SMT (SMT Solver) dùng để giải các bài toán SMT đã
được xây dựng và phát triển từ rất lâu. Những bộ SMT Solver đầu tiên được xây dựng từ
những năm 1980. Cho đến ngày nay, số lượng Solver đã được xây dựng đã lên đến hàng
chục Solver, có thể kể đến : ArgoLib, Ario, Barcelogic, CVC, CVC Lite, CVC3, ExtSAT,
Fx7, Harvey, HTP, ICS (SRI), Jat, MathSAT, Sateen, Simplify, Spear, STeP, STP, SVC,
TSAT, UCLID, Yices (SRI), Zap (Microsoft), Z3 (Microsoft), …
Trong hệ thống giải quyết bài toán SMT hiệu năng cao đã được xây dựng, ta sử

dụng đến 2 Solver là Yieces và Z3. Yieces và Z3 là 2 Solver cho phép đưa ra kết quả của
10
bài toán SMT và cũng cho phép truyền tham số về thời gian thực hiện giải bài toán, phù
hợp với yêu cầu của hệ thống. Đó chính là lí do hệ thống giải bài toán SMT hiệu năng cao
chọn 2 Solver này trong quá trình xậy dựng và thực thi hệ thống.
2.3. Các ứng dụng của bài toán SMT
Ứng dụng của bài toán SMT được sử dụng kiểm tra phần mềm và phần cứng, mở
rộng các kiểm tra tĩnh, làm sáng tỏ các ràng buộc, lập kế hoạch, lập lịch, sinh ra các kiểm
thử và bảo mật máy tính. Do đó, việc tạo hệ thống giải quyết bài toán SMT hiệu năng cao
đem lại kết quả nhanh nhất, tốt nhất và rõ ràng nhất cho người sử dụng. Đem lại cho
người sử dụng cảm giác tin cậy và tiện dụng. [4] Cùng với đó, hệ thống có khả năng hỗ
trợ nhiều định dạng SMT, nhiều cách nhập dữ liệu cho người dùng.
11
CHƯƠNG 3: PHÂN TÍCH HỆ THỐNG VÀ HƯỚNG GIẢI QUYẾT
3.1. Phân tích yêu cầu
3.1.1. Các yêu cầu của người sử dụng
- Đầu vào: Ta có thể chọn 2 hình thức nhập bài toán SMT để gửi đến hệ thống giải quyết
bài toán SMT đó là sinh ra file SMT bằng dòng code hoặc sử dụng file SMT sẵn có. Việc
gửi file để giải bài toán đi phải dễ dàng, hoặc cách thức nhập dữ liệu bài toán đơn giản.
Hiện tại, hệ thống mới hỗ trợ file định dạng *.SMT, một định dạng chuẩn và cơ bản nhất
mô tả các bài toán SMT và định dạng này được hỗ trợ ở hầu hết các Solver hiện tại.
- Output: Kết quả của bài toán SMT được hiển thị trên màn hình. Kết quả trả về cần chính
xác, nhanh và dễ hiểu. Tất cả các kết quả của các bài toán phải viết theo 1 chuẩn, chuẩn
này có thể được quy định bởi chính hệ thống nhưng điều quan trọng là dễ hiểu.
3.1.2. Các yêu cầu của hệ thống
Dựa trên yêu cầu của người dùng, hệ thống cũng phải đáp ứng được những điều sau:
- Phải chuyển được bài toán đến tất cả các Solver, để đón chờ kết quả nhanh nhất trong các
Solver và chuyển tới người sử dụng một cách nhanh chóng.
- Kết quả nhận được từ Solver phải được convert về một chuẩn chung dễ hiểu.
- Hỗ trợ nhiều người dùng cùng kết nối đến Solver và giải bài toán SMT cùng một lúc.

- Quản lý số lượng kết nối đến cùng lúc.
- Dễ cài đặt và thực thi hệ thống.
3.2. Các thành phần của hệ thống
Mô hình của hệ thống:
12
Hình 3.1 Mô hình hệ thống giải quyết bài toán SMT hiệu năng cao.
Dựa vào mô hình hệ thống giải quyết bài toán SMT hiệu năng cao hình 3.1, ta có thể
thấy được hệ thống hoạt động bao gồm một Server, là trung tâm kết nối của các User và
Solver, một Server có thể có nhiều User và Solver. Server làm nhiệm vụ trung chuyển các
yêu cầu về bài toán của User đến các Solver và chuyển kết quả theo chiều ngược lại đến
User.
Hệ thống bao gồm 3 bộ phận chính:
- Solver: mỗi một Solver kết nối với một bộ giải bài toán SMT (SMT Solver), cho phép giải
quyết bài toán SMT và nhận kết quả của bài toán từ SMT Solver đem gửi cho Server, để
Server chuyển kết quả cho người dùng tương ứng. Một Solver có thể cho phép thực hiện
giải nhiều bài toán cùng một lúc, mỗi một bài toán được thực hiện dưới một phiên làm
việc (Session) riêng.
13
- User: Tạo kết nối đến Server của hệ thống giải quyết bài toán SMT. User cho phép người
dùng gửi bài toán SMT bằng nhiều cách khác nhau như nhập bằng code của User hay
nhập bằng tệp. Mỗi yêu cầu có khoảng thời gian giải quyết riêng, người dùng có thể
truyền vào nhưng không thể lớn hơn giá trị tối đa mặc định được quy đinh bởi hệ thống.
Khi người dùng bắt đầu gửi bài toán thì kết nối từ User đến Server được thiết lập và kết
nối đó sẽ bị ngắt ngay sau khi có kết quả trả về từ Server.
- Server: Là một bộ phận rất quan trọng của hệ thống. Server phải đem lại hiệu quả cao cho
người dùng. Server là nơi lắng nghe những yêu cầu của User và nhận thông tin về bài
toán của User. Khi nhận được bài toán từ User, Server phải tạo ra các phiên làm việc mới
tới các Solver và phân phối bài toán đó cho các Solver để đón chờ kết quả sớm nhất từ
một trong các Solver đó. Việc tạo ra phiên làm việc để dễ dàng xử lý khi có nhiều luồng
dữ liệu vào - ra từ Server đến Solver và để phân biên các bài toán khác nhau. Server phải

cùng lúc gửi bài toán đó đến tất cả các Solver. Sau khi nhận được kết quả của một phiên
làm việc, Server phải có nhiệm vụ ngắt tất cả các Solver đang thực thi phiên làm việc đó
nhằm mục đích tiết kiệm tài nguyên và hiệu quả hơn cho việc giải quyết các bài toán
khác. Server phải phục vụ được cùng lúc nhiều người dùng khác nhau, với khả năng
truyền tải thông tin giữa các bộ phận lớn. Chính vì vậy, Server cần phải có cơ chế phục vụ
và quản lý tiến trình chặt chẽ, nếu không hệ thống sẽ hoạt động kém hiệu quả do tài
nguyên máy tính có giới hạn.
3.3. Cách thức giao tiếp của các thành phần của hệ thống
3.3.1. Phương thức kết nối giữa các thành phần trong hệ thống
Ta có thể lựa chọn 2 phương thức kết nối giữa các thành phần trong việc giải quyết
bài toán SMT hiệu năng cao đó là sử dụng web service và sử dụng kết nối socket. Mỗi
phương thức kết nối đều có những ưu, nhược điểm riêng. Tùy thuộc theo yêu cầu của bài
toán, ta có được sự lựa chọn đúng đắn. Bảng 3.1 cho ta so sanh việc lựa chọn kết nối
giữa các thành phần của hệ thống.
14
Bảng 3.1 So sánh việc lựa chọn kết nối các thành phần của hệ thống
Sử dụng kết nối socket Webservice
Việc kết nối và giao tiếp giữa các thành
phần nhanh chóng và chính xác.
Phải tự xây dựng cơ chế phục vụ cho
User, và Solver.
Không mất các chi phí phụ khác.
Việc kết nối và truyền tải giữa các thành
phần của hệ thống sẽ chậm hơn.
Không phải xây dựng cơ chế phục vụ do
cơ chế phục vụ đã được xây dựng sẵn.
Phải mất các chi phí phụ như: thuê máy
chủ, tên miền…
Do yêu cầu của bài toán, việc thời gian đáp ứng kết quả cho người dùng là điều đặc
biệt quan trọng. Cùng với đó, việc tự xây dựng cơ chế phục vụ của Server cho phép ta có

thể tùy biến nhiều hơn phù hợp với bài toán được đặt ra. Chính vì vậy, hệ thống lựa chọn
hình thức kết nối socket là hoàn toàn hợp lý với yêu cầu bài toán.
2.3.2. Các quy ước trong giao tiếp giữa các thành phần hệ thống.
Việc giao tiếp giữa Server và các thành phần User, Solver của hệ thống thông qua
socket và được quy ước gần giống như theo ngôn ngữ XML, nhưng có một chút cải tiến
đề phù hợp với tính chất của bài toán hơn.
XML là ngôn ngữ phổ biến sử dụng trên nhiều nền ngôn ngữ, hình thức giao tiếp
khác nhau. XML cũng tương tự như HTML, nó biểu diễn các đối tượng cần lưu trữ dựa
vào các thẻ, còn HTML là biểu diễn các đối tượng để trình bày. XML được sử dụng rất
hữu ích trong chia sẻ dữ liệu, có ảnh hưởng lớn đến sự phát triển các ứng dụng web. Các
thẻ trong XML hoàn toàn được định nghĩa bởi người lập trình [5]. Hình 3.2 là một ví dụ
về XML:
<hello>
Z3
</hello>
15
Hình 3.2 Ví dụ về XML.
Đây là câu chào đầu tiên của Solver với Server để Server có thể hiểu được đó là
Solver nào. Nội dung của các đối tượng nằm trong cặp thẻ mở và thẻ đóng tương ứng. Do
tính thích nghi với tất cả các ngôn ngữ nên nó được sử dụng phổ biến trên khắp thế giới.
Các quy ước trong hệ thống được mô tả rất kĩ trong tệp mã nguồn config.java
- Cặp thẻ <hello> và </hello> thể hiện sự bắt tay kết nối giữa các thành phần khác trong hệ
thống với Server.
- Cặp thẻ <file> và </file> để bắt đầu việc thực hiện gửi file giữa Server và các Solver,
User của hệ thống.
- Cặp thẻ <result> và </result> Để thể hiện nội dung kết quả nhận được từ việc giải bài
toán SMT giữa Solver – Server và Server – User.
- Thẻ <destroy> Để phá hủy một phiên làm việc sau khi nhận được kết quả từ bài toán của
phiên làm việc đó, hoặc bài toán đó vô nghiệm trong khoảng thời gian giới hạn.
- Thẻ <exit> thể hiện sự kết thúc kết nối giữa người dùng và Server.

Trong quá trình gửi dữ liệu từ Server đến các sovler, có rất nhiều luồng dữ liệu vào -
ra. Do đó, để phân biệt giữa các dòng dữ liệu của các bài toán khác nhau ta sử dụng tới
phiên làm việc. Mã của phiên làm việc (Session_id) được sinh ra từ lớp ServerSMT và
sesssion_id sẽ được ghi trước mỗi dòng dữ liệu từ Server đến Solver và ngược lại, ngăn
cách với chuỗi gửi đi bằng dấu “|”.
Chẳng hạn như 1234|<destroy> là việc thực hiện hủy việc hoạt động của phiên làm
việc 1234 trên Solver nhận được dòng thông điệp trên từ Server.
Việc xử dụng XML cũng tạo nên sự dễ hiểu cho những người cùng tham gia phát
triển hệ thống.
3.4. Ngôn ngữ lập trình
Giải pháp được chọn trong phương thức kết nối giữa các thành phần trong hệ thống
là kết nối qua socket nên ta lựa chọn ngôn ngữ lập trình bậc cao để lập trình cho hệ thống
vì các ngôn ngữ lập trình bậc cao hỗ trợ lập trình socket rất tốt. Để xây dựng hệ thống giải
quyết bài toán SMT hiệu năng cao, ta sử dụng ngôn ngữ lập trình Java, một trong những
ngôn ngữ lập trình thông dụng và mạnh nhất hiện nay.
16
Java đã rất quen thuộc với hầu hết các lập trình, có cộng đồng người sử dụng lớn,
nên khi gặp phải vấn đề trong lập trình ta có thể dễ dàng tìm hiểu vấn đề đó qua mạng
hơn. Java còn hỗ trợ tốt lập trình socket qua lớp Java.net.Socket và Java.net.ServerSocket.
Tính tương thích cao của Java với các hệ điều hành khác nhau như Windows, Linux, Mac
… cũng là một trong những nguyên nhân dẫn đến quyết định chọn ngôn ngữ lập trình
Java. Sở dĩ Java có khả năng tương thích cao như vậy vì Java sử dụng máy ảo Java để có
thể thông dịch mã bytecode của Java sang mã máy để máy có thể thực thi được. [6]
3.5. Cơ chế phục vụ của Server
Xây dựng một Server đơn giản là một việc không khó nhưng để xây dựng được một
Server có tính năng mạnh, có khả năng phục vụ nhiều người sử dụng thì phức tạp hơn. Hệ
thống giải quyết bài toán SMT hiệu năng cao được xây dựng dựa trên mô hình “Robust
Java Server” của Steven Haines, một kĩ sư về Java của công ty phần mềm Quest, là tác
giả của 2 cuốn sách “Java 2 primer plus” và “Java 2 from scratch”. Để phù hợp với bài
toán giải quyết bài toán SMT hiệu năng cao, chúng ta cần phải cải tiến mô hình để phân

tách giữa các kết nối của Solver, và các kết nối của vì hệ thống có nét đặc trưng riêng.
3.5.1.Mô hình robust Java Server – Steven Haines
Việc tự xây dựng một Java Server đơn giản là một việc không khó nhưng để xây
dựng một Java Server mạnh mẽ thì phức tạp hơn nhiều.
Để xây dựng một Server đơn giản, ta sử dụng lớp Java.net.ServerSocket và cũng chỉ
cần một vài dòng code theo các bước sau, ta có thể có một Server trong vòng 10 phút, các
bước thực hiện:
- Tạo một đối tượng thuộc lớp ServerSocket, cung cấp cho nó cổng để lắng nghe, và số
lượng kết nối chờ trong hàng đợi (backlog).
- Gọi phương thức accept() thuộc lớp đối tượng ServerSocket đó để chờ đợi các kết nối từ
client đến ở cổng đã được định sẵn.
- Và phương thức đó sẽ trả về một đối tượng Socket, từ đó ta có thể giao tiếp với các client
đó.
17
Một Server như vậy chỉ có thể phục vụ được một client request, nhưng thông
thường, một Server cần phục vụ cho rất nhiều kết nối đến. Khi ấy, một Server đơn giản
như vậy sẽ gặp một số vấn đề rắc rối.
Như vậy, phải có bước xử lý đa kết nối. Việc đó có thể thực hiện được bằng cách
thực hiện vòng lặp cho phương thức accept() của ServerSocket. Điều ta cần làm là khi
nhận được một kết nối từ Client đến Server từ cổng lắng nghe của ServerSocket phải có
một luồng xử lý được gọi ra. Ta phải làm như vậy để cho ServerSocket có thể chờ và nhận
các kết nối khác đến Server. Ta có thể làm như sau:
while(true) {
Socket socket = ServerSocket.accept();
HandlerThread handler = new HandlerThread(socket);
handler.start();
}
Hình 2.3 Cách nhận tiếp nhận các kết nối đến.
Trong đoạn code trên, trong vòng lặp có 3 dòng:
- Server lắng nghe kết nối.

- Khi có một kết nối đến và trả về là một socket, Server tạo một đối tượng để thực hiện
trên socket đó.
- Server bắt đầu luồng xử lý đó.
Đến cuối vòng lặp, vòng lặp lại được thực hiện lại để lắng nghe kết nối tiếp theo.
Trên lý thuyết, nếu chỉ làm như vậy thì Server có thể hoạt động tốt. Nhưng trong
thực tế, nó sẽ là một Server hoạt động cực kì chậm chạp. Có thể kể đến 2 lý do như sau:
- Việc sinh một luồng xử lý mới tốn chi phí xử lý của CPU rất lớn.
- Ở đây, hệ thống không có giới hạn về số luồng xử lý, và không có quản lý các tiến trình.
Khi có quá nhiều các luồng xử lý được thực hiện thì việc chuyển giao giữa các luồng xử
lý sẽ tốn nhiều thời gian. Do vậy, hiệu quả hoạt động của hệ thống trở nên không cao.
Steven Haines đã đề ra kiến trúc của một Server có khả năng hoạt động tốt –
Robust Java Server như sau:
Mô hình của Robust Java Server:
18
19
Lớp AbstractServer của hệ thống được xây dựng với các công việc chính sau:
+ Có một ServerSocket, đối tượng này thực hiện lắng nghe các kết nối đến từ
phía client thông qua cổng lắng nghe đã được người lập trình định sẵn trong hệ thống.
+ Khi có kết nối đến, Server thêm socket đó vào hàng đợi các request để tiện
xử lý.
+ Lớp có biến thể hiện trạng thái của Server đang hoạt động hay không. Khi
Server bắt đầu, hàm run() sẽ được gọi, vòng lặp lắng nghe các kết nối đến Server chừng
nào biến trạng thái hoạt động.
+ Khi Server tắt, tiến trình đang xử lý và tất cả các kết nối đến nó sẽ bị ngắt.
20
Hình 2.4 Mô hình hoạt động của Robust Java Server.
+ Đây là lớp được viết ra để khi xây dựng các Server khác có thể thừa kế từ
lớp này.
Lớp AbtractSever có sử dụng hàng đợi các request và gọi đến lớp xử lý các
request, khi hàng đợi đó được tạo ra luôn có sự giới hạn về số lượng request, số lượng

threads tối thiểu và tối đa. Khi phương thức start() được gọi chương trình sẽ thực hiện
hàm run của lớp Server. Vòng lặp trong hàm run được thực hiện và sẽ đón chờ các kết
nối, thêm các kết nối vào hàng đợi request.
Lớp RequestQueue sử dụng danh sách liên kết để tạo ra danh sách cho các socket
giữa client và Server. Số lượng thread (tiến trình) đang xử lý sẽ được giới hạn trong
khoảng từ minthreads đến maxthreads. Trên thực tế, minthread ta thường để là 0 và
maxThreads có thể tùy chỉnh trong từng bài toán, có thể là bằng 2 lần số nhân của CPU
máy tính đó. Có 2 phương thức chính trong lớp này:
- Add (): thêm một đối tượng vào trong hàng đợi.
- GetNextObject(): Lấy một đối tượng trong hàng đợi ra.
Cũng giống như lớp Server, nó cũng có biến thể hiện trạng thái hoạt động, một danh
sách liên kết.
Lớp RequestThread
- Lớp RequestThread tạo một đối tượng RequestHandler, lớp định nghĩa việc xử lý các
request. Toàn bộ phần chính của lớp được viết trong phương thức run(), sẽ được gọi đến
khi requestThread bắt đầu.
- Khi một socket được lấy ra từ hàng đợi, đặt trạng thái là đang xử lý, sau đó truyền cho
RequestHandler và lại đánh dấu lại trạng thái xử lý, và chờ lấy một đối tượng khác từ
hàng đợi.
- Thực chất, lớp RequestThread chỉ có nhiệm vụ truyền request đến lớp xử lý
RequestHandler mà thôi.
Lớp requestThread gọi đến một lớp thực thi xử lý socket từ client kết nối đến
Server. Lớp RequestHandler được tùy chỉnh theo từng bài toán, lớp này quản lý và định
nghĩa cách thức giao tiếp giữa Server và Client.
- Với kiến trúc làm việc như vậy, cho phép:
+ Một Client tạo một request đến Server.
21
+ Khi Server nhận được request đó, thêm request vào danh sách hàng đợi, và
tiếp tục lắng nghe những request tiếp theo.
+ Hàng đợi các request thêm request đó vào danh sách liên kết của mình

(Thêm vào cuối và gỡ bỏ phần tử ở đầu đi).
+ RequestThread chờ đợi khi có một luồng dữ liệu rảnh rỗi thì đẩy request từ
luồng xử lý và thực hiện nó.
+ Luồng xử lý request sẽ chuyển giao việc xử lý cho lớp xử lý yêu cầu
(requesthandler) để thao tác trực tiếp với client.
Ta có thể nhận thấy, việc thực hiện theo các bước trên khá là rõ ràng, và có thể
thực hiện được một cách nhanh chóng. Khi đi vào thực tế áp dụng cho các bài toán khác,
tất nhiên sẽ gặp một số vướng mắc nho nhỏ theo tính chất đặc trưng riêng của từng bài
toán. [7]
3.5.2. Áp dụng mô hình Robust Java Server vào xây dựng giải quyết bài toán SMT hiệu
năng cao
Do tính chất đặc thù của bài toán, nên khi xây dựng Server ta phải chú ý đầu tiên
đến các đối tượng kết nối đến Server. Các đối tượng kết nối đến Server bao gồm 2 phần:
User và Solver. Vai trò của mỗi đối tượng là khác nhau, do vậy, để cho dễ hiểu và minh
bạch, ta viết các lớp xử lý cho Solver và User riêng biệt, cụ thể ở đây là SolverHandler và
RequestHandler.
Tương tự như mô hình Robust Java Server, Server SMT bao gồm các phần cơ bản
là RequestHandler, RequestQueue, RequestThread, SolverHandler - Cùng là lớp xử lý
như RequestHandler nhưng là giao tiếp với các Solver. Ngoài ra, còn có những lớp đặc
trưng riêng của bài toán:
+ Lớp Session, là lớp tạo ra phiên làm việc giữa Solver và Server để phân
biệt giữa các tiến trình giữa Server và Solver.
+ Lớp config: Quy ước việc giao tiếp giữa các thành phần trong hệ thống.
+ Lớp Debug: Để kiểm tra trong quá trình hoạt động của hệ thống.
+ Lớp Convert: Chuyển output của các Solver về dạng chuẩn. Do mỗi
Solver sau khi thực hiện giải bài toán SMT sẽ đưa ra cho chúng ta nhiều định dạng kết
22
quả đầu ra khác nhau, để giúp cho người dùng dễ hiểu, ta phải chuyển chúng về một
chuẩn của Server SMT.
23

CHƯƠNG 4. THIẾT KẾ TỔNG THỂ HỆ THỐNG
4.1. Biểu đồ ca sử dụng của hệ thống
Hình 4.1 Biểu đồ ca sử dụng của hệ thống [8].
Trong biểu đồ ca sử dụng của hệ thống, có 2 tác nhân chính là Solver và User. Các
công việc phân phối, các giá trị tham số, và chuyển kết quả dạng chuẩn đến User là các
Use Case của hệ thống.
User sẽ gửi giá trị về Timeout và bài toán SMT đến cho Solver. User gửi thông tin
về time out và phân phối đến các Solver. Kết quả hệ thống nhận được từ Solver hoặc
không nhận được do quá thời hạn thực hiện giải bài toán sẽ được chuyển về dạng chuẩn
để gửi về cho User. Biểu đồ được vẽ bằng phần mềm Enterprise Architect 7.5.
24
4.2. Biểu đồ hoạt động của hệ thống
Hình 4.2 Biều đồ hoạt động của hệ thống [8].
25

×