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

Bài tiểu luận Java lập trình mạng và mô phỏng thuật toán lamport

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 (168.58 KB, 16 trang )

TRƯỜNG ĐẠI HỌC QUẢNG NAM
Khoa Toán –Tin
BÀI TIỂU LUẬN
Đề Tài:Java lập trình mạng và mô phỏng thuật toán
Lamport
Môn: Nguyên lý Hệ Điều Hành
GVHD:Nguyễn Văn Khương
Thành viên nhóm:
Nguyễn Văn Tiền
Trần Ngọc Toàn
Nguyễn Viết Hiếu
Nguyễn Duy Khánh
Phan Văn Hà
1
Contents
2
Nội dung nghiên cứu:
I.Giới thiệu chung về Java lập trình mạng
1.Java là gì?
Java là công nghệ cho phép tạo ra các phần mềm phân tán (distributed
software). Đây là những phần mềm đặt trên máy chủ (server), được nạp
về qua kết nối mạng và thực hiện trên máy khách (client).
Mặc dù được tạo ra từ những năm 70, Internet chỉ thực sự quyến rũ các
doanh nghiệp vào những năm 90 nhờ có sự ra đời của World Wide Web.
Web cho phép người sử dụng truy cập trực tiếp các thông tin trên
Internet mà không cần phải học các lệnh phức tạp, cung cấp thông tin
trực tuyến về nhiều lĩnh vực với hình ảnh, âm thanh,
Sự ra đời của Java cho phép Web tiến xa hơn nữa, biến các trang Web
tĩnh thành các ứng dụng sống động, có thể tương tác với người sử dụng.
Những lý do căn bản để mọi người chú ý đến Java là:
Cho phép viết các chương trình mạnh và tin cậy.


Xây dựng ứng dụng chạy được trên hầu hết các phần cứng và hệ điều
hành khác nhau.
Phân phối các ứng dụng trên mạng với độ bảo mật và an toàn cao.
2.Cấu trúc của Java
Sức mạnh Java có được chính là nhờ cấu trúc của nó. Java được thiết kế
nhằm mục đích trước hết là đơn giản hoá công việc của người lập trình.
Kế đến, do nhu cầu chạy trên mạng, Java phải thật sự an toàn và ổn
định, cũng như có khả năng làm việc được với nhiều kiểu phần cứng,
phần mềm khác nhau.
3
Cấu trúc ngôn ngữ Java thực sự đã đảm bảo được tất cả các tính năng
trên.
Cũng như các ngôn ngữ lập trình khác, Java cần một trình biên dịch để
chuyển đổi mã lệnh cho người đọc (mã nguồn) sang ứng dụng thực thi
được.
Trình biên dịch Java chuyển chương trình nguồn Java thành các
bytecode. Các bytecode này chỉ có thể chạy được trên máy ảo Java (Java
Virtual Machine -JVM).
Bộ Java Developers Kit (JDK) do Sun cung cấp bao gồm một số chương
trình tiện ích cho phép bạn biên dịch, bắt lỗi và tạo tài liệu cho một ứng
dụng Java.
Hiện nay trên thị trường đang có rất nhiều môi trường phát triển Java
của hãng thứ ba rất tiện lợi (như Visual J++, Symantec Cafe, ), nhưng
tất cả các chương trình này đều dựa trên nền JDK.
3.Các trình tiện ích của JDK bao gồm:
Javac (Bộ biên dịch Java): Làm nhiệm vụ chuyển mã nguồn Java sang
bytecode.
Java (Bộ thông dịch Java): Thực thi các ứng dụng Java trực tiếp từ tập
tin lớp (class).
appletviewer: Một trình thông dịch Java thực thi các Java applet từ tập

tin HTML.
javadoc: Tạo tài liệu dạng HTML từ mã nguồn cùng với các chú thích
bên trong.
Các trình tiện ích của JDK bao gồm:
Javac (Bộ biên dịch Java): Làm nhiệm vụ chuyển mã nguồn Java sang
bytecode.
4
Java (Bộ thông dịch Java): Thực thi các ứng dụng Java trực tiếp từ tập
tin lớp (class).
appletviewer: Một trình thông dịch Java thực thi các Java applet từ tập
tin HTML.
javadoc: Tạo tài liệu dạng HTML từ mã nguồn cùng với các chú thích
bên trong.
Jdb (Java debuger): Cho phép bạn thực hiện từng dòng trong chương
trình, đặt các điểm dừng (breakpoint), xem giá trị các biến.
javah: Tạo ra tập tin header của C cho phép C gọi hàm Java hoặc
ngược lại.
Javap (Trình dịch ngược java): Hiển thị các hàm và dữ liệu truy cập
được bên trong một tập tin lớp đã dịch. Nó cũng cho phép hiển thị nghĩa
của bytecode.
Quá trình biên dịch Java như sau: mã nguồn trong các tập tin *.java,
qua trình biên dịch javac được chuyển thành các bytecode. Bytecode
nằm trong tập tin *.class, được gọi là tập tin lớp (bởi mỗi tập tin chứa
một lớp riêng biệt của Java). Các ứng dụng Java có thể bao gồm nhiều
lớp khác nhau.
Chú ý: Một lớp (class) của Java cũng giống hệt như một lớp trong C++.
Lớp chính là các biến dữ liệu và thủ tục kết hợp với nhau thành một
khối.
Khi thực hiện chương trình Java, máy ảo Java sử dụng trình nạp lớp
(class loader) để đọc các bytecode từ đĩa hoặc kết nối mạng. Các lớp

được nạp sẽ phải đi qua trình kiểm tra lớp (class verifier) để chắc chắn
rằng chúng sẽ không sinh ra các lỗi ảnh hưởng đến hệ thống khi thực thi.
5
Quá trình kiểm tra này làm tăng thời gian nạp một lớp, tuy nhiên nó chỉ
phải thực hiện có một lần mà thôi.
Phần thực hiện (execution unit) trong máy ảo Java sẽ thực thi các lệnh
quy định trong từng bytecode.
Bộ phận thực thi đơn giản nhất là một trình thông dịch, chuyển đổi từng
bytecode sang các thủ tục cần làm trên từng hệ thống. Cách này rất chậm
vì trình thông dịch phải luôn tra nghĩa của bytecode mà nó thực thi.
Để khắc phục nhược điểm này, người ta đưa ra trình biên dịch Just-in-
time (JIT): Quá trình chuyển đổi từ bytecode sang mã lệnh riêng của
từng hệ thống sẽ được làm luôn một lần ngay khi nạp chương trình, do
đó tăng được tốc độ đáng kể.
Chương trình viết bằng Java có thể là ứng dụng riêng biệt (stand-alone
application), hay là ứng dụng nhúng trên Web (applet) hoặc đồng thời cả
hai.
Applet là chương trình được nhúng trong trang Web, được đọc và thực
hiện bởi trình duyệt hỗ trợ Java (Java-enabled Web browser).
Khi trình duyệt đọc tới trang Web này, applet sẽ được thực thi.
Trái lại, một ứng dụng Java riêng biệt được chạy bằng dòng lệnh thì
không cần thông qua trình duyệt Web.
Một trình duyệt Web hỗ trợ Java (Java-enabled browser) có máy ảo Java
riêng. Hiện nay, các trình duyệt hỗ trợ Java như vậy khá nhiều: Netscape
2.0 trở lên, HotJava, Microsoft Internet Explorer 3.0 (bản beta 2 trở lên)

Các trang Web nhúng Java applet có chứa đường dẫn kiểu URL tới tập
tin lớp chính của applet đó. Trình duyệt chỉ việc khởi động máy ảo Java
và cung cấp cho trình nạp lớp đường dẫn này. Chú ý rằng mỗi lớp đều
6

đưa ra tên của các lớp phụ nó cần, do đó trình nạp lớp phải nạp một số
lớp phụ khác trước khi thực hiện chương trình.
4.Các đặc tính chính của Java :
Trong phần này, chúng ta sẽ điểm qua bảy đặc tính quan trọng khiến
Java trở thành một công cụ phát triển mạnh, tin cậy.
An ninh
An ninh là một vấn đề khó khăn hàng đầu mà người lập trình mạng gặp
phải: Người sử dụng luôn e ngại 2 điều: Thứ nhất, thông tin họ gửi đi
trên mạng có thể bị đọc lén và thứ hai hệ thống của họ có thể bị xâm
nhập và phá hoại. Cấu trúc an ninh của Java nhằm vào giải quyết đồng
thời hai vấn đề trên.
Cấu trúc an ninh của Java dựa vào ba thành phần: Trình nạp lớp, trình
kiểm tra lớp và trình quản lý an ninh (SecurityManager). Chúng ta đã
biết rằng trình kiểm tra lớp làm nhiệm vụ đảm bảo chắc chắn chương
trình Java được biên dịch đúng đắn, khi thực hiện sẽ không gây lỗi ảnh
hưởng đến hệ thống cũng như không đụng chạm đến những dữ liệu
"riêng tư" trên máy khách hàng.
Bên cạnh đó, trình nạp lớp phân biệt rõ lớp nào đến từ mạng, lớp nào
nằm ngay trên máy khách hàng. Điều này ngăn lớp tới từ mạng "giả
dạng" một lớp trên máy khách hàng để thực hiện các tác vụ bị cấm đối
với lớp này. Ngoài ra nó còn giúp tách biệt hoạt động của các lớp khác
nhau tới từ các máy chủ khác nhau.
Giao diện lập trình ứng dụng chuẩn - Core API
Java cung cấp cho người lập trình một thư viện các hàm chuẩn, đó là
Core API. Các hàm chuẩn này được đặt trong các gói (package) - là tập
hợp của các lớp có mối quan hệ với nhau (ví dụ như gói java.awt chứa
7
các lớp Abstract Windowing Toolkit, giúp người lập trình xây dựng ứng
dụng với giao diện GUI trên các platform khác nhau).
Tương thích với nhiều kiểu phần cứng

Mã bytecode của Java có thể chạy trên hầu như mọi loại phần cứng và
hệ điều hành hiện nay như: PC, Macintosh cũng như các máy khác có
chạy máy ảo Java.
Một điểm nữa là thư viện các thủ tục chuẩn Java có chứa đầy đủ các
hàm có thể dùng chung cho các platform khác nhau.
Đặc tính động và phân tán
Hệ điều hành Windows cho phép các chương trình sử dụng chung và
nạp tự động các thư viện liên kết động DLL.
Chia sẻ tập tin DLL làm giảm dung lượng bộ nhớ cũng như đĩa cần
dùng và tăng tính cấu trúc của chương trình.
Java cũng có đặc tính này: các lớp được nạp tự động khi cần và nhiều
chương trình có thể dùng chung một lớp. Nó còn hỗ trợ đặc tính phân
tán, tức là các phần của chương trình có thể nằm trên máy chủ lẫn trên
máy khách hàng.
Hướng đối tượng
Lập trình hướng đối tượng (OOP) là phương thức viết các ứng dụng dễ
bảo trì, dễ nâng cấp và đặc biệt là có thể tái sử dụng các mã lệnh. Java
là một ngôn ngữ hướng đối tượng, do đó nó có đầy đủ các đặc tính trên.
Ngoài ra, thư viện lớp Java cung cấp khá đầy đủ cho người lập trình để
bắt đầu một dự án mới.
Đa luồng (multi-threads)
8
Các ứng dụng viết bằng Java có thể có nhiều tiến trình được xử lý cùng
một lúc.
Một ứng dụng đơn luồng chỉ có thể thực hiện một tác vụ tại một thời
điểm: Giả sử ứng dụng đang bận lấy từ trên mạng xuống một tập tin
mất vài phút, trong thời gian này ứng dụng không thể làm các việc khác
như vẽ lại màn hình
Với ứng dụng viết bằng Java, bạn có thể tạo hai tiến trình song song
làm việc: một tiến trình nạp tập tin, một tiến trình khác làm nhiệm vụ

cập nhật màn hình.
Quản lý bộ nhớ và quá trình thu dọn “rác”
Quản lý bộ nhớ là một vấn đề khá phức tạp đối với C và C++. Trong
thời gian thực hiện chương trình, người lập trình chịu trách nhiệm khởi
tạo các vùng nhớ, sau khi dùng xong lại giải phóng chúng. Chỉ cần một
lỗi nhỏ trong đó cũng có thể làm cạn kiệt tài nguyên hay dẫn đến treo hệ
thống.
Java đã loại bỏ gánh nặng này cho người lập trình. Các vùng nhớ được
tự động giải phóng nếu như nó không tham chiếu đến bất kỳ đối tượng
nào đang hoạt động.
II.Khái niệm về hệ tin học phân tán
Hệ tin học phân tán là hệ thống xử lý thông tin bao gồm nhiều bộ xử lý
hoặc các bộ xử lý nằm ở xa tại các vị trí khác nhau và được liên kết với
nhau thông qua phương tiện viễn thông dưới sự thống nhất của hệ điều
hành.
Hệ tin học phân tán là hệ thống không chia sẽ bộ nhớ và đồng hồ.
9
Trong hệ tin học phân tán, các tính toán có thể được tính trên nhiều bộ vi
xử lý của hệ thống đa bộ xử lý. Như vậy hệ thống tin học phân tán đòi
hỏi hệ thống của mình phải trang bị bộ nhớ cục bộ.
Các bộ xử lý trao đổi thông tin qua các hệ thống đường truyền khác nhau
như là cáp chuyên dụng, bus trao đổi, đường điện thoại, cáp
quang……….
1.Nguyên tắc xây dựng hệ phân tán
Chia sẻ tài nguyên: thực tế phát triển mạng máy tính đặt ra một vấn đề
là cần phải dùng chung tài nguyên. Một tiến trình trên một trạm nào đó
có thể cung cấp tài nguyên dùng chung ở một trạm khác.
Liên lạc: khi các hệ thống đã được mắc nối với nhau, các thực thể trong
hệ có thể trao đổi thông tin với nhau.
Tin cậy: một trạm trong hệ bị sự cố không làm cho toàn hệ ảnh hưởng,

mà ngược lại công việc đó được phân cho các trạm khác đảm nhận.
Ngoài ra, trạm bị sự cố có thể tự động phục hồi lại trạng thái ban đầu
trước khi có sự cố hay trạng thái ban đầu của nó.
Tăng tốc: đây là khái niệm mới về phân tán tải. Một tính toán lớn nào
đó, nếu sử dụng một trạm thì thời gian cho kết quả lâu. Tính toán này
được chia nhỏ và thực hiện song song trên các trạm. Điều này cũng cần
thiết đối với các trạm quá tải.
Một trong những tư tưởng lớn của các hệ phân tán là phân tán hóa các
quá trình xử lý thông tin và thực hiện các công việc đó trên các trạm xa
nhau. Đó là cơ sở để xây dựng các hệ ứng dụng lớn như thương mại điện
tử, giáo dục điện tử…….
Liên lạc là thuật ngữ được sử dụng chỉ những tác vụ trao đổi thông tin
giữa các thực thể thuộc hệ thống, trong đó có một thực thể gửi (trạm
10
phát) và một thực thể nhận (trạm nhận). Thông tin trong quá trình nhận
và gửi gọi là thông điệp.
Khi một người sử dụng muốn liên hệ với các người khác trong mạng thì
người ấy phải có địa chỉ mạng của những người cần liên hệ. Địa chỉ
mạng là hệ thống tên quy ước theo nguyên tắc xây dựng nhất định và
không trùng nhau. Trong mạng, một người sử dụng có thể sử dụng một
trạm bất kỳ để liên lạc với người sử dụng khác mà họ muốn.
Khi người sử dụng gửi thông điệp cho người khác ở xa, máy chủ nguồn
nơi thông điệp xuất phát phải tra cứu vào đây để xác định hướng của
luồng thông tin đến máy chủ đích, máy của thông điệp đến.
Hệ thống hoạt động như vậy gọi là hệ phân tán. Nhược điểm lớn nhất
của hệ này là khi máy chủ bị sự cố dẫn đến không thể tra cứu thông tin
cho các người sử dụng gắn liền với nó.
Để khắc phục điều này người ta phân tán các hệ thống tra cứu trên máy
chủ.
Trong hệ phân tán, thời hạn truyền một thông điệp là hiệu số giữa thời

điểm nhận và thời điểm truyền.
Ta giả sử rằng: thời hạn này đủ lớn để so sánh với hệ tập trung, là một
đại lượng biến thiên, và thời hạn đó ở cặp máy này khác với cặp máy
khác.
Từ đó ta có các hệ quả như sau:
Hệ quả 1: Ở một thời điểm cho trước, một xử lý đang thực hiện trên một
máy chỉ có thể biết trạng thái gần đúng của các máy khác. Hệ quả này
cho ta biết trong mạng không tồn tại đồng hồ chung.
Hệ quả 2: Trật tự nhận các thông điệp trên máy nhận có thể không
giống trật tự phát của chính thông điệp đó. Các máy trên trạm có thể bị
11
sự cố và các thông điệp có thể mất. Giải pháp cho vấn đề này là đánh số
cho tất cả các gói tin gửi đi kèm theo số đó cho máy nhận.
Hệ quả 3: 2 máy giống nhau chứa thông tin hoàn toàn giống nhau lại
không bao giờ giống nhau về trạng thái.
III.Đồng bộ hóa và mô phỏng thuật toán Lamport
1.Cung cấp phân tán
Vì lý do ổn định và hiệu quả mà ta phải phân tán chức năng cung cấp
trên nhiều trạm khác nhau. Sự hoạt động gắn bó với nhau giữa các
chương trình cung cấp là rất cần thiết để đảm bảo cho hoạt động cung
cấp được hoàn toàn chính xác.
Thuật toán cung cấp cho hệ phân tán
Một sự hoạt động gắn bó của các chương trình cung cấp phân tán quản
lý trên cùng một tập hợp các tài nguyên chỉ đạt được nếu tuân thủ các
quy tắc sau, ở đây các thông điệp được hiểu là các yêu cầu hay khuyến
nghị giải phóng tài nguyên.
Quy tắc
Các bộ cung cấp bắt buộc phải thực hiện cùng một giải thuật.
Các bộ cung cấp đều nhận tất cả các thông điệp phát đi từ các tiến
trình.

Các thông điệp phải được xử lý cùng một trật tự như nhau trong các
chương trình cung cấp.
Quy tắc sau cùng nhấn mạnh đến sự thiết yếu phải có một trật tự duy
nhất trên tập hợp các thông điệp của hệ. Trật tự này có thể được thực
hiện thông qua việc hợp lực giữa các tiến trình cung cấp giữa các tiến
trình phát thông điệp.
12
2.Sắp xếp kiểu đóng dấu
Đóng dấu là hành vi gán giá trị nguyên cho một thông điệp nhằm ghi
nhận thời điểm truyền trên cơ sở tham chiếu đồng hồ logic.
Nội dung cơ bản của phương pháp này là trạm phát được gắn một giá trị
gọi là dấu. Giá trị này có tính chất thời điểm cho trạm phát thông tin và
dựa vào đồng hồ logic cục bộ của chính trạm.
Các đồng hồ này được lấy lại thông qua hội thoại giữa các trạm.
3.Thuật toán Lamport
Mỗi trạm s đều có trang bị công tơ với các giá trị nguyên gọi là Hs. Đó
chính là đồng hồ logic tăng lên giữa hai sự kiện kế tiếp. Trạm e phát
thông điệp ghi dấu E của mình dựa trên giá trị hiện hành của He. Khi
nhận được thông điệp, trạm nhận r cập nhật đồng hồ Hr riêng của mình
bằng giải thuật sau đây:
Nếu Hr, thì
Hr:=E+1
Chấm dứt
Sự kiện “Nhận thông điệp” lúc này được ghi nhận bằng giá trị của Hr.
Thuật toán này đảm bảo rằng thời gian nhận thông điệp là sau thời gian
phát nó đi.
Với thời gian này cho phép xác định một quan hệ trật tự toàn bộ mà ta
đã ký hiệu → và cho phép kiểm tra được các điều kiện trong C1 và C2
của phần trước.
Một sự kiện a sinh ra trong trạm i và được đánh dấu bởi đồng hồ cục bộ

gọi là Hi(a). Nếu a và b đều là hai sự kiện trên hai trạm i và j, ta luôn
luôn có qua hệ xác định như sau:
a
"
b <=> Hi(a)<Hi(b)
13
Đó là trật tự không chặt chẽ vì hai sự kiện trên hai trạm khác nhau có thể
đến cùng một thời điểm giống nhau.
Ta có thể mở rộng quan hệ → thành quan hệ trật tự chặt chẽ => bằng
cách kết hợp một số khác cố định cho mỗi trạm và bằng cách đánh dấu
thời gian cho mỗi sự kiện a của trạm i bằng cặp (Hi(a),i).
Theo định nghĩa ta có:
a=>b <=>(Hi(a)<Hi(b))
hay
(Hi(a)=Hi(b) và i<j)
4.Ứng dụng thuật toán trong hệ phân tán
Trường hợp 1: Các quy tắc cho các thuật toán cung cấp tài nguyên trên
hệ phân tán.
Các bộ cung cấp bắt buộc phải thực hiện cùng giải thuật
Các bộ cung cấp đều nhận tất cả các thông điệp phát đi từ các tiến
trình.
Các thông điệp phải được xử lý cùng một trật tự như nhau trong các
chương trình cung cấp.
Vậy quy tắc 3 nhấn mạnh đến sự thiết yếu phải có một trật tự duy nhất
trên tập hợp các thông điệp của hệ. Để thực hiện được điều này cần sử
dụng thuật toán Lamport.
Trường hợp 2: Định nghĩa về mối quan hệ “xảy ra trước”.
Khi so sánh những sự kiện trên cùng một máy chủ (Host), nếu sự kiện a
xuất hiện trước sự kiện b, thì a “Xảy ra trước” b
14

Nếu một host tiếp nhận (Receives) một Mesg được gởi (Send) từ một
host khác, thì sự kiện Send “Xảy ra trước” Receives
Nếu x xuất hiện trong P1 và y xuất hiện trong P2, P1 và P2 không thế
hoán đổi Mesg cho nhau, thì X và Y gọi là đồng quy (concurrent).
Những quy tắc được sử dụng cho việc cập nhật giá trị cho đồng hồ logic
trên các host:
Bộ đếm Counter được tăng trước mỗi sự kiện.
Trong trường hợp Send, bộ đếm Counter được tăng, sau đó Mesg được
gởi. Đồng thời Mesg mang giá trị mới của Timestamp (nhãn thời gian).
Trong trường hợp Receive, hành động đúng được quyết định bởi giá trị
của Timestamp trong Mesg. Nếu Mesg có giá trị Timestamp cao hơn
nhận (Receiver), đồng hồ logic nơi nhận chấp nhận giá trị được gởi với
Mesg. Ngược lại, đồng hồ logic nơi nhận được tăng và Mesg chọn giá
trị được chấp nhận là giá trị đồng hồ mới.
Trường hợp 3: Cài đặt đồng hồ lôgic.
B1: Tất cả tiến trình Pi, sử dụng đồng hồ lôgic riêng Ci, giá trị khởi tạo
là 0.
B2: Trước khi xử lý một sự kiện, Pi thực hiện như sau: tăng giá trị đồng
hồ và gán cho sự kiện như là timestamp của nó.
Hi = Hi + d (d>0 thường d=1)
B3: Mỗi thông điệp mang giá trị đồng hồ của tiến trình gởi tại thời điểm
gởi. Khi Pi nhận một thông điệp với timestamp Hmsg nó xử lý như sau:
1.Hi = Max( Hi, Hmsg).
2.Thực hiện B2.
15
3.Phát thông điệp.
IV.Kết luận:
Các dấu được cung cấp bởi đồng hồ logic cho phép đánh dấu các sự kiện
và không xác định một trật tự tổng quan chặt chẽ. Nhưng tại đây ta
không có quan hệ nào giữa các sự kiện và các giá trị của dấu.

Trên một trạm cho trước, việc nhận thông điệp có đóng dấu không thể
cho nó biết được sự kiện nào đến trước hay đang ở trên đường. Như vậy,
ta còn phải nhận thông điệp từ các trạm khác còn lại.
16

×