Thảo luận Bài 5
+72
LeThanhQuang (I22B)
NguyenTrongTinh(I22A)
MaiNguyenThanhLong(I22A)
QuangMinhTuan(I22B)
NguyenThiMai(I22A)
NguyenThiNgocPhuoc(122A)
LeNgocTung (I22A)
LETHIANHDAO48(I22B)
lekhanhhoa(I22B)
NguyenVanQuoc (I22B)
HaTrungMinhPhuc(I22B)
NguyenBaoLoc70(I22A)
PhamThiThao (I22B)
DuongKhanhThanh(I22B)
nguyenhoanglam_I22B
phungvanduong24(I12A)
tranngochuy(I22B)
NguyenCaoDuong(I22B)
phanthanhcan(I22A)
DuongTrungQuan
tranvanminh82(I22A)
NguyenKhanhDuy18 (I22B)
TranQuangTien(I22A)
NguyenNgocDan(I22B)
TrỉnhToQuyen(I12A)
vivanbieu(I22B)
VanNhatDongGiang(I22A)
NguyenVanSang(I22A)
TranThienTam (I22A)
NguyenPhuongNhu(I22B)
HuynhHuuTai(I22A)
Dao Duy Thanh(I22B)
NguyenVanTu(I22A)
dangvannhan(I22A)
NguyenVanPhat(I22B)
TruongTranThanhTu(I22B)
VoMinhThang(I22B)
VoMinhDien(I22B)
MaiXuanSon (I22B)
NguyenHuuMinh80(I22B)
dangthihoangly(I12A)
NguyenTienDat (I22A)
truongtph.i11c
NguyenHoangThien(I22B)
TranDangKhoa(I22A)
LeThiKimNgan67(I11C)
TranVuSang (I22B)
HongGiaPhu (I22A)
BuiTrongHung41(I11C)
NgT.KimHuyen(I22A)
PhamXuanThieu (I22A)
LêAnhNgữ(I22A)
nguyenthithutrang (I11C)
PhamQuocCuong (I22A)
NguyenHuuThien159 (I22B)
BuiThucTuan(I22B)
cat
NguyenBacHoi(I22B)
NguyenNhatHuy64(I22B)
LeAnhToan48(I22B)
NguyenTanDat(I22B)
dangmonghai(I12A)
NguyenManhHuy(I22B)
NgoVanTuyen(I22B)
NguyenHoangKimVu (I11C)
ChauQuangCam (I22B)
NguyenQuocHuy (I22B)
NguyenQuangHuy(I22B)
NguyenThanhQuoc(I22A)
HuynhDucQuang(I22B)
HoangThanhThien(I22B)
Admin
76 posters
Trang 7 trong tổng số 8 trang
Trang 7 trong tổng số 8 trang • 1, 2, 3, 4, 5, 6, 7, 8
Trình bày nguyên lý tập luồng và 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 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.
- Khi phục vụ xong, luồng sẽ đượ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 thì tiến trình cha sẽ chờ đến khi có luồng được giải phóng.
* Ưu điểm: Đáp ứng yêu cầu nhanh hơn.
* Nhược điểm: Tốn RAM.
* VD minh họa:
- Duy trì đội quân 100.000 lính được đào tạo kỹ càng (mặc sẵn áo giáp, cầm súng, luôn ở tư thế sẵn sàng) ---> khi có cuộc tấn công thì đưa lính vào chiến đấu sẽ nhanh hơn và dễ thắng trận hơn.
- Sinh viên phải tự rèn luyện kiến thức cho mình những lúc rãnh để đáp ứng cho nhu cầu công việc của mình sau này chứ không phải đợi đến lúc có việc rồi mới rèn luyện kiến thức, tay nghề.
- 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.
- Khi phục vụ xong, luồng sẽ đượ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 thì tiến trình cha sẽ chờ đến khi có luồng được giải phóng.
* Ưu điểm: Đáp ứng yêu cầu nhanh hơn.
* Nhược điểm: Tốn RAM.
* VD minh họa:
- Duy trì đội quân 100.000 lính được đào tạo kỹ càng (mặc sẵn áo giáp, cầm súng, luôn ở tư thế sẵn sàng) ---> khi có cuộc tấn công thì đưa lính vào chiến đấu sẽ nhanh hơn và dễ thắng trận hơn.
- Sinh viên phải tự rèn luyện kiến thức cho mình những lúc rãnh để đáp ứng cho nhu cầu công việc của mình sau này chứ không phải đợi đến lúc có việc rồi mới rèn luyện kiến thức, tay nghề.
NguyenThiNgocPhuoc(122A)- Tổng số bài gửi : 15
Join date : 21/03/2013
Nguyên lý tập nguồn và ứng dụng
Tập luồng (thread pools): là luồng chính sẽ tạo ra những luồng có sẵn (nhưng chưa có công việc) và được nằm trong RAM và bị đánh thức bất kỳ lúc nào, sau khi thực hiện xong các công việc, các luồng được trả về tập luồng để thực hiện các yêu cầu khác khi có nhu cầu.
Ví dụ: Một lệnh được gởi đến SQL Server để truy vấn cơ sở dữ liệu (select, insert, delete, drop database,...), sau quá trình thực hiện các câu truy vấn, dữ liệu được trả về bảng khác nhưng dữ liệu trước khi truy vấn trở về trạng thái ban đầu để thực thi các công việc khác. Được xét trong trường hợp hiển thị chứ không thực hiện thay đổi, chỉnh sửa dữ liệu.
Admin
Dữ liệu hay Luồng ? Ví dụ trên rất tối nghĩa !
Ví dụ: Một lệnh được gởi đến SQL Server để truy vấn cơ sở dữ liệu (select, insert, delete, drop database,...), sau quá trình thực hiện các câu truy vấn, dữ liệu được trả về bảng khác nhưng dữ liệu trước khi truy vấn trở về trạng thái ban đầu để thực thi các công việc khác. Được xét trong trường hợp hiển thị chứ không thực hiện thay đổi, chỉnh sửa dữ liệu.
Admin
Dữ liệu hay Luồng ? Ví dụ trên rất tối nghĩa !
TranDangKhoa(I22A)- Tổng số bài gửi : 32
Join date : 10/03/2013
Age : 33
Đến từ : Lớp I22A
Re: Thảo luận Bài 5
Trình bày và so sánh khái niệm luồng với tiến trình.Cho biết những lợi ích của công nghệ đa nguồn
- 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.
- 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ụ.
- 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.
- 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.
- 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.
- 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ụ.
- 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.
- 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.
NguyenThiMai(I22A)- Tổng số bài gửi : 32
Join date : 28/03/2013
Re: Thảo luận Bài 5
Trình bày nguyên lý tập luồng và ứng dụ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 lĩnh (tiến trình cha) và sẽ có một đội binh nằm chờ lệnh(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, 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 nằm chờ lệnh(luồng được trả về tập luồng)
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 lĩnh (tiến trình cha) và sẽ có một đội binh nằm chờ lệnh(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, 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 nằm chờ lệnh(luồng được trả về tập luồng)
NguyenThiMai(I22A)- Tổng số bài gửi : 32
Join date : 28/03/2013
Re: Thảo luận Bài 5
TranDangKhoa(I22A) đã viết:Tập luồng (thread pools): là luồng chính sẽ tạo ra những luồng có sẵn (nhưng chưa có công việc) và được nằm trong RAM và bị đánh thức bất kỳ lúc nào, sau khi thực hiện xong các công việc, các luồng được trả về tập luồng để thực hiện các yêu cầu khác khi có nhu cầu.
Ví dụ: Một lệnh được gởi đến SQL Server để truy vấn cơ sở dữ liệu (select, insert, delete, drop database,...), sau quá trình thực hiện các câu truy vấn, dữ liệu được trả về bảng khác nhưng dữ liệu trước khi truy vấn trở về trạng thái ban đầu để thực thi các công việc khác. Được xét trong trường hợp hiển thị chứ không thực hiện thay đổi, chỉnh sửa dữ liệu.
Admin
Dữ liệu hay Luồng ? Ví dụ trên rất tối nghĩa !
Em chào Thầy, em cảm ơn vì Thầy đã góp ý bài viết của em. Em có thể giải thích thêm về ý của em để nhận được sự góp ý của Thầy cũng như các bạn trong Hai lớp I22A và I22B.
Về phần khái niệm Khoa đã trình bày ở trên, còn đối với ví dụ, mình xin nói thêm ý của mình:
Ví dụ như chúng ta đã có một cơ sở dữ liệu về thông tin sinh viên (bao gồm tên sinh viên, mã số sinh viên, lớp, ngày tháng năm sinh, địa chỉ, điện thoại,...)
Sau đó, chúng ta sẽ dùng tạo một bảng mới (để lọc ra theo điều kiện của sinh viên. Ví dụ như bấm vào nút lệnh "Lọc theo lớp" là:I22A), công việc tạo bảng này chưa có giá trị nên có thể hình dung, đây là công việc tạo những luồng rỗng và chờ dữ liệu từ bảng chính (thông tin từ danh sách các sinh viên).
Khi thực hiện nhấn vào nút lệnh "Lọc theo lớp" thì các ô trống từ bảng mới vừa khởi tạo, dữ liệu sau khi truy vấn lại tiếp tục "đỗ vào" các ô trống này, có thể hình dung đó là những tập luồng chứa dữ liệu mới. Thông tin được đưa vào các ô trống trên các dòng (record) không chỉ một sinh viên có cùng lớp học (I22A) mà có thể chứa nhiều sinh viên đang học trong lớp I22A. ta có thể hình dung nó như là một tập các luồng hay tập luồng
Cũng xin nói thêm là: Các giá trị ở đây chỉ minh họa cho luồng và tập luồng. Và các luồng và tập luồng được tạo lập thật chất đang được thể hiện rõ qua lệnh: CREATE TABLE và SELECT, còn đối với lệnh show() chỉ hiện thị kết quả các giá trị để người dùng tiện theo dõi.
Một số ví dụ mình đã đưa ví dụ từ trang trước, các bạn có thể tham khảo thử rồi thảo luận với mình tại thread "Thảo luận chương 5" nha:
https://hedieuhanh.forumvi.com/t5333p45-topic#25758
TranDangKhoa(I22A)- Tổng số bài gửi : 32
Join date : 10/03/2013
Age : 33
Đến từ : Lớp I22A
So sánh luồng và quá trình.
Định nghĩa
Quá trình (process) 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ư quá 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 quá trình.
Mục đích
Cả quá trình và luồng đều 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.
Đó là lý do tại sao lập trình viên cần chia những gì chương trình phải làm thành quá trình và luồng.
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, quá 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ó
Để phục vụ nhiều người dùng, một quá trình có thể cần phải phân nhánh, hay tạo bản sao của chính nó để tạo ra một quá trình con. Cũng giống như quá trình mẹ, quá trình con cũng có không gian địa chỉ và tiến trình điều khiển riêng. Tuy nhiên, thường thì khi quá trình mẹ chấm dứt, mọi quá trình con mà nó khởi động cũng sẽ tự động chấm dứt.
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.
CPU hiện đại có bộ quản lý bộ nhớ (memory management unit – MMU) để ngăn bất kỳ quá trình nào vi phạm không gian bộ nhớ của quá trình khác. Chuyển từ một quá trình này sang quá trình khác – được gọi là chuyển ngữ cảnh – có nghĩa là lập trình lại MMU để chỉ đến không gian địa chỉ khác cùng với việc lưu và phục hồi thông tin của một quá trình. Hệ điều hành chịu trách nhiệm quản lý chi tiết của việc chuyển ngữ cảnh nhưng nó cũng tiêu tốn thời gian của CPU. Do mỗi quá trình đều được cách ly với những quá trình khác, giao tiếp giữa các quá trình đòi hỏi phải có những chức năng đặc biệt. Tương tự việc chuyển ngữ cảnh, truyền thông giữa các quá trình cũng chiếm thời gian của bộ xử lý.
Tất cả thời gian trên sẽ cộng dồn lên khi nhiều chương trình chạy cùng lúc hay khi có nhiều người dùng mà mỗi người đều yêu cầu chạy nhiều quá trình cũng lúc. Càng nhiều quá trình chạy thì càng tốn nhiều thời gian của CPU và hệ điều hành để thực hiện công việc chuyển ngữ cảnh.
Nếu số quá trình đủ nhiều, máy chủ có thể phải dành toàn bộ thời gian để thực hiện việc chuyển đổi giữa các quá trình mà không thể thực sự xử lý được công việc nào.
Phân Luồng
Để tránh tình trạng trên, lập trình viên có thể dùng luồng (thread). Luồng cũng giống một quá trình con, ngoại trừ đặc điểm là mọi luồng kết hợp với một quá trình nào đó chia sẻ cùng không gian địa chỉ.
Ví dụ, nếu có nhiều người dùng cùng chương trình, lập trình viên có thể viết ứng dụng sao cho ứng với mỗi người dùng sẽ có một luồng mới được tạo ra.
Mỗi luồng có tiến trình kiểm soát riêng nhưng nó lại chia sẻ cùng không gian địa chỉ và hầu hết dữ liệu với tất cả luồng khác chạy trong cùng quá trình. Đối với từng người dùng có thể nói rằng chương trình dường như chỉ chạy cho một mình họ.
Ư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ý.
Quá trình (process) 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ư quá 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 quá trình.
Mục đích
Cả quá trình và luồng đều 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.
Đó là lý do tại sao lập trình viên cần chia những gì chương trình phải làm thành quá trình và luồng.
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, quá 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ó
Để phục vụ nhiều người dùng, một quá trình có thể cần phải phân nhánh, hay tạo bản sao của chính nó để tạo ra một quá trình con. Cũng giống như quá trình mẹ, quá trình con cũng có không gian địa chỉ và tiến trình điều khiển riêng. Tuy nhiên, thường thì khi quá trình mẹ chấm dứt, mọi quá trình con mà nó khởi động cũng sẽ tự động chấm dứt.
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.
CPU hiện đại có bộ quản lý bộ nhớ (memory management unit – MMU) để ngăn bất kỳ quá trình nào vi phạm không gian bộ nhớ của quá trình khác. Chuyển từ một quá trình này sang quá trình khác – được gọi là chuyển ngữ cảnh – có nghĩa là lập trình lại MMU để chỉ đến không gian địa chỉ khác cùng với việc lưu và phục hồi thông tin của một quá trình. Hệ điều hành chịu trách nhiệm quản lý chi tiết của việc chuyển ngữ cảnh nhưng nó cũng tiêu tốn thời gian của CPU. Do mỗi quá trình đều được cách ly với những quá trình khác, giao tiếp giữa các quá trình đòi hỏi phải có những chức năng đặc biệt. Tương tự việc chuyển ngữ cảnh, truyền thông giữa các quá trình cũng chiếm thời gian của bộ xử lý.
Tất cả thời gian trên sẽ cộng dồn lên khi nhiều chương trình chạy cùng lúc hay khi có nhiều người dùng mà mỗi người đều yêu cầu chạy nhiều quá trình cũng lúc. Càng nhiều quá trình chạy thì càng tốn nhiều thời gian của CPU và hệ điều hành để thực hiện công việc chuyển ngữ cảnh.
Nếu số quá trình đủ nhiều, máy chủ có thể phải dành toàn bộ thời gian để thực hiện việc chuyển đổi giữa các quá trình mà không thể thực sự xử lý được công việc nào.
Phân Luồng
Để tránh tình trạng trên, lập trình viên có thể dùng luồng (thread). Luồng cũng giống một quá trình con, ngoại trừ đặc điểm là mọi luồng kết hợp với một quá trình nào đó chia sẻ cùng không gian địa chỉ.
Ví dụ, nếu có nhiều người dùng cùng chương trình, lập trình viên có thể viết ứng dụng sao cho ứng với mỗi người dùng sẽ có một luồng mới được tạo ra.
Mỗi luồng có tiến trình kiểm soát riêng nhưng nó lại chia sẻ cùng không gian địa chỉ và hầu hết dữ liệu với tất cả luồng khác chạy trong cùng quá trình. Đối với từng người dùng có thể nói rằng chương trình dường như chỉ chạy cho một mình họ.
Ư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ý.
QuangMinhTuan(I22B)- Tổng số bài gửi : 17
Join date : 08/03/2013
Phân biệt khái niện luồng với tiến trình. Và trình bày những lợi ích của công nghệ đa luồng
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 I22A đ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.
• 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 I22A đ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.
MaiNguyenThanhLong(I22A)- Tổng số bài gửi : 16
Join date : 13/03/2013
Lập trình đa luồng trong windows
• Windows sử dụng các hàm trong thư viện Win32 API.
• Ứng dụng Windows vận hành như một tiến trình với 1 hoặc nhiều luồng.
• Bài toán Sản xuất-Tiêu thụ có thể được thực thi bằng Ứng dụng đa luồng (Visual C++ 6.0).
• Nhận độ ưu tiên của luồng bằng hàm: int GetThreadPriority (HANDLE threadHandle)
• Thay đổi độ ưu tiên của luồng bằng hàm:BOOL SetThreadPriority (HANDLE threadHandle, int priority)
Với độ ưu tiên priority:
THREAD_PRIORITY_LOWEST ( -2)
THREAD_PRIORITY_BELOW_NORMAL ( -1)
THREAD_PRIORITY_NORMAL ( 0 )
THREAD_PRIORITY_ABOVE_NORMAL (+1)
THREAD_PRIORITY_HIGHEST (+2)
• Có thể lập trình đa luồng với Visual Basic 6.0:
. Sản xuất – Tiêu thụ
. Animations
. Colors
//
• Ứng dụng Windows vận hành như một tiến trình với 1 hoặc nhiều luồng.
• Bài toán Sản xuất-Tiêu thụ có thể được thực thi bằng Ứng dụng đa luồng (Visual C++ 6.0).
• Nhận độ ưu tiên của luồng bằng hàm: int GetThreadPriority (HANDLE threadHandle)
• Thay đổi độ ưu tiên của luồng bằng hàm:BOOL SetThreadPriority (HANDLE threadHandle, int priority)
Với độ ưu tiên priority:
THREAD_PRIORITY_LOWEST ( -2)
THREAD_PRIORITY_BELOW_NORMAL ( -1)
THREAD_PRIORITY_NORMAL ( 0 )
THREAD_PRIORITY_ABOVE_NORMAL (+1)
THREAD_PRIORITY_HIGHEST (+2)
• Có thể lập trình đa luồng với Visual Basic 6.0:
. Sản xuất – Tiêu thụ
. Animations
. Colors
//
MaiNguyenThanhLong(I22A)- Tổng số bài gửi : 16
Join date : 13/03/2013
Khái niệm luồng và ví dụ minh họa
Luồng: còn được gọi là 1 tiến trình nhẹ, nằm bên trong các tiến trình lớn. Có thể nói chúng là một đơn vị nhò sử dụng cpu. Chúng có thông tin về trạng thái như một tiến trình truyền thống.
VD1: Các bạn đi trên đường một chiều thì một chiều đó chình là một luồng hay 1 tiến trình, nhưng trong luồng đó người ta phân ra các luồng nhỏ hơn đó là các làn xe ô tô, xe tải, xe máy, và đi bộ. Các làn đó được gọi là một luồng hay 1 tiến trình nhẹ.
VD2: Trong công ty các bạn có : Sếp, thư kí, kế toán, nhân viên văn phòng...... Thì công ty là một luồng lớn hay 1 tiến trình để sản xuất là một sản phẩm gì đó vd như cơ khí, còn những cá thể trong công ty sẽ là một luồng hay một tiến trình nhẹ để xử lý các công việc khác nhau.......
VD1: Các bạn đi trên đường một chiều thì một chiều đó chình là một luồng hay 1 tiến trình, nhưng trong luồng đó người ta phân ra các luồng nhỏ hơn đó là các làn xe ô tô, xe tải, xe máy, và đi bộ. Các làn đó được gọi là một luồng hay 1 tiến trình nhẹ.
VD2: Trong công ty các bạn có : Sếp, thư kí, kế toán, nhân viên văn phòng...... Thì công ty là một luồng lớn hay 1 tiến trình để sản xuất là một sản phẩm gì đó vd như cơ khí, còn những cá thể trong công ty sẽ là một luồng hay một tiến trình nhẹ để xử lý các công việc khác nhau.......
NguyenTrongTinh(I22A)- Tổng số bài gửi : 31
Join date : 11/03/2013
Age : 33
Đến từ : BR-VT
Mục đích đồng bộ hóa công việc các tiến trình
• Đảm bảo tính nhất quán của tài nguyên dùng chung.
• Tránh được hiện tượng Deadlock (Hiện tượng kẹt tiến trình) .
ví dụ : bạn a lên bản viết một lá đơn phần họ tên ghi là nguyễn văn a và phần ký tên là lê văn b. lúc sau đó bạn b lên bảng sửa lại phần ký tên cho đúng là nguyễn văn a. lúc đó phái dưới lớp có bạn c lấy máy ảnh chụp lại cái bảng đang lúc bạn b đang sửa lại phần ký tên mới gi là nguyễn văn, dẫn đến nội dung sai lệch, không hoàn chỉnh và thiếu nhất quán. đáng lẽ bạn c phải chờ bạn b thực hiện song công việc là sửa phần ký tên là nguyễn văn a song rồi mới chụp thì nội dung mới đúng.
NguyenTrongTinh(I22A)- Tổng số bài gửi : 31
Join date : 11/03/2013
Age : 33
Đến từ : BR-VT
NGUYÊN LÝ TẬP LUỒNG VÀ VÍ DỤ MINH HỌA
-Tập luồng(Thread pools): khi một luồng chính tạo ra tập luồng (tập luồng bao gồm nhiều luồng con sẵn sàn chờ công việc được giao )
-Khi tiến trình cha nhận được yêu cầu công việc , thì 1 luồng con trong tập được đánh thức và đưa vào vận hành .
-vận hành xong luồng con sẽ được trả về tập luồng .
-Nếu số yêu cầu lớn hơn số luồng trong tập luồng, tiến trình cha sẽ chờ đến khi có luồng được giải phóng .
VD:
Trong một trung tâm bảo hành xe máy trong đó có nhiều nhân viên bảo hành (mỗi nhân viên là một luồng con), số nhân viên tương ứng với số luồng trong tập luồng.
- Và ở ngoài cửa có một nhân viên tiếp tân có nhiệm vụ đón nhận xe vào bảo hành và phân công cho nhân viên bảo hành làm nhiệm vụ của mình (nhân viên tiếp tân chính là CPU điều phối).
- Khi có khách hàng nhân viên bảo hành sẽ nhận được sự phân công của nhân viên tiếp tân (luồng được đánh thức và đưa vào vận hành) khi nhân viên bảo hành hoàn thành xong việc của mình thì được nghỉ (lúc này luồng được đưa vào trạng thái ngủ như lúc ban đầu).
- Nếu trường hợp lượng khách hàng đến quá đông vượt quá số lượng nhân viên của trung tâm thì nhân viên tiếp tân chờ cho một trong những nhân nhân viên bảo hành làm xong việc của mình rồi mới tiếp tục phân công tiếp (CPU chờ luồng con được giải phóng)
-Khi tiến trình cha nhận được yêu cầu công việc , thì 1 luồng con trong tập được đánh thức và đưa vào vận hành .
-vận hành xong luồng con sẽ được trả về tập luồng .
-Nếu số yêu cầu lớn hơn số luồng trong tập luồng, tiến trình cha sẽ chờ đến khi có luồng được giải phóng .
VD:
Trong một trung tâm bảo hành xe máy trong đó có nhiều nhân viên bảo hành (mỗi nhân viên là một luồng con), số nhân viên tương ứng với số luồng trong tập luồng.
- Và ở ngoài cửa có một nhân viên tiếp tân có nhiệm vụ đón nhận xe vào bảo hành và phân công cho nhân viên bảo hành làm nhiệm vụ của mình (nhân viên tiếp tân chính là CPU điều phối).
- Khi có khách hàng nhân viên bảo hành sẽ nhận được sự phân công của nhân viên tiếp tân (luồng được đánh thức và đưa vào vận hành) khi nhân viên bảo hành hoàn thành xong việc của mình thì được nghỉ (lúc này luồng được đưa vào trạng thái ngủ như lúc ban đầu).
- Nếu trường hợp lượng khách hàng đến quá đông vượt quá số lượng nhân viên của trung tâm thì nhân viên tiếp tân chờ cho một trong những nhân nhân viên bảo hành làm xong việc của mình rồi mới tiếp tục phân công tiếp (CPU chờ luồng con được giải phóng)
LeThanhQuang (I22B)- Tổng số bài gửi : 15
Join date : 16/03/2013
Câu 2: Trình bày nguyên lý tâp luồng? cho ví dụ minh họa
- 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 lĩnh (tiến trình cha) và sẽ 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, 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).
* Bài tập về tạo, đánh thức và tạm ngừng luồng
HANDLE ProducerHandle[30 ] ;
HANDLE ConsumerHandle[30 ] ;
DWORD ProducerID[ 30]; // cấp ID cho sản phẩm được tạo mới
DWORD ConsumerID[30 ];
for ( int i = 0 ; i < 30 ; i ++)
{
//các tập luồng này sau khi khởi tạo sẽ ngủ và chờ được đánh thức
ProducerHandle[ i ]=CreateThread(Producer, 4, &ProducerID[i]);
ConsumerHandle[ i ]=CreateThread(Consumer, 0, &ConsumerID[i]));
}
// 2. Đánh thức các luồng
for ( int i = 0 ; i < 30 ; i ++)
{
//các tập luồng này sau khi khởi tạo sẽ chạy ngay
ResumeThread ( ProducerHandle[ i ] );
ResumeThread ( ConsumerHandle[ i ]
}
// 3. Tạm ngừng
for ( int i = 0 ; i < 30 ; i ++)
{
SuspendThread(ProducerHandle[ i ]);
SuspendThread(ConsumerHandle[ i ]);
}
- 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 lĩnh (tiến trình cha) và sẽ 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, 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).
* Bài tập về tạo, đánh thức và tạm ngừng luồng
HANDLE ProducerHandle[30 ] ;
HANDLE ConsumerHandle[30 ] ;
DWORD ProducerID[ 30]; // cấp ID cho sản phẩm được tạo mới
DWORD ConsumerID[30 ];
for ( int i = 0 ; i < 30 ; i ++)
{
//các tập luồng này sau khi khởi tạo sẽ ngủ và chờ được đánh thức
ProducerHandle[ i ]=CreateThread(Producer, 4, &ProducerID[i]);
ConsumerHandle[ i ]=CreateThread(Consumer, 0, &ConsumerID[i]));
}
// 2. Đánh thức các luồng
for ( int i = 0 ; i < 30 ; i ++)
{
//các tập luồng này sau khi khởi tạo sẽ chạy ngay
ResumeThread ( ProducerHandle[ i ] );
ResumeThread ( ConsumerHandle[ i ]
}
// 3. Tạm ngừng
for ( int i = 0 ; i < 30 ; i ++)
{
SuspendThread(ProducerHandle[ i ]);
SuspendThread(ConsumerHandle[ i ]);
}
NguyenVanQuoc (I22B)- Tổng số bài gửi : 25
Join date : 12/03/2013
Câu 1: Phân tích những đặc điểm của luồng? So sánh với khái niệm đa 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ĐH hỗ trợ?
- Luồng còn gọi là tiến trình 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.
- So sánh:
+ Giống: Điề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 1 chương trình. Dùng chung tài nguyên từ tiến trinh( hoặc luồng ) cha. Cùng có chức năng xử lý song song. Tăng tốc tính toán. Đảm bảo tính đơn thể.
+ Khác: Do các luồng cùng vận hành cũng 1 địa chỉ vì vậy dể dùng chung tài nguyên hơn đa tiến trình( VD: mượn đồ trong nhà thì dể hơn mượn đồ của hàng xóm láng giềng ). Do các 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 và ít chiếm tài nguyên hơn tiến trình( VD: việc ngăn ra riêng ra 1 phòng thì nhanh hơn là chờ nhà nước cấp cho 1 căn hộ ). Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng. Lập trình đa luồng thì dể hơn lập trình đa tiến trình.
- 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.
- So sánh:
+ Giống: Điề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 1 chương trình. Dùng chung tài nguyên từ tiến trinh( hoặc luồng ) cha. Cùng có chức năng xử lý song song. Tăng tốc tính toán. Đảm bảo tính đơn thể.
+ Khác: Do các luồng cùng vận hành cũng 1 địa chỉ vì vậy dể dùng chung tài nguyên hơn đa tiến trình( VD: mượn đồ trong nhà thì dể hơn mượn đồ của hàng xóm láng giềng ). Do các 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 và ít chiếm tài nguyên hơn tiến trình( VD: việc ngăn ra riêng ra 1 phòng thì nhanh hơn là chờ nhà nước cấp cho 1 căn hộ ). Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng. Lập trình đa luồng thì dể hơn lập trình đa tiến trình.
- 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.
NguyenVanQuoc (I22B)- Tổng số bài gửi : 25
Join date : 12/03/2013
Có những mô hình đa luồng nào?
-Mô hình Many – to – One là nhiều User level threads được ánh xạ vào một Kernel Thread.Việc quản lý được thực hiện ở User Level, khi có một thread bị block thì toàn bộ các Process cũng bị block theo.
-Mô hình One – to – One là mỗi User level thread được gắn với một Kernel thread. Khi có một user thread mới được tạo ra thì cũng cần tạo một Kernel thread tương ứng, lúc này chi phí quá lớn.
-Mô hình Many – to – Many nhiều User level thread được phân chia ánh xạ vào một số Kernel thread. Tránh được các khuyết điếm của 2 mô hình trên
-Mô hình One – to – One là mỗi User level thread được gắn với một Kernel thread. Khi có một user thread mới được tạo ra thì cũng cần tạo một Kernel thread tương ứng, lúc này chi phí quá lớn.
-Mô hình Many – to – Many nhiều User level thread được phân chia ánh xạ vào một số Kernel thread. Tránh được các khuyết điếm của 2 mô hình trên
LeThiKimNgan67(I11C)- Tổng số bài gửi : 23
Join date : 26/02/2013
Bai 5: Đa luồng
Luồng người dùng và luồng nhân
•Luồng người dùng: được hỗ trợ dưới nhân và được cài đặt bởi thư viện luồng tại cấp người dùng. Thư viện cung cấp hỗ trợ cho việc tạo luồng, lập thời biểu, và quản lý mà không có sự hỗ trợ từ nhân. Vì nhân không biết các luồng cấp người dùng, tất cả việc tạo luồng và lập thời biểu được thực hiện trong không gian người dùng mà không cần sự can thiệp của nhân. Do đó, các luồng cấp người dùng thường tạo và quản lý nhanh, tuy nhiên chúng cũng có những trở ngại. Thí dụ, nếu nhân là đơn luồng thì bất cứ luồng cấp người dùng thực hiện một lời gọi hệ thống nghẽn sẽ làm cho toàn bộ quá trình bị nghẽn, thậm chí nếu các luồng khác sẳn dùng để chạy trong ứng dụng. Các thư viện luồng người dùng gồm các luồng POSIX Pthreads, Mach C-threads và Solaris 2 UI-threads.
• Luồng nhân: được hỗ trợ trực tiếp bởi hệ điều hành. Nhân thực hiện việc tạo luồng, lập thời biểu, và quản lý không gian nhân. Vì quản lý luồng được thực hiện bởi hệ điều hành, luồng nhân thường tạo và quản lý chậm hơn luồng người dùng. Tuy nhiên, vì nhân được quản lý các luồng nếu một luồng thực hiện lời gọi hệ thống nghẽn, nhân có thể lập thời biểu một luồng khác trong ứng dụng thực thi. Trong môi trường đa xử lý, nhân có thể lập thời biểu luồng trên một bộ xử lý khác. Hầu hết các hệ điều hành hiện nay như Windows NT, Windows 2000, Solaris 2, BeOS và Tru64 UNIX (trước Digital UNIX)-hỗ trợ các luồng nhân.
•Luồng người dùng: được hỗ trợ dưới nhân và được cài đặt bởi thư viện luồng tại cấp người dùng. Thư viện cung cấp hỗ trợ cho việc tạo luồng, lập thời biểu, và quản lý mà không có sự hỗ trợ từ nhân. Vì nhân không biết các luồng cấp người dùng, tất cả việc tạo luồng và lập thời biểu được thực hiện trong không gian người dùng mà không cần sự can thiệp của nhân. Do đó, các luồng cấp người dùng thường tạo và quản lý nhanh, tuy nhiên chúng cũng có những trở ngại. Thí dụ, nếu nhân là đơn luồng thì bất cứ luồng cấp người dùng thực hiện một lời gọi hệ thống nghẽn sẽ làm cho toàn bộ quá trình bị nghẽn, thậm chí nếu các luồng khác sẳn dùng để chạy trong ứng dụng. Các thư viện luồng người dùng gồm các luồng POSIX Pthreads, Mach C-threads và Solaris 2 UI-threads.
• Luồng nhân: được hỗ trợ trực tiếp bởi hệ điều hành. Nhân thực hiện việc tạo luồng, lập thời biểu, và quản lý không gian nhân. Vì quản lý luồng được thực hiện bởi hệ điều hành, luồng nhân thường tạo và quản lý chậm hơn luồng người dùng. Tuy nhiên, vì nhân được quản lý các luồng nếu một luồng thực hiện lời gọi hệ thống nghẽn, nhân có thể lập thời biểu một luồng khác trong ứng dụng thực thi. Trong môi trường đa xử lý, nhân có thể lập thời biểu luồng trên một bộ xử lý khác. Hầu hết các hệ điều hành hiện nay như Windows NT, Windows 2000, Solaris 2, BeOS và Tru64 UNIX (trước Digital UNIX)-hỗ trợ các luồng nhân.
TranAnhTam(I22B)- Tổng số bài gửi : 19
Join date : 28/03/2013
Khái niệm luồng và đa luồng
1/Khái niệm luồng:Luồng là một dòng điều khiển trong phạm vi một quá trình, một luồng thường được gọi là tiến trình nhẹ, là một đơn vị cơ bản cho việc sử dụng CPU, thành phần luồng: định danh luồng, một bộ đếm chương trình, tập thanh ghi, ngăn xếp và được chia sẻ với các luồng khác qua phần mã, phần dữ liệu và tài nguyên .
-Ví dụ: Trong cơ thể con người, bộ não (Tiến trình cấp trên ) làm nhiệm vụ tổng hợp thông tin từ các giác quan, sau đó đưa ra các tín hiệu điều khiển đến từng phần trên cơ thể (tiến trình cấp dưới) và từng phần cơ thể lại có những phần nhỏ (tiến trình nhỏ hay luồng) hơn cùng làm nhiệm vụ, như cánh tay thì có các ngón tay.
2/Khái niệm đa luồng: Là sự tồn tại song song nhiều dòng điều khiển khác nhau trong cùng không gian địa chỉ.
Lợi ích đa luồng: đáp ứng nhanh đối với người dùng, chia sẻ tài nguyên, tính kinh tế và khả năng thuận lợi trong kiến trúc đa xử lý.
-Ví dụ: Trong cơ thể con người, bộ não (Tiến trình cấp trên ) làm nhiệm vụ tổng hợp thông tin từ các giác quan, sau đó đưa ra các tín hiệu điều khiển đến từng phần trên cơ thể (tiến trình cấp dưới) và từng phần cơ thể lại có những phần nhỏ (tiến trình nhỏ hay luồng) hơn cùng làm nhiệm vụ, như cánh tay thì có các ngón tay.
2/Khái niệm đa luồng: Là sự tồn tại song song nhiều dòng điều khiển khác nhau trong cùng không gian địa chỉ.
Lợi ích đa luồng: đáp ứng nhanh đối với người dùng, chia sẻ tài nguyên, tính kinh tế và khả năng thuận lợi trong kiến trúc đa xử lý.
LeVanVan (I22B)- Tổng số bài gửi : 12
Join date : 10/03/2013
Re: Thảo luận Bài 5
Luồng Solaris 2
Solaris 2 là một ấn bản của UNIX với hỗ trợ luồng tại cấp độ nhân và cấp độ người dùng, đa xử lý đối xứng (SMP) và định thời thời thực. Solaris 2 cài đặt Pthread API hỗ trợ luồng cấp người dùng với thư viện chứa APIs cho việc tạo và quản lý luồng (được gọi luồng UI). Sự khác nhau giữa hai thư viện này rất lớn, mặc dù hầu hết người phát triển hiện nay chọn thư viện Pthread. Solaris 2 cũng định nghĩa một cấp độ luồng trung gian. Giữa luồng cấp nhân và cấp người dùng là các quá trình nhẹ (lightweight process- LWPs). Mỗi quá trình chứa ít nhất một LWP. Thư viện luồng đa hợp luồng người dùng trên nhóm LWP cho quá trình và chỉ luồng cấp người dùng hiện được nối kết tới một LWP hoàn thành công việc. Các luồng còn lại bị khoá hoặc chờ cho một LWP mà chúng có thể thực thi trên nó.
Luồng cấp nhân chuẩn thực thi tất cả thao tác trong nhân. Mỗi LWP có một luồng cấp nhân, và một số luồng cấp nhân (kernel) chạy trên một phần của nhân và không có LWP kèm theo (thí dụ, một luồng phục vụ yêu cầu đĩa ). Các luồng cấp nhân chỉ là những đối tượng được định thời trong hệ thống.Solaris 2 cài mô hình nhiều-nhiều.
Các luồng cấp người dùng có thể giới hạn hay không giới hạn. Một luồng cấp người dùng giới hạn được gán vĩnh viễn tới một LWP. Chỉ luồng đó chạy trên LWP và yêu cầu LWP có thể được tận hiến tới một bộ xử lý đơn (xem luồng trái nhất trong hình trên). Liên kết một luồng có ích trong trường hợp yêu cầu thời gian đáp ứng nhanh, như ứng dụng thời thực. Một luồng không giới hạn gán vĩnh viễn tới bất kỳ LWP nào. Tất cả các luồng không giới hạn được đa hợp trong một nhóm cac LWP sẳn dùng cho ứng dụng. Các luồng không giới hạn là mặc định. Solaris 8 cũng cung cấp một thư viện luồng thay đổi mà mặc định chúng liên kết tới tất cả các luồng với một LWP.
Xem xét hệ thống trong hoạt động: bất cứ một quá trình nào có thể có nhiều luồng người dùng. Các luồng cấp người dùng này có thể được định thời và chuyển đổi giữa LWPs bởi thư viện luồng không có sự can thiệp của nhân. Các luồng cấp người dùng cực kỳ hiệu quả vì không có sự hỗ trợ nhân được yêu cầu cho việc tạo hay huỷ, hay thư viện luồng chuyển ngữ cảnh từ luồng người dùng này sang luồng khác.
Mỗi LWP được nối kết tới chính xác một luồng cấp nhân, ngược lại mỗi luồng cấp người dùng là độc lập với nhân. Nhiều LWPs có thể ở trong một quá trình, nhưng chúng được yêu cầu chỉ khi luồng cần giao tiếp với một nhân. Thí dụ, một LWP được yêu cầu mỗi luồng có thể khoá đồng hành trong lời gọi hệ thống. Xem xét năm tập tin khác nhau-đọc các yêu cầu xảy ra cùng một lúc. Sau đó, năm LWPs được yêu cầu vì chúng đang chờ hoàn thành nhập/xuất trong nhân. Nếu một tác vụ chỉ có bốn LWPs thì yêu cầu thứ năm sẽ không phải chờ một trong những LWPs để trả về từ nhân. Bổ sung một LWP thứ sáu sẽ không đạt được gì nếu chỉ có đủ công việc cho năm.
Các luồng nhân được định thời bởi bộ lập thời biểu của nhân và thực thi trên một hay nhiều CPU trong hệ thống. Nếu một luồng nhân khoá (trong khi chờ một thao tác nhập/xuất hoàn thành), thì bộ xử lý rảnh để thực thi luồng nhân khác. Nếu một luồng bị khoá đang chạy trên một phần của LWP thì LWP cũng khoá. Ở trên vòng, luồng cấp người dùng hiện được gán tới LWP cũng bị khoá. Nếu một quá trình có nhiều hơn một LWP thì nhân có thể định thời một LWP khác.
Thư viện luồng tự động thay đổi số lượng LWPs trong nhóm để đảm bảo năng lực thực hiện tốt nhất cho ứng dụng. Thí dụ, nếu tất cả LWPs trong một quá trình bị khoá bởi những luồng có thể chạy thì thư viện tự tạo một LWP khác được gán tới một luồng đang chờ. Do đó, một chương trình được ngăn chặn từ một chương trình khác bởi sự nghèo nàn của những LWPs không bị khoá. LWPs là những tài nguyên nhân đắt để duy trì nếu chúng không được dùng. Thư viện luồng “ages” LWPs và xoá chúng khi chúng không được dùng cho khoảng thời gian dài, điển hình khoảng 5 phút.
Các nhà phát triển dùng những cấu trúc dữ liệu cài đặt luồng trên Solaris 2:
• Luồng cấp người dùng chứa một luồng ID; tập thanh ghi (gồm một bộ đếm chương trình và con trỏ ngăn xếp); ngăn xếp; và độ ưu tiên (được dùng bởi thư viện cho mục đích định thời). Không có cấu trúc dữ liệu nào là tài nguyên nhân; tất cả chúng tồn tại trong không gian người dùng.
• Một LWP có một tập thanh ghi cho luồng cấp nhân nó đang chạy cũng như bộ nhớ và thông tin tính toán. Một LWP là một cấu trúc dữ liệu nhân và nó nằm trong không gian nhân
• Một luồng nhân chỉ có một cấu trúc dữ liệu nhân và ngăn xếp. Cấu trúc dữ liệu gồm bản sao các thanh ghi nhân, con trỏ tới LWP mà nó được gán, độ ưu tiên và thông tin định thời.
Mỗi quá trình trong Solaris 2 gồm nhiều thông tin được mô tả trong khối điều khiển quá trình (Process Control Block-PCB ). Trong thực tế, một quá trình Solaris 2 chứa một định danh quá trình (Process ID-PID); bản đồ bộ nhớ; danh sách các tập tin đang mở, độ ưu tiên; và con trỏ của các luồng nhân vơi quá trình.
Solaris 2 là một ấn bản của UNIX với hỗ trợ luồng tại cấp độ nhân và cấp độ người dùng, đa xử lý đối xứng (SMP) và định thời thời thực. Solaris 2 cài đặt Pthread API hỗ trợ luồng cấp người dùng với thư viện chứa APIs cho việc tạo và quản lý luồng (được gọi luồng UI). Sự khác nhau giữa hai thư viện này rất lớn, mặc dù hầu hết người phát triển hiện nay chọn thư viện Pthread. Solaris 2 cũng định nghĩa một cấp độ luồng trung gian. Giữa luồng cấp nhân và cấp người dùng là các quá trình nhẹ (lightweight process- LWPs). Mỗi quá trình chứa ít nhất một LWP. Thư viện luồng đa hợp luồng người dùng trên nhóm LWP cho quá trình và chỉ luồng cấp người dùng hiện được nối kết tới một LWP hoàn thành công việc. Các luồng còn lại bị khoá hoặc chờ cho một LWP mà chúng có thể thực thi trên nó.
Luồng cấp nhân chuẩn thực thi tất cả thao tác trong nhân. Mỗi LWP có một luồng cấp nhân, và một số luồng cấp nhân (kernel) chạy trên một phần của nhân và không có LWP kèm theo (thí dụ, một luồng phục vụ yêu cầu đĩa ). Các luồng cấp nhân chỉ là những đối tượng được định thời trong hệ thống.Solaris 2 cài mô hình nhiều-nhiều.
Các luồng cấp người dùng có thể giới hạn hay không giới hạn. Một luồng cấp người dùng giới hạn được gán vĩnh viễn tới một LWP. Chỉ luồng đó chạy trên LWP và yêu cầu LWP có thể được tận hiến tới một bộ xử lý đơn (xem luồng trái nhất trong hình trên). Liên kết một luồng có ích trong trường hợp yêu cầu thời gian đáp ứng nhanh, như ứng dụng thời thực. Một luồng không giới hạn gán vĩnh viễn tới bất kỳ LWP nào. Tất cả các luồng không giới hạn được đa hợp trong một nhóm cac LWP sẳn dùng cho ứng dụng. Các luồng không giới hạn là mặc định. Solaris 8 cũng cung cấp một thư viện luồng thay đổi mà mặc định chúng liên kết tới tất cả các luồng với một LWP.
Xem xét hệ thống trong hoạt động: bất cứ một quá trình nào có thể có nhiều luồng người dùng. Các luồng cấp người dùng này có thể được định thời và chuyển đổi giữa LWPs bởi thư viện luồng không có sự can thiệp của nhân. Các luồng cấp người dùng cực kỳ hiệu quả vì không có sự hỗ trợ nhân được yêu cầu cho việc tạo hay huỷ, hay thư viện luồng chuyển ngữ cảnh từ luồng người dùng này sang luồng khác.
Mỗi LWP được nối kết tới chính xác một luồng cấp nhân, ngược lại mỗi luồng cấp người dùng là độc lập với nhân. Nhiều LWPs có thể ở trong một quá trình, nhưng chúng được yêu cầu chỉ khi luồng cần giao tiếp với một nhân. Thí dụ, một LWP được yêu cầu mỗi luồng có thể khoá đồng hành trong lời gọi hệ thống. Xem xét năm tập tin khác nhau-đọc các yêu cầu xảy ra cùng một lúc. Sau đó, năm LWPs được yêu cầu vì chúng đang chờ hoàn thành nhập/xuất trong nhân. Nếu một tác vụ chỉ có bốn LWPs thì yêu cầu thứ năm sẽ không phải chờ một trong những LWPs để trả về từ nhân. Bổ sung một LWP thứ sáu sẽ không đạt được gì nếu chỉ có đủ công việc cho năm.
Các luồng nhân được định thời bởi bộ lập thời biểu của nhân và thực thi trên một hay nhiều CPU trong hệ thống. Nếu một luồng nhân khoá (trong khi chờ một thao tác nhập/xuất hoàn thành), thì bộ xử lý rảnh để thực thi luồng nhân khác. Nếu một luồng bị khoá đang chạy trên một phần của LWP thì LWP cũng khoá. Ở trên vòng, luồng cấp người dùng hiện được gán tới LWP cũng bị khoá. Nếu một quá trình có nhiều hơn một LWP thì nhân có thể định thời một LWP khác.
Thư viện luồng tự động thay đổi số lượng LWPs trong nhóm để đảm bảo năng lực thực hiện tốt nhất cho ứng dụng. Thí dụ, nếu tất cả LWPs trong một quá trình bị khoá bởi những luồng có thể chạy thì thư viện tự tạo một LWP khác được gán tới một luồng đang chờ. Do đó, một chương trình được ngăn chặn từ một chương trình khác bởi sự nghèo nàn của những LWPs không bị khoá. LWPs là những tài nguyên nhân đắt để duy trì nếu chúng không được dùng. Thư viện luồng “ages” LWPs và xoá chúng khi chúng không được dùng cho khoảng thời gian dài, điển hình khoảng 5 phút.
Các nhà phát triển dùng những cấu trúc dữ liệu cài đặt luồng trên Solaris 2:
• Luồng cấp người dùng chứa một luồng ID; tập thanh ghi (gồm một bộ đếm chương trình và con trỏ ngăn xếp); ngăn xếp; và độ ưu tiên (được dùng bởi thư viện cho mục đích định thời). Không có cấu trúc dữ liệu nào là tài nguyên nhân; tất cả chúng tồn tại trong không gian người dùng.
• Một LWP có một tập thanh ghi cho luồng cấp nhân nó đang chạy cũng như bộ nhớ và thông tin tính toán. Một LWP là một cấu trúc dữ liệu nhân và nó nằm trong không gian nhân
• Một luồng nhân chỉ có một cấu trúc dữ liệu nhân và ngăn xếp. Cấu trúc dữ liệu gồm bản sao các thanh ghi nhân, con trỏ tới LWP mà nó được gán, độ ưu tiên và thông tin định thời.
Mỗi quá trình trong Solaris 2 gồm nhiều thông tin được mô tả trong khối điều khiển quá trình (Process Control Block-PCB ). Trong thực tế, một quá trình Solaris 2 chứa một định danh quá trình (Process ID-PID); bản đồ bộ nhớ; danh sách các tập tin đang mở, độ ưu tiên; và con trỏ của các luồng nhân vơi quá trình.
TranAnhTam(I22B)- Tổng số bài gửi : 19
Join date : 28/03/2013
Bai 5: Đa luồng
Tóm tắt
Luồng là một dòng điều khiển trong phạm vi một quá trình. Quá trình đa luồng gồm nhiều dòng điều khiển khác nhau trong cùng không gian địa chỉ. Những lợi điểm của đa luồng gồm đáp ứng nhanh đối với người dùng, chia sẻ tài nguyên trong quá trình, tính kinh tế, và khả năng thuận lợi trong kiến trúc đa xử lý.
Luồng cấp người dùng là các luồng được nhìn thấy bởi người lập trình và không được biết bởi nhân. Thư viện luồng trong không gian người dùng điển hình quản lý luồng cấp người dùng. Nhân của hệ điều hành hỗ trợ và quản lý các luồng cấp nhân. Thông thường, luồng cấp người dùng nhanh hơn luồng cấp nhân trong việc tạo và quản lý. Có ba loại mô hình khác nhau liên quan đến luồng cấp người dùng và luồng cấp nhân. Mô hình nhiều-một ánh xạ nhiều luồng người dùng tới một luồng nhân. Mô hình một-một ánh xạ mỗi luồng người dùng tới một luồng nhân tương ứng. Mô hình nhiều-nhiều đa hợp nhiều luồng người dùng tới một số lượng nhỏ hơn hay bằng luồng nhân.
Những chương trình đa luồng giới thiệu nhiều thử thách cho việc lập trình, gồm ngữ nghĩa của lời gọi hệ thống fork và exec. Những vấn đề khác gồm huỷ bỏ luồng, quản lý tín hiệu, và dữ liệu đặc tả luồng. Nhiều hệ điều hành hiện đại cung cấp nhân hỗ trợ luồng như Windows NT, Windows 2000, Solaris 2 và Linux. Pthread API cung cấp tập hợp các hàm để tạo và quản lý luồng tại cấp người dùng. Java cung cấp một API tương tự cho việc hỗ trợ luồng. Tuy nhiên, vì các luồng Java được quản lý bởi JVM và không phải thư viện luồng cấp người dùng hay nhân, chúng không rơi vào loại luồng người dùng hay nhân.
Luồng là một dòng điều khiển trong phạm vi một quá trình. Quá trình đa luồng gồm nhiều dòng điều khiển khác nhau trong cùng không gian địa chỉ. Những lợi điểm của đa luồng gồm đáp ứng nhanh đối với người dùng, chia sẻ tài nguyên trong quá trình, tính kinh tế, và khả năng thuận lợi trong kiến trúc đa xử lý.
Luồng cấp người dùng là các luồng được nhìn thấy bởi người lập trình và không được biết bởi nhân. Thư viện luồng trong không gian người dùng điển hình quản lý luồng cấp người dùng. Nhân của hệ điều hành hỗ trợ và quản lý các luồng cấp nhân. Thông thường, luồng cấp người dùng nhanh hơn luồng cấp nhân trong việc tạo và quản lý. Có ba loại mô hình khác nhau liên quan đến luồng cấp người dùng và luồng cấp nhân. Mô hình nhiều-một ánh xạ nhiều luồng người dùng tới một luồng nhân. Mô hình một-một ánh xạ mỗi luồng người dùng tới một luồng nhân tương ứng. Mô hình nhiều-nhiều đa hợp nhiều luồng người dùng tới một số lượng nhỏ hơn hay bằng luồng nhân.
Những chương trình đa luồng giới thiệu nhiều thử thách cho việc lập trình, gồm ngữ nghĩa của lời gọi hệ thống fork và exec. Những vấn đề khác gồm huỷ bỏ luồng, quản lý tín hiệu, và dữ liệu đặc tả luồng. Nhiều hệ điều hành hiện đại cung cấp nhân hỗ trợ luồng như Windows NT, Windows 2000, Solaris 2 và Linux. Pthread API cung cấp tập hợp các hàm để tạo và quản lý luồng tại cấp người dùng. Java cung cấp một API tương tự cho việc hỗ trợ luồng. Tuy nhiên, vì các luồng Java được quản lý bởi JVM và không phải thư viện luồng cấp người dùng hay nhân, chúng không rơi vào loại luồng người dùng hay nhân.
TranAnhTam(I22B)- Tổng số bài gửi : 19
Join date : 28/03/2013
Re: Thảo luận Bài 5
Giải thích code Sản Xuất Tiêu Thụ Đa Luồng
#include < stdio . h >
#include < conio . h >
#include < windows . h > // lập trình đa luồng đồng hành, sử dụng được hàm win32 API
#define BUFFER_SIZE 10 // định nghĩa một buffer có số khoang chứa là 10
int buffer[BUFFER_SIZE];
int in=0; // biến in chứa giá trị chỉ vị trí xếp sản phẩm vào
int out=0;// biến out chứa giá trị chỉ vị trí lấy sản phẩm ra
int nextProduced=1;// biến trung gian, chứa số hiệu sản phẩm đầu tiên
void Producer(){ // nhà sản xuất
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);// khoang chứa đầy thì quẩn tại đây đến khi nào có chỗ trống
buffer[in]=nextProduced++; // cho sản phẩm vào mảng tại vị trí in
in=(in+1)%BUFFER_SIZE; //sau khi chèn sản phẩm vào mảng, tăng in lên 1, nếu in đang nằm ở vị trí cuối mảng sẽ nhảy về đầu mảng
SuspendThread(GetCurrentThread()); //getcureentthread: hàm của thư viện win32 API, trả về giá trị mục quản của luồng hiện hành, vd: 1700. SuspendThread(): ngừng luồng có mục quản là giá trị trong ngoặc, vd: SuspendThread(1700) ngừng luồng có mục quản 1700
}
}
void Consumer(){ // nhà tiêu thụ
int nextConsumed; // biến chứa sản phẩm được tiêu thụ
while (1){
while(in==out); //trong khoang chứa hết sản phẩm thì quẩn tại đây cho đến khi nào trong buffer có sản phẩm
nextConsumed=buffer[out]; //sản phẩm ở vị trí out được đưa vào biến netxconsumed
out=(out+1)%BUFFER_SIZE;//out tăng lên 1, nếu out đang nằm ở cuối mảng thì nhảy lên đầu mảng
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000); // hàm gettickcount() sẽ trả về 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, kết quả sẽ ra được con số rất lớn và chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này ngủ trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nội 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; // lưu mục quản của 2 nhà sx vào 2 biến ProducerHandle1, ProducerHandle2
HANDLE ConsumerHandle1, ConsumerHandle2; //lưu mục quản của 2 nhà tiêu thụ
DWORD ProducerID1, ProducerID2; // mã số định danh của luồng sản xuất
DWORD ConsumerID1, ConsumerID2; // mã số định danh của luồng tiêu thụ
// 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);// các đối số đầu ko quan tâm vì có mới chạy được
// số 4 chỉ ra luồng vừa tạo sẽ không chạy mà ngủ luôn, &ProducerID1 chỉ ra luồng sẽ có mã số định danh là ProducerID1
// sau khi làm lệnh này, sẽ có 2 luồng, luồng ctrinh này và luồng producer
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2);
// Tạo 2 luồng tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1); //0: luồng tiêu thụ vận hành ngay, ko ngủ
ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);
while(1){
printf("\n- Nhap P/p de san xuat, 0 de ket thuc:”);
//P đánh thức nhà sx1, p sx2
switch (getch()){//biết người sử dụng bấm gì
case 'P':
ResumeThread(ProducerHandle1); //đánh thức luồng 1
break;
case 'p':
ResumeThread(ProducerHandle2);//đánh thức luồng 2
break;
case '0':
CloseHandle(ProducerHandle1);// hủy đối tượng(ở đây là luồng) có mục quản
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);// ngủ 1 ms, tức là luồng chính sẽ trễ 1 chút để sản xuất cho xong(chờ in tăng lên 1) rồi mới showbuffer ra
ShowBuffer();
}
}
#include < stdio . h >
#include < conio . h >
#include < windows . h > // lập trình đa luồng đồng hành, sử dụng được hàm win32 API
#define BUFFER_SIZE 10 // định nghĩa một buffer có số khoang chứa là 10
int buffer[BUFFER_SIZE];
int in=0; // biến in chứa giá trị chỉ vị trí xếp sản phẩm vào
int out=0;// biến out chứa giá trị chỉ vị trí lấy sản phẩm ra
int nextProduced=1;// biến trung gian, chứa số hiệu sản phẩm đầu tiên
void Producer(){ // nhà sản xuất
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);// khoang chứa đầy thì quẩn tại đây đến khi nào có chỗ trống
buffer[in]=nextProduced++; // cho sản phẩm vào mảng tại vị trí in
in=(in+1)%BUFFER_SIZE; //sau khi chèn sản phẩm vào mảng, tăng in lên 1, nếu in đang nằm ở vị trí cuối mảng sẽ nhảy về đầu mảng
SuspendThread(GetCurrentThread()); //getcureentthread: hàm của thư viện win32 API, trả về giá trị mục quản của luồng hiện hành, vd: 1700. SuspendThread(): ngừng luồng có mục quản là giá trị trong ngoặc, vd: SuspendThread(1700) ngừng luồng có mục quản 1700
}
}
void Consumer(){ // nhà tiêu thụ
int nextConsumed; // biến chứa sản phẩm được tiêu thụ
while (1){
while(in==out); //trong khoang chứa hết sản phẩm thì quẩn tại đây cho đến khi nào trong buffer có sản phẩm
nextConsumed=buffer[out]; //sản phẩm ở vị trí out được đưa vào biến netxconsumed
out=(out+1)%BUFFER_SIZE;//out tăng lên 1, nếu out đang nằm ở cuối mảng thì nhảy lên đầu mảng
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000); // hàm gettickcount() sẽ trả về 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, kết quả sẽ ra được con số rất lớn và chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này ngủ trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nội 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; // lưu mục quản của 2 nhà sx vào 2 biến ProducerHandle1, ProducerHandle2
HANDLE ConsumerHandle1, ConsumerHandle2; //lưu mục quản của 2 nhà tiêu thụ
DWORD ProducerID1, ProducerID2; // mã số định danh của luồng sản xuất
DWORD ConsumerID1, ConsumerID2; // mã số định danh của luồng tiêu thụ
// 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);// các đối số đầu ko quan tâm vì có mới chạy được
// số 4 chỉ ra luồng vừa tạo sẽ không chạy mà ngủ luôn, &ProducerID1 chỉ ra luồng sẽ có mã số định danh là ProducerID1
// sau khi làm lệnh này, sẽ có 2 luồng, luồng ctrinh này và luồng producer
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2);
// Tạo 2 luồng tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1); //0: luồng tiêu thụ vận hành ngay, ko ngủ
ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);
while(1){
printf("\n- Nhap P/p de san xuat, 0 de ket thuc:”);
//P đánh thức nhà sx1, p sx2
switch (getch()){//biết người sử dụng bấm gì
case 'P':
ResumeThread(ProducerHandle1); //đánh thức luồng 1
break;
case 'p':
ResumeThread(ProducerHandle2);//đánh thức luồng 2
break;
case '0':
CloseHandle(ProducerHandle1);// hủy đối tượng(ở đây là luồng) có mục quản
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);// ngủ 1 ms, tức là luồng chính sẽ trễ 1 chút để sản xuất cho xong(chờ in tăng lên 1) rồi mới showbuffer ra
ShowBuffer();
}
}
nguyenhoanglam_I22B- Tổng số bài gửi : 16
Join date : 12/03/2013
Lợi ích của công nghệ Đa Luồng
- Khả năng đáp ứng tốt hơn, khi 1 luồng bị treo hoặc quá bận thì luồng khác vẫn làm việc 1 cách bình thường (Luồng chính của người dùng vẫn tương tác tốt với người dùng trong khi vẫn lấy được dữ liệu về.
- Đa luồng chia sẽ tài nguyên dể dàng, 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ồn vận hành cùng 1 địa chỉ do đó dể dùng chung tài nguyên hơn so với trường hợp đa tiến tình.
VD: Trong lớp học việc dùng chung 1 cái bảng dễ sửa dễ thay đổi, nếu thay đổi sẽ thay đổi tất cả.
- Đa luồng tiết kiệm hơn: 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ồn 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. Việc tạo mới 1 luồng sẽ dể hơn rất nhiều so với việc tạo mới 1 tiến tình mới.
VD: Trong 1 gia đình có anh chị sắp xây dựng 1 gia đình mới nếu như xây thêm 1 căn nhà (hoặc căn phòng) sẽ tốn kém và khó hơn rất nhiều so với việc ngăn 1 căn phòng trong 1 gia đình lớn thành nhiều ngăn (chia ra nhiều phòng sẽ nhanh hơn và tiết kiệm hơn rất nhiều so với tạo dựng mới, tiết kiệm hơn rất nhiều.
- 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. Việc chuyển từ luồng này sang luồng kia là rất nhanh.
- Lập trình đa luồng dể hơn là lập trình đa tiến trình
- Đa luồng chia sẽ tài nguyên dể dàng, 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ồn vận hành cùng 1 địa chỉ do đó dể dùng chung tài nguyên hơn so với trường hợp đa tiến tình.
VD: Trong lớp học việc dùng chung 1 cái bảng dễ sửa dễ thay đổi, nếu thay đổi sẽ thay đổi tất cả.
- Đa luồng tiết kiệm hơn: 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ồn 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. Việc tạo mới 1 luồng sẽ dể hơn rất nhiều so với việc tạo mới 1 tiến tình mới.
VD: Trong 1 gia đình có anh chị sắp xây dựng 1 gia đình mới nếu như xây thêm 1 căn nhà (hoặc căn phòng) sẽ tốn kém và khó hơn rất nhiều so với việc ngăn 1 căn phòng trong 1 gia đình lớn thành nhiều ngăn (chia ra nhiều phòng sẽ nhanh hơn và tiết kiệm hơn rất nhiều so với tạo dựng mới, tiết kiệm hơn rất nhiều.
- 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. Việc chuyển từ luồng này sang luồng kia là rất nhanh.
- Lập trình đa luồng dể hơn là lập trình đa tiến trình
Ng0HaiQuan(i22B)- Tổng số bài gửi : 20
Join date : 12/03/2013
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)
- 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)
Ng0HaiQuan(i22B)- Tổng số bài gửi : 20
Join date : 12/03/2013
truyên thong điệp trong win downs
Các hàm API dùng để Gửi/Nhận thông điệp
+ SendMessage : Gửi có chờ
+ PostMessage : Gửi không chờ
+ SendMessageTimeout : Gửi có chờ nhưng với thời hạn
+ WaitMessage : Chờ thông điệp đến
+ GetMessage : Nhận có chờ
+ PeekMessage : Nhận không chờ
+ SendMessage : Gửi có chờ
+ PostMessage : Gửi không chờ
+ SendMessageTimeout : Gửi có chờ nhưng với thời hạn
+ WaitMessage : Chờ thông điệp đến
+ GetMessage : Nhận có chờ
+ PeekMessage : Nhận không chờ
Ng0HaiQuan(i22B)- Tổng số bài gửi : 20
Join date : 12/03/2013
So sánh Luồng và Tiến Trình Truyền Thố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ĐH .
- Luồng: là một tiến trình, nhưng đặc biệt ở chỗ là nhẹ hơn tiến trình truyền thống nên còn được gọi là tiểu tiến trình. Luồng nhẹ hơn tiến trình vì nó nằm trong lòng của một tiến trình.
- Một tiến trình có ít nhất một luồng (luồng chính) hoặc có thể có nhiều luồng (một luồng chính và nhiều luồng phụ)
- Luồng chính quản lý, điều phối các luồng phụ.
- Các luồng có thể chạy chung một mã code để đảm bảo tính nhất quán trong công việc.
Giống nhau:
- Bản chất đều là tiến trình, nên đều có thông tin trạng thái.
- Đều được hệ điều hành quản lý và cấp phát CPU.
- Chia sẻ tài nguyên cho nhau.
Khác nhau:
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.
- Tạo mới một tiến trình khó hơn tạo mới một luồng.
- Luồng chuyển đổi ngữ cảnh nhanh và ít chiếm tài nguyên hơn tiến trình.
- Luồng chia sẻ tài nguyên dùng chung dể hơn tiến trình.
- Luồng: là một tiến trình, nhưng đặc biệt ở chỗ là nhẹ hơn tiến trình truyền thống nên còn được gọi là tiểu tiến trình. Luồng nhẹ hơn tiến trình vì nó nằm trong lòng của một tiến trình.
- Một tiến trình có ít nhất một luồng (luồng chính) hoặc có thể có nhiều luồng (một luồng chính và nhiều luồng phụ)
- Luồng chính quản lý, điều phối các luồng phụ.
- Các luồng có thể chạy chung một mã code để đảm bảo tính nhất quán trong công việc.
Giống nhau:
- Bản chất đều là tiến trình, nên đều có thông tin trạng thái.
- Đều được hệ điều hành quản lý và cấp phát CPU.
- Chia sẻ tài nguyên cho nhau.
Khác nhau:
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.
- Tạo mới một tiến trình khó hơn tạo mới một luồng.
- Luồng chuyển đổi ngữ cảnh nhanh và ít chiếm tài nguyên hơn tiến trình.
- Luồng chia sẻ tài nguyên dùng chung dể hơn tiến trình.
PhanNgocThoai(I22B)- Tổng số bài gửi : 17
Join date : 22/03/2013
So Sánh Sự Khác Nhau Giữa Lập Trình Đ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 or nhiều tiến trình có thể liên quan đến một chương 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 một vùng địa chỉ vì vậy dể dùng chung tài nguyên hơn đa tiến trình.
VD : Mượn đồ dùng trong gia đình thì dể hơn mượn của hàng xó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 tiến trình.
VD : Việc ngăn riêng ra một phòng trong nhà thì nhanh hơn là chờ nhà nước cấp cho
một căn hộ.
- Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng.
- Lập trình đa luồng thì dể hơn đ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 or nhiều tiến trình có thể liên quan đến một chương 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 một vùng địa chỉ vì vậy dể dùng chung tài nguyên hơn đa tiến trình.
VD : Mượn đồ dùng trong gia đình thì dể hơn mượn của hàng xó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 tiến trình.
VD : Việc ngăn riêng ra một phòng trong nhà thì nhanh hơn là chờ nhà nước cấp cho
một căn hộ.
- Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng.
- Lập trình đa luồng thì dể hơn đa tiến trình.
PhanNgocThoai(I22B)- Tổng số bài gửi : 17
Join date : 22/03/2013
Trang 7 trong tổng số 8 trang • 1, 2, 3, 4, 5, 6, 7, 8
Similar topics
» Ôn tập thi Cuối kỳ
» Thảo luận các vấn đề của Môn học
» Thảo luận Bài 3
» Thảo luận bài 4
» Thảo luận Bài 7
» Thảo luận các vấn đề của Môn học
» Thảo luận Bài 3
» Thảo luận bài 4
» Thảo luận Bài 7
Trang 7 trong tổng số 8 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết