Thread trong .NET hỗ trợ phương thức suspend và resume, tuy nhiên việc dùng
hai phương thức này vào xử lý trong thực tế có thể dẫn đến một số bất cập. Ta không
thể biết thread đang làm gì lúc nó dừng, nếu thread đang nắm một tài nguyên dùng
chung nào đó đột ngột bị dừng, nó có thể khiến các thread khác gặp exception hoặc tệ
hơn gây deadlock. Để dừng một thread cách tốt nhất là sử dụng biến dùng chung và
thay đổi giá trị biến ấy từ bên ngoài. Khi thread thực hiện công việc nó sẽ định kỳ
kiểm tra biến này và dừng khi đến đúng điểm định trước và gặp đúng giá trị thích hợp.
Một trong những cách dừng cơ bản nhất là dùng một biến làm cờ và bên trong
đoạn code mà thread thực thi, ta đặt tại vị trí thích hợp một vòng lặp, có tác dụng như
một bẫy:
while(pauseFlag== true) ;
45 trang |
Chia sẻ: lylyngoc | Lượt xem: 2447 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Công nghệ thông tin với sự tự do, sáng tạo và chia sẻ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
iệp phần mềm có mức độ vận động sáng tạo và
chuyển hóa nhanh đến nỗi những nền tảng pháp lý về sở hữu trí tuệ vốn trước nay
được xem là để bảo vệ quyền lợi của nhà phát minh sáng chế lại trở thành rào cản cho
sự tự do sáng tạo. Phần này sẽ điểm qua lịch sử của ngành công nghệ phần mềm và
các xu hướng phát triển phần mềm hiện tại, các tranh cãi vẫn đang tiếp diễn liên quan
đến sở hữu trí tuệ đối với phần mềm. Từ đó chúng ta có thể nhìn thấy một bức tranh
muôn màu về việc áp dụng các nguyên lý sáng tạo vào ngành công nghiệp phần mềm
cũng như làm sao thúc đẩy sự sáng tạo trong công nghệ thông tin.
GVHD: Hoàng Văn Kiếm Trang 13/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Mục cuối cùng của phần này sẽ mô tả lại quá trình xây dựng một phần mềm sơ
khai, chỉ tận dụng các nguyên tắc sáng tạo mà không theo một lối mòn cho trước nào.
I. Sự giải phóng của ngành phần mềm và bùng nổ sáng tạo trong
công nghệ thông tin
Từ thời kỳ của những cỗ máy tính siêu lớn những năm 50, đến giai đoạn bùng
nổ máy tính cá nhân, và cho đến thời kỳ chớm nở của điện toán đám mây và máy tính
bảng. Mục này điểm qua sơ lược lịch sử ngành công nghệ phần mềm với những sáng
tạo và phát kiến đã ghi dấu vào lịch sử.
a. Giai đoạn 1: Phần mềm là gắn liền với phần cứng
Thập niên 60 của thế kỷ XX đánh dấu một bước thay đổi to lớn đối với ngành
công nghiệp phần mềm. Trước thập niên 60 không ai nghĩ đến một ngành công nghiệp
phần mềm, người ta xem phần mềm như là một phần gắn liền với phần cứng máy
tính. Những cổ máy tính khổng lồ to bằng cả toà nhà được lập trình trước một số chức
năng nhất định và thường được cho thuể sử dụng theo giờ. Do thời gian làm việc với
máy hạn chế, rất ít kỹ sư có khả năng cũng như điều kiện nghiên cứu phát triển phần
mềm trên máy, nhà sản xuất chỉ sản xuất những phần mềm cần thiết để máy hoạt động
và không thu phí phần mềm cũng như không đầu tư phát triển phần mềm cho máy
tính.
Tuy nhiên sự thay đổi đột phá đầu tiên đến từ một tên tuổi không mấy xa lạ:
công ty IBM. Năm 1964, như một ví dụ điển hình cho “nguyên tắc linh động” trong
40 nguyên tắc sáng tạo khoa học/kỹ thuật, IBM công bố sản phẩm System/360. Thay
vì các sản phẩm máy tính trước đây chỉ được thiết kế tối ưu cho một số công việc nhất
định, IBM tung ra một họ các máy tính với một thiết kế tương tự nhau, sử dụng chung
phần mềm nhưng có nhiều kích thước và tốc độ xử lý tính toán khác nhau.
Các công ty vừa và nhỏ có thể dễ dàng trang bị một máy tính cỡ nhỏ của hệ
thống System/360 cùng các phần mềm cần thiết và khi công ty phát triển họ có thể
chuyển sang sử dụng một máy tính lớn hơn mà vẫn đảm bảo tương thích. Sự linh
động này đánh dấu một bước đột phá trong ngành công nghiệp máy tính. Giờ đây máy
tính từ những cổ máy khổng lồ chỉ có thể cho thuê chứ ít ai mua nổi nay đã trở nên dễ
dàng tiếp cận hơn. Sự thành công mày System/360 mang lại cho IBM lớn đến nỗi
GVHD: Hoàng Văn Kiếm Trang 14/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
chính hãng đã thừa nhận đây là sản phẩm quan trọng nhất trong lịch sử công ty từ
trước đến nay[9]. Đồng thời, System/360 cũng mở ra một kỷ nguyên mới cho ngành
công nghiệp phần mềm khi giờ đây phần mềm có thể chạy trên nhiều máy tính khác
nhau.
Không chỉ sáng tạo đôt phá về mặt kỹ thuật, năm 1969, IBM tiếp tục đề xuất
một đột phá mới trong mô hình kinh doanh áp dụng “nguyên tắc phân nhỏ” khi chia
sản phẩm máy tính thành 3 phần riêng biệt bao gồm: Phần cứng, phần mềm và dịch
vụ. Theo đó IBM sẽ tính phí riêng cho việc cung cấp phần cứng, phát triển phần mềm
theo yêu cầu, tổ chức các khóa đào tạo sử dụng máy tính, dịch vụ hỗ trợ khách hàng
khi có sự cố, v.v... Mô hình kinh doanh đột phá này chính thức khai sinh ngành công
nghiệp phần mềm và dịch vụ, mở đường cho sự bùng nổ sáng tạo không ngừng của
công nghệ thông tin.
b. Giai đoạn 2: Định hình nền công nghiệp với sự trỗi dậy của máy tính cá
nhân
Khi mới khai sinh ngành công nghiệp phần mềm phát triển khá chậm chạp. Các
hệ thống phần cứng máy tính bấy giờ vẫn còn có giá khá cao và phần mềm chỉ tương
thích với một số phần cứng nhất định. Điều này dẫn đến việc thị trường phần mềm
khá manh múng với lượng khách hàng tương đối ít và vẫn còn lệ thuộc khá nhiều vào
phần cứng. Các công ty lớn vẫn xem phần mềm là một loại hình dịch vụ giá trị gia
tăng cho phần cứng và chưa đầu tư đúng mức cho lĩnh vực này.
Giai đoạn đầu của thập niên 70 cũng đánh dấu sự ra đời của hai nhân tố quan
trọng là mạng Internet và đĩa mềm (floppy disk). Hai công cụ này cho phép phần mềm
được chia sẻ và trao đổi cực kỳ dễ dàng giữa những người dùng máy tính tạo ra một
kênh phân phối phần mềm độc lập không cần thông qua các công ty sản xuất phần
cứng. Và đặc biệt hơn internet cho phép trao đổi giữa những người đam mê máy tính
(hobbyist) - những lập trình viên, những kỹ sư phần mềm tương lai. Họ có thể tự mình
phát triển phần mềm, chia sẻ phần mềm đó với cộng đồng người dùng trên internet và
nhận được các phản hồi góp ý để cùng nhau tiến bộ.
Đây chính là hạt giống ban đầu cho phong trào mã nguồn mở và các công ty
sản xuất phần cứng hết sức vui vẻ chào đón các cộng đồng những người đam mê máy
tính này. Trước hết vì họ là những khách hàng tiềm năng và luôn sẵn sàng đó nhận sản
phẩm mới, hơn nữa sự phong phú về phần mềm do những lập trình viên ban sơ này
GVHD: Hoàng Văn Kiếm Trang 15/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
viết ra sẽ thúc đẩy doanh số phần cứng.
Tuy nhiên môi trường phát triển và chia sẻ phần mềm dựa theo đam mê này lại
gây ảnh hưởng đến doanh thu của những công ty chỉ chuyên phát triển phần mềm.
Công ty Microsoft thành lập năm 1975 với sản phẩm đầu tay là phần mềm Altair
BASIC cho máy MITS. Tuy nhiên trong khi máy MITS được bán ra hành nghìn chiếc
mỗi tháng thì trong suốt cả năm ròng phần mềm Altair BASIC chỉ bán được vài trăm
phiên bản. Tháng 2 năm 1976, Bill Gate, viết một bức thư ngỏ cho tất cả người đam
mê máy tính (Open letter to Hobbyist) được xuất bản trên nhiều tạp chí. Trong đó ông
than phiền về việc có quá ít người dùng Altair BASIC thật sự trả tiền mua phần mềm
này. Cho rằng việc sao chép phần mềm sẽ làm nản lòng những nhà lập trình viên
muốn tham gia ngành công nghiệp phần mềm vừa chớm nở, ông lên án hành vi sao
chép phần mềm là bất công và trộm cắp.
Bức thư của Bill Gate nhận được nhiều sự phản ứng dữ dội nhưng cũng có
nhiều người tán đồng quan điểm của Bill Gate. Trong những phát biểu và hướng đi
tiếp theo của mình, ông đã áp dụng triệt để “nguyên tắc chuyển sang chiều khác”,
thay vì xem phần mềm là một sản phẩm phụ trợ được bán theo phần cứng, ông xem
phần mềm là một tác phẩm của lao động sáng tạo, được bảo hộ bởi quyền tác giả và
tác giả phần mềm có quyền thu hoa hồng trên mỗi phiên bản copy phần mềm được
phát hành.
Cách tiếp cận này nhanh chóng thu hút được sự chú ý của nhiều công ty phần
mềm khác và xu hướng phần mềm mã nguồn đóng dần được hình thành. Theo đó
phần mềm sẽ được phân phối dưới dạng mã nhị phân, độc lập với phần cứng và người
dùng sẽ mua một license trong đó thường quy định rõ họ không được phép xem lén
mã nguồn, không được phân phát phần mềm cho người khác và chỉ được dùng trên
một số lượng máy tính nhất định.
Phương thức kinh doanh phần mềm này nhận được một sự thúc đẩy vượt bậc
hơn nữa khi máy tính cá nhân của IBM ra đời. Một dòng máy tính đủ rẻ để cá nhân và
gia đình có thể mua được mở ra một thì trường vô cùng to lớn cho các nhà phát triển
phần mềm. Microsoft nhanh chóng nhảy vào thị trường cung cấp phần mềm cho máy
tính cá nhân với hệ điều hành DOS và nhanh chóng xác lập được vị trí thống trị của
mình trong ngành công nghiệp phần mềm còn non trẻ này.
GVHD: Hoàng Văn Kiếm Trang 16/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
c. Sự trỗi dậy của phần mềm mã nguồn mở và câu chuyện Tái ông thất mã
Cuối thập niên 70, thị trường phần mềm chuyển hướng sang mô hình kinh
doanh mã nguồn đóng do Bill Gate khởi sướng tuy mang lại một luồng sinh khí mới
cho công nghệ thông tin nhưng cũng để lại một số mặt trái:
Những người đam mê tin học, những nhà tiên phong trong lĩnh vực công nghệ
phần mềm cảm thấy họ bị đặt vào một tình thế bị phản bội. Họ đã góp phần thúc đẩy
sự phát triển của ngành công nghiệp máy tính nhưng bây giờ họ bị cấm không được
xem mã nguồn phần mềm. Những phần mềm trước đây họ phát tham gia phát triển bị
các công ty lớn đem về chỉnh sửa cho hoàn thiện và bán với giá không thể mua được.
Thậm chí một số công ty đăng ký bảo hộ phần mềm bằng hình thức “bằng sáng chế”
patent có thể yêu cầu cấm việc phát triển và sử dụng những phần mềm cùng tính năng.
Bức bối trước tình trạng lợi dụng luật sở hữu trí tuệ để bóp chẹt sáng tạo hòng
độc quyền kinh doanh, Richard Stallman - cha đẻ của tổ chức Phần mềm tự do đã
tương kế tựu kế - sử dụng nguyên tắc “Biến hại thành lợi”, dùng chính luật sở hữu trí
tuệ để xây dựng một hành lang pháp lý cho trào lưu phần mềm nguồn mở. Giấy phép
công cộng phổ quát (General Public License – GPL) ra đời với phương châm của
phần mềm tự do. Theo đó bất kỳ người nào có một bảng copy của phần mềm cũng sẽ
sở hữu ngay quyền được tự do sửa đổi, sao chép, phân phối lai phần mềm đó với duy
nhất một điều kiện: Mọi sản phẩm được phát triển tiếp theo dựa trên phần mềm đó
cũng sẽ phải mang giấp phép GPL.
Hành lang pháp lý vững chắc của GPL cho phép hoạt động chia sẻ phần mềm
từ một hành vi bị lên án nhầm là trộm cắp nay trở thành một hoạt động tự do dưới sự
bảo vệ của luật pháp. Dưới sự bảo trợ này Stallman và tổ chức phần mềm tự do bắt
tay vào việc xây dựng một loạt phần mềm tự do mang giấy phép GPL để thay thế cho
các phần mềm thương mại hiện có đang chuyển dần sang mã nguồn đóng, từ hoạt
động này mà hệ điều hành linux ra đời và dần dần phát triển thành một sản phẩm duy
nhất khả dĩ cạnh tranh được với Microsoft windows về thị phần hệ điều hành cho máy
tính cá nhân.
Phong trào phần mềm tự do hay mã nguồn mở tiếp tục phát triển lên một tầm
mức mới với sự kiện có liên quan đến sự ra đời của world wide web. Đầu thập niên
90, Microsoft phát hành trình duyệt Internet Explorer để cạnh tranh với trình duyệt
Netscape Navigator của công ty Netscape Communication. Tuy là một trong những
GVHD: Hoàng Văn Kiếm Trang 17/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
công ty tiên phong với sự ra đời của world wide web và chiếm đến 95% thị phần trình
duyệt web, Netscape nhanh chóng bị Microsoft đẩy lùi bằng con át chủ bài: Windows.
Sau khi Microsoft quyết định phát hành miễn phí Internet Explorer như một phần
Windows vào năm 1995, thị phần của Internet Explorer nhanh chóng tăng lên 50% và
dần dần đẩy Netscape Navigator vào chỗ nguy khốn. Đến năm 1997 sau khi Microsoft
tăng cường việc tích hợp một số chuẩn lạ vào Internet Explorer khiến cho các trang
web duyệt tốt trên Internet Explorer có thể không chạy được trên trình duyệt
Netscape, 90% thị trường trình duyệt web đã rơi vào tay Internet Explorer,.
Trước tình thế đó, công ty Netscape communication đã có một quyết định cực
kỳ táo bạo: “Phát hành mã nguồn Netscpae Navigator dưới giấy phép mã nguồn mở”.
Quyết định này về sau được giải thích nhằm tránh thế độc quyền về trình duyệt web
của Microsoft, một khi Microsoft nắm độc quyền trình duyệt web, họ sẽ có khả năng
thao túng quá trình phát triển của giao thức HTTP và chuẩn world wide web, từ đó
làm bàn đạp xâm chiếm thị trường máy chủ web và độc quyền gần như toàn bộ
internet.
Việc mã nguồn mở Netscape Navigator cho phép các chuyên gia về tin học có
thể tiếp tục tham gia phát triển trình duyệt này dưới sự bảo trợ của giấy phép GPL và
không bị Microsoft lợi dụng. Sự kiện này mở ra một hướng đi mới cho mã nguồn mở,
từ chỗ là kẻ thù của doanh nghiệp thì nay mã nguồn mở trở thành một lợi thế trong
kinh doanh. Thay vì thu phí phần mềm thật cao doanh nghiệp sẽ tận dụng sự trợ giúp
của các cộng đồng người sử dụng có đam mê và kinh nghiệm để phát triển phần mềm.
Phần mềm đó được mã nguồn mở để tránh sự lợi dụng đánh cắp mã nguồn từ đối thủ.
Với việc giảm được gánh nặng trong phát triển phần mềm, công ty có thể tập trung
vào thu lợi từ cách dịch vụ kèm theo.
II. Áp dụng các nguyên tắc sáng tạo trong xây dựng phần mềm
a. Nhu cầu thực tế.
Chia sẻ dữ liệu giữa các máy là một nhu cầu khá phổ biến trong thực tế làm
việc với máy tính. Nếu như trong môi trường mạng cục bộ (LAN) việc chia sẻ dữ liệu
diễn ra khá dễ dàng, thì trong môi trường internet, mọi việc lại không được suôn sẻ
như thế. Về cơ bản, việc chia sẻ file giữa các máy đang kết nối chung trong một mạng
là không khó. Tuy nhiên, do đặt cao tính bảo mật nên khả năng chia sẻ file tích hợp
GVHD: Hoàng Văn Kiếm Trang 18/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
trong hệ thống thường bị chặn trong mội trường internet. Để chia sẻ file người dùng
thường có một số lựa chọn:
1. Chép file vào thiết bị lưu trữ ngoài rồi chạy đến chỗ máy cần nhận file.
Dễ thấy phương án này không khả thi nếu hai máy cách nhau quá xa về địa lý...
2. Biến máy mình thành một server chia sẻ file trên máy (vd FTP server)
Phương án này đòi hỏi nhiều kiến thức chuyên môn về công nghệ thông tin.
3. Sử dụng tính năng send file có sẵn trong các chương trình chat (instant
message). Phương án này phải lệ thuộc vào nhà cung cấp dịch vụ tin nhắn tức
thời, khi dịch vụ có sự cố, tính năng send file cũng tiêu tùng theo.
4. Upload file cần chia sẻ lên một server chuyên lưu trữ file. Phương án
này tốn thời gian do đòi hỏi file phải được tải lên hoàn chỉnh trước khi người
nhận có thể tải về
5. Sử dụng chương trình chia sẻ file qua mạng ngang hàng. Đây là phương
án rất khả thi, tuy nhiên các trình chia sẻ file qua mạng ngang hàng hiện nay
tương đối khó sử dụng với người dùng cuối.
b. Phân tích các giải pháp đã có và tìm ra vấn đề:
Với nhu cầu không ngừng gia tăng mỗi ngày của con người thì các phương án
đã nêu ở mục trước không trán khỏi những hạn chế nhất định. Áp dụng các phương
pháp phát hiện vấn đề đã được học, ta có thể thấy còn rất nhiều vướng mắc cần giải
quyết.
Áp dụng nguyên tắc thứ 4, từ thực tiễn quan sát và sử dụng các phương án đã
nêu nhiều năm nay, ta nhận thấy còn một số vướng mắc:
1. Có nhiều phương án bị lệ thuộc vào một nhà cung cấp dịch vụ thứ 3. Khi
tập tin được tải lên một dịch vụ chia sẻ file hay truyền qua một ứng dụng
chat nào đó thì cả bên truyền và bên nhận đều phải tiếp cận được dịch vụ
này. Bất kỳ sự cố nào khi kết nối với nhà cung cấp dịch vụ cũng khiến
việc truyền tải tập tin không thực hiện được, mặc dù người gửi và nhận
vẫn có thể kết nối trực tiếp với nhau.
2. Có nhiều phương án quá chuyên sâu về kỹ thuật. Việc thiết lập một
mạng ngang hàng hoặc một máy chủ là một mảng khá chuyên biệt trong
GVHD: Hoàng Văn Kiếm Trang 19/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
công nghệ thông tin. Và các công cụ để thực hiện việc này không được
thiết kế dành cho người dùng ít kinh nghiệm.
Áp dụng nguyên tắc thứ 5, lắng nghe những phàn nàn từ người dùng chúng ta
có thể thấy còn những điểm sau:
1. Nhiều phương án không chú trọng tính năng tạm dừng truyền tải file và
tiếp tục truyền tải khi thuận tiện. A truyền cho B một file khá lớn, giữa
chừng A có việc phải đi không thể tiếp tục truyền file, khi A quay lại việc
truyền file phải bắt đầu lại từ đầu. Hoặc A và B đang truyền file thì mạng
có sự cố, khi sự cố được khắc phục việc truyền file phải bắt đầu lại từ
đầu. Người dùng rất khó chịu khi truyền những file lớn bằng các phương
án bất ổn như vậy.
2. Nhiều phương án không chú trọng đến việc kiểm tra file đã truyền đi có
nguyên vẹn hay không: A send cho B một file video khá lớn, B mở ra
xem và thấy có vẻ bình thường. Tuy nhiên, khi xem đến gần cuối video
thì phát hiện file bị lỗi và video không hiển thị được phần cuối. Lúc này
A đã đi đâu đó và không thể truyền lại tập tin. Mặc dù kết nối internet
ngày nay dùng giao thức TCP/IP có khả năng kiểm tra lỗi. Tuy nhiên,
với những sự cố phát sinh không phải trong lúc truyền mà trong lúc lưu
dữ liệu trên máy hay lúc ngắt rồi tiếp tục quá trình truyền thì giao thức
TCP/IP không can thiệp được.
3. Có thể phương án kiểm tra được file truyền đi có lỗi hay không nhưng
không có cách sửa lỗi: A truyền cho B một file nén, các chuẩn nén file
hiện nay có tích hợp chức năng kiểm tra tính toàn vẹn, nếu file bị lỗi sẽ
không giải nén được. Tuy nhiên dù file chỉ bị lỗi nhỏ nhưng B không có
cách nào khác ngoài việc báo A truyền lại toàn bộ file.
c. Xác định lại vấn đề.
Để giải quyết các vướng mắc trên, em quyết định cố gắng tạo ra một chương
trình nhỏ gọn, có khả năng send file qua mạng, nhưng hội tụ đầy đủ tính năng cần
thiết. Các yêu cầu mà em đặt ra cho chương trình của mình là:
1. Gọn nhẹ, đơn giản, dễ sử dụng. Chương trình sẽ có dung lượng cỡ 1
MB, để thuận lợi trong việc chia sẻ vì trước khi chia sẻ file, người dùng phải
GVHD: Hoàng Văn Kiếm Trang 20/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
chia sẻ chính bản thân của chương trình.
2. Có thể send một file cho nhiều người, những người đang nhận file có thể
cùng send cho nhau. Ý tưởng từ giao thức truyền dữ liệu bittorrent, tính năng
này giúp quá trình chia sẽ dữ liệu sẽ nhanh chóng hơn. Đặc biệt là khi có nhiều
người cùng tham gia quá.
3. Có khả năng resume sau khi bị gián đoạn. Tính năng cơ bản nhưng hầu
hết nhung chương trình send file thông dụnng thường “quên” đưa vào. Nhờ
tính năgn này, công việc chia sẽ trở nên thuận tiện và ngươi dùng có thể chủ
động hơn về thời gian, nhất là với file có kích thước lớn
4. Có khả năng kiểm tra tính toàn vẹn của file sau khi send, những phần
send sai sẽ bị phát hiện và send lại, không nhất thiết phải send lại toàn bộ file.
5. Hỗ trợ file với kích thước không giới hạn. Chỉ cần .Net framework có thể
open file đó chương trình có thể send được, không có giới hạn về dung lượng.
GVHD: Hoàng Văn Kiếm Trang 21/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
III. Sáng tạo, phát triển từ những công cụ đã có:
Không ai có thể sáng tạo tất cả mọi thứ bắt nguồn từ con số 0 nên việc khắc
phục các hạn chế nêu trên cũng phải bắt nguồn từ những phương án, giải pháp, công
nghệ, công cụ đã có sẵn.
Ở đây phương án được chọn để cải tiến là giao thức chia sẻ file qua mạng
ngang hàng bittorrent. Nền tảng công nghệ được sử dụng là Windows và Microsoft
.NET Framework.
a. Giao thức bittorrent.
Bittorrent là một giao thức được dùng để chia sẻ file trên mạng ngang hàng
(peer-to-peer), được dùng để chuyển những file và dữ liệu lớn và rất lớn. Được thiết
kế và cài đặt bởi Bram Cohen, phiên bản đầu tiên của bittorrent ra mắt vào ngày
2/7/2001 [1], hiện Bitttorrent là một trong những phương thức chia sẻ file phổ biến
nhất thế giới. Năm 2002, bittorrent chiếm 35% tổng dung lượng truyền tải trên
internet[2].
Torrent hoạt động bằng cách chia file thành nhiều “piece” kích thước mỗi piece
dao động từ 256KiB đến 4MiB. Mỗi piece này được đánh số bắt đầu từ 0, SHA-1
Hash của mỗi piece cũng được tính và lưu vào một file siêu dữ liệu với phần đuôi
thường là .torrent. Trước khi chia sẻ được dữ liệu thật, người dùng phải tìm cách chia
sẻ file siêu dữ liệu này với nhau. Để máy của người dùng (peers) có thể kết nối với
nhau, torrent sử dụng một server làm trung gian (tracker), server này không tham gia
truyền dữ liệu mà chỉ lưu trữ thông tin về IP và port của những peers đang chia sẻ
cùng file torrent đó và gửi thông tin này đến cho các peers.
Trong giao thức bittorrent có 8 thông điệp (message) khác nhau, mỗi thông
điệp mang một ý nghĩa riêng và không nhất thiết phải đi đồng bộ với nhau. Khi nhận
thông điệp, clients có thể trả lời hoặc không, và nếu trả lời cũng không nhất thiết phải
theo một quy ước nào. Việc sử dụng 8 thông điệp đó như thế nào là tùy vào clients.
Cơ chế thoáng, không gò bó này cho phép mở ra nhiều kỹ thuật nhằm tận dụng hiệu
quả giao thức bittorrent. Trong 8 thông điệp đó có 4 thông điệp chính phục vụ cho
việc truyền dữ liệu:
GVHD: Hoàng Văn Kiếm Trang 22/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Thông điệp Tham số Ý nghĩa
4 – Have Integer Peers vừa download hoàn chỉnh một piece
5 – Bitfield Một dãy bit
chiều dài tương
ứng số pieces
Được send một lần ngay khi 2 peers vừa kết
nối. Cho biết peers đang có những pieces nào.
6 – Request 3 số nguyên Yêu cầu dữ liệu từ peers. 3 số nguyên bao
gồm:Số_thứ_tự_peice, Vị_trí_Byte_bắt_đầu,
Kích_thước_dữ_liệu.
7 – Piece 2 số nguyên + 1
dãy bytes
Thông điệp này chứa dữ liệu gửi. Tham số
gồm: Số_thứ_tự_peice, Vị_trí_Byte_bắt_đầu,
Dữ_liệu
Được thiết kế dành riêng cho việc chia sẻ file giữa các máy trạm, có thể nói
giao thức bittorrent cung cấp nền tảng cho mọi nhu cầu chía sẻ file. Tuy nhiên, các
chương trình sử dụng giao thức bittorrent vẫn còn chịu một số hạn chế đã được nêu.
Áp dung nguyên tắc phân nhỏ và tách khỏi ta sẽ lọc ra những phẩm chất cần thiết của
giao thức bittorrent đồng thời loại bỏ những phẩm chất tiêu cực như:
- Không để người dùng phải tự quản lý các file siêu dữ liệu. Thực tế cho
thấy, khúc mắc của những người mới dùng torrent hầu hết là không hiểu được
khái niệm và vai trò của file siêu dữ liệu .torrent. Với chương trình của em việc
tạo ra file siêu dữ liệu, lưu trữ và send file này giữa các clients là hoàn toàn tự
động. Đảm bảo tính thân thiện và dễ sử dụng với người dùng.
- Không có tracker. Do chỉ nhằm đáp ứng nhu cầu send file giữa một
nhóm người có quen biết trước và số lượng người không đông lắm nên chương
trình hoạt động không cần một server lưu thông tin về IP và port, người dùng sẽ
tự nhập thông tin này. Chương trình sẽ có chức năng tự động tìm IP đễ hỗ trợ
người dùng.
- Các thông điệp giờ đây là đồng bộ, không đặt nặng vấn đề “bánh ít đi
bánh quy lại” (tick-tack-toe). Trong giao thức torrent có 4 thông điệp để quản
lý peers, torrent clients thường chỉ ưu tiên send dữ liệu cho peers nào có dữ liệu
để trao đổi với nó. Các peers mới tham gia chia sẻ file, không có tí dữ liệu nào
sẽ bị chặn (choke) và được send dữ liệu một cách rất hạn chế.
GVHD: Hoàng Văn Kiếm Trang 23/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Do chương trình của em phục vụ việc chia sẻ file giữa bạn bè với nhau nên mọi
đối tượng tham gia chia sẻ file đều bình đẳng, khi nhận được thông điệp
chương trình sẽ trả lời ngay.
b. SHA-1 Hash và file checksum
Giải thuật băm (hash) là thuật toán mã hóa, chuyển đổi một khối dữ liệu cho
trước thành một đoạn dữ liệu có kích thước cố định gọi là hash value, sao cho với mỗi
khối dữ liệu chỉ có thể có một hash value duy nhất. Một thuật toán hash được gọi là có
khả năng “chống trùng lặp” (collision resistance)[5] nếu không thể tìm được hai khối
dữ liệu khác nhau lại có hash value giống nhau, và khi khối dữ liệu này thay đổi thì
hash value cũng sẽ thay đổi. Thực tế rất khó có giải thuật nào đảm bảo 100% khả
năng chống trùng lặp, tuy nhiên ta vẫn có thể chấp nhận giải thuật có trùng lặp của nó
là thấp. Các giải thuật hash chống trùng lặp được ứng dụng phổ biến vào các chiến
thuật checksum, trong đó SHA-1 và MD5 là hai giải thuật hash được biết đến hơn cả.
MD5(Message-Digest algorithm 5) được thiết kế bởi Ron Rivest [4] vào năm
1991 để thay thế giải thuật hash MD4, MD5 được ứng dụng vào các phần mềm đảm
bảo độ tin cậy khi chuyển file .
Năm 1993, Den Boer và Bosselaers đã đưa ra lời cảnh báo về lỗ hổng của giải
thuật MD5. Năm 1996, Dobbertin đã tuyên bố về lỗi của MD5 và khuyên mọi người
thay thế MD5 bằng SHA-1 hay RIPED-160. Kích thước của hash(128 bit) là khá nhỏ
đủ cho các sự tấn công. Tháng 3 năm 2004 một dự án mang tên MD5CRK với mục
đích chứng minh MD5 trên thực tế không an toàn bằng việc tìm các lỗi bởi các sự tấn
công. Ngày 17 tháng 4 năm 2004, MD5CRK đã được kết thúc, khi mà Xiaoyun Wang,
Dengguo Feng, Xuejia Lai, và Hongbo Yu tuyên bố đã tìm được lỗi của MD5. Hiện
nay MD5 đã không còn được công nhận là chống trùng lặp, nhưng khả năng của nó
vẫn còn đủ để dùng trong việc checksum file và một số ứng dụng cần bảo mật thấp.
SHA (Secure Hash Algorithm) được phát triển bởi NSA (National Security
Agency) và được xuất bản thành chuẩn của chính phủ Mỹ bởi viện công nghệ và
chuẩn quốc gia Mỹ (National Institute of Standards and Technology hay NIST). SHA
được chấp nhận bởi FIPS nhờ khả năng chống trùng lặp tốt. SHA có 5 thuật toán khác
nhau: SHA-1, SHA-224, SHA-256, SHA-384, SHA-512. Trong đó, SHA-1 được sử
dụng rộng rãi trong nhiều ứng dụng và giao thức khác nhau, SHA-1 sẽ cho ra đoạn mã
hóa (hash value) có độ dài 160 bit từ một dữ liệu có kích thước tối đa là (2^64 – 1) bit.
GVHD: Hoàng Văn Kiếm Trang 24/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
SHA-1 được dùng trong việc checksum dữ liệu, bên gửi khi chuyển dữ liệu cho
bên nhận sẽ chuyển kèm hash value của khối dữ liệu, khi đã hoàn tất việc truyền dữ
liệu bên nhận sẽ đối chiếu (checksum) hash value nhận được với hash value của dữ
liệu vừa nhận, nếu giống nhau thì chứng tỏ dữ liệu đã được truyền chính xác. SHA-1
dựa trên cơ sở MD4 và MD5 của Ron Rivest, nhưng thiết kế phức tạp hơn.
Lưu đồ SHA-1:
Trước khi bắt đầu tính hash, giá trị hash value ban đầu phải được khởi
tạo (số ghi ở dạng thập lục phân)
A= 67452301
B= efcdab80
C= 98badcfe
D= 10325476
E = c3d2e1f0.
5 giá trị hash value A, B, C, D, E này cuối cùng sẽ được ghép với nhau thành
giá trị hash cho dữ liệu. Tuy nhiên, trước đó, dữ liệu sẽ được chia thành những khối
512 bit và được xử lý qua hai bước như hai hình bên dưới hình dưới:fffffff
Bước 1: Mỗi khố 512 bit (bao gồm 16 từ, mỗi từ 32bit) sẽ được mở rộng thành 80 từ.
GVHD: Hoàng Văn Kiếm Trang 25/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Bước 2: 80 từ đó sẽ XOR và dịch với các hash value A, B, C, D, E. Đây là quy trình
tính toán chính của SHA-1 (SHA-1 Compress Function)
c. Giao diện người dùng
Trong giao diện người dùng của một số chương trình truyền file, giao diện trình
GVHD: Hoàng Văn Kiếm Trang 26/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
bài chủ yếu là dạng bảng. Trong đó mỗi file đang được truyền chiếm một dòng, mỗi
cột biểudiễn một thông tin trong quá trình truyền (tên file, dung lượng, tốc độ, thời
gian, mức độ hoàn thành, v.v....). Cách bố trí giao diện này được hỗ trợ trong hầu hết
các công cụ lập trình nhờ ưu thế đơn giản, dễ thiết kế, cho người dùng tầm nhìn bao
quát trên toàn bộ các file đang được truyền tải.
Tuy nhiên giao diện như vậy có nhược điểm chết người là khi ta điều chỉnh độ
rộng một cột nào đó thì tất cả các hàng đều bị ảnh thưởng theo, hơn nữa bảng quá
rộng sẽ khiến người dùng khó quan sát. Để khắc phục nhược điểm này ta sẽ áp dụng
nguyên tắc tổ hợp. Ta gom nhiều thông tin liên quan đến một quá trình truyền tải vào
cùng một mục và xếp chúng lên 2 hàng thay vì 1 như thường thấy.
Ví dụ về giao diện truyền file với mỗi file được đặt trên 2 hàng.
.Net cho phép tạo một control hòan tòan mới, kết thừa từ control cũ hoặc tạo
một control trống rỗng, kế thừa từ class UserControl. Trong tình huống này, em cần
một control với giao diện tương tự như danh sách download của các phần mềm
firefox[3] và transmission[4].
Ý tưởng ban đầu là tạo một control thừa kế từ control ListView của .NET. Tuy
nhiên control này có cấu trúc phức tạp và có nhiều tính năng không cần thiết, hơn nữa
yêu cầu lớn nhất đặt ra là mỗi items phải có một thanh progressbar và hiển thị trên
nhiều hành thì ListView lại thiếu.
Cuối cùng em chọn giải pháp tạo một đối tượng mới hoàn toàn, bao gồm 2
control là ListItems và TheList
ListItems bao gồm 1 picture box để, thể hiện icon; 3 label lần lượt cho Tên đối
tượng, khối lượng dữ liệu đã gửi/nhận và tốc độ truyền dữ; 1 thanh progressbar. Trong
GVHD: Hoàng Văn Kiếm Trang 27/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
các thông số thể hiện của items không thể truy cập vào mà chỉ được thay đổi
bằng hàm update.
Control TheList bao gồm một danh sách các ListItems ( List) và
một thanh scroll bar. TheList có nhiệm vụ chứa các ListItems và hiển thị các ListItems
này sao cho các items có màu xen kẽ nhau. Trước khi thực hiện một thay đổi nào đối
với items người dùng phải báo hiệu cho TheList bằng cách gọi hàm StartUpdate(), sau
khi hoàn tất thay đổi phải gọi hàm EndUpdate() để List vẽ lại các items. Trong khoảng
thời gian từ lúc gọi StarUpdate đến lúc gọi EndUpdate, Control List sẽ không được vẽ
lại tránh việc phải cập nhật danh sách các đối tượng (ListItems) trong khi chúng đang
bị người dùng thay đổi.
GVHD: Hoàng Văn Kiếm Trang 28/45
Giao diện chính.i i í .
Bộ thư
viện lõi
t
i l i
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
IV. Chi tiết thiết kế, mô tả hoạt động.
a. Kết cấu chương trình.
Khi người dùng sử dụng chương trình để chia sẻ file, họ được biết đến như một
user. Mỗi user được đặc trưng bằng 3 thông số: Alias – bí danh người dùng chọn để
miêu tả mình, IP – địa chỉ IP của máy người dùng, Port – port mà từ đó máy khác có
thể connect vào máy người dùng.
Chương trình quản lý các tác vụ chia sẻ file như là một task. Mỗi task có thể
bao gồm nhiều file một danh sách các user cùng tham gia chia sẻ file các file đó (User
có thể chọn chỉ tham gia chia sẻ một phần trong số các file của task)
Chương trình có thể được chia làm hai thành phần chính, kết nối chặt chẽ với
nhau:
Phần lõi đảm nhận các công việc xử lý nền, phía sau giao diện chính. Cung cấp
các công cụ để quản lý các task, tính toán thông tin cùng những thông tin cần thiết.
Quản lý các kết nối đế từ máy khác, từ đó điều phối việc send file. Lưu lại dữ liệu đã
nhận cùng với các thông tin mô tả cần thiết để phục hồi quá trình send file khi gặp sự
cố.
GVHD: Hoàng Văn Kiếm Trang 29/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Giao diện chính: Gồm các form và controls cần thiết để làm nhiệm vụ giao tiếp với
người dùng, nhận lệnh và hiển thị thông tin.
V. Giao diện chính.
Sơ đồ các form trong giao diện.
Theo như sơ đồ kết cấu bên trên thì ta thấy được giao diện gồm nhiều form
nhỏ. Trong đó form Main là cửa sổ làm việc chính, từ đó người dùng điều khiể và
tương tác với chương trình, các form khác sẽ được gọi ra ứng với mỗi tình huống
tương ứng.
Main Form
GVHD: Hoàng Văn Kiếm Trang 30/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
• Thực hiện công việc tự động load các task trong thư mục TaskList, bao gồm
cả những cái đã thuc hiện xong và những task còn đang dở dang.
• Thiết lập cấu hình mặc định cho chương trình trong lần chạy đầu tiên, lưu
các tùy chọn cấu hình của người dùng.
• Tự động mở một kết nối lắng nghe trên port do người dùng chọn, sẵn sàng
thực hiện việc chia sẻ dữ liệu giữa các máy tính với nhau.
Chương trình có khả năng thu gọn xuống system tray
GVHD: Hoàng Văn Kiếm Trang 31/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Các button phía dưới thanh toolbar được dùng để lọc (filter) các task dựa theo trạng
thái của chúng.
Create Task form:
Form này cho phép người dùng tạo một task. Form sẽ gọi các hàm tương ứng
trong bộ thư viện lõi để tính hash và các thông số cần thiết khác của task. Quá trình
tính hash thường chiếm một thời gian tương đối lâu nên chương trình cung cấp khả
năng hủy bỏ quá trình hash (tính năng pause quá trình hash không được đưa vào do
mức độ cần thiết không cao và để đảm bảo giao diện ).
Form Peer Input:
GVHD: Hoàng Văn Kiếm Trang 32/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Được dùng nhưng một dialog box đặc biệt, dành riêng cho việc nhập các thông
số đặc trưng cho user.
Các textbox nhập IP và port đã được thiết kế kỹ để đảm bảo người dùng không
thể thông số không hợp lý (dù là cố ý hay vô tình).
Detail form
Từ form này người dùng có thể xem lại các thông tin liên quan đến task, danh
sách các file được chia sẻ và có thể điều chỉnh thêm hoặc bớt user trong danh sách.
Option form
Đây la nơi chứa các thiết lập của chuong trình, bên trong sẽ bao gồm các tính năng cơ
bản nhung sẽ ảnh hưởng đến toàn bộ các hoạt động của chương trình.
Request form
GVHD: Hoàng Văn Kiếm Trang 33/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Form này chỉ được mở lên khi chương trình nhân được tín hiệu bắt đầu chia sẻ
file từ user khác. Người dùng có thể chấp nhận chia sẻ hoặc không, và có quyền lựa
chọn file mình sẽ nhận.
a. Bộ thư viện lõi.
Công cụ tính Hash: .NET hỗ trợ sẵn các hàm cần thiết để tính Md5 và SHA-1
hash trong namespace System.Security.Cryptograph. Tuy nhiên, qua thực tế sử dụng
của em, các công cụ có sẵn này không phù hợp với việc tính Hash của một file, nhất là
các file có kích thước lớn.
Hơn nữa nếu dùng các hàm có sẵn này, không thể biết được quá trình tính hash
đã chạy tới đâu và ước lượng thời gian tính toán cần thiết. Vì thế em tự cài đặt các
công cụ để tính hash theo hai thuật toán MD5 và SHA-1 đã đề cập trong phần hai.
GVHD: Hoàng Văn Kiếm Trang 34/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Interface IHash bao gồm ba phương thức dữ liệu đầu vào được nạp vào
bằng hàm input. Hàm result được dùng để báo hiệu việc nhập dữ liệu kết thúc và
trả về kết quả tính toán sau cùng. Hai clash MD5 và SHA1 implement Interface này
và chứa các hàm cụ thể cho từng thuật toán.
Class Task, là đơn vị quản lý các tác vụ send file mà chương trình đang thực
hiện thông tin về task được lưu trong đĩa cứng, hiện tại định dạng file được sử dụng là
dạng chữ trơn, một file thông tin sẽ có dạng thức như sau:
17/06/2009 1:09:46 SA /* Thời điểm task được tạo ra */
01/01/0001 12:00:00 SA /* Thời điểm task hoành thành */
</
3 dòng lưu thông tin về giới hạn tốc độ, hiện chưa cài đặt
/>
1 /* Số lượng user tham gia task */
</Thông tin về user, mỗi user 3 dòng theo thứ tự: Alias
IP
Port />
1 /* Số lượng file trong task */
</ Thông tin về file, mỗi file gồm Đường dẫn
Kích thước
Số mảnh
Hash của từng mảnh />
/* Dòng cuối cùng: task hash */
GVHD: Hoàng Văn Kiếm Trang 35/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Các file thông tin này được lưu trong thư mục TaskList ở cùng thư mục với file
thực thi chương trình. Thời task hoàn thất được để mặc định là ngày 1/1/1 để báo hiệu
task chưa hoàn tất. Một task được tạo ngay trên máy (máy bắt đầu tiến hành chia sẻ)
sẽ không có ngày hoàn tất. Task Hash được tính bằng cách lấy SHA-1 hash của chính
phần hashcode của từng file.
Class transmission và class peer, mỗi instance class task sẽ chứa một instance
của class transmission, class này có nhiệm vụ quản lý hoạt động chia sẻ dữ liệu của
task. Class peers đại diện cho một user khác đang kết nối vào máy. Trong class
transmission sẽ có một list các peers hiện đang cùng chia sẻ dữ liệu. Một user nếu
tham gia chia sẻ nhiều task sẽ được đại diện bằng nhiều peer trong các class
transmission tương ứng.
Khi người dùng Start một task, class transmission sẽ tạo ra một thread riêng
biệt để chạy hàm private void download() hàm này lặp đến khi người dùng
download hoàn chỉnh hoặc người dùng ra lệnh stop.
Class peers có nhiệm vụ gửi message đến user và nhận các message từ user gửi
đến, một peers có thể có tối đa 4 kết nối, mỗi kết nối có 1 hàm ListenToPeer để nhận
các message được gửi đến từ kết nối này, hàm này được chạy trên một thread riêng,
khi cả 4 kết nối cùng bị ngắt, peers sẽ bị hủy bỏ.
Mối quan hệ giữa hai class trên và class task được được thể hiện bằng sơ đồ
dưới đây:
b. Cơ chế send file
Khi chương trình bắt đầu chạy, form Main sẽ tạo một socket và listen trên port
do người dùng chỉ định trong form Options. Các connections do main nhận được sẽ
được giao cho các class tương ứng xử lý. Sau khi đã kết nối thành công việc send file
sẽ diễn ra theo một giao thức gần tương tự bittorrent.
Một file được chia làm nhiều piece - 2MiB, chương trình giữ hash code của từ
piece để checksum ngay sau khi nhận dữ liệu. Mỗi piece lại được chia làm nhiều
block – 16KiB, đây là đơn vị dữ liệu sẽ được gửi đi. Việc truyền – nhận dữ liệu thực
hiện thông qua các message. Peers chỉ trả lời các message khi thật sự cần thiết.
GVHD: Hoàng Văn Kiếm Trang 36/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Để cài đặt khả năng resume em dùng cách cơ bản nhất là tạo một file đánh dấu,
nội dung file là một chuỗi các số 0,1 mỗi số tương ứng với trạng thái đã nhân, chưa
nhận của một block. Mỗi file sẽ được lưu bằng một hàng riêng.
Tên message Chú thích
Announce Message bắt đầu quá trình chia sẻ file, sau message này sẽ là
một chuỗi các message đồng bộ nhau nhằm gửi cho user toàn bộ
thông tin về task.
Connect Message báo hiệu bắt đầu hay chấp nhận một kết nối.
Accept Trả lời cho connect, báo hiệu chấp nhận kết nối.
Disconnect Message thông báo hủy bỏ kết nối.
Have Peers gửi message này sau khi đã nhận hoàn chỉ một piece hoặc
để trả lời cho message Ask
Ask Dùng message để hỏi xem peers có một piece nào đó hay
không. Nếu có peers sẽ trả lời bằng message have.
Request Yêu cầu peers gửi một block xác định nào đó, nếu có peers sẽ
trả lời bằng message block
Block Gửi dữ liệu của block tới cho peers, dùng để trả lời cho message
Request
Bảng chú giải các message mà chương trình sử dụng:
VI. Một số mẹo dùng trong lúc cài đặt chương trình
a. Background
Do đặc thù chương trình phải xử lý những công việc việc đòi hỏi nhiều thời
gian như tính hash, chờ kết nối v.v… nên việc dùng kỹ thuật đa luồng (multi thread)
là bắt buộc đảm bảo khả năng đáp ứng (responsiveness). Và BackgroundWorker là
một đối tượng (control) sẵn có của .NET Framework nhằm đơn giản hóa việc lập trình
đa luồng.
Không như đa số control khác, BackgroundWorker nằm trong namespace
System.ComponentModel. Hỗ trợ 3 sự kiện: DoWork, ProgressChage và
RunWorkerComplete. BackgroundWorker được điều khiển thông qua các hàm:
GVHD: Hoàng Văn Kiếm Trang 37/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
RunWorkAsync() có nhiệm vụ raise event DoWork, eventHandler của DoWork được
thực hiện trong một tiến trình khác với tiến trình chạy RunWorkAsync(), sau khi kết
thúc DoWork, sự kiện RunWorkerComplete được raise và eventHandler của sự kiện
này thực thi thread đang điều khiển BackgroundWorker và thread trước đó được thu
hồi.
Em thường hay sử dụng chung BackgroundWorker với ProgressBar và timer
(xem hình trên), để thể hiện cho người dùng biết được quá trình hoạt động của
BackgroundWorker đang làm gì và chừng nào thì kết thúc. Tuy đơn giản hóa công
việc lập trình đa luồng đi rất nhiều, nhưng khi sử dụng BackgroundWorker cũng
không tránh khỏi một số khó khăn đặc trưng của việc lập trình luồng, sẽ đề cập chi tiết
sau.
b. Synchronous socket programming
Để send dữ liệu qua mạng chúng ta phải quản lý được kết nối giữa hai máy.
NET mô hình hóa kết nối này thông qua đối tượng socket. Một socket bao gồm hai
IPEndPoint, hai đối tượng IPEndPoint này lần lượt chứa thông tin về IP, port của máy
chủ và IP, Port của máy khách – nhưng thành phần đại diện cho một kết nối. Việc gửi
và nhận dữ liệu được thực hiện thông qua hai Phương thức có sẵn của socket là
Socket.Send() và Socket.Receive()
Đối tượng socket trong .NET hỗ trợ nhiều giao thức transport khác nhau như
GVHD: Hoàng Văn Kiếm Trang 38/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
TCP, IPX, UDP v.v… Do không có nhiều yêu cầu đặt biệt về giao thức transport nền
cho chương trình nên em chọn sử dụng giao thức TCP phổ biến có sẵn khả năng
checksum tương đối.
Ở đây để đơn giản hóa những công việc liên quan nhiều đến network và kiến
thức mạng máy tính. em chọn lập trình socket đồng bộ, tức là mỗi khi gọi phương
thức Socket.Send() hoặc Socket.Receive(), chương trình sẽ bị khóa (block) cho đến
khi dữ liệu được gửi/nhận thành công. Cách này có thể hạn chế tình trạng máy bị tràn
ngập bởi tín hiệu gửi đến từ các máy khác, nhất là trong trường hợp một máy khi chia
sẻ file phải kết nối với nhiều máy, mỗi máy lại có nhiều socket khác nhau. Tuy nhiên
synchronous socket đôi khi khiến chương trình bị treo, đòi hỏi phải áp dụng thêm kỹ
thuật lập trình đa luồng trong việc quản lý và sử dụng các socket này.
c. Thread synchronization
Việc trang bị khả năng đa luồng cho phép chương trình tận dụng tốt tài nguyên
hệ thống, đảm bảo vẫn đáp ứng (responsiveness) ngay cả khi đang phải thực hiện
những công việc nặng. Đổi lại, chương trình trở nên cực kỳ phức tạp so với ứng dụng
đơn luồng và phát sinh nhiều vấn đề đặt trưng của lập trình đa xử lý.
Ngày nay mọi chương trình hầu như đều đa luồng. Một chương trình có dùng
window form của .NET chắc chắn là đa luồng, dù người lập trình không có ý định
đụng đến đa luồng thì bên dưới những dòng code của người lập trình, bao giờ cũng là
những đoạn code có sẵn của thư viện .NET và luôn luôn có luồng chạy song song đảm
nhận việc vẽ lại các control. Thế nên việc sử dụng đa luồng khi lập trình ngày nay gần
như là bắt buộc.
Để một chương trình đa luồng có thể hoạt động suôn sẻ, các luồng này phải
được đồng bộ hóa (synchronization) tốt. Đồng bộ hóa là quy tắc đảm bảo các tiến
trình này chạy một cách “có tổ chức” và không xung đột với nhau về tài nguyên dùng
chung. Đây là một công việc phức tạp, khó có thể lường hết các tình huống có thể xảy
ra trên thực tế khi nhiều luồng cùng một lúc tranh giành nhau tài nguyên hệ thống. Và
một sơ sẩy của người lập trình có thể dẫn đến hàng loạt vấn đề.
Một trong những lỗi mà em thường hay gặp nhất là “Cross-thread operation not
valid “ , như trong hình:
GVHD: Hoàng Văn Kiếm Trang 39/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Lỗi thường gặp khi lập trình multi thread
Lỗi này phát sinh khi một thread thay đổi thuộc tính một control được tạo ra
bởi một thread khác. Do control có thể đang được redraw ngay tại thời điểm thread
khác truy cập vào nên để đảm bảo nhất quán và tránh xung đột, .NET cấm việc thay
đổi controls từ thread khác. Vấn đề này có thể được khắc phục bằng các sử dụng hàng
loạt biến trung gian để giao tiếp giữa 2 thread thay vì can thiệp trực tiếp vào control
của thread kia hoặc triệt để hơn là sử dụng cơ chế Invoke.
Và cuối cùng là vấn đề lớn nhất phải đối mặt khi lập trình đa xử lý: chương
trình có thể bị deadlock. Deadlock xảy ra khi một thread hay tiến trình nào đó không
thể được kết thúc do nó đang chờ một điều kiện nào đấy từ thread khác, mà điều kiện
này không bao giờ xảy ra. Điều này rất dễ gặp phải trong thực tế.
Có bốn điều kiện để xảy ra deadlock (Coffman conditions) [6]
1. Tài nguyên không thể được dùng bởi nhiều thread (Mutual Exclusion).
2. Thread đang giữ tài nguyên vẫn cần có thêm một tài nguyên gì khác
(Hold and wait).
3. Thread phải tự trả lại tài nguyên dùng chung, không ai có thể giành (No
Premption).
4. Ít nhất hai thread hình thành một vòng tròn chờ tài nguyên lẫn nhau
(circular wait).
Trong trường hợp cụ thể của em, có rất nhiều khả năng có thể gây deadlock
GVHD: Hoàng Văn Kiếm Trang 40/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
như: thread A vừa nhận dữ liệu và ghi vào file x, đang chờ truy cập file y từ thread B
để hoàn tất. Thread B đang giữ file y, nhưng lại chờ truy cập file x từ A.
Điểm đáng sợ của deadlock là nó không thể được khắc phục, chỉ có 2 chiến
lược để lựa chọn khi deadlock: Cố tránh deadlock bằng cách đồng bộ hóa các tiến
trình tốt hơn và tốt hơn nữa. Hoặc chúng ta phải chấp nhận deadlock, restart chương
trình và hy vọng lần sau sẽ không gặp tình huống tương tự.
Cách lấy external IP
Để thực hiện kết nối, chương trình cần biết đến IP của máy đích, tuy nhiên ngay
với hầu hết người hiểu biết về địa chỉ IP còn khá mập mờ. Để tiện sử dụng, chương
trình tích hợp khả năng tự xác định địa chỉ IP khi truy cập internet của người dùng và
hiển thị nó trong form options.
Cần lưu ý rằng chỉ có gateway (thường là router) mà từ đó người dùng truy cập
vào internet mới nắm được external IP, và việc truy cập vào gateway để lấy IP không
phải lúc nào cũng làm được, mỗi thiết bị có một cách giao tiếp khác nhau hơn nữa
cũng có thể máy người dùng không đủ quyền truy cập vào tran cung cấp thông tin của
gateway.
Để có thể lấy được một external IP trong mọi trường hợp, cách đơn giản nhất là
nhờ vào một máy khác trên internet với công năng đặc biệt: Khi chúng ta gửi một gói
tin đến máy này, máy này sẽ bóc phần source IP trong gói tin và gửi lại cho ta. Có
nhiều trang web thực hiện việc này nhưng hầu hết bị chèn quảng cáo khá rối rắm vì
thế, ta sẽ tự tạo ra một trang web chỉ hiển thị duy nhất một thứ là địa chỉ IP của máy
vừa truy cập.
+ Đối với ASP, chỉ cần tạo một trang duy nhất một dòng:
+ Đối với PHP, :
Sau khi tạo ra một trang có nội dung như trên , ta cần upload file lên một host
thường trực nào đó. Ở đây địa chỉ em đã thực hiện là:
GVHD: Hoàng Văn Kiếm Trang 41/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Dữ liệu trả về sẽ có dạng:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"">
Untitled Document
118.69.168.69
Nếu ta để ý ở xung quanh IP trên, ta sẽ thấy nó nằm ngay sau chữ và cả
chuỗi chỉ có duy nhất một dòng , công việc còn lại chỉ là xử lý chuỗi đơn giản.
d. Lấy Icon của file – task
Trong ListItem, với mỗi file hay task đều có Icon tương ứng để hiển thị cho file
hay task đó. Với các file không thể lấy được Icon thì Icon của file đó sẽ là Icon chung
được mặc định sẵn bởi chương trình.
.Net cung cấp sẵn công cụ để lấy icon của một file:
Namespace: system.Drawing
Cú pháp: Icon.ExtractAssociatedIcon
public static Icon ExtractAssociatedIcon(
string filePath
)
Trả về Icon của file được chỉ ra. Tham số cần truyền vào là đường dẫn của
file(string filepath).
Icon của task sẽ được được đại diện bằng Icon của loại file có tổng dung lượng
lớn nhất. Để làm việc này ta dùng phương thức GetIcon được viết trong task.cs.
Public string GetIcon()
GVHD: Hoàng Văn Kiếm Trang 42/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
Tất cả các file của task sẽ được phân thành từng nhóm, mỗi nhóm tương ứng
với một loại của file, và mỗi loại file này có dung lượng bằng tổng dung lượng của tất
cả các file có cùng loại, sau đó ta sẽ so sánh dung lượng của các loại file với nhau, kết
quả trả về là đường dẫn của 1 file với dung lượng của loại của file đó là lớn nhất. Dựa
vào đường dẫn của file này, ta dùng phương thức Icon.ExtractAssociatedIcon để xác
định Icon cho task.
e. Cách dừng một thread
Thread trong .NET hỗ trợ phương thức suspend và resume, tuy nhiên việc dùng
hai phương thức này vào xử lý trong thực tế có thể dẫn đến một số bất cập. Ta không
thể biết thread đang làm gì lúc nó dừng, nếu thread đang nắm một tài nguyên dùng
chung nào đó đột ngột bị dừng, nó có thể khiến các thread khác gặp exception hoặc tệ
hơn gây deadlock. Để dừng một thread cách tốt nhất là sử dụng biến dùng chung và
thay đổi giá trị biến ấy từ bên ngoài. Khi thread thực hiện công việc nó sẽ định kỳ
kiểm tra biến này và dừng khi đến đúng điểm định trước và gặp đúng giá trị thích hợp.
Một trong những cách dừng cơ bản nhất là dùng một biến làm cờ và bên trong
đoạn code mà thread thực thi, ta đặt tại vị trí thích hợp một vòng lặp, có tác dụng như
một bẫy:
while (pauseFlag == true) ;
Thread sẽ bị mắc bẫy và dừng đến khi nào ta đặt lại giá trị của pauseFlag từ bên
ngoài thành false. Ngoài phương pháp thô sơ trên, ta có thể sử dụng cơ chế đồng bộ
hóa hỗ trợ sẵn trong .NET để dừng thread: khai báo một biến dùng chung:
ManualResetEvent PauseEvent = new ManualResetEvent(true);
Bên trong thread, ta lại đặt tại vị trí thích hợp lệnh:
ResumeEvent.WaitOne();
Để dừng thread ta dùng: ResumeEvent.Reset(); và ResumeEvent.Set(); để thread
tiếp tục thực thi.
f. Cách ngăn không cho hệ thống vẽ lại chương trình.
Việc vẽ lại các control được thực hiện tự động từ base class, đây là công việc
đòi hỏi khá nhiều khả năng xử lý của hệ thống. Chúng ta có thể handle sự kiện
OnPaint để xử lý mỗi khi control được vẽ lại nhưng không thể can thiệp vào quá trình
GVHD: Hoàng Văn Kiếm Trang 43/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
vẽ này.
Tuy nhiên trong một số tình huống đặc biệt, sẽ phát sinh nhu cầu tạm hoãn việc
vẽ lại control. Nếu ta sắp thực hiện một loạt thay đổi lớn thì việc vẽ lại control liên tục
sẽ tốn rất nhiều tìa nguyên hệ thống, nếu hoãn cơ chế redraw này đến khi tòan bộ thay
đổi hoàn tất sẽ hợp lý hơn nhiều.
Việc override hàm OnPaint không thể giải quyết được vấn đề, để chặn hệ thống
tự vẽ lại chương trình, ta phải gọi hàm API:
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam,
Int32 lParam);
Để chặn việc vẽ lại chương trình:
SendMessage(Parent.Handle, WM_SETREDRAW, false, 0);
Để cho phép quá trình vẽ lại bắt đầu:
SendMessage(Parent.Handle, WM_SETREDRAW, true, 0);
GVHD: Hoàng Văn Kiếm Trang 44/45
Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học
D.TÀI LIỆU THAM KHẢO:
1. Cohen, Bram (2001-07-02). "BitTorrent — a new P2P app"
2.
3. Microsoft Developer Network www.msdn.com
4.
5.
6. Giáo sư Coffman, đại học columbia:
7. Slide Phương pháp nghiên cứu khoa học - GS-TSKH Hoàng Văn Kiếm
8. Các thủ thuật sáng tạo cơ bản – Phan Dũng
9. IBM Archives: 1960s -
03.ibm.com/ibm/history/history/year_1964.html
GVHD: Hoàng Văn Kiếm Trang 45/45
Các file đính kèm theo tài liệu này:
- pham_nguyen_truong_an_ch1101062_ppnckhtth_3097.pdf