Thảo luận Bài 5
+100
NguyenTuanHai_I12A
lymydung_I12A
DiepMaiNgocYen(I12A)
tranthithanhuyen85 (I11C)
minhtam_I12C
nguyenthanhnghi_I12C
nguyenthihongtham_I12C
LeMInhTien(I11C)
DuongTrungQuan
Đỗ Phan Diễm Hương I12A
TRANTHINHPHAT (I11C)
TrinhThiPhuongThaoI12C
TRANTHUYOANH_10H1010066
nguyenthaihiep (I11C)
maidangvu_I12A
huynhtamhaoI12A
TranVanBao(I12A)
TranPhiLong (I11C)
quynhnhi.nguyen_I12A
BuiAnhNgoc(I12C)
DaoThaiHuyI12A
HUYNHMINHHAI(I12A)
VoTrongQuyet-I12A
phamphihung55
PhamDucPhuong(I12A)
nguyenthanhphongHC11TH2A
ngothihanHC11TH2A
NguyenXuanTri28
LeMinhDuc (I11C)
nguyen_tuan_phat_I12A
BuiHuongTra(I12A)
NguyenHongHaiI12C
lengocthuthao89 (i11c)
huynhvanhung(I12A)
leminhtam13(I12A)
NguyenThiHue48(I12A)
quicly_I111c
lethianhnhat_I12A
lethanhsang_I12A
phanngocthinh(i12a)
hoanghaiyen
Đinh Đông Dương
NgoXuanQuoc_(102C)
trantrungnam-HC11TH2A
Nguyen Doan Linh051(I11c)
HUYNHDUCANHI12A
levanhop.it
LeQuocKhanh-11H1010059
nguyenthipha1510
nguyenhuutho
NguyenthechinhI12A
TaThucCuongI12C
LeXuanHau (I12C)
TranThiMyKhanh(I12A)
ng_dang_khoa_HC11TH2A
TranTrungTinh(I12A)
plminhhoangI12A
LePhucHiep(102C)
thailongI12C
NguyenAnhTan15 (I12C)
NguyenDangPhongI12A
lacongchinh_I12A
NguyenHaThanh97 (I11C)
ngophicamI12A
TranTrungHienI12C
phamduyI12A
TranThiAnhDao89I12C
nguyenthingocmai_I12A
phuongnguyen
TranLeThanhVu_I12A
TranHoangNhanI12C
dangmonghai(I12A)
LeThiMaiPhuongI12A
maihuynam(I91c)
TranMinhTuan143(I12A)
vothingocthuy87(I11C)
DoanNgocDan(I12A)
hoxuanvu_I12A
letanthanh18(I12A)
HoNgocTuan142(I12A)
NguyenVanBenI12C
NguyenNgocDuy(I12A)
TranThiNgocQuynh(I12C)
tranvanthien27(I12C)
luthioanh-I12A
LeThanhTung (I11C)
NgoPhuQuoc_I12C
NguyenThiHongYen(I12A)
NguyenHoangThangI12A
hoanggiangI12C
TrinhVinhThanh (I12A)
HoNguyenQuocTuy(I12A)
PhamQuangHien_I12A
nguyenthimao_I12A
nguyenvanhonglac_0066
BuiDaiNghia-102C
DaoQuangTri38(I12A)
TruongQuocTrung_I12A
TranHuyCuong17 (I12A)
Admin
104 posters
Trang 4 trong tổng số 9 trang
Trang 4 trong tổng số 9 trang • 1, 2, 3, 4, 5, 6, 7, 8, 9
Re: Thảo luận Bài 5
nguyenthimao_I12A đã viết:BuiDaiNghia-102C đã viết:a) Khái niệm luồng ( thread )
+ Luồng còn gọi là tiến trình nhẹ ( LWP – Light Weight Process), một đơn vị cơ bản sử dụng CPU. Luồng cũng có thông tin trạng thái của tiến trình truyền thống ( HWP – Heavy Weight Process ).
+ Một luồng là một dòng xử lý cơ bản trong hệ thống. Mỗi luồng xử lý tuần tự đoạn code của nó, sở hữu một con trỏ lệnh, tập các thanh ghi và một vùng nhớ stack riêng-> luồng bao gồm: mã luồng ( thread ID ) + bộ đếm chương trình ( program counter ) + tập thanh ghi ( register set ) + stack.
b) Khái niệm tiến trình ( process)
+ Việc thực hiện các công việc được mô tả thông qua chương trình-> chương trình hoạt động thì chuyển thành tiến trình-> một tiến trình gồm:mã nguồn chương trình (code ) + data + bộ đếm chương trình ( program counter ) + ngăn xếp ( stack ) + giá trị ở các thanh ghi ( register values )-> một tiến trình cần: cung cấp đầy đủ tài nguyên cần thiết + CPU tiếp nhận và thực hiện.
+ Tiến trình có thể có một luồng chính với nhiều luồng phụ.
c) Phân biệt luồng và tiến trình
+ Luồng được coi là mức thấp hơn của tiến trình, mỗi tiến trình có thể có nhiều luồng.
+ Hoạt động của các luồng giống như tiến trình nhưng các luồng cùng chia sẻ không gian địa chỉ chung, còn các tiến trình thì hoàn toàn độc lập.
d) Trình bày những ích lợi của công nghệ đa luồng.
+ Đáp ứng nhanh ( responsiveness ): cho phép luồng chính tiếp tục được thực hiện thậm chí khi một luồng bị ách hoặc quá bận.
+ Chia sẻ tài nguyên ( resource sharing ): các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha, cho phép 1 ứng dụng có 1 số luồng khác nhau hoạt động trong cùng 1 không gian địa chỉ.
+ Tiết kiệm ( Economy ): cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác nên việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn.
+ Tận dụng được thế mạnh của kiến trúc đa xử lý ( multiprocessor ): làm tăng tính song song trên hệ máy nhiều CPU ( processor ).
+ Lập trình đa luồng dễ hơn lập trình đa tiến trình, tạo mới 1 tiến trình vừa lâu vừa khó, tạo mới 1 luồng thì nhanh và dễ hơn.
Mình xin bổ xung thêm:
Phân biệt khái niệm luồng với tiến trình
- Luồng: là tiến trình nhẹ (LWP - Light Weight Process), một đơn vị cơ bản sử dụng CPU. Luồng cũng có thông tin trạng thái như của tiến trình hệ thống (HWP - Heavy Weight Process) Ví dụ: Lớp học là một tiến trình. Trong lớp sẽ có một giáo viên(đơn luồng) và các học viên (đa luồng)
- Tiến trình: là chương trình trong thời gian thực hiện (đặt dưới sự quản lý của hệ điều hành). Có sự phân biệt Tiến trình hệ thống (của Hệ điều hành) với Tiến trình người dùng. Ví dụ: Lớp HCTH102C đang học là một tiến trình
Những ích lợi của công nghệ đa luồng
- Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
Ví dụ: Các cô ở tổng đài 108 là các luồng. Khi khách hàng điện thoại hỏi 108, thì một trong các cô (cô thứ 1) sẽ trả lời. Nếu trong thời điểm đó khách hàng thứ hai gọi 108, thì một trong các cô (cô thứ 2) còn lại sẽ trả lời cho khách hàng.
- Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
Ví dụ: Trong nhà ta có kệ sách, tivi, xe gắn máy, ... mọi người trong nhà có thể dùng chung sách, tivi, xe máy.
- Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, Chuyển ngữ cảnh chậm hơn 5 lần). Ví dụ: Các bạn trong lớp là các luồng đang dùng chung một cái bảng, ai cần ghi thi ghi, ai cần thì chụp hình về xem
- Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng.
Mình xin bổ sung ví dụ của bạn như thế nào nha!
Ví dụ: Trong lớp I12A, mỗi sinh viên là các luồng, giáo viên là luồng chính. Luồng chính chịu trách nhiệm điều phối các luồng khác (luồng phụ: tiểu trình, các thực thể hoạt động song song.
Có 2 code điều khiển công việc:
+ Code giáo viên: Quá trình truyền đạt kiến thức của giáo viên
+ Code sinh viên: Các sinh viên nghe giảng và chép bài (Mỗi sinh viên có một code riêng. Code chung: bài thảo luận, các sinh viên cùng nhóm trao đổi với nhau (code riêng))
? Tại sao code chung có mặt mạnh hơn code riêng
- Code riêng: không tiế kiệm ram -> tăng tốc độ truy cập
- Code chung: Một hôm nào đó, giáo viên yều cầu sữa chữa code chung -> chỉ cần sữa một lần -> đảm bảo tính đông bộ, nhấ quán
lacongchinh_I12A- Tổng số bài gửi : 14
Join date : 24/02/2012
Mô tả luồng
Luồng - Thread (chúng ta có thể hiểu là tiến trình mức thấp hay còn gọi là tiểu trình )
Mỗi tiến trình có một không gian địa chỉ và chỉ có một dòng xử lý. Để tăng tốc độ và sử dụng CPU hiệu quả hơn chúng ta cần nhiều dòng xử lý cùng chia sẻ một không gian địa chỉ, các dòng xử lý này hoạt động song song tương tự như các tiến trình phân biệt, ngoại trừ viiệc chia sẻ không gian địa chỉ. Mỗi dòng xử lý đưucọ gọi là một luồng (thread) hay một tiểu trình.
Một luồng là một dòng xử lý cơ bản trong hệ thống mỗi luồng xử lý tuàn tự đoạn code của nó, sở hửu một con trỏ lệnh, tập các thanh ghi và một vùng nhớ stack riêng
phân biệt cơ bản về luồng và tiến trình là:
_ luồng được xem là mức thấp của tiến trình, mỗi tiến trình có thể có nhiều luồng.
_ Họa động của cac luồng giống như tiến trình nhưng các luồng cùng chia sẻ không gian đại chỉ chung, các tiến trình thì hoàn toàn đọc lập.
Khi máy tính có nhiều CPU, mỗi CPU có thể thực hiện các công việc khác nhau hoạc các luồng khác nhau cho cùng một công việc.
Khi hệ thống chỉ có một CPU, mỗi luồng được thực hiện luân phiên nhau. Không có luồng nào ưu thế trong CPU.
Mỗi luồng có thể tương tác với một phần riêng của hệ thống như đĩa, I/O trên mạng, hoặc người dùng.
Các luồng đươc lập lịch để thực hiện vì một số luồng có thể chờ một một biến có nào đó xảy ra hoạc chờ kết thúc một công việc nào đó từ luồng khác.
Luồng bao gồm:
_Mã luồng (thread ID)
_Bộ đếm chương trình(PC)
_Tập thanh ghi( register set)
_Stack
Các luồng trong một tiến trình chia sẻ với nhau đoạn mã (code), đoạn dữ liệu(data) và các tài nguyên hệ thống khác như tệp mở, các tín hiệu.
Mỗi tiến trình có một không gian địa chỉ và chỉ có một dòng xử lý. Để tăng tốc độ và sử dụng CPU hiệu quả hơn chúng ta cần nhiều dòng xử lý cùng chia sẻ một không gian địa chỉ, các dòng xử lý này hoạt động song song tương tự như các tiến trình phân biệt, ngoại trừ viiệc chia sẻ không gian địa chỉ. Mỗi dòng xử lý đưucọ gọi là một luồng (thread) hay một tiểu trình.
Một luồng là một dòng xử lý cơ bản trong hệ thống mỗi luồng xử lý tuàn tự đoạn code của nó, sở hửu một con trỏ lệnh, tập các thanh ghi và một vùng nhớ stack riêng
phân biệt cơ bản về luồng và tiến trình là:
_ luồng được xem là mức thấp của tiến trình, mỗi tiến trình có thể có nhiều luồng.
_ Họa động của cac luồng giống như tiến trình nhưng các luồng cùng chia sẻ không gian đại chỉ chung, các tiến trình thì hoàn toàn đọc lập.
Khi máy tính có nhiều CPU, mỗi CPU có thể thực hiện các công việc khác nhau hoạc các luồng khác nhau cho cùng một công việc.
Khi hệ thống chỉ có một CPU, mỗi luồng được thực hiện luân phiên nhau. Không có luồng nào ưu thế trong CPU.
Mỗi luồng có thể tương tác với một phần riêng của hệ thống như đĩa, I/O trên mạng, hoặc người dùng.
Các luồng đươc lập lịch để thực hiện vì một số luồng có thể chờ một một biến có nào đó xảy ra hoạc chờ kết thúc một công việc nào đó từ luồng khác.
Luồng bao gồm:
_Mã luồng (thread ID)
_Bộ đếm chương trình(PC)
_Tập thanh ghi( register set)
_Stack
Các luồng trong một tiến trình chia sẻ với nhau đoạn mã (code), đoạn dữ liệu(data) và các tài nguyên hệ thống khác như tệp mở, các tín hiệu.
NguyenDangPhongI12A- Tổng số bài gửi : 3
Join date : 15/02/2012
Age : 35
Tóm tắt bài 5: ĐA LUỒNG
1) Khái niệm:
- Luồng còn gọi là tiến trình nhẹ , một đơn vị cơ bản sử dụng CPU
- có thông tin trạng thái như tiến trình truyền thông
- tiến trình có thể có một luồng chính , luồng phụ
- nhiều luồng có thể dùng chung một mã chương trình
2) Ích lợi
- Khả năng đáp ứng tốt hơn
- Chia sẻ tài nguyên
- Tiết kiệm
3) Tập Luồng:
- Tiến trình cha tạo lập sẵn một tập luồng khi khởi động
- Các luồng trong tập luồng luôn sẵn sang chờ công việc
- Khi tiến trình cha nhận thêm một yêu cầu , một luồng được đánh thức và dưa vào vận hành
- Phục vụ xong , luồng được đưa trả về tạp luồng
- Nếu số yêu cầu lớn hơn số luồng trong tập , tiến trình cha chở đến khi có luồng được giải phóng
Còn nhiều thiếu sót... mong ace góp ý, bổ sung thêm
- Luồng còn gọi là tiến trình nhẹ , một đơn vị cơ bản sử dụng CPU
- có thông tin trạng thái như tiến trình truyền thông
- tiến trình có thể có một luồng chính , luồng phụ
- nhiều luồng có thể dùng chung một mã chương trình
2) Ích lợi
- Khả năng đáp ứng tốt hơn
- Chia sẻ tài nguyên
- Tiết kiệm
3) Tập Luồng:
- Tiến trình cha tạo lập sẵn một tập luồng khi khởi động
- Các luồng trong tập luồng luôn sẵn sang chờ công việc
- Khi tiến trình cha nhận thêm một yêu cầu , một luồng được đánh thức và dưa vào vận hành
- Phục vụ xong , luồng được đưa trả về tạp luồng
- Nếu số yêu cầu lớn hơn số luồng trong tập , tiến trình cha chở đến khi có luồng được giải phóng
Còn nhiều thiếu sót... mong ace góp ý, bổ sung thêm
NguyenAnhTan15 (I12C)- Tổng số bài gửi : 17
Join date : 16/02/2012
Phân tích luồng-tiến trình
Tiến trình (process) là trạng thái tức thời của một chương trình đang chạy trên máy tính. Nó bao gồm bộ nhớ cần thiết để chạy chương trình (không gian địa chỉ của quá trình) và khả năng kiểm soát hiện trạng của bộ xử lý trong quá trình thực thi chương trình (tiến trình điều khiển của quá trình).
Luồng (thread) tương tự như tiến trình nhưng chỉ bao gồm tiến trình điều khiển. Nhiều luồng sử dụng không gian địa chỉ của một tiến trình.
Tiến trình và luồng có chung một mục đích: buộc máy tính phải làm nhiều việc hơn tại một thời điểm. Để làm điều đó, bộ xử lý (hay các bộ xử lý) phải chuyển đổi một cách trơn tru giữa các tác vụ, điều này đòi hỏi chương trình ứng dụng phải được thiết kế để chia sẻ tài nguyên máy tính.
Mỗi chương trình chạy trên một máy tính cần ít nhất là một quá trình. Quá trình đó bao gồm không gian địa chỉ (phần bộ nhớ máy tính mà ở đó chương trình chạy) và tiến trình điều khiển (cách thức để biết được phần nào của chương trình đang được bộ xử lý thực thi tại bất kỳ thời điểm nào). Nói cách khác, tiến trình là một vùng làm việc và cách thức quản lý những gì chương trình đang thực hiện. Khi một số chương trình chạy cùng một thời điểm, mỗi chương trình sẽ có không gian địa chỉ và tiến trình điều khiển của riêng nó.
Hệ điều hành đa nhiệm như Unix hay Windows thực hiện việc chuyển đổi qua lại giữa các quá trình, lần lượt phân thời gian sử dụng CPU cho từng quá trình. Nếu máy tính có nhiều CPU, mỗi quá trình có thể được gán riêng cho một trong các CPU.
Điều này thích hợp với các chương trình đơn giản. Các ứng dụng phức tạp hiện nay như xử lý văn bản hay bảng tính có thể xem như là nhiều chương trình khác nhau với yêu cầu chuyển đổi qua lại và giao tiếp giữa các quá trình liên tục. Đây là một vấn đề vì phải mất thời gian để chuyển đổi giữa các quá trình.
Ưu điểm là gì?
Thời gian chuyển đổi giữa các luồng ít hơn hẳn so với giữa các quá trình vì không cần phải chuyển đổi không gian địa chỉ. Ngoài ra, vì chúng chia sẻ không gian địa chỉ nên các luồng trong một quá trình có thể giao tiếp với nhau dễ dàng hơn nhiều.
Trên máy tính có nhiều bộ xử lý, chương trình dạng một quá trình đơn chỉ chạy trên một CPU, còn chương trình dạng luồng có thể chia các luồng cho tất cả các bộ xử lý. Vì thế, nếu bạn chuyển chương trình dạng luồng sang máy chủ nhiều bộ xử lý thì nó sẽ chạy nhanh hơn.
Khuyết điểm?
Chương trình dạng luồng khó viết và kiểm lỗi hơn. Không phải mọi thư viện lập trình đều được thiết kế để dùng với luồng và không phải mọi ứng dụng cũ đều có thể làm việc tốt với ứng dụng dạng luồng. Một vài công cụ lập trình cũng làm cho việc thiết kế và thử nghiệm mã luồng khó khăn hơn.
Lỗi liên quan đến luồng cũng khó phát hiện hơn. Các luồng trong một quá trình có thể bị chồng chéo dữ liệu với nhau. Hệ điều hành có thể hạn chế số luồng thực thi chẳng hạn đọc và ghi dữ liệu cùng lúc. Việc định thời cho các luồng khác nhau để tránh xung đột là rất khó khăn.
Tuy nhiên, khi các ứng dụng dùng chung phức tạp và máy chủ nhiều bộ xử lý ngày càng phổ biến thì luồng sẽ ngày càng được dùng nhiều để thực hiện đa xử lý.
Luồng (thread) tương tự như tiến trình nhưng chỉ bao gồm tiến trình điều khiển. Nhiều luồng sử dụng không gian địa chỉ của một tiến trình.
Tiến trình và luồng có chung một mục đích: buộc máy tính phải làm nhiều việc hơn tại một thời điểm. Để làm điều đó, bộ xử lý (hay các bộ xử lý) phải chuyển đổi một cách trơn tru giữa các tác vụ, điều này đòi hỏi chương trình ứng dụng phải được thiết kế để chia sẻ tài nguyên máy tính.
Mỗi chương trình chạy trên một máy tính cần ít nhất là một quá trình. Quá trình đó bao gồm không gian địa chỉ (phần bộ nhớ máy tính mà ở đó chương trình chạy) và tiến trình điều khiển (cách thức để biết được phần nào của chương trình đang được bộ xử lý thực thi tại bất kỳ thời điểm nào). Nói cách khác, tiến trình là một vùng làm việc và cách thức quản lý những gì chương trình đang thực hiện. Khi một số chương trình chạy cùng một thời điểm, mỗi chương trình sẽ có không gian địa chỉ và tiến trình điều khiển của riêng nó.
Hệ điều hành đa nhiệm như Unix hay Windows thực hiện việc chuyển đổi qua lại giữa các quá trình, lần lượt phân thời gian sử dụng CPU cho từng quá trình. Nếu máy tính có nhiều CPU, mỗi quá trình có thể được gán riêng cho một trong các CPU.
Điều này thích hợp với các chương trình đơn giản. Các ứng dụng phức tạp hiện nay như xử lý văn bản hay bảng tính có thể xem như là nhiều chương trình khác nhau với yêu cầu chuyển đổi qua lại và giao tiếp giữa các quá trình liên tục. Đây là một vấn đề vì phải mất thời gian để chuyển đổi giữa các quá trình.
Ưu điểm là gì?
Thời gian chuyển đổi giữa các luồng ít hơn hẳn so với giữa các quá trình vì không cần phải chuyển đổi không gian địa chỉ. Ngoài ra, vì chúng chia sẻ không gian địa chỉ nên các luồng trong một quá trình có thể giao tiếp với nhau dễ dàng hơn nhiều.
Trên máy tính có nhiều bộ xử lý, chương trình dạng một quá trình đơn chỉ chạy trên một CPU, còn chương trình dạng luồng có thể chia các luồng cho tất cả các bộ xử lý. Vì thế, nếu bạn chuyển chương trình dạng luồng sang máy chủ nhiều bộ xử lý thì nó sẽ chạy nhanh hơn.
Khuyết điểm?
Chương trình dạng luồng khó viết và kiểm lỗi hơn. Không phải mọi thư viện lập trình đều được thiết kế để dùng với luồng và không phải mọi ứng dụng cũ đều có thể làm việc tốt với ứng dụng dạng luồng. Một vài công cụ lập trình cũng làm cho việc thiết kế và thử nghiệm mã luồng khó khăn hơn.
Lỗi liên quan đến luồng cũng khó phát hiện hơn. Các luồng trong một quá trình có thể bị chồng chéo dữ liệu với nhau. Hệ điều hành có thể hạn chế số luồng thực thi chẳng hạn đọc và ghi dữ liệu cùng lúc. Việc định thời cho các luồng khác nhau để tránh xung đột là rất khó khăn.
Tuy nhiên, khi các ứng dụng dùng chung phức tạp và máy chủ nhiều bộ xử lý ngày càng phổ biến thì luồng sẽ ngày càng được dùng nhiều để thực hiện đa xử lý.
thailongI12C- Tổng số bài gửi : 35
Join date : 17/02/2012
Ví dụ ứng dụng công nghệ đa luồng
NguyenAnhTan15 (I12C) đã viết:1) Khái niệm:
- Luồng còn gọi là tiến trình nhẹ , một đơn vị cơ bản sử dụng CPU
- có thông tin trạng thái như tiến trình truyền thông
- tiến trình có thể có một luồng chính , luồng phụ
- nhiều luồng có thể dùng chung một mã chương trình
2) Ích lợi
- Khả năng đáp ứng tốt hơn
- Chia sẻ tài nguyên
- Tiết kiệm
3) Tập Luồng:
- Tiến trình cha tạo lập sẵn một tập luồng khi khởi động
- Các luồng trong tập luồng luôn sẵn sang chờ công việc
- Khi tiến trình cha nhận thêm một yêu cầu , một luồng được đánh thức và dưa vào vận hành
- Phục vụ xong , luồng được đưa trả về tạp luồng
- Nếu số yêu cầu lớn hơn số luồng trong tập , tiến trình cha chở đến khi có luồng được giải phóng
Còn nhiều thiếu sót... mong ace góp ý, bổ sung thêm
- Lập trình xử lý công việc bán vé máy bay
- Gửi và rút tiền ở ngân hàng
2 ứng dụng trên đều cần đến công nghệ đa luồng.
Re: Thảo luận Bài 5
l Ích lợi của đa luồng
1. Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
VD:trong 1 quầy bán vé,có nhiều nhân viên bán vé,khi khách hàng cần mua vé,thì 1 trong những nhân viên sẽ bán vé cho khách.Nếu trong thời điểm đó,khách hàng thứ 2 tới mua thì 1 trong những nhân viên(nhân viên thứ 2) sẽ bán vé cho khách.
2. Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
3. Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, Chuyển ngữ cảnh chậm hơn 5 lần).
VD:2 người cùng học chung 1 lớp thì có thể đi cùng 1 xe để tiết kiệm
4. Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng.
1. Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
VD:trong 1 quầy bán vé,có nhiều nhân viên bán vé,khi khách hàng cần mua vé,thì 1 trong những nhân viên sẽ bán vé cho khách.Nếu trong thời điểm đó,khách hàng thứ 2 tới mua thì 1 trong những nhân viên(nhân viên thứ 2) sẽ bán vé cho khách.
2. Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
3. Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, Chuyển ngữ cảnh chậm hơn 5 lần).
VD:2 người cùng học chung 1 lớp thì có thể đi cùng 1 xe để tiết kiệm
4. Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng.
plminhhoangI12A- Tổng số bài gửi : 19
Join date : 22/02/2012
Ích lợi của đa luồng
1. Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
VD:trong siêu thị có nhiếu quầy thanh toán cho khách hàng,khi 1 khách hàng cần thanh toán thì một trong các quầy sẽ thanh toán cho khách.Nếu 1 khách hàng khác có nhu cầu thanh toán thì có thể qua quầy kế bên mà không cần phải đợi.
2. Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
VD:Trong gia đình mọi người có thể dùng chung tivi,tủ lạnh...
3. Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, Chuyển ngữ cảnh chậm hơn 5 lần).
VD:Trong gia đình,khi có anh(chị) cưới vợ(chồng) thì không cần phải xây nhà mới vì rất tốn kém,mà chia căn phòng lớn thành nhiều phòng nhỏ để tiết kiệm hơn.
4. Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng.
VD:trong siêu thị có nhiếu quầy thanh toán cho khách hàng,khi 1 khách hàng cần thanh toán thì một trong các quầy sẽ thanh toán cho khách.Nếu 1 khách hàng khác có nhu cầu thanh toán thì có thể qua quầy kế bên mà không cần phải đợi.
2. Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
VD:Trong gia đình mọi người có thể dùng chung tivi,tủ lạnh...
3. Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, Chuyển ngữ cảnh chậm hơn 5 lần).
VD:Trong gia đình,khi có anh(chị) cưới vợ(chồng) thì không cần phải xây nhà mới vì rất tốn kém,mà chia căn phòng lớn thành nhiều phòng nhỏ để tiết kiệm hơn.
4. Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng.
thailongI12C- Tổng số bài gửi : 35
Join date : 17/02/2012
Re: Thảo luận Bài 5
Mình xin bổ sung thêm.DaoQuangTri38(I12A) đã viết:- Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (ví dụ, luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
VD:người 1 người thu ngân trong siêu thị đang tính tiền cho khách hàng mặc dù đằng sau còn rất nhiều người khách khác thì trong lúc đó cũng đang có nhiều người thu ngân khác phục vụ cho các khách hàng khác
- Chia sẽ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong một vùng địa chỉ, do đó dễ chia sẻ tài nguyên hơn so với trường hợp đa tiến trình.
VD:Mẫu csdl quản lí sinh viên trong trường nếu thống nhất dùng chung 1 mẫu thì dễ dàng chỉnh sửa nếu cần thay đổi
- Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là một công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, chuyển ngữ cảnh chậm hơn 5 lần).
VD:2 sinh viên cùng phòng học cùng lớp thì nên đi 1 xe máy sẽ đỡ tốn kém hơn là mỗi người đi 1 xe
- Tận dụng được thế mạnh của kiến trức đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể được chạy bởi CPU riêng.
VD:với một CPU đa luồng bạn sẽ thấy sự cải thiện lớn khi xem DVD trong lúc máy vẫn đang chơi game online mà tốc độ không bị ảnh hưởng, bởi vì từng ứng dụng sẽ được gán trên các lõi khác nhau.
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.
VD: lập trình xử lý công việc bán vé máy bay, gửi và rút tiền ở ngân hàng đều cần đến công nghệ đa luồng.
TranTrungTinh(I12A)- Tổng số bài gửi : 19
Join date : 10/03/2012
Nguyên lý tập luồng.
- Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
- Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
- KHi tiến trình cha nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
- Phục vụ xong luồng được trả về tập luồng.
- Nếu số yêu cầu lớn hơn số luồng có trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
- Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
- KHi tiến trình cha nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
- Phục vụ xong luồng được trả về tập luồng.
- Nếu số yêu cầu lớn hơn số luồng có trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
TranTrungTinh(I12A)- Tổng số bài gửi : 19
Join date : 10/03/2012
[b]khái niệm đa luồng, so sánh với tiến trình, những ưu việt của công nghệ đa luồng[/b]
1:Khái niệm đa luồng: Luồng còn gọi là tiến trình nhẹ (LWP-Light Weight Process), cũng là một đơn vị cơ bản sử dụng CPU.
2: So sánh:
2.1:
giống nhau: luồng cũng là 1 tiến trình, đơn vị cấp phát CPU của hệ điều hành.
khác nhau: luồng là 1 bộ phận của tiến trình.
3: Ích lợi của đa luồng:
* Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (ví dụ, luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
Ví dụ: Các cô ở tổng đài 1080 là các luồng. Khi khách hàng điện thoại tới tổng đài 1080, thì một trong các cô sẽ trả lời. Nếu trong thời điểm đó khách hàng khác gọi 1080, thì một trong các cô còn lại sẽ trả lời cho khách hàng.
* Chia sẽ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong một vùng địa chỉ, do đó dễ chia sẻ tài nguyên hơn so với trường hợp đa tiến trình.(trao đổi giữa các luồng thì dễ hơn).
* Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là một công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, chuyển ngữ cảnh chậm hơn 5 lần).
* Tận dụng được thế mạnh của kiến trức đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể được chạy bởi CPU riêng.
* Lập trình đa luồng dễ hơn lập trình đa tiến trình, tạo mới 1 tiến trình vừa lâu vừa khó, tạo mới 1 luồng thì nhanh và dễ hơn.
2: So sánh:
2.1:
giống nhau: luồng cũng là 1 tiến trình, đơn vị cấp phát CPU của hệ điều hành.
khác nhau: luồng là 1 bộ phận của tiến trình.
3: Ích lợi của đa luồng:
* Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (ví dụ, luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
Ví dụ: Các cô ở tổng đài 1080 là các luồng. Khi khách hàng điện thoại tới tổng đài 1080, thì một trong các cô sẽ trả lời. Nếu trong thời điểm đó khách hàng khác gọi 1080, thì một trong các cô còn lại sẽ trả lời cho khách hàng.
* Chia sẽ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong một vùng địa chỉ, do đó dễ chia sẻ tài nguyên hơn so với trường hợp đa tiến trình.(trao đổi giữa các luồng thì dễ hơn).
* Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là một công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, chuyển ngữ cảnh chậm hơn 5 lần).
* Tận dụng được thế mạnh của kiến trức đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể được chạy bởi CPU riêng.
* Lập trình đa luồng dễ hơn lập trình đa tiến trình, tạo mới 1 tiến trình vừa lâu vừa khó, tạo mới 1 luồng thì nhanh và dễ hơn.
ng_dang_khoa_HC11TH2A- Tổng số bài gửi : 2
Join date : 21/02/2012
Nên dùng một vài code chung hay chỉ một code chung trong "Đa Luồng"???
Admin đã viết:
- Đặt vấn đề đúng và thiết thực.
- Cách giải quyết cũng hợp lý. Sau này, theo cách đó, em sẽ có nhiều sáng kiến trong công việc ! Học HĐH cũng tác dụng đấy chứ !
He he. Cảm ơn thầy nhiều.
mình cũng đang phân vân không biết dùng một code chung hay vài code chung trong "Đa Luồng" sẽ tốt hơn.NguyenNgocDuy(I12A) đã viết:
Thực ra vấn đề này theo quan điểm của mình thì vẫn cho là dùng chung 1 đoạn code sẽ tối ưu hơn cả. Việc này sẽ tránh lãng phí bộ nhớ và quản lý đồng bộ, dễ dàng update.
Theo như ví dụ của bạn thì giáo viên chính là tiến trình quản lý bản tin thông báo mới thì thay vì phải mất công copy ra làm 3 hoặc 4 bản (tốn cả tiền photo Evil or Very Mad ) rồi giao cho cán bộ lớp, giáo viên chỉ việc phổ biến bản tin này cho cả lớp hoặc phổ biến cho riêng cán bộ lớp để quản lý khi có ai đó cố ý thay đổi thông báo. Twisted Evil
Thực tế việc này cũng tương tự như việc bảo mật phần mềm mã nguồn mở (PMMNM). Theo như mình được biết thì PMMNM là các phần mềm mà mã nguồn của nó được công bố rộng rãi công khai và cho phép mọi người tiếp tục phát triển phần mềm đó. Điều này không có nghĩa là chúng có thể được sao chép, sửa chữa thoải mái hay sử dụng vào mục đích nào cũng được, và nếu như cho rằng PMMNM không có tính bảo mật thì điều này là không hợp lý, bởi vì nếu như kém bảo mật thì nó đâu được đông đảo cộng đồng mạng trên thế giới sử dụng, và hơn hết 1 dự án mã nguồn mở được phát triển khá lâu và được nhiều nhà lập trình trên thế giới phát triển và được kiểm tra, fix lỗi liên tục thì không có lý do gì chúng ta lại cho là mã nguồn mở kém bảo mật?
Tóm lại: dùng chung code vẫn là tối ưu nhất lol! lol! lol!
- nếu dùng chung một code thì khi sảy ra sự cố thì rất nguy hiểm.
- nếu dùng vài code chung thì sẽ hay hơn, nhưng nếu vậy tại sao các chuyên gia, kỹ sư (ví dụ đội ngũ kỹ sư của Microsoft) có lẽ cũng đã nghĩ tới vấn đề này nhưng vì một nguyên nào đó họ chọn 1 code chung ???
có thể là người ta chọn phương án là làm sao HĐH hoạt động được nhanh, tối ưu, tiết kiệm tài nguyên, đồng bộ hóa cao và dể update hơn là vấn đề khi sảy ra sự cố thì như thế nào (vì nếu sảy ra sự cố chỉ cần cài lại Win) hihi
nhưng mình cũng nghĩ như thầy "Đa vẫn hơn Đơn"
cũng giống như ta cần sao lưu backup dữ liệu ra nhiều file vậy.
Admin
Thực ra "Đa" của thày là "Vài" (ví dụ, 3 cái).
HoNgocTuan142(I12A)- Tổng số bài gửi : 33
Join date : 22/02/2012
Age : 34
Đến từ : Quãng Ngãi
Một ví dụ về đa luồng vừa tìm thấy!!!
Ví dụ này sẽ mô tả 2 luồng (cho đơn giản) được thực thi cùng một lúc.
Ở đây bạn cứ tưởng tượng ra rằng có hai người tên là A và B thi đếm từ 0 cho đến 100, người nào đếm xong trước thì báo cáo và được về chỗ. Tương ứng mình sẽ tạo ra 2 phương thức A() và B() (mỗi luồng sẽ xử lý một người).
Bạn cần khai báo sử dụng nó using Sytem.Threading;
Ở đây bạn cứ tưởng tượng ra rằng có hai người tên là A và B thi đếm từ 0 cho đến 100, người nào đếm xong trước thì báo cáo và được về chỗ. Tương ứng mình sẽ tạo ra 2 phương thức A() và B() (mỗi luồng sẽ xử lý một người).
- Code:
void A()
{
for(int i=0; i<=100; i++)
{
Console.WriteLine(i.ToString());
}
Console.WriteLine("A đã đọc xong"); // Báo cáo đã đọc xong
}
void B()
{
for(int i=0; i<=100; i++)
{
Console.WriteLine(i.ToString());
}
Console.WriteLine("B đã đọc xong"); // Báo cáo đã đọc xong
}
- Code:
static void main()
{
ThreadStart ts1 = new ThreadStart(A); // Chỉ định thằng A lên đọc
ThreadStart ts2 = new ThreadStart(B); // Chỉ định thằng B lên đọc
// Sẵn sàng cho cuộc đấu (thi đếm nhanh :D)
Thread tA = new Thread(ts1);
Thread tB = new Thread(ts2);
// Bắt đầu bấm giờ
tA.Start();
tB.Start();
tA.Join();
tB.Join();
// Hai thằng tranh nhau đếm
Console.WriteLine("Cuộc thi kết thúc"); // Chờ đến khi 2 thằng đọc xong, không biết thằng nào sẽ thắng :D
Console.ReadLine();
}
Bạn cần khai báo sử dụng nó using Sytem.Threading;
TranThiMyKhanh(I12A)- Tổng số bài gửi : 24
Join date : 02/03/2012
Age : 34
mình muốn send file đến ftp sever nhưng khi mình tạo 2 thread để send thì có vài điều
Do code có một số điều nhạy cảm liên quan đến server công ty nên mình không thể post lên được, mình chỉ xin trình bày vấn đề thôi.
1.connect:
CFtpConnection* m_pConnect=NULL;
m_pConnect=cisSess.GetFtpConnection(sServer,sUser, sPassword,atoi(sPort),FALSE);//CInternetSession cisSess; khai báo toàn cục
2.xử lý lỗi (nếu có), và send file://send nhiều file
BOOL rt=m_pConnect->PutFile(m_sImgFolder+"\\"+sF,sF);//m_sImgFolder, sF là folder + file name
...
3.khi send file xong thì hủy kết nối:
m_pConnect->Close();
delete m_pConnect;
m_pConnect=NULL;
xin nói thêm, nếu không dùng 2 thread để send thì code chạy rất tốt, đúng yêu cầu.
nhưng khi dùng 2 thread thì xảy ra lỗi:
-khi 1 thread hoàn thành và hủy kết nối thì thread còn lại bị lỗi, và quá trình send bị treo (hàm PutFile không return) <== tại sao lại thế , ai giúp tôi trả lời với.
thêm 1 điều nữa mạng rất tệ, kết nối lâu, thường hay disconnect.
p/s: Có anh chị nào pro không giải thích dùm mình với được không, mình cũng lên mạng tiềm kiếm rồi cũng có 1 số trường hợp giống của mình nhưng, mình vẫn chưa hiểu lắm.
1.connect:
CFtpConnection* m_pConnect=NULL;
m_pConnect=cisSess.GetFtpConnection(sServer,sUser, sPassword,atoi(sPort),FALSE);//CInternetSession cisSess; khai báo toàn cục
2.xử lý lỗi (nếu có), và send file://send nhiều file
BOOL rt=m_pConnect->PutFile(m_sImgFolder+"\\"+sF,sF);//m_sImgFolder, sF là folder + file name
...
3.khi send file xong thì hủy kết nối:
m_pConnect->Close();
delete m_pConnect;
m_pConnect=NULL;
xin nói thêm, nếu không dùng 2 thread để send thì code chạy rất tốt, đúng yêu cầu.
nhưng khi dùng 2 thread thì xảy ra lỗi:
-khi 1 thread hoàn thành và hủy kết nối thì thread còn lại bị lỗi, và quá trình send bị treo (hàm PutFile không return) <== tại sao lại thế , ai giúp tôi trả lời với.
thêm 1 điều nữa mạng rất tệ, kết nối lâu, thường hay disconnect.
p/s: Có anh chị nào pro không giải thích dùm mình với được không, mình cũng lên mạng tiềm kiếm rồi cũng có 1 số trường hợp giống của mình nhưng, mình vẫn chưa hiểu lắm.
LeXuanHau (I12C)- Tổng số bài gửi : 33
Join date : 16/02/2012
Làm thế nào để xem các luồng đang hoạt động trên máy tính?
Để xem các tiến trình (Processes) đang hoạt động ta xem trong Task Manager. Vậy... mình muốn hỏi có cách nào để xem các luồng (Threads) đang hoạt động trên máy tính không?
Trong các trình duyệt như IE, Firefox,... "new window" có phải là một tiến trình và "new tab" có phải là một luồng không? Mình muốn kiểm tra nó thì như thế nào?
Rất mong thầy và các bạn chỉ giáo, mình cũng search google mà chưa ra, English vẫn còn hạn chế ^^!
Admin
- Em cho New Tab là Luồng, còn New Window là Tiến trình, khá hợp lý đấy. Thày cũng nghĩ vậy.
- Còn để thấy được các luồng đang chạy thì chưa rõ cách làm. Nhưng có thật sự cần thiết không ?
Trong các trình duyệt như IE, Firefox,... "new window" có phải là một tiến trình và "new tab" có phải là một luồng không? Mình muốn kiểm tra nó thì như thế nào?
Rất mong thầy và các bạn chỉ giáo, mình cũng search google mà chưa ra, English vẫn còn hạn chế ^^!
Admin
- Em cho New Tab là Luồng, còn New Window là Tiến trình, khá hợp lý đấy. Thày cũng nghĩ vậy.
- Còn để thấy được các luồng đang chạy thì chưa rõ cách làm. Nhưng có thật sự cần thiết không ?
TaThucCuongI12C- Tổng số bài gửi : 13
Join date : 15/02/2012
Age : 36
Đến từ : I12A
Thảo luận về lập trình đa luồng
Thực ra sau khi học bài 5 này của Thầy mình mới bắt đầu tiếp cận với khái niệm Lập trình đa luồng. Mình đã bắt đầu tìm hiểu về nó, và bài viết dưới đây là do mình sưu tầm, nó nói về ưu vs nhược điểm của lập trình đa luồng. Chắc hẳn bạn là người có kinh nghiệm trong lĩnh vực này, Thầy và bạn hãy thử đọc xem có đúng không nhé!...HoNgocTuan142(I12A) đã viết:
mình cũng đang phân vân không biết dùng một code chung hay vài code chung trong "Đa Luồng" sẽ tốt hơn.
- nếu dùng chung một code thì khi sảy ra sự cố thì rất nguy hiểm.
- nếu dùng vài code chung thì sẽ hay hơn, nhưng nếu vậy tại sao các chuyên gia, kỹ sư (ví dụ đội ngũ kỹ sư của Microsoft) có lẽ cũng đã nghĩ tới vấn đề này nhưng vì một nguyên nào đó họ chọn 1 code chung ???
có thể là người ta chọn phương án là làm sao HĐH hoạt động được nhanh, tối ưu, tiết kiệm tài nguyên, đồng bộ hóa cao và dể update hơn là vấn đề khi sảy ra sự cố thì như thế nào (vì nếu sảy ra sự cố chỉ cần cài lại Win) hihi
nhưng mình cũng nghĩ như thầy "Đa vẫn hơn Đơn"
cũng giống như ta cần sao lưu backup dữ liệu ra nhiều file vậy.
Admin
Thực ra "Đa" của thày là "Vài" (ví dụ, 3 cái).
Multi Thread là gì? Khi nói đến Multi Thread hay kỹ thuật Multi Thread, hiểu đơn giản là tạo 1 chương trình sao cho có hơn 1 luồng dữ liệu được xử lý trong đó. Trong .NET các hàm xử lý Thread được định nghĩa bên trong namespace System.Threading; Trong một chương trình có xử lý đa luồng nghĩa là có hơn 1 luồng dữ liệu cùng được xử lý đồng thời và được đồng bộ hóa theo 1 cơ chế định thời bên trong .NET. Ta thấy ở thời điểm hiện nay ngành công nghệ phần cứng đang phát triển mạnh mẽ, máy tính và các thiết bị di động được trang bị các bộ xử lý đa nhân để có thể làm được cùng một lúc nhiều công việc hơn – Xử lý song song. Việc phát triển chương trình chạy đa luồng cũng có ý nghĩa rất lớn bên ngành mạng viễn thông, giúp tăng tốc và cải thiện đường truyền tín hiệu…
ƯU ĐIỂM CỦA MỘT ỨNG DỤNG MultiThreading
- Cải thiện hiệu suất và đồng thời
Đối với các ứng dụng nhất định, hiệu quả và đồng thời có thể được cải thiện bằng cách sử dụng đa luồng và multicontexting với nhau. Trong các ứng dụng khác, hiệu suất có thể không bị ảnh hưởng hoặc thậm chí bị suy thoái bằng cách sử dụng đa luồng và multicontexting với nhau. Làm thế nào hiệu suất bị ảnh hưởng phụ thuộc vào ứng dụng của bạn.
- Đơn giản hóa mã hóa các cuộc gọi thủ tục từ xa và các cuộc hội thoại
Trong một số ứng dụng nó được dễ dàng hơn để mã cuộc gọi thủ tục khác nhau từ xa và các cuộc hội thoại trong chủ đề riêng biệt hơn để quản lý chúng từ cùng một thread.
- Đồng thời tiếp cận với nhiều ứng dụng
BEA Tuxedo khách hàng của bạn có thể được kết nối với nhiều ứng dụng cùng một lúc.
- Giảm số lượng máy chủ cần thiết
Bởi vì một máy chủ có thể gửi chủ đề dịch vụ nhiều, số lượng máy chủ để bắt đầu cho ứng dụng của bạn bị giảm. Khả năng này cho nhiều đề cử đặc biệt hữu ích cho các máy chủ thoại, nếu không phải được dành riêng cho một khách hàng cho toàn bộ thời gian của cuộc hội thoại.
Đối với các ứng dụng, trong đó chủ đề của khách hàng được tạo ra bởi Microsoft Internet Information Server API hoặc giao diện Netscape Enterprise Server (có nghĩa là, các NSAPI), việc sử dụng nhiều đề tài là điều cần thiết nếu bạn muốn có được những lợi ích đầy đủ khả năng bởi những công cụ này.
NHƯỢC ĐIỂM CỦA MỘT ỨNG DỤNG MultiThreaded
- Khó khăn của việc viết mã
Ứng dụng Multithreaded và multicontexted không dễ dàng để viết. Chỉ lập trình viên có kinh nghiệm nên thực hiện mã hóa cho các loại ứng dụng.
- Khó khăn của gỡ rối
Đó là khó khăn hơn nhiều để tái tạo một lỗi trong ứng dụng đa luồng hoặc multicontexted hơn là để làm như vậy trong một ứng dụng đơn luồng đơn contexted.
Kết quả là, nó là khó khăn hơn, trong trường hợp trước đây, để xác định và xác minh nguyên nhân gốc rễ khi lỗi xảy ra.
- Khó khăn của việc quản lý đồng thời
Các nhiệm vụ quản lý tương tranh giữa các chủ đề rất khó khăn và có tiềm năng để giới thiệu những vấn đề mới vào ứng dụng.
- Khó khăn thử nghiệm
Kiểm tra một ứng dụng đa luồng là khó khăn hơn thử nghiệm một ứng dụng đơn luồng, vì khuyết tật này thường liên quan đến thời gian và khó khăn hơn để sinh sản.
- Khó khăn của porting mã hiện tại
Code hiện tại thường đòi hỏi quan trọng tái kiến trúc để tận dụng đa luồng. Các lập trình viên cần phải:
---- +) Hủy bỏ các biến tĩnh
---- +) Thay thế bất kỳ chức năng cuộc gọi mà không phải là thread-safe
---- +) Thay thế các mã khác mà không phải là thread-safe
Bởi vì các cảng đã hoàn thành phải được kiểm tra và tái kiểm tra, công việc yêu cầu một cổng đa luồng ứng dụng là đáng kể.
Hai bạn A, B được thầy giáo mời lên đếm từ 1->100. Ai đếm xong trước thì được về chỗ.
- Code:
using System;
using System.Threading;
namespace MultiThreading_011011
{
class Program
{
static void Main(string[] args)
{
ThreadStart _threadStartA, _threadStartB;
_threadStartA = new ThreadStart(ThreadA);
_threadStartB= new ThreadStart(ThreadB);
Thread _threadA= new Thread(_threadStartA);
Thread _threadB= new Thread(_threadStartB);
_threadA.Start();
_threadB.Start();
_threadA.Join();
_threadB.Join();
Console.ReadLine();
}
static void ThreadA()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Thread A : "+i.ToString());
Thread.Sleep(1400);
}
Console.WriteLine("Thread A has finished!");
}
static void ThreadB()
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine("Thread B : "+i.ToString());
Thread.Sleep(400);
}
Console.WriteLine("Thread B has finished!");
}
}
}
- Code:
using System;
using System.Threading;
namespace MultiThreading_011011
{
class Program
{
static void Main()
{
ThreadStart threadStart = new ThreadStart(Other);
Thread thread = new Thread(threadStart);
thread.Start();
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Main: {0}", i);
Thread.Sleep(1000);
}
Console.ReadLine();
}
static void Other()
{
for (int i = 0; i < 15; i++)
{
Console.WriteLine("Other thread: {0}", i);
Thread.Sleep(500);
}
}
}
}
Bạn có 5 user name, bạn muốn cho 5 user cùng download một lúc -> ?
- Code:
using System;
using System.Threading;
public class Test
{
static void Main()
{
for (int i = 1; i <= 5; i++)
{
Users user = new Users(i);
new Thread(new ThreadStart(user.Download)).Start();
}
Console.ReadLine();
}
public class Users
{
private int number;
public Users(int number)
{
this.number = number;
}
public void Download()
{
for (int i = 1; i <= 3; i++)
{
Console.WriteLine("User {0} is downloading file {1} ",this.number, i);
Thread.Sleep(1000);
}
}
}
}
Vậy để khắc phục cảnh báo gây ra liên quan đến Control đơn giản nhất là đặt thuộc tính tĩnh:
CheckForIllegalCrossThreadCalls = false
- Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
Thread t1, t2;
public Form1()
{
InitializeComponent();
}
private void AppendText(string s)
{
if (textBox1.InvokeRequired)
{
textBox1.BeginInvoke(new MethodInvoker(delegate() { AppendText(s); }));
}
else
{
lock (textBox1)
{
textBox1.AppendText(s);
textBox1.AppendText(Environment.NewLine);
}
}
}
private void Thread1()
{
while (true)
{
AppendText("This is thread 1");
Thread.Sleep(500);
}
}
private void Thread2()
{
while (true)
{
AppendText("This is thread 2");
Thread.Sleep(500);
}
}
private void Form1_Load(object sender, EventArgs e)
{
t1 = new Thread(Thread1);
t2 = new Thread(Thread2);
t1.Start();
t2.Start();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
t1.Abort();
t2.Abort();
}
}
}
NguyenNgocDuy(I12A)- Tổng số bài gửi : 17
Join date : 16/02/2012
Bổ sung Lợi ích của Đa luồng
DaoQuangTri38(I12A) đã viết:- Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (ví dụ, luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
VD:người 1 người thu ngân trong siêu thị đang tính tiền cho khách hàng mặc dù đằng sau còn rất nhiều người khách khác thì trong lúc đó cũng đang có nhiều người thu ngân khác phục vụ cho các khách hàng khác
- Chia sẽ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong một vùng địa chỉ, do đó dễ chia sẻ tài nguyên hơn so với trường hợp đa tiến trình.
VD:Mẫu csdl quản lí sinh viên trong trường nếu thống nhất dùng chung 1 mẫu thì dễ dàng chỉnh sửa nếu cần thay đổi
- Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là một công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, chuyển ngữ cảnh chậm hơn 5 lần).
VD:2 sinh viên cùng phòng học cùng lớp thì nên đi 1 xe máy sẽ đỡ tốn kém hơn là mỗi người đi 1 xe
- Tận dụng được thế mạnh của kiến trức đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể được chạy bởi CPU riêng.
VD:với một CPU đa luồng bạn sẽ thấy sự cải thiện lớn khi xem DVD trong lúc máy vẫn đang chơi game online mà tốc độ không bị ảnh hưởng, bởi vì từng ứng dụng sẽ được gán trên các lõi khác nhau.
Mình xin bổ sung thêm Lợi ích của Đa luồng:
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.
(do quản lý luồng dễ hơn quản lý của tiến trình)
vd: Trong trường ĐH Mở có nhiều khoa (đa tiến trình), trong 1 khoa có nhiều phân ngành(đa luồng) -> quản lý 1 khoa thì dễ hơn quản lý nhiều khoa.
ngophicamI12A- Tổng số bài gửi : 24
Join date : 23/02/2012
Age : 34
Đến từ : BRVT
Re: Thảo luận Bài 5
[quote="HoNgocTuan142(I12A)"]
He he. Cảm ơn thầy nhiều.
- nếu dùng chung một code thì khi sảy ra sự cố thì rất nguy hiểm.
- nếu dùng vài code chung thì sẽ hay hơn, nhưng nếu vậy tại sao các chuyên gia, kỹ sư (ví dụ đội ngũ kỹ sư của Microsoft) có lẽ cũng đã nghĩ tới vấn đề này nhưng vì một nguyên nào đó họ chọn 1 code chung ???
có thể là người ta chọn phương án là làm sao HĐH hoạt động được nhanh, tối ưu, tiết kiệm tài nguyên, đồng bộ hóa cao và dể update hơn là vấn đề khi sảy ra sự cố thì như thế nào (vì nếu sảy ra sự cố chỉ cần cài lại Win) hihi
nhưng mình cũng nghĩ như thầy "Đa vẫn hơn Đơn"
cũng giống như ta cần sao lưu backup dữ liệu ra nhiều file vậy.
Mình xin góp ý thêm một tí !
- Theo mình nghĩ thì tùy trường hợp mà mình áp dụng code chung hay code riêng sẽ tốt hơn. Ví dụ như thông báo lên diễn đàn thì chỉ có một thông báo cho 1 vấn đề cụ thể nào đó và không lặp đi lặp lại nhiều lần (code chung). Còn vấn đề backup dữ liệu ra nhiều file để phòng ngừa virus xâm nhập là điều cần làm và rất thiết thực ( áp dụng phương án đa luồng là phù hợp).
Admin đã viết:
- Đặt vấn đề đúng và thiết thực.
- Cách giải quyết cũng hợp lý. Sau này, theo cách đó, em sẽ có nhiều sáng kiến trong công việc ! Học HĐH cũng tác dụng đấy chứ !
He he. Cảm ơn thầy nhiều.
mình cũng đang phân vân không biết dùng một code chung hay vài code chung trong "Đa Luồng" sẽ tốt hơn.NguyenNgocDuy(I12A) đã viết:
Thực ra vấn đề này theo quan điểm của mình thì vẫn cho là dùng chung 1 đoạn code sẽ tối ưu hơn cả. Việc này sẽ tránh lãng phí bộ nhớ và quản lý đồng bộ, dễ dàng update.
Theo như ví dụ của bạn thì giáo viên chính là tiến trình quản lý bản tin thông báo mới thì thay vì phải mất công copy ra làm 3 hoặc 4 bản (tốn cả tiền photo Evil or Very Mad ) rồi giao cho cán bộ lớp, giáo viên chỉ việc phổ biến bản tin này cho cả lớp hoặc phổ biến cho riêng cán bộ lớp để quản lý khi có ai đó cố ý thay đổi thông báo. Twisted Evil
Thực tế việc này cũng tương tự như việc bảo mật phần mềm mã nguồn mở (PMMNM). Theo như mình được biết thì PMMNM là các phần mềm mà mã nguồn của nó được công bố rộng rãi công khai và cho phép mọi người tiếp tục phát triển phần mềm đó. Điều này không có nghĩa là chúng có thể được sao chép, sửa chữa thoải mái hay sử dụng vào mục đích nào cũng được, và nếu như cho rằng PMMNM không có tính bảo mật thì điều này là không hợp lý, bởi vì nếu như kém bảo mật thì nó đâu được đông đảo cộng đồng mạng trên thế giới sử dụng, và hơn hết 1 dự án mã nguồn mở được phát triển khá lâu và được nhiều nhà lập trình trên thế giới phát triển và được kiểm tra, fix lỗi liên tục thì không có lý do gì chúng ta lại cho là mã nguồn mở kém bảo mật?
Tóm lại: dùng chung code vẫn là tối ưu nhất lol! lol! lol!
- nếu dùng chung một code thì khi sảy ra sự cố thì rất nguy hiểm.
- nếu dùng vài code chung thì sẽ hay hơn, nhưng nếu vậy tại sao các chuyên gia, kỹ sư (ví dụ đội ngũ kỹ sư của Microsoft) có lẽ cũng đã nghĩ tới vấn đề này nhưng vì một nguyên nào đó họ chọn 1 code chung ???
có thể là người ta chọn phương án là làm sao HĐH hoạt động được nhanh, tối ưu, tiết kiệm tài nguyên, đồng bộ hóa cao và dể update hơn là vấn đề khi sảy ra sự cố thì như thế nào (vì nếu sảy ra sự cố chỉ cần cài lại Win) hihi
nhưng mình cũng nghĩ như thầy "Đa vẫn hơn Đơn"
cũng giống như ta cần sao lưu backup dữ liệu ra nhiều file vậy.
Mình xin góp ý thêm một tí !
- Theo mình nghĩ thì tùy trường hợp mà mình áp dụng code chung hay code riêng sẽ tốt hơn. Ví dụ như thông báo lên diễn đàn thì chỉ có một thông báo cho 1 vấn đề cụ thể nào đó và không lặp đi lặp lại nhiều lần (code chung). Còn vấn đề backup dữ liệu ra nhiều file để phòng ngừa virus xâm nhập là điều cần làm và rất thiết thực ( áp dụng phương án đa luồng là phù hợp).
Được sửa bởi ngophicamI12A ngày 2/4/2012, 23:52; sửa lần 2.
ngophicamI12A- Tổng số bài gửi : 24
Join date : 23/02/2012
Age : 34
Đến từ : BRVT
Phân tích những đặc điểm của luồn và so sánh với khá niệm tiến trình. Trình bày những ưu việt của công nghệ đa luồng được các hệ điều hành hiện đạii hỗ trợ?
Quá trình nhẹ (lightweight process – Lwp)
Đơn vị cơ bản của việc sử dụng CPU
Mỗi tiểu trình xử lý tuần tự đoạn code của nó,
Gồm:
+ Định danh luồng (thread ID)
+Bộ đếm chương trình
+Tập thanh ghi
+Ngăn xếp
Các tiểu trình chia sẻ CPU với nhau giống như cách chia sẻ giữa các tiến trình: một tiểu trình xử lý trong khi các tiểu trình khác chờ đến lượt.
Một tiểu trình cũng có thể tạo lập các tiến trình con, và nhận các trạng thái khác nhau như một tiến trình thật sự.
Một tiến trình có thể sỡ hữu nhiều tiểu trình.
+Chia sẻ với các luồng khác thuộc cùng một tiến trình
Code
Data
OS resource
Tập tin, tín hiệu…
-Nếu tiến trình có nhiều luồng điều khiển, nó có thể thực hiện nhiều hơn một tác vụ tại một thời điểm
-Các tiến trình hoàn toàn độc lập với nhau, chỉ có thể liên lạc thông qua các cơ chế thông tin giữa các tiến trình mà hệ điều hành cung cấp. các tiểu trình trong cùng một tiến trình lại chia sẻ một không gian địa chỉ chung -> các tiểu trình có thể chia sẻ các biến toàn cục của tiến trình.
-Một tiểu trình có thể truy xuất đến cả các stack của những tiểu trình khác trong cùng tiến trình.
-không có cơ chế bảo vệ
Ưu Việt:
+Sự đáp ứng (Responsiveness) : cho phép một chương trình tiếp tục chạy thậm chí nếu một phần của nó bị khóa hay đang thực hiện một thao tác dài -> gia tăng sự đáp ứng với người dùng.
VD: trình duyệt web đáp ứng bằng 1 luồng ảnh được tải bằng 1 luồng
+Chia sẻ tài nguyên (Resource Sharing) :
Mặc định chia sẻ: bộ nhớ và tài nguyên của tiến trình
Cho phép ứng dụng có nhiều hoạt động trong cùng không gian địa chỉ.
+Kinh tế (Economic): tốn ít thể gian để tạo và quản lý luồng hơn tiến trình
VD: Solaris 2: tạo quá trình chậm hơn 30 lần so với luồng chuyển ngữ cảnh chậm hơn 5 lần
+Sử dụng kiến trúc đa xử lý (Utilization of MP Architectures):
Tiến trình đơn luồng chỉ chạy trên một CPU
Mỗi luồng thực thi song song trên một bộ xử lý khác nhau -> gia tăng tính đồng hành
Trong kiến trúc đơn xử lý: CPU chuyển đổi qua lại giữa các luồng nhanh -> tạo ảo giác của song song
+Lập trình đa luồng dễ hơn lập trình đa tiến trình.
Đơn vị cơ bản của việc sử dụng CPU
Mỗi tiểu trình xử lý tuần tự đoạn code của nó,
Gồm:
+ Định danh luồng (thread ID)
+Bộ đếm chương trình
+Tập thanh ghi
+Ngăn xếp
Các tiểu trình chia sẻ CPU với nhau giống như cách chia sẻ giữa các tiến trình: một tiểu trình xử lý trong khi các tiểu trình khác chờ đến lượt.
Một tiểu trình cũng có thể tạo lập các tiến trình con, và nhận các trạng thái khác nhau như một tiến trình thật sự.
Một tiến trình có thể sỡ hữu nhiều tiểu trình.
+Chia sẻ với các luồng khác thuộc cùng một tiến trình
Code
Data
OS resource
Tập tin, tín hiệu…
-Nếu tiến trình có nhiều luồng điều khiển, nó có thể thực hiện nhiều hơn một tác vụ tại một thời điểm
-Các tiến trình hoàn toàn độc lập với nhau, chỉ có thể liên lạc thông qua các cơ chế thông tin giữa các tiến trình mà hệ điều hành cung cấp. các tiểu trình trong cùng một tiến trình lại chia sẻ một không gian địa chỉ chung -> các tiểu trình có thể chia sẻ các biến toàn cục của tiến trình.
-Một tiểu trình có thể truy xuất đến cả các stack của những tiểu trình khác trong cùng tiến trình.
-không có cơ chế bảo vệ
Ưu Việt:
+Sự đáp ứng (Responsiveness) : cho phép một chương trình tiếp tục chạy thậm chí nếu một phần của nó bị khóa hay đang thực hiện một thao tác dài -> gia tăng sự đáp ứng với người dùng.
VD: trình duyệt web đáp ứng bằng 1 luồng ảnh được tải bằng 1 luồng
+Chia sẻ tài nguyên (Resource Sharing) :
Mặc định chia sẻ: bộ nhớ và tài nguyên của tiến trình
Cho phép ứng dụng có nhiều hoạt động trong cùng không gian địa chỉ.
+Kinh tế (Economic): tốn ít thể gian để tạo và quản lý luồng hơn tiến trình
VD: Solaris 2: tạo quá trình chậm hơn 30 lần so với luồng chuyển ngữ cảnh chậm hơn 5 lần
+Sử dụng kiến trúc đa xử lý (Utilization of MP Architectures):
Tiến trình đơn luồng chỉ chạy trên một CPU
Mỗi luồng thực thi song song trên một bộ xử lý khác nhau -> gia tăng tính đồng hành
Trong kiến trúc đơn xử lý: CPU chuyển đổi qua lại giữa các luồng nhanh -> tạo ảo giác của song song
+Lập trình đa luồng dễ hơn lập trình đa tiến trình.
NguyenthechinhI12A- Tổng số bài gửi : 24
Join date : 16/02/2012
Age : 35
Đến từ : BẮC NINH - HCM
Re: Thảo luận Bài 5
phuongnguyen đã viết:#include-->khai báo
#include
#include
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in=0;
int out=0;
int nextProduced=1;
void Producer(){
while (1){
// ... (nextProduced) quá trình tạo ra 1 sản phẩm
while(((in+1)%BUFFER_SIZE)==out); ---> vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm… khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
buffer[in]=nextProduced++; --> chèn sản phẩm vô ngăn chứa
in=(in+1)%BUFFER_SIZE; --> tìm vị trí khác để Producer chèn thêm sản phầm vào
SuspendThread(GetCurrentThread());lấy luồng hiện hành, SuspendThread hàm API dùng để tạo ngưng 1 luồng.
}
}
void Consumer(){
int nextConsumed;
while (1){
while(in==out); --> vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
------vòng lặp while thoát khi có 1 ngăn chứa sản phầm---------
nextConsumed=buffer[out]; --> lấy sản phẩm ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; --> tìm vị trí khác để Consumer lấy sản phẩm nếu out đang nằm ở cuối mảng thì out sẽ trở về đầu mảng
// ... (nextConsumed) ----quá trình tiêu thụ sàn phẩm-----
Sleep(GetTickCount()%5000); --> hàm API đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm,thời gian tính bằng ms trôi qua kể từ khi hệ thống khởi động tới thời điểm hiện tại, chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này tạm dừng trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nộii dung Buffer
const char * LeftMargin="\n\t";
int i;
printf(LeftMargin);
for(i=0; i<(in*5);i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0; iprintf("S%2d, ",buffer[i]);
printf("S%2d",buffer[BUFFER_SIZE-1]);
printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');printf("^out");
printf("\n");
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2; --> biến Handle chứa mục quản NSX
HANDLE ConsumerHandle1, ConsumerHandle2; --> biến Handle chứa mục quản NTT
DWORD ProducerID1, ProducerID2; --> chứa ID NSX
DWORD ConsumerID1, ConsumerID2; --> chứa ID NTT
// tạo 2 luồng sản xuất trong trạng thái ngủ
ProducerHandle1=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID1); //khởi tạo NSX với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo là trạng thái luôn luôn ngủ
ProducerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2); // tuong tu
// tao 2 luồng tiêu thụ trong trang thái ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1); //khởi tạo NTT với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái luôn luôn thức.
ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID2); //tuong tu
while(1){
printf("\n- Nhấn P/p để sản xuất,0 để kết thúc:”);
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1); //đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); ///đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case '0': /// giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1); --> ngủ trong khoảng 1mns
ShowBuffer(); -->kết quả sau khi sản xuất tiêu thụ, khi đang show thì không sx, không tiêu thụ
}
}
Mình xin giải thích thêm một số lưu ý cụ thể hơn cho vài hàm trong đoạn code này !
- SuspendThread : luồng sản xuất hiện hành được chuyển sang trạng thái ngủ cho đến khi được đánh thức
vd; một người công nhân đến làm việc ở bến cảng khi chưa được phân công thì anh ta tạm rơi vào trạng thái ngủ, chờ khi tàu đến thì anh ta dậy và vác đồ vào kho, làm xong anh ta lại tiếp tục rơi vào trạng thái ngủ.
- GetCurrentThread: trả về mục quản cuả luồng hiện hành.
- Sleep: ngủ 1 khoảng thời gian cho trước.
- Sleep(0): làm cho luồng chính trễ đi 1mili giây trước khi thực hiện đưa nội dung bộ đệm ra màn hình.
- GetTickCount: Nhận số mili giây trôi qua kể từ khi HĐH khởi động cho đến thời điểm gọi hàm này.
- ShowBuffer(): Đưa kết quả ra màn hình.
* Mình xin có lưu ý là bạn nên làm lại tên tài khoản cho phù hợp ( thầy có dặn )..! hì hì
ngophicamI12A- Tổng số bài gửi : 24
Join date : 23/02/2012
Age : 34
Đến từ : BRVT
Phân biệt đa luồng và đa tiến trình?
Giống nhau:
Đều có thông tin trạng thái
Luồng còn được gọi là tiến trình nhẹ
Nhiều luồng hoặc nhiều tiến trình có thể liên quan đến một chu trình
Chia sẻ tài nguyên cho nhau, tăng tốc tính toán, đảm bảo tính đơn thể
Khác nhau
Do luồng cùng vận hành trong 1 vùng địa chỉ, vì vậy dễ dùng chung tài nguyên hơn đa tiến trình ví dụ mượn đồ trong gia đình dễ mượn đồ hơn của hàng xóm
Do luồng chung tài nguyên với luồng cha nên việc tạo lập và chuyển đổi ngữ cảnh cũng nhanh hơn tiến trình
Ví dụ: việc ngăn riêng ra một phòng trong nhà thì dễ hơn được nhà nước cấp cho một căn hộ
Cấp phát tài nguyên cho bộ nhớ thì tốn kém
Lập trình đa luồng thì dễ hơn lập trình đa tiến trình
Đều có thông tin trạng thái
Luồng còn được gọi là tiến trình nhẹ
Nhiều luồng hoặc nhiều tiến trình có thể liên quan đến một chu trình
Chia sẻ tài nguyên cho nhau, tăng tốc tính toán, đảm bảo tính đơn thể
Khác nhau
Do luồng cùng vận hành trong 1 vùng địa chỉ, vì vậy dễ dùng chung tài nguyên hơn đa tiến trình ví dụ mượn đồ trong gia đình dễ mượn đồ hơn của hàng xóm
Do luồng chung tài nguyên với luồng cha nên việc tạo lập và chuyển đổi ngữ cảnh cũng nhanh hơn tiến trình
Ví dụ: việc ngăn riêng ra một phòng trong nhà thì dễ hơn được nhà nước cấp cho một căn hộ
Cấp phát tài nguyên cho bộ nhớ thì tốn kém
Lập trình đa luồng thì dễ hơn lập trình đa tiến trình
nguyenhuutho- Tổng số bài gửi : 31
Join date : 09/03/2012
Đa Luồng
Khái niệm:
- Luồng còn gọi là tiến trình nhẹ , một đơn vị cơ bản sử dụng CPU
- có thông tin trạng thái như tiến trình truyền thông
- tiến trình có thể có một luồng chính , luồng phụ
- nhiều luồng có thể dùng chung một mã chương trình
Ích lợi:
- Khả năng đáp ứng tốt hơn
- Chia sẻ tài nguyên
- Tiết kiệm
Tập Luồng:
- Tiến trình cha tạo lập sẵn một tập luồng khi khởi động
- Các luồng trong tập luồng luôn sẵn sang chờ công việc
- Khi tiến trình cha nhận thêm một yêu cầu , một luồng được đánh thức và dưa vào vận hành
- Phục vụ xong , luồng được đưa trả về tạp luồng
- Nếu số yêu cầu lớn hơn số luồng trong tập , tiến trình cha chở đến khi có luồng được giải phóng
- Luồng còn gọi là tiến trình nhẹ , một đơn vị cơ bản sử dụng CPU
- có thông tin trạng thái như tiến trình truyền thông
- tiến trình có thể có một luồng chính , luồng phụ
- nhiều luồng có thể dùng chung một mã chương trình
Ích lợi:
- Khả năng đáp ứng tốt hơn
- Chia sẻ tài nguyên
- Tiết kiệm
Tập Luồng:
- Tiến trình cha tạo lập sẵn một tập luồng khi khởi động
- Các luồng trong tập luồng luôn sẵn sang chờ công việc
- Khi tiến trình cha nhận thêm một yêu cầu , một luồng được đánh thức và dưa vào vận hành
- Phục vụ xong , luồng được đưa trả về tạp luồng
- Nếu số yêu cầu lớn hơn số luồng trong tập , tiến trình cha chở đến khi có luồng được giải phóng
nguyenthipha1510- Tổng số bài gửi : 6
Join date : 22/03/2012
Nguyên lý tập luồn
Tiến trình cha tạo lập sẵn một luồng khi khởi động.
- Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
- Khi tiến trình cha (ví dụ như Web server) nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
- Phục vụ xong, luồng được trả về tập luồng.
- Nếu số yêu cầu lớn hơn số luồng có trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
VD: Trong một doanh trại quân đội có một tướng lĩnh(tiến trình cha) và có một đội binh (tập luồng). Đội binh này sẽ sẵn sàng chiến đấu khi có mệnh lệnh (sẵn sàng chờ công việc). Khi có một tên địch đột nhập (Nhận một yêu cầu), tướng lĩnh sẽ điều một binh sĩ (một luồng) đi bắt tên địch (một luồng được đánh thức và đưa vào vận hành). Trong khi đó, lại có thêm một tên địch khác đột nhập (nhận thêm một yêu cầu), tướng lĩnh điều binh sĩ 2 (một luồng) đi bắt địch (một luồng khác được đánh thức và đưa vào vận hành). Sau khi bắt địch xong, binh sĩ sẽ trở về doanh trại (luồng được trả về tập luồng)
- Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
- Khi tiến trình cha (ví dụ như Web server) nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
- Phục vụ xong, luồng được trả về tập luồng.
- Nếu số yêu cầu lớn hơn số luồng có trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
VD: Trong một doanh trại quân đội có một tướng lĩnh(tiến trình cha) và có một đội binh (tập luồng). Đội binh này sẽ sẵn sàng chiến đấu khi có mệnh lệnh (sẵn sàng chờ công việc). Khi có một tên địch đột nhập (Nhận một yêu cầu), tướng lĩnh sẽ điều một binh sĩ (một luồng) đi bắt tên địch (một luồng được đánh thức và đưa vào vận hành). Trong khi đó, lại có thêm một tên địch khác đột nhập (nhận thêm một yêu cầu), tướng lĩnh điều binh sĩ 2 (một luồng) đi bắt địch (một luồng khác được đánh thức và đưa vào vận hành). Sau khi bắt địch xong, binh sĩ sẽ trở về doanh trại (luồng được trả về tập luồng)
LeThanhTung (I11C)- Tổng số bài gửi : 50
Join date : 28/08/2011
Công nghệ Hyper-Threading cho máy chủ và trạm làm việc cao cấp
Internet, thương mại điện tử và phần mềm ứng dụng doanh nghiệp đang ngày càng đòi hỏi nhiều năng lực tính toán của các máy chủ hơn. Để nâng cao tốc độ, phần mềm cần phải được “phân luồng” - các chỉ thị sẽ được chia thành nhiều dòng lệnh để có thể xử lý đồng thời trên nhiều bộ xử lý. Intel đã đưa ra công nghệ “phân luồng” cho phép nâng cao tốc độ và khả năng tính toán song song cho những ứng dụng đa luồng. Công nghệ mới của Intel mô phỏng mỗi bộ vi xử lý vật lý như là hai bộ vi xử lý luận lý (logic), tài nguyên vật lý được chia sẻ và có cấu trúc chung giống hệt nhau cho cả hai bộ xử lý lôgic. Hệ điều hành và phần mềm ứng dụng sẽ “tưởng” như đang chạy trên hai hay nhiều bộ xử lý, kết quả là tốc độ xử lý trung bình có thể tăng lên xấp xỉ 40% đối với một bộ xử lý vật lý, Intel gọi công nghệ này là Hyper-Threading (HT - tạm dịch là siêu luồng).
Công nghệ siêu luồng cho phép các phần mềm ứng dụng được viết cho những máy chủ đa luồng có thể thực hiện các chỉ thị song song đồng thời trên mỗi bộ xử lý riêng, bằng cách này sẽ cải thiện tức thì tốc độ giao dịch cũng như thời gian đáp ứng và các yêu cầu đặc thù khác của phần mềm nghiệp vụ và thương mại điện tử. Công nghệ này tương thích với các phần mềm ứng dụng và hệ điều hành sẵn có trên các máy chủ, nó cho phép hỗ trợ nhiều người dùng hơn và tăng khối lượng công việc được xử lý trên một máy chủ. Với các máy trạm cao cấp, công nghệ siêu phân luồng cũng sẽ tăng đáng kể tốc độ các phần mềm ứng dụng đòi hỏi năng lực tính toán cao, ví dụ như phần mềm thiết kế 3 chiều, xử lý ảnh hay video… Trong thời gian tới sẽ xuất hiện ngày càng nhiều phần mềm được thiết kế đặc biệt và tối ưu hoá cho công nghệ này.
Từ tháng 1-2002, công nghệ siêu luồng đã được Intel đưa vào các bộ vi xử lý Xeon đời mới, khởi đầu với các bộ xử lý có tốc độ 1,8GHz và 2,0GHz với 512KB cache thứ cấp, sản xuất bằng công nghệ 0,13 micron (Xeon 1,7GHz, 1,8GHz, 2,0GHz với 256KB cache thứ cấp được sản xuất bằng công nghệ 0,18 không hỗ trợ siêu luồng). Tại thời điểm đầu tiên khi Intel giới thiệu bộ xử lý Xeon cùng với chipset 860, chỉ có một số rất ít các nhà sản xuất hàng đầu như IBM, Compaq, Dell, SuperMicro, Tyan… hỗ trợ bộ vi xử lý này, số lượng sản phẩm cũng rất ít. Tuy nhiên tới thời điểm hiện nay, khi có thêm các chipset hỗ trợ bộ xử lý Xeon như E7500 và Serverworks GC, nhiều nhà sản xuất khác đã có sản phẩm hỗ trợ bộ xử lý Xeon. Đặc biệt SuperMicro đã gần như “bỏ rơi” Pentium III với việc cho ra đời tới hơn 20 loại motherboard hỗ trợ bộ xử lý Xeon, chứng tỏ Xeon với công nghệ siêu luồng là sự thay thế xứng đáng.
Tuy nhiên đối với đa số người dùng, nhất là người dùng máy tính để bàn thì công nghệ HT còn khá xa lạ. Bài viết này giúp các bạn hiểu rõ hơn về công nghệ siêu luồng, nhất là khi Intel chuẩn bị đưa ra bộ xử lý Pentium 4 dành cho desktop áp dụng công nghệ siêu luồng (tốc độ khởi điểm là 3,06GHz).
Công Nghệ Hyper--Threading Và Simultaneous Multi-Threading (Smt)
Intel phát triển SMT từ một công nghệ gốc có tên mã là Jackson, nó được giới thiệu tại diễn đàn các nhà phát triển Intel Development Forum với một cái tên gần gũi hơn là Hyper-Threading – công nghệ siêu luồng. Trước khi có thể hiểu về cách thức hoạt động của công nghệ này, chúng ta cần phải tìm hiểu cơ bản về nó, đặc biệt là về chuỗi lệnh và cách chúng hoạt động.
Cái gì làm cho một ứng dụng có thể chạy? Làm thế nào CPU biết các chỉ dẫn để thực hiện và thực hiện với dữ liệu nào? Tất cả những thông tin này có chứa trong mã biên dịch của ứng dụng mà bạn đang chạy mỗi khi bạn nạp ứng dụng đó vào. Û́ng dụng lần lượt gửi các chuỗi lệnh báo cho CPU biết phải làm gì để đáp ứng, và đối với CPU chuỗi lệnh sẽ là một tập các chỉ thị cần phải thực thi. CPU biết chính xác các chỉ thị này nằm ở đâu nhờ thanh ghi gọi là Program Counter (PC). PC luôn chỉ đến vị trí trong bộ nhớ nơi mà các chỉ thị cần thực hiện tiếp theo đã được lưu giữ, như vậy một khi chuỗi lệnh được gửi đến CPU thì địa chỉ trong bộ nhớ của chuỗi lệnh này đã được nạp sẵn vào PC, vì vậy CPU biết bắt đầu thực hiện từ đâu. Sau mỗi chỉ thị, PC sẽ tăng lên và quá trình tiếp tục đến hết chuỗi lệnh. Khi chuỗi lệnh được thực hiện xong, PC sẽ bị ghi đè bởi chỉ thị tiếp theo. Chuỗi lệnh có thể bị ngắt bởi một yêu cầu khác, khi đó CPU sẽ lưu giá trị hiện tại của PC trong ngăn xếp (stack) và nạp giá trị mới vào PC, tuy nhiên hạn chế là tại mỗi thời điểm chỉ có thể có duy nhất một chuỗi lệnh được thực thi. Một hướng giải quyết chung cho vấn đề này là sử dụng hai hay nhiều CPU, nếu tại mỗi thời điểm một CPU chỉ có thể thực thi một chuỗi lệnh thì hai hay nhiều CPU sẽ thực thi được hai hay nhiều chuỗi lệnh. Tuy vậy, lại có nhiều vấn đề nảy sinh với cách giải quyết này, trước hết là nhiều CPU sẽ tốn nhiều tiền, quan trọng hơn nữa là việc quản lý hai hay nhiều CPU để chúng chia sẻ tốt tài nguyên chung. Ví dụ, cho tới trước khi chipset AMD 760MP được đưa ra, tất cả các nền tảng x86 đa bộ xử lý chỉ hỗ trợ việc chia băng thông sẵn có giữa các CPU, điều quan trọng nhất là các ứng dụng và hệ điều hành cần phải có khả năng hỗ trợ tính năng này. Hiện nay, để giải quyết nhanh các chuỗi lệnh phức tạp, phần cứng nói chung phải nhờ vào phương án xử lý đa luồng, hệ điều hành phải hỗ trợ xử lý đa luồng, và phải tăng tốc độ một cách thật sự, giống như có nhiều bộ xử lý (trong hầu hết các trường hợp). Công nghệ siêu luồng của Intel giải quyết vấn đề bằng cách thực hiện nhiều hơn một chuỗi lệnh tại cùng một thời điểm.
Các bộ vi xử lý hoạt động không hiệu quả!
Thuật ngữ hiệu quả có vẻ như là một vòng luẩn quẩn, giống như con người chỉ sử dụng một phần nhỏ sức mạnh bộ não của mình, CPU cũng vậy.
Lấy Pentium 4 làm ví dụ, CPU này có tổng cộng 7 đơn vị thực thi, hai trong số đó có thể thực hiện hai vi lệnh mỗi xung nhịp (gọi là double pumped ALUs). Nhưng ngay cả như vậy thì bạn cũng không thể tìm được phần mềm nào tận dụng hết các đơn vị thực thi đó. Hầu hết các phần mềm cho máy tính cá nhân đang sử dụng chỉ làm việc với một ít phép tính số nguyên như nạp và lưu trữ mà không hề động đến đơn vị thực thi dấu chấm động. Còn một số phần mềm kiểu như Maya thì chỉ tập trung vào mỗi đơn vị xử lý dấu chấm động mà không sử dụng đến đơn vị xử lý số nguyên. Ngay cả ứng dụng chủ yếu sử dụng phép tính số nguyên cũng không tận dụng tất cả các đơn vị xử lý số nguyên, đặc biệt là đơn vị xử lý số nguyên “chậm”, một thành phần trong CPU chuyên dùng cho phép “dịch chuyển” hay “xoay”.
Để minh hoạ rõ hơn hãy thử đặt giả thiết một CPU với 3 đơn vị thực thi: một đơn vị số nguyên, một đơn vị dấu chấm động và một đơn vị nạp/lưu trữ (đơn vị dùng để đọc/ghi bộ nhớ). Giả sử CPU có thể thực hiện mọi lệnh trong vòng một chu kỳ xung nhịp và đồng thời giải quyết nhiều mệnh lệnh tới cả ba đơn vị thực thi. Bây giờ hãy đưa cho CPU một chuỗi lệnh như các chỉ dẫn sau đây:
1+1
10+1
Store Previous Result
Biểu đồ dưới đây sẽ giúp minh họa mức độ của các đơn vị thực thi, màu xám biểu thị đơn vị thực thi không sử dụng, màu xanh cho biết đơn vị thực thi hoạt động.
Bạn có thể thấy rằng trong mỗi xung nhịp sẽ chỉ có 33% trong số các đơn vị được sử dụng, và trong các phép toán này hoàn toàn không sử dụng đơn vị xử lý dấu chấm động FPU. Theo Intel thì hầu hết các mã lệnh IA-32 x86 chỉ sử dụng khoảng 35% số các đơn vị thực thi của Pentium 4.
Thử gửi một chuỗi lệnh khác đến các đơn vị thực thi của CPU, lần này là các lệnh tải, cộng và lưu trữ theo thứ tự:
Một lần nữa bạn thấy rằng cũng chỉ sử dụng có 33% số các đơn vị thực thi. Thuật toán xử lý song song mà chúng tôi cố gắng chỉ ra ở đây được gọi là ILP (instruction level parallelism), ở đó các chỉ dẫn phức tạp được thực hiện đồng thời bởi vì CPU có khả năng “điền đầy” các đơn vị xử lý song song, tức là có nhiều hơn 33% số đơn vị xử lý được sử dụng. Đáng tiếc là trên thực tế hầu hết các mã lệnh x86 không phải là ILP, vì vậy bạn phải tìm những cách khác để tăng hiệu quả. Ví dụ, hệ thống của bạn có 2 CPU và chúng có thể thực hiện các chuỗi lệnh đồng thời, cách này được biết đến như là xử lý song song theo luồng để tăng cường hiệu năng, tuy nhiên lại rất tốn kém.
Vậy có cách nào khác để sử dụng tốt hơn sức mạnh thực thi vốn có của bộ xử lý x86?
Giới Thiệu Công Nghệ Hyper---Threading
Có một vài nguyên nhân làm cho các đơn vị thực thi không được sử dụng thường xuyên. Nói chung, CPU không thể lấy dữ liệu nhanh như nó mong muốn do tắc nghẽn đường truyền (memory bus và front-side-bus), dẫn đến sự giảm sút hoạt động của các đơn vị thực thi. Ngoài ra, một nguyên nhân khác đã được đề cập là có quá ít ILP trong hầu hết các chuỗi lệnh thực thi.
Hiện thời cách mà đa số các nhà sản xuất CPU dùng để cải thiện hiệu năng trong các thế hệ CPU của họ là tăng tốc độ xung nhịp và tăng độ lớn của bộ nhớ đệm (cache). Nhưng cho dù cả hai cách này cùng được sử dụng thì vẫn không thực sự sử dụng hết được tiềm năng sẵn có của CPU. Nếu có cách nào đó cho phép thực thi được nhiều chuỗi lệnh đồng thời mới có thể tăng hiệu quả sử dụng tài nguyên của CPU. Đó chính là cái mà công nghệ siêu luồng của Intel đã làm được, bản chất của nó là chia sẻ tài nguyên để sử dụng hiệu quả hơn các đơn vị thực thi lệnh đã có sẵn trên các CPU đó.
Hyper threading - siêu luồng là một cái tên “tiếp thị” cho một công nghệ nằm ngoài “vương quốc” x86, là một phần nhỏ của SMT. Ý tưởng đằng sau SMT rất đơn giản: một CPU vật lý sẽ xuất hiện trên hệ điều hành như là hai CPU và hệ điều hành không thể phân biệt được. Trong cả hai trường hợp nhiệm vụ của hệ điều hành chỉ là gửi hai chuỗi lệnh tới “hai” CPU và phần cứng sẽ đảm nhiệm những công việc còn lại.
Trong các CPU sử dụng công nghệ Hyper-Threading, mỗi CPU logic sở hữu một tập các thanh ghi, kể cả thanh ghi đếm chương trình PC riêng (separate program counter), CPU vật lý sẽ luân phiên các giai đoạn tìm/giải mã giữa hai CPU logic và chỉ cố gắng thực thi những thao tác từ hai chuỗi lệnh đồng thời theo cách hướng tới những đơn vị thực thi ít được sử dụng.
Khi giới thiệu tại diễn đàn các nhà phát triển, công nghệ này được trình diễn trên bộ xử lý Xeon cùng với phần mềm dựng hình (rendering) của Maya, trong thí nghiệm đó một bộ xử lý Xeon với công nghệ siêu luồng đã chạy nhanh hơn 30% so với bộ xử lý Xeon thông thường. Lợi ích về tốc độ ấn tượng đến nỗi chẳng ai buồn để ý rằng thực tế công nghệ này đã có sẵn trên tất cả các lõi (nhân) của CPU Pentium 4 và Xeon, nhưng chỉ đơn giản là đã bị chính Intel vô hiệu hoá. Những ai đã mua CPU Xeon đời mới (0,13 micron) cho các workstation/server nên nâng cấp BIOS và có thể sẽ rất ngạc nhiên với tuỳ chọn thú vị: cho phép hay vô hiệu hoá Hyper-Threading. Hiện tại Intel đang mặc định vô hiệu hoá công nghệ này đối với các CPU dành cho máy tính để bàn, nhưng trong tương lai rất gần nó sẽ được kích hoạt bởi tuỳ chọn đặc biệt trong BIOS của các nhà sản xuất bo mẹ.
Có thể bạn sẽ hỏi rằng tại sao Intel lại mặc định vô hiệu hoá một công nghệ “hay” như vậy, tại sao nó lại không được sử dụng trong tất cả các bộ xử lý mới của Intel? Để có được câu trả lời, chúng ta hãy xem xét kỹ hơn.
Hyper----Threading: Không Phải Là Hoàn Hảo
Bạn còn nhớ ví dụ về hai chuỗi lệnh trước đây không? Bây giờ giả thiết rằng CPU đơn giản trước đây của bạn cũng có các đặc tính của Hyper-Threading và hãy xem cái gì sẽ xảy ra khi thực thi đồng thời hai chuỗi lệnh đó:
Những ô màu xanh thẫm hiển thị một chỉ dẫn từ chuỗi lệnh thứ nhất đang được thực hiện, trong khi những ô màu lá cây hiển thị một chỉ dẫn từ chuỗi lệnh thứ hai đang được thực hiện. Các ô màu xám hiển thị những đơn vị thực hiện không được sử dụng, trong khi các ô màu đỏ hiển thị xung đột khi mà cả hai chỉ dẫn đều cố gắng sử dụng cùng một đơn vị thực hiện.
Rõ ràng là không như bạn trông đợi, việc thực hiện song song hai chuỗi lệnh với công nghệ siêu luồng lại thực hiện chậm hơn so với một CPU thông thường. Nguyên nhân thật ra cực kỳ đơn giản: bạn đang cố gắng đồng thời thực hiện hai chuỗi lệnh quá đơn giản, tất cả đều là trùng lặp với lệnh add, load, store. Nếu bạn chạy các ứng dụng đòi hỏi nhiều năng lực tính toán động cùng với các ứng dụng số nguyên thì kết quả sẽ khác đi, vấn đề là bạn sử dụng ứng dụng loại nào nhiều hơn trên máy tính để bàn? Hiện tại các ứng dụng văn phòng trên máy tính để bàn hầu như chỉ sử dụng số nguyên (và trong tương lai chắc cũng vẫn chỉ sử dụng số nguyên). Vì vậy lợi ích mà công nghệ siêu luồng đem lại thấp (và đôi khi còn kém hơn không dùng công nghệ siêu luồng). Trên thực tế, nếu bạn kích hoạt tính năng “siêu luồng” trên máy tính desktop của mình, bạn có thể chẳng được gì ngoại trừ phải trả giá bằng việc giảm tốc độ tới 10%. Tuy nhiên người dùng các ứng dụng tính toán phức tạp (kiểu như rendering của Maya, 3DS) thì sẽ được hưởng lợi rất nhiều từ công nghệ này. Ngoài ra công nghệ này cũng tăng tốc đáng kể cho các máy chủ, nhất là các máy chủ web server.
Bạn có thể tham khảo kết quả khảo sát thử nghiệm của ETesting Labs:
www.intel.com/eBusiness/products/server/processor/Xeon/bm020902.htm.
Lợi Ích Của Công Nghệ Hyper----Threading
Có phải Intel đã tạo ra hyper-threading chỉ để cho các CPU máy chủ? Tất nhiên là không. Intel không định lãng phí bất kỳ không gian trống nào trong CPU của họ, kể cả trong trường hợp này. Thực ra kiến trúc NetBurst của Pentium 4 và Xeon hiện nay hoàn chỉnh với lõi SMT. Hãy quay trở lại ví dụ trước đây, giờ bạn cho nó thêm một đơn vị thực hiện - một ALU thứ 2 và thực hiện hai chuỗi lệnh trên:
Ái chà! Với một ALU thứ 2, xung đột duy nhất mà bạn gặp phải là lần lưu trữ cuối cùng. Bạn nên biết rằng CPU Pentium 4 được thiết kế với ba đơn vị số nguyên (hai ALU và một đơn vị xử lý số nguyên khác chậm hơn cho phép dịch/xoay). Quan trọng hơn nữa là mỗi ALU của Pentium 4 có thể thực hiện hai vi lệnh trong cùng một xung nhịp, nghĩa là trong hai chỉ dẫn add (phép cộng) mỗi chỉ dẫn có thể từ hai chuỗi lệnh khác nhau, được thực hiện đồng thời trong một xung nhịp duy nhất trên Pentium 4/Xeon.
Nhưng điều đó vẫn chưa giải quyết được vấn đề của bạn, cho thấy rằng việc tăng thêm các đơn vị xử lý để tăng hiệu quả với công nghệ siêu luồng lại tốn kém đứng từ quan điểm vật lý (sẽ phải làm cho CPU phình to ra với nhiều transistor hơn, tiêu tốn nhiều điện năng hơn; hoặc phải giảm kích thước CPU với các công nghệ chế tạo mới). Thay vào đó, Intel đang khuyến khích các nhà phát triển tối ưu hoá công nghệ Hyper-Threading. Chẳng hạn sử dụng lệnh “dừng” (HALT) một trong các bộ xử lý logic, như vậy sẽ tối đa được tốc độ cho các ứng dụng không sử dụng được công nghệ Hyper-Threading, CPU còn lại chỉ hoạt động như là hệ thống một CPU. Khi một ứng dụng có thể sử dụng lợi ích từ Hyper-Threading, bộ xử lý logic thứ hai lại tiếp tục được hoạt động.
Kết Luận
Mặc dù bạn cảm thấy rất bị thuyết phục khi công nghệ Hyper Threading hiện diện trên tất cả các nhân của CPU Pentium 4/Xeon hiện nay, nhưng nó không phải là tất cả những gì bạn mong muốn. Lý do đơn giản là công nghệ thường ở phía trước rất xa, trước khi người dùng có thể nhìn thấy được ưu điểm của nó trên các nền tảng, kể cả máy tính để bàn. Sự hỗ trợ của nhà phát triển rõ ràng có thể mở ra một hướng phát triển mạnh cho Pentium 4/Xeon và các bộ xử lý trong tương lai.
Dù còn nhiều hạn chế, Hyper Threading cũng đã làm được nhiều điều cho thị trường trước khi một bộ xử lý khác của AMD với hai nhân (dual-core) có tên gọi là Sledge Hammer ra đời. Cho tới khi những công nghệ mới như Bumpless Build-Up Layer Packaging hoàn thiện, chi phí để sản xuất CPU nhiều nhân có thể sẽ quá cao do sự phức tạp của công nghệ. Tuy nhiên bộ xử lý nhiều nhân hơn chắc chắn sẽ cho tốc độ cao hơn, vì trên thực tế chúng có nhiều đơn vị thực hiện hơn, tránh được những vấn đề mà hyper-threading đang gặp phải.
Trước mắt, bạn hãy tạm hài lòng với Hyper-Threading và chờ xem bao giờ thì Intel sẽ quyết định đưa các công nghệ này vào bộ xử lý cho máy để bàn.
nguồn pcworld.com.vn
Công nghệ siêu luồng cho phép các phần mềm ứng dụng được viết cho những máy chủ đa luồng có thể thực hiện các chỉ thị song song đồng thời trên mỗi bộ xử lý riêng, bằng cách này sẽ cải thiện tức thì tốc độ giao dịch cũng như thời gian đáp ứng và các yêu cầu đặc thù khác của phần mềm nghiệp vụ và thương mại điện tử. Công nghệ này tương thích với các phần mềm ứng dụng và hệ điều hành sẵn có trên các máy chủ, nó cho phép hỗ trợ nhiều người dùng hơn và tăng khối lượng công việc được xử lý trên một máy chủ. Với các máy trạm cao cấp, công nghệ siêu phân luồng cũng sẽ tăng đáng kể tốc độ các phần mềm ứng dụng đòi hỏi năng lực tính toán cao, ví dụ như phần mềm thiết kế 3 chiều, xử lý ảnh hay video… Trong thời gian tới sẽ xuất hiện ngày càng nhiều phần mềm được thiết kế đặc biệt và tối ưu hoá cho công nghệ này.
Từ tháng 1-2002, công nghệ siêu luồng đã được Intel đưa vào các bộ vi xử lý Xeon đời mới, khởi đầu với các bộ xử lý có tốc độ 1,8GHz và 2,0GHz với 512KB cache thứ cấp, sản xuất bằng công nghệ 0,13 micron (Xeon 1,7GHz, 1,8GHz, 2,0GHz với 256KB cache thứ cấp được sản xuất bằng công nghệ 0,18 không hỗ trợ siêu luồng). Tại thời điểm đầu tiên khi Intel giới thiệu bộ xử lý Xeon cùng với chipset 860, chỉ có một số rất ít các nhà sản xuất hàng đầu như IBM, Compaq, Dell, SuperMicro, Tyan… hỗ trợ bộ vi xử lý này, số lượng sản phẩm cũng rất ít. Tuy nhiên tới thời điểm hiện nay, khi có thêm các chipset hỗ trợ bộ xử lý Xeon như E7500 và Serverworks GC, nhiều nhà sản xuất khác đã có sản phẩm hỗ trợ bộ xử lý Xeon. Đặc biệt SuperMicro đã gần như “bỏ rơi” Pentium III với việc cho ra đời tới hơn 20 loại motherboard hỗ trợ bộ xử lý Xeon, chứng tỏ Xeon với công nghệ siêu luồng là sự thay thế xứng đáng.
Tuy nhiên đối với đa số người dùng, nhất là người dùng máy tính để bàn thì công nghệ HT còn khá xa lạ. Bài viết này giúp các bạn hiểu rõ hơn về công nghệ siêu luồng, nhất là khi Intel chuẩn bị đưa ra bộ xử lý Pentium 4 dành cho desktop áp dụng công nghệ siêu luồng (tốc độ khởi điểm là 3,06GHz).
Công Nghệ Hyper--Threading Và Simultaneous Multi-Threading (Smt)
Intel phát triển SMT từ một công nghệ gốc có tên mã là Jackson, nó được giới thiệu tại diễn đàn các nhà phát triển Intel Development Forum với một cái tên gần gũi hơn là Hyper-Threading – công nghệ siêu luồng. Trước khi có thể hiểu về cách thức hoạt động của công nghệ này, chúng ta cần phải tìm hiểu cơ bản về nó, đặc biệt là về chuỗi lệnh và cách chúng hoạt động.
Cái gì làm cho một ứng dụng có thể chạy? Làm thế nào CPU biết các chỉ dẫn để thực hiện và thực hiện với dữ liệu nào? Tất cả những thông tin này có chứa trong mã biên dịch của ứng dụng mà bạn đang chạy mỗi khi bạn nạp ứng dụng đó vào. Û́ng dụng lần lượt gửi các chuỗi lệnh báo cho CPU biết phải làm gì để đáp ứng, và đối với CPU chuỗi lệnh sẽ là một tập các chỉ thị cần phải thực thi. CPU biết chính xác các chỉ thị này nằm ở đâu nhờ thanh ghi gọi là Program Counter (PC). PC luôn chỉ đến vị trí trong bộ nhớ nơi mà các chỉ thị cần thực hiện tiếp theo đã được lưu giữ, như vậy một khi chuỗi lệnh được gửi đến CPU thì địa chỉ trong bộ nhớ của chuỗi lệnh này đã được nạp sẵn vào PC, vì vậy CPU biết bắt đầu thực hiện từ đâu. Sau mỗi chỉ thị, PC sẽ tăng lên và quá trình tiếp tục đến hết chuỗi lệnh. Khi chuỗi lệnh được thực hiện xong, PC sẽ bị ghi đè bởi chỉ thị tiếp theo. Chuỗi lệnh có thể bị ngắt bởi một yêu cầu khác, khi đó CPU sẽ lưu giá trị hiện tại của PC trong ngăn xếp (stack) và nạp giá trị mới vào PC, tuy nhiên hạn chế là tại mỗi thời điểm chỉ có thể có duy nhất một chuỗi lệnh được thực thi. Một hướng giải quyết chung cho vấn đề này là sử dụng hai hay nhiều CPU, nếu tại mỗi thời điểm một CPU chỉ có thể thực thi một chuỗi lệnh thì hai hay nhiều CPU sẽ thực thi được hai hay nhiều chuỗi lệnh. Tuy vậy, lại có nhiều vấn đề nảy sinh với cách giải quyết này, trước hết là nhiều CPU sẽ tốn nhiều tiền, quan trọng hơn nữa là việc quản lý hai hay nhiều CPU để chúng chia sẻ tốt tài nguyên chung. Ví dụ, cho tới trước khi chipset AMD 760MP được đưa ra, tất cả các nền tảng x86 đa bộ xử lý chỉ hỗ trợ việc chia băng thông sẵn có giữa các CPU, điều quan trọng nhất là các ứng dụng và hệ điều hành cần phải có khả năng hỗ trợ tính năng này. Hiện nay, để giải quyết nhanh các chuỗi lệnh phức tạp, phần cứng nói chung phải nhờ vào phương án xử lý đa luồng, hệ điều hành phải hỗ trợ xử lý đa luồng, và phải tăng tốc độ một cách thật sự, giống như có nhiều bộ xử lý (trong hầu hết các trường hợp). Công nghệ siêu luồng của Intel giải quyết vấn đề bằng cách thực hiện nhiều hơn một chuỗi lệnh tại cùng một thời điểm.
Các bộ vi xử lý hoạt động không hiệu quả!
Thuật ngữ hiệu quả có vẻ như là một vòng luẩn quẩn, giống như con người chỉ sử dụng một phần nhỏ sức mạnh bộ não của mình, CPU cũng vậy.
Lấy Pentium 4 làm ví dụ, CPU này có tổng cộng 7 đơn vị thực thi, hai trong số đó có thể thực hiện hai vi lệnh mỗi xung nhịp (gọi là double pumped ALUs). Nhưng ngay cả như vậy thì bạn cũng không thể tìm được phần mềm nào tận dụng hết các đơn vị thực thi đó. Hầu hết các phần mềm cho máy tính cá nhân đang sử dụng chỉ làm việc với một ít phép tính số nguyên như nạp và lưu trữ mà không hề động đến đơn vị thực thi dấu chấm động. Còn một số phần mềm kiểu như Maya thì chỉ tập trung vào mỗi đơn vị xử lý dấu chấm động mà không sử dụng đến đơn vị xử lý số nguyên. Ngay cả ứng dụng chủ yếu sử dụng phép tính số nguyên cũng không tận dụng tất cả các đơn vị xử lý số nguyên, đặc biệt là đơn vị xử lý số nguyên “chậm”, một thành phần trong CPU chuyên dùng cho phép “dịch chuyển” hay “xoay”.
Để minh hoạ rõ hơn hãy thử đặt giả thiết một CPU với 3 đơn vị thực thi: một đơn vị số nguyên, một đơn vị dấu chấm động và một đơn vị nạp/lưu trữ (đơn vị dùng để đọc/ghi bộ nhớ). Giả sử CPU có thể thực hiện mọi lệnh trong vòng một chu kỳ xung nhịp và đồng thời giải quyết nhiều mệnh lệnh tới cả ba đơn vị thực thi. Bây giờ hãy đưa cho CPU một chuỗi lệnh như các chỉ dẫn sau đây:
1+1
10+1
Store Previous Result
Biểu đồ dưới đây sẽ giúp minh họa mức độ của các đơn vị thực thi, màu xám biểu thị đơn vị thực thi không sử dụng, màu xanh cho biết đơn vị thực thi hoạt động.
Bạn có thể thấy rằng trong mỗi xung nhịp sẽ chỉ có 33% trong số các đơn vị được sử dụng, và trong các phép toán này hoàn toàn không sử dụng đơn vị xử lý dấu chấm động FPU. Theo Intel thì hầu hết các mã lệnh IA-32 x86 chỉ sử dụng khoảng 35% số các đơn vị thực thi của Pentium 4.
Thử gửi một chuỗi lệnh khác đến các đơn vị thực thi của CPU, lần này là các lệnh tải, cộng và lưu trữ theo thứ tự:
Một lần nữa bạn thấy rằng cũng chỉ sử dụng có 33% số các đơn vị thực thi. Thuật toán xử lý song song mà chúng tôi cố gắng chỉ ra ở đây được gọi là ILP (instruction level parallelism), ở đó các chỉ dẫn phức tạp được thực hiện đồng thời bởi vì CPU có khả năng “điền đầy” các đơn vị xử lý song song, tức là có nhiều hơn 33% số đơn vị xử lý được sử dụng. Đáng tiếc là trên thực tế hầu hết các mã lệnh x86 không phải là ILP, vì vậy bạn phải tìm những cách khác để tăng hiệu quả. Ví dụ, hệ thống của bạn có 2 CPU và chúng có thể thực hiện các chuỗi lệnh đồng thời, cách này được biết đến như là xử lý song song theo luồng để tăng cường hiệu năng, tuy nhiên lại rất tốn kém.
Vậy có cách nào khác để sử dụng tốt hơn sức mạnh thực thi vốn có của bộ xử lý x86?
Giới Thiệu Công Nghệ Hyper---Threading
Có một vài nguyên nhân làm cho các đơn vị thực thi không được sử dụng thường xuyên. Nói chung, CPU không thể lấy dữ liệu nhanh như nó mong muốn do tắc nghẽn đường truyền (memory bus và front-side-bus), dẫn đến sự giảm sút hoạt động của các đơn vị thực thi. Ngoài ra, một nguyên nhân khác đã được đề cập là có quá ít ILP trong hầu hết các chuỗi lệnh thực thi.
Hiện thời cách mà đa số các nhà sản xuất CPU dùng để cải thiện hiệu năng trong các thế hệ CPU của họ là tăng tốc độ xung nhịp và tăng độ lớn của bộ nhớ đệm (cache). Nhưng cho dù cả hai cách này cùng được sử dụng thì vẫn không thực sự sử dụng hết được tiềm năng sẵn có của CPU. Nếu có cách nào đó cho phép thực thi được nhiều chuỗi lệnh đồng thời mới có thể tăng hiệu quả sử dụng tài nguyên của CPU. Đó chính là cái mà công nghệ siêu luồng của Intel đã làm được, bản chất của nó là chia sẻ tài nguyên để sử dụng hiệu quả hơn các đơn vị thực thi lệnh đã có sẵn trên các CPU đó.
Hyper threading - siêu luồng là một cái tên “tiếp thị” cho một công nghệ nằm ngoài “vương quốc” x86, là một phần nhỏ của SMT. Ý tưởng đằng sau SMT rất đơn giản: một CPU vật lý sẽ xuất hiện trên hệ điều hành như là hai CPU và hệ điều hành không thể phân biệt được. Trong cả hai trường hợp nhiệm vụ của hệ điều hành chỉ là gửi hai chuỗi lệnh tới “hai” CPU và phần cứng sẽ đảm nhiệm những công việc còn lại.
Trong các CPU sử dụng công nghệ Hyper-Threading, mỗi CPU logic sở hữu một tập các thanh ghi, kể cả thanh ghi đếm chương trình PC riêng (separate program counter), CPU vật lý sẽ luân phiên các giai đoạn tìm/giải mã giữa hai CPU logic và chỉ cố gắng thực thi những thao tác từ hai chuỗi lệnh đồng thời theo cách hướng tới những đơn vị thực thi ít được sử dụng.
Khi giới thiệu tại diễn đàn các nhà phát triển, công nghệ này được trình diễn trên bộ xử lý Xeon cùng với phần mềm dựng hình (rendering) của Maya, trong thí nghiệm đó một bộ xử lý Xeon với công nghệ siêu luồng đã chạy nhanh hơn 30% so với bộ xử lý Xeon thông thường. Lợi ích về tốc độ ấn tượng đến nỗi chẳng ai buồn để ý rằng thực tế công nghệ này đã có sẵn trên tất cả các lõi (nhân) của CPU Pentium 4 và Xeon, nhưng chỉ đơn giản là đã bị chính Intel vô hiệu hoá. Những ai đã mua CPU Xeon đời mới (0,13 micron) cho các workstation/server nên nâng cấp BIOS và có thể sẽ rất ngạc nhiên với tuỳ chọn thú vị: cho phép hay vô hiệu hoá Hyper-Threading. Hiện tại Intel đang mặc định vô hiệu hoá công nghệ này đối với các CPU dành cho máy tính để bàn, nhưng trong tương lai rất gần nó sẽ được kích hoạt bởi tuỳ chọn đặc biệt trong BIOS của các nhà sản xuất bo mẹ.
Có thể bạn sẽ hỏi rằng tại sao Intel lại mặc định vô hiệu hoá một công nghệ “hay” như vậy, tại sao nó lại không được sử dụng trong tất cả các bộ xử lý mới của Intel? Để có được câu trả lời, chúng ta hãy xem xét kỹ hơn.
Hyper----Threading: Không Phải Là Hoàn Hảo
Bạn còn nhớ ví dụ về hai chuỗi lệnh trước đây không? Bây giờ giả thiết rằng CPU đơn giản trước đây của bạn cũng có các đặc tính của Hyper-Threading và hãy xem cái gì sẽ xảy ra khi thực thi đồng thời hai chuỗi lệnh đó:
Những ô màu xanh thẫm hiển thị một chỉ dẫn từ chuỗi lệnh thứ nhất đang được thực hiện, trong khi những ô màu lá cây hiển thị một chỉ dẫn từ chuỗi lệnh thứ hai đang được thực hiện. Các ô màu xám hiển thị những đơn vị thực hiện không được sử dụng, trong khi các ô màu đỏ hiển thị xung đột khi mà cả hai chỉ dẫn đều cố gắng sử dụng cùng một đơn vị thực hiện.
Rõ ràng là không như bạn trông đợi, việc thực hiện song song hai chuỗi lệnh với công nghệ siêu luồng lại thực hiện chậm hơn so với một CPU thông thường. Nguyên nhân thật ra cực kỳ đơn giản: bạn đang cố gắng đồng thời thực hiện hai chuỗi lệnh quá đơn giản, tất cả đều là trùng lặp với lệnh add, load, store. Nếu bạn chạy các ứng dụng đòi hỏi nhiều năng lực tính toán động cùng với các ứng dụng số nguyên thì kết quả sẽ khác đi, vấn đề là bạn sử dụng ứng dụng loại nào nhiều hơn trên máy tính để bàn? Hiện tại các ứng dụng văn phòng trên máy tính để bàn hầu như chỉ sử dụng số nguyên (và trong tương lai chắc cũng vẫn chỉ sử dụng số nguyên). Vì vậy lợi ích mà công nghệ siêu luồng đem lại thấp (và đôi khi còn kém hơn không dùng công nghệ siêu luồng). Trên thực tế, nếu bạn kích hoạt tính năng “siêu luồng” trên máy tính desktop của mình, bạn có thể chẳng được gì ngoại trừ phải trả giá bằng việc giảm tốc độ tới 10%. Tuy nhiên người dùng các ứng dụng tính toán phức tạp (kiểu như rendering của Maya, 3DS) thì sẽ được hưởng lợi rất nhiều từ công nghệ này. Ngoài ra công nghệ này cũng tăng tốc đáng kể cho các máy chủ, nhất là các máy chủ web server.
Bạn có thể tham khảo kết quả khảo sát thử nghiệm của ETesting Labs:
www.intel.com/eBusiness/products/server/processor/Xeon/bm020902.htm.
Lợi Ích Của Công Nghệ Hyper----Threading
Có phải Intel đã tạo ra hyper-threading chỉ để cho các CPU máy chủ? Tất nhiên là không. Intel không định lãng phí bất kỳ không gian trống nào trong CPU của họ, kể cả trong trường hợp này. Thực ra kiến trúc NetBurst của Pentium 4 và Xeon hiện nay hoàn chỉnh với lõi SMT. Hãy quay trở lại ví dụ trước đây, giờ bạn cho nó thêm một đơn vị thực hiện - một ALU thứ 2 và thực hiện hai chuỗi lệnh trên:
Ái chà! Với một ALU thứ 2, xung đột duy nhất mà bạn gặp phải là lần lưu trữ cuối cùng. Bạn nên biết rằng CPU Pentium 4 được thiết kế với ba đơn vị số nguyên (hai ALU và một đơn vị xử lý số nguyên khác chậm hơn cho phép dịch/xoay). Quan trọng hơn nữa là mỗi ALU của Pentium 4 có thể thực hiện hai vi lệnh trong cùng một xung nhịp, nghĩa là trong hai chỉ dẫn add (phép cộng) mỗi chỉ dẫn có thể từ hai chuỗi lệnh khác nhau, được thực hiện đồng thời trong một xung nhịp duy nhất trên Pentium 4/Xeon.
Nhưng điều đó vẫn chưa giải quyết được vấn đề của bạn, cho thấy rằng việc tăng thêm các đơn vị xử lý để tăng hiệu quả với công nghệ siêu luồng lại tốn kém đứng từ quan điểm vật lý (sẽ phải làm cho CPU phình to ra với nhiều transistor hơn, tiêu tốn nhiều điện năng hơn; hoặc phải giảm kích thước CPU với các công nghệ chế tạo mới). Thay vào đó, Intel đang khuyến khích các nhà phát triển tối ưu hoá công nghệ Hyper-Threading. Chẳng hạn sử dụng lệnh “dừng” (HALT) một trong các bộ xử lý logic, như vậy sẽ tối đa được tốc độ cho các ứng dụng không sử dụng được công nghệ Hyper-Threading, CPU còn lại chỉ hoạt động như là hệ thống một CPU. Khi một ứng dụng có thể sử dụng lợi ích từ Hyper-Threading, bộ xử lý logic thứ hai lại tiếp tục được hoạt động.
Kết Luận
Mặc dù bạn cảm thấy rất bị thuyết phục khi công nghệ Hyper Threading hiện diện trên tất cả các nhân của CPU Pentium 4/Xeon hiện nay, nhưng nó không phải là tất cả những gì bạn mong muốn. Lý do đơn giản là công nghệ thường ở phía trước rất xa, trước khi người dùng có thể nhìn thấy được ưu điểm của nó trên các nền tảng, kể cả máy tính để bàn. Sự hỗ trợ của nhà phát triển rõ ràng có thể mở ra một hướng phát triển mạnh cho Pentium 4/Xeon và các bộ xử lý trong tương lai.
Dù còn nhiều hạn chế, Hyper Threading cũng đã làm được nhiều điều cho thị trường trước khi một bộ xử lý khác của AMD với hai nhân (dual-core) có tên gọi là Sledge Hammer ra đời. Cho tới khi những công nghệ mới như Bumpless Build-Up Layer Packaging hoàn thiện, chi phí để sản xuất CPU nhiều nhân có thể sẽ quá cao do sự phức tạp của công nghệ. Tuy nhiên bộ xử lý nhiều nhân hơn chắc chắn sẽ cho tốc độ cao hơn, vì trên thực tế chúng có nhiều đơn vị thực hiện hơn, tránh được những vấn đề mà hyper-threading đang gặp phải.
Trước mắt, bạn hãy tạm hài lòng với Hyper-Threading và chờ xem bao giờ thì Intel sẽ quyết định đưa các công nghệ này vào bộ xử lý cho máy để bàn.
nguồn pcworld.com.vn
LeQuocKhanh-11H1010059- Tổng số bài gửi : 59
Join date : 16/02/2012
Age : 36
Đến từ : HCM
phân tích nguyên lý tập luồng.Cho ví dụ minh họa ?
Tập luồng (Thread Pools):
-Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
- Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
- Khi tiến trình cha (ví dụ Web Server) nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
- Phục vụ xong, luồng được đưa trả về tập luồng.
- Nếu số yêu cầu lớn hơn số luồng trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
Ví dụ:
Trong một doanh trai quân đội, sẽ có một tướng chỉ huy (tiến trình cha) và sẽ có một đội quân (tập luồng).
Đội quân này sẽ sẳn sàng chiến đầu khi có mệnh lệnh (sẵn sàng chờ công việc).
Khi có một tên địch đột nhập, Tướng lĩnh sẽ điều binh sĩ 1 (một luồng) đi bắt tên địch (một luồng được đánh thức và đưa vào vận hành).
Trong khi đó, lại có thêm một tên địch khác đột nhập (nhận thêm một yêu cầu), Tướng lĩnh sẽ điều binh sĩ 2 (một luồng) đi bắt địch (một luồng khác được đánh thức và đưa vào vận hành).
Sau khi bắt địch xong, binh sĩ sẽ trở về doanh trại (luồng được trả về tập luồng)
-Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
- Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
- Khi tiến trình cha (ví dụ Web Server) nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
- Phục vụ xong, luồng được đưa trả về tập luồng.
- Nếu số yêu cầu lớn hơn số luồng trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
Ví dụ:
Trong một doanh trai quân đội, sẽ có một tướng chỉ huy (tiến trình cha) và sẽ có một đội quân (tập luồng).
Đội quân này sẽ sẳn sàng chiến đầu khi có mệnh lệnh (sẵn sàng chờ công việc).
Khi có một tên địch đột nhập, Tướng lĩnh sẽ điều binh sĩ 1 (một luồng) đi bắt tên địch (một luồng được đánh thức và đưa vào vận hành).
Trong khi đó, lại có thêm một tên địch khác đột nhập (nhận thêm một yêu cầu), Tướng lĩnh sẽ điều binh sĩ 2 (một luồng) đi bắt địch (một luồng khác được đánh thức và đưa vào vận hành).
Sau khi bắt địch xong, binh sĩ sẽ trở về doanh trại (luồng được trả về tập luồng)
Giải thích các hàm trong bài toán sản xuất tiêu thụ ?
- Hàm GetCurrentThread() : dùng để lấy về mục quản của luồng hiện hành (mục quản: là con số do hệ điều hành cấp cho luồng được tạo).
- Hàm SuspendThread() : dùng để tạm ngưng công việc của luồng với mục quản cho trước.
- Hàm Sleep() : dùng để ngủ 1 số milli giây cho trước, hết khoảng thời gian đó, luồng lại làm việc tiếp.
- Hàm GetTickCount() : dùng để lấy số milli giây trôi qua kể từ khi hệ điều hành khởi động cho đến thời điểm gọi hàm này.
- Hàm ResumeThread() : dùng để tiếp tục công việc (đánh thức) của luồng với mục quản cho trước.
- Hàm CloseHandle() : dùng để hủy đối tượng (trong đó có luồng) với mục quản cho trước.
vd: CLoseHandle (45) : luồng 45 không làm việc nữa,bị đóng lại
- Hàm SuspendThread() : dùng để tạm ngưng công việc của luồng với mục quản cho trước.
- Hàm Sleep() : dùng để ngủ 1 số milli giây cho trước, hết khoảng thời gian đó, luồng lại làm việc tiếp.
- Hàm GetTickCount() : dùng để lấy số milli giây trôi qua kể từ khi hệ điều hành khởi động cho đến thời điểm gọi hàm này.
- Hàm ResumeThread() : dùng để tiếp tục công việc (đánh thức) của luồng với mục quản cho trước.
- Hàm CloseHandle() : dùng để hủy đối tượng (trong đó có luồng) với mục quản cho trước.
vd: CLoseHandle (45) : luồng 45 không làm việc nữa,bị đóng lại
Trang 4 trong tổng số 9 trang • 1, 2, 3, 4, 5, 6, 7, 8, 9
Trang 4 trong tổng số 9 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết