Bài viết tiến hành cải tiến hệ thống kiểu để tính được tài nguyên tối đa cần sử dụng của chương trình giao dịch đa luồng một cách hoàn toàn tự động. Người lập trình không cần thực hiện bước tính toán thủ công các tham số như trong nghiên cứu trước. Tài nguyên trong nghiên cứu này được cụ thể hóa là bộ nhớ log của các giao dịch. Để thực hiện được công việc này, ngôn ngữ cũng đã được cải tiến, bổ sung và chúng cũng gần với ngôn ngữ thực tế hơn.
Chuyên san Công nghệ thông tin Truyền thông - Số 11 (04-2018) HỆ THỐNG KIỂU ĐỂ SUY RA BỘ NHỚ LOG CỦA CHƯƠNG TRÌNH GIAO DỊCH TỪ BIẾN DÙNG CHUNG Nguyễn Ngọc Khải1 , Trương Anh Hồng2 Tóm tắt Trong nghiên cứu trước đây, xây dựng hệ thống kiểu để tính tài nguyên tối đa cần sử dụng chương trình giao dịch đa luồng Tuy nhiên, tài ngun tính tốn dựa tham số tài nguyên mà giao dịch cần sử dụng Những tham số người lập trình phải tự tính tốn thủ cơng dựa mã nguồn chương trình Vì vậy, kết mang tính phương pháp bán tự động, chưa thuận tiện cho người lập trình Trong nghiên cứu này, chúng tơi cải tiến hệ thống kiểu để tính tài nguyên tối đa cần sử dụng chương trình giao dịch đa luồng cách hoàn toàn tự động Người lập trình khơng cần thực bước tính tốn thủ công tham số nghiên cứu trước Tài nguyên nghiên cứu cụ thể hóa nhớ log giao dịch Để thực công việc này, ngôn ngữ cải tiến, bổ sung chúng gần với ngôn ngữ thực tế In previous works, we built a type system for calculating the maximum resource usage of a transactional program However, this resource was calculated based on the parameters These parameters were the resources that transactions need to use and calculated manually based on analysis source code of program by the programmer Therefore, the result was still methodical and semi-automatic leading to inconvenient to be used for programmers In this work, we have improved the type system with fully automatic functions for inferring the maximum resources usage of transactional programs Based on this result, the programmers not need to calculate manually parameters like previous work The resources here are specified into the log memory of the transaction In order to this, the language is also improved, complementary, and it is closer to the actual language Từ khóa Đa luồng, Bộ nhớ giao dịch, Hệ thống kiểu, Ngơn ngữ lập trình, Tài ngun nhớ Giới thiệu Mục đích nghiên cứu xây dựng hệ thống kiểu để giúp người lập trình ước lượng tĩnh nhớ log tối đa cần sử dụng chương trình giao dịch đa luồng sử dụng chế nhớ giao dịch (gọi tắt chương trình giao dịch) Từ đó, người lập trình tối ưu chương trình để sử dụng nhớ hiệu hơn, đảm bảo không bị lỗi tràn nhớ Nghiên cứu phát triển từ nghiên cứu [19], hệ thống kiểu cải tiến để tính nhớ log tối đa cần sử dụng cách 18 Đại học Tài nguyên môi trường Hà Nội, Đại học Công nghệ - Đại học Quốc Gia Hà Nội Tạp chí Khoa học Kỹ thuật - Học viện KTQS - Số 190 (04-2018) tự động chương trình giao dịch Ngôn ngữ nghiên cứu cải tiến để thực điều chúng gần với ngôn ngữ thực tế Để thuận tiện cho việc mô tả vấn đề đặt bạn đọc dễ theo dõi, phần trình bày tóm tắt đặc điểm chế nhớ giao dịch ngôn ngữ giao dịch Đặc điểm mơ hình lập trình nhớ giao dịch cho phép tạo giao dịch lồng nhau, tạo luồng giao dịch mở Khi giao dịch lồng giao dịch khác, ta gọi giao dịch sinh trước giao dịch cha, giao dịch sinh sau giao dịch Một giao dịch phải kết thúc trước giao dịch cha chúng Khi giao dịch bắt đầu, vùng nhớ gọi log cấp phát để lưu trữ biến dùng chung Một giao dịch bắt đầu chưa kết thúc gọi giao dịch mở Bên giao dịch mở, sinh luồng Khi này, luồng tạo log luồng cha Khi luồng cha kết thúc giao dịch, tất luồng mà tạo bên giao dịch phải kết thúc với giao dịch cha chúng Loại kết thúc gọi đồng kết thúc, thời điểm kết thúc diễn gọi điểm đồng kết thúc Những đồng kết thúc đồng ngầm định luồng Nếu giao dịch khơng có luồng con, việc kết thúc kết thúc cục thông thường Cả hai loại kết thúc giải phóng vùng nhớ cấp phát cho log Việc chép log từ luồng cha luồng sinh làm tăng nhớ log lên đáng kể Vì vậy, việc ước lượng nhớ log cần sử dụng chương trình giao dịch cần thiết người lập trình để đưa giải pháp tối ưu chương trình, hạn chế lỗi nhớ Tuy nhiên, đặc điểm chương trình giao dịch, giao dịch đan xen lồng nhau, luồng hoạt động song song khơng độc lập mà có điểm đồng với Việc đồng luồng ngầm định ngơn ngữ lập trình mà khơng phải người lập trình chủ động viết lệnh Do khơng thể phân tích mức mã nguồn chương trình mà phải phân tích mức ngữ nghĩa ngơn ngữ lập trình Vì lý này, việc ước lượng xác nhớ log tối đa cần sử dụng chương trình toán thực phức tạp Trong nghiên cứu [11], [18] xây dựng hệ thống kiểu tính số log tối đa tồn thực thi chương trình Sau đó, nghiên cứu [19] phát triển tiếp từ nghiên cứu xây dựng hệ thống kiểu để tính tài ngun tối đa chương trình cần sử dụng cách bán tự động Trong nghiên cứu này, tiếp tục cải tiến hệ thống kiểu nghiên cứu [19] để tính nhớ log tối đa cần sử dụng chương trình giao dịch cách tự động Trong nghiên cứu này, nhiều ký hiệu sử dụng lại từ nghiên cứu trước, chúng mang ý nghĩa hồn tồn khác trước Những đóng góp nghiên cứu bao gồm: ngôn ngữ giao dịch cải tiến để gần với ngôn ngữ thực tế hơn; hệ thống kiểu phù hợp với ngơn ngữ tính nhớ log tối đa cần sử dụng chương trình giao dịch cách hồn tồn tự động Các nghiên cứu liên quan: Xác định tài nguyên cần sử dụng chương trình nhiều nhà khoa học quan tâm nghiên cứu nhiều góc độ khác Trong 19 Chuyên san Công nghệ thông tin Truyền thông - Số 11 (04-2018) nghiên cứu [13], tác giả Hofmann Jost phân tích việc tính biên nhớ heap cho ngơn ngữ hàm Sau đó, họ sử dụng hệ thống kiểu để tính biên nhớ heap hàm đầu vào cho ngôn ngữ hướng đối tượng Trong nghiên cứu [14], tác giả Hughes Pareto giới thiệu ngôn ngữ hàm nghiêm ngặt, với hệ thống kiểu mà chương trình có kiểu hợp lệ chạy với khơng gian định người lập trình Trong nghiên cứu [10], tác giả Wei-Ngan Chin cộng nghiên cứu nhớ sử dụng chương trình hướng đối tượng Trong nghiên cứu [9], tác giả đưa phương pháp tính tốn tĩnh cận tổng tài nguyên phương thức sử dụng hàm tuyến tính tham số phương thức Trong nghiên cứu này, biên tìm chưa xác, phương pháp nghiên cứu khơng dựa hệ thống kiểu Trong nghiên cứu [4], [8], tác giả Braberman cộng đưa phương pháp tính tốn xấp sỉ hình thức biên nhớ cho chương trình Java Trong nghiên cứu [5], tác giả đề xuất hệ thống kiểu cho ngôn ngữ thành phần với thành phần song song luồng chạy độc lập, khơng có đồng kết thúc luồng ngôn ngữ của Tác giả Albert cộng có nhiều nghiên cứu ước lượng tài nguyên cần sử dụng cho chương trình Trong nghiên cứu [3], tác giả tính tốn tổng nhớ heap chương trình hàm kích cỡ liệu Trong [1], [2], tác giả nghiên cứu vấn đề ngữ cảnh chương trình phân tán đa luồng Tuy nhiên, nghiên cứu chi phí cho chương trình tính cách cộng dồn tất chi phí cho phương thức chương trình tất điểm mà chương trình thực thi Trong nghiên cứu [17], tác giả Pham cộng đề xuất thuật tốn nhanh để tìm biên nhớ heap cho lớp chương trình JavaCard Trong nghiên cứu [12], tác giả Jan Hoffmann Zhong Shao sử dụng hệ thống kiểu để ước lượng tài nguyên sử dụng chương trình song song cho ngơn ngữ lập trình hàm Đối với chương trình tương tranh, [6], [7], tác giả đo lường chi phí nhớ đệm Tuy nhiên, nghiên cứu không cung cấp chế hỗ trợ cho việc tìm biên nhớ tĩnh Nghiên cứu tập trung vào ngôn ngữ lập trình đa luồng sử dụng chế nhớ giao dịch Trong đó, chúng tơi tập trung giải vấn đề giao dịch lồng nhau, trình đồng luồng, biên nhớ tìm sắc phương pháp trước Phương pháp đưa phương pháp phân tích chương trình tĩnh, dựa hệ thống kiểu chứng minh kiểm thử chặt chẽ Ví dụ minh họa Chúng ta xem xét ví dụ chương trình giao dịch mơ tả Hình Ví dụ phát triển dựa ví dụ [16] Trong đoạn mã Hình 1a, lệnh onacid commit dùng để bắt đầu kết thúc giao dịch Lệnh spawn dùng để tạo luồng Lệnh global int x = 0; để khai báo khởi tạo biến dùng chung, lệnh yêu cầu cấp phát nhớ cho giao dịch chương trình Lệnh spawn tạo luồng chạy song song với luồng cha Luồng nhân biến dùng chung luồng cha để lưu trữ thành 20 Tạp chí Khoa học Kỹ thuật - Học viện KTQS - Số 190 (04-2018) dành riêng cho chúng, làm việc với biến cách độc lập Hành vi đoạn chương trình mơ tả Hình 1b 10 11 12 13 14 15 16 17 18 19 20 21 22 23 onacid //thread global int x=0; spawn{ //thread onacid //do something onacid global int y=0; //do something commit; commit; commit;}; int i=0; //local variable while(i