Thảo luận Bài 5

Trang 6 trong tổng số 9 trang Previous  1, 2, 3, 4, 5, 6, 7, 8, 9  Next

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

So sánh giống và khác nhau giữa Đa Luồng - Đa Tiến Trình - ví dụ

Bài gửi  huynhvanhung(I12A) on 1/4/2012, 12:03

Đa Tiến Trình :

• Tiến trình là chưong trình trong thời gian thực hiện, đặt dưới sự quản lý của hệ điều hành
• Mỗi tiến trình dùng mã chưong trình khác nhau.
• Tiến trình có thể có 1 luồng chính với nhiều luồng phụ.
• 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:
o Tạo tiến trình chậm hơn tạo luồng 30 lần
o Chuyển ngữ cảnh tiến trình chậm hơn luồng 5 lần
• Phải dùng các kỹ thuật truyền thông điệp để liên lạc giữa các tiến trình
• Khó nhân bản

Đa Luồng :


• Luồng là tiến trình nhẹ, là đơn vị cơ bản sử dụng CPU
• Nhiều luồng có thể dùng chung 1 mã chưong trình

• Luồng có thể dùng chung bộ nhớ với luồng 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
• Không cần dùng kỹ thuật truyền thông điệp. Do tài nguyên là dùng chung.
• Dể nhân bản

VÍ DỤ VỀ ĐA LUỒNG: mượn đồ dùng trong gia đình sẽ dễ dàng hơn so với việc mượn đồ dùng của người hàng xóm .
VÍ DỤ VỀ ĐA TIẾN TRÌNH: có 1 công ty may mặc được chia ra làm 4 bộ phận : bộ phận cắt , lắp ráp , may và khâu đóng gói thành phẩm ( mỗi bộ phận được xem như là 1 thread ) . Nếu bình thường hoạt động thì các bộ phận này có khả năng làm việc cùng nhau . giả sử có một bộ phận cắt bị sự cố , thì các bộ phận khác sẽ gặp khó khăn và có thể không làm việc được .
avatar
huynhvanhung(I12A)

Tổng số bài gửi : 43
Join date : 17/02/2012
Age : 29
Đến từ : TP.HCM

Xem lý lịch thành viên

Về Đầu Trang Go down

Những lợi ích của công nghệ đa luồng

Bài gửi  lengocthuthao89 (i11c) on 2/4/2012, 12:03

+ Đảm bảo được khả năng đáp ứng của tiến trình tốt hơn, khi lập trình đa luồng thì một khi 1 luồng có sự cố thì luồng khác vẫn làm việc, vẫn phản hồi ,trong trường hợp lập trình đơn luồng khi gặp sự cố thì luồng đó sẽ chậm và làm chậm luôn cả tiến trình, đa luồng một ứng dụng giao tiếp 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, do đó gai tăng sự đáp ứng đối với người dùng, Ví dụ : một trình duyệt web vẫn có thể đáp ứng người dùng bằng một luồng trong khi vẫn nạp bằng một luồng khác.
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ô (người thứ nhất) 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
+ Theo mặc định các luồng có thể dùng chung bộ nhớ và tai nguyên của luồng cha. Thuận lợi của việc chia sẻ mã là nó cho phép một ứng dụng có nhiều hoạt động của các luồng khác nằm trong cùng không gian, địa chỉ,vài luồng cùng vận hành trong một vùng địa chỉ 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à có kệ sách, xe máy, máy vi tính … mọi người có thể dùng chung và sử dụng chung kệ sách, xe máy, máy vi tính. Trong khi không thể dùng chung những đồ dùng trên với nhà khác được
Trong lớp chúng ta có thể dùng bảng củ lớp mình, chúng ta có thể chia sẻ các thông tin cần thiết cho tất cả các thành viên ở trong lớp biết,trong khi chúng ta khong thể dùng chung bảng của lớp khác để chia sẻ thông tin cho lớp mình được.
+ 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 rất tốn kém. Do luồng có thể dùng chung tài nguyên với luồng cha và các luồng khác, việc tạo lập ngữ cảnh cũng nhanh hơn (Solaris2, 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 của lớp, ai cần ghi thì ghi, ai cần thì chụp hình về xem
Có thể bố trí một chỗ ngồi ở trong lớp cho một bạn đến sau dễ dàng hơn việc làm một chiếc ghế khác cho bạn đó.
+ Chuyển ngữ cảnh từ luồng này sang luồng khác thì nhanh hơn chuyển ngữ cảnh từ tiến trình này sang tiến trình khác.
+ Tận dụng được ưu thế kiến trúc đa xử lý (nhiều CPU). Khi đa luồng thì 1 luồng dùng CPU này và 1 luồng dùng CPU khác sẽ nhanh hơn và các luồng có thể làm việc song song , mỗi luồng có thể chạy bởi CPU riêng. Tiến trình đa luồng sẽ làm việc nhanh hơn tiến trình đơn luồng.
+ Lập trình đa luồng dễ dàng hơn lập trình đa tiến trình

lengocthuthao89 (i11c)

Tổng số bài gửi : 50
Join date : 13/09/2011

Xem lý lịch thành viên

Về Đầu Trang Go down

Process và Thread

Bài gửi  lengocthuthao89 (i11c) on 2/4/2012, 12:20

Định nghĩa: Quá 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ư 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.
Quá 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.
Đó 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ó (xem sơ đồ).
Để 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ý.

lengocthuthao89 (i11c)

Tổng số bài gửi : 50
Join date : 13/09/2011

Xem lý lịch thành viên

Về Đầu Trang Go down

Đa luồng trong Java

Bài gửi  lengocthuthao89 (i11c) on 2/4/2012, 12:27

Mục tiêu của Thread là để tạo ra nhiều tiểu trình chạy song song với nhau để thực hiện 1 số việc nào đó. Để làm vậy, cần tạo 1 lớp như sau:
1. Implement interface Runnable
2. Extends lớp Thread và overide hàm run().

ví dụ:

class Apple extends Thread {
void run() {}
}

public class test{
public void main(){
Apple a = new Apple();
a.start();
}
}

Lưu ý là: hàm run() chỉ là để chạy tiểu trình sẽ thực hiện song song, còn để gọi nó thì phải xài hàm start(). Còn ko gọi, mà gọi run() trực tiếp thì nó sẽ ko chạy song song mà nó sẽ chạy như 1 hàm bình thường, tức là chỉ có 1 tiểu trình chạy mà thôi chứ ko phải 2.
join(): nếu a gọi b.join() thì khi b thực hiện xong công việc thì a mới chạy tiếp.
wait(): nếu a gọi b.wait() thì a sẽ tạm dừng và đợi cho b khi nào làm xong cái trò gì đó, gọi notify() hay notifyAll() thì a mới chạy tiếp.
notify(): cái này dùng để báo mấy thread khác đang đợi được phép chạy tiếp. Lưu ý là wait() với notify() phải ở trong một khối synchronize mới chịu chạy.
sleep(): nếu a chạy sleep() thì nó sẽ dừng lại bao nhiêu giây rồi chạy tiếp.
yeild(): nếu a gọi lệnh này, nó từ trạng thái đang chạy sẽ bị quánh bật về trạng thái sẵn sàng, dùng lệnh này để cho mấy thread khác có cơ hội chạy. Nhưng nó chỉ có tác dụng với các thread có cùng độ ưu tiên.
setPriority(): chỉ định độ ưu tiên cho một thread. thread có độ ưu tiên cao hơn sẽ được chạy và chiếm cpu nhiều hơn.

lengocthuthao89 (i11c)

Tổng số bài gửi : 50
Join date : 13/09/2011

Xem lý lịch thành viên

Về Đầu Trang Go down

Đa luồng

Bài gửi  NguyenHongHaiI12C on 2/4/2012, 21:31

Luồng - Thread: Một dòng các lệnh mà CPU phải thực thi.
Các hệ điều hành mới cho phép nhiều luồng được thực thi đồng thời. Chúng ta đã quen với việc mở nhiều ứng dụng trong một lần làm việc với máy tính.
- Một luồng là một chuỗi các lệnh nằm trong bộ nhớ (chương trình đã được nạp).
- 1 application thông thường khi thực thi là một luồng.
- Trong 1 application có thể có nhiều luồng. Thí dụ chuyển động của 10 đối tượng hiện hành trong 1 trò chơi là một luồng.

Lợi ích của đa luồng:
- Tăng hiệu suất sử dụng CPU: Phần lớn thời gian thực thi của 1 ứng dụng là chờ đợi nhập liệu từ user -> hiệu suất sử dụng CPU chưa hiệu quả.
- Tạo được sự đồng bộ giữa các đối tượng: thí dụ như trong 1 trò chơi, các nhân vật cùng nhau chuyển động.
- Quản lý được thời gian trong các ứng dụng nhu thi online, thời gian chơi một trò chơi.

NguyenHongHaiI12C

Tổng số bài gửi : 48
Join date : 18/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Phân biệt đa luồng và tiến trình

Bài gửi  NguyenHongHaiI12C on 2/4/2012, 21:34

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ể
Vd: trong lớp dùng chung 1 đoạn code gốc . Nếu chia ra nhiều đoạn code khi cần sửa phải sửa chữa nhiều đoạn code rất mất thời gian (hao Ram)

Khác nhau
Tiến trình bao gồm nhiều luồng bên trong .Còn bên trong luồng không bao gồm luồng khác
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

NguyenHongHaiI12C

Tổng số bài gửi : 48
Join date : 18/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Trình bày nguyên lý tập luồng và ứng dụng .

Bài gửi  NguyenHongHaiI12C on 2/4/2012, 21:40

Tập luồng (Thread Pools):
- Tiến trình cha yêu cầu tạo lập sẵn một tập luồng chờ (ở trạng thái waiting). Khi tiến trình cha nhận một yêu cầu thì một luồng được đánh thức để xử lý yêu cầu đó. Sau khi thực hiện xong, luồng được đưa trả về tập luồng tiếp tục chờ .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ụ:Lớp học là một tiến trình .Trong đó giáo viên là luồng chính. Khi có 1 bài tập nào đó thì giáo viên sẽ yêu cầu 1 học sinh lên bảng thực hiện bài tập này. Đôi khi bài tập này quá lớn thì giáo viên có thể chia bài tập này ra nhiều phần và cho các học sinh khác nhau giải quyết từng phần .

NguyenHongHaiI12C

Tổng số bài gửi : 48
Join date : 18/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Những lợi ích của lập trình đa luồng

Bài gửi  NguyenHongHaiI12C on 2/4/2012, 21:41

Những lợi ích của lập trình đa luồng
Được chia làm 4 loại như sau:
1.Sự đáp ứng: đa luồng một ứng dụng giao tiếp 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, do đó gia tăng sự đáp ứng đối với người dùng. Thí dụ, một trình duyệt web vẫn có thể đáp ứng người dùng bằng một luồng trong khi một ảnh đang được nạp bằng một luồng khác.
2.Chia sẻ tài nguyên: Mặc định, các luồng chia sẻ bộ nhớ và các tài nguyên của các quá trình mà chúng thuộc về. Thuận lợi của việc chia sẽ mã là nó cho phép một ứng dụng có nhiều hoạt động của các luồng khác nhau nằm trong cùng không gian địa chỉ.
3.Kinh tế: cấp phát bộ nhớ và các tài nguyên cho việc tạo các quá trình là rất
đắt. Vì các luồng chia sẻ tài nguyên của quá trình mà chúng thuộc về nên nó kinh tế hơn để tạo và chuyển ngữ cảnh giữa các luồng. Khó để đánh giá theo kinh nghiệm sự khác biệt chi phí cho việc tạo và duy trì một quá trình hơn một luồng, nhưng thường nó sẽ mất nhiều thời gian để tạo và quản lý một quá trình hơn một luồng. Trong Solaris 2, tạo một quá trình chậm hơn khoảng 30 lần tạo một luồng và chuyển đổi ngữ cảnh chậm hơn 5 lần.
4.Sử dụng kiến trúc đa xử lý: các lợi điểm của đa luồng có thể phát huy trong
kiến trúc đa xử lý, ở đó mỗi luồng thực thi song song trên một bộ xử lý khác nhau. Một quá trình đơn luồng chỉ có thể chạy trên một CPU. Đa luồng trên một máy nhiều CPU gia tăng tính đồng hành. Trong kiến trúc đơn xử lý, CPU thường chuyển đổi qua lại giữa mỗi luồng quá nhanh để tạo ra hình ảnh của sự song song nhưng trong thực tế chỉ một luồng đang chạy tại một thời điểm.

NguyenHongHaiI12C

Tổng số bài gửi : 48
Join date : 18/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Tiến trình đơn luồng và tiến trình đa luồng

Bài gửi  NguyenHongHaiI12C on 2/4/2012, 21:45


Tiến trình đơn luồng( Single - threaded) : là mỗi một luồng có 1 nội dung thanh ghi và ngăn xếp riêng nhưng mà dùng chung data và chung code

Tiến trình đa luồng (multithreaded) : là tiến trình với 1 luồng chính và 2 luồng phụ, mỗi luồng có nội dung các thanh ghi riêng, ngăn xếp riêng co các luồng đó và được dùng chung code,data và file. Mỗi luồng được điều khiển bởi Hệ diều hành.

NguyenHongHaiI12C

Tổng số bài gửi : 48
Join date : 18/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Bài toán sản xuất và tiêu thụ

Bài gửi  BuiHuongTra(I12A) on 2/4/2012, 21:57

* Ý nghĩa của những câu lệnh thực thi :
#include < stdio.h >
#include < conio.h >
#include < windows.h >

#define BUFFER_SIZE 10 // 10 : Số khoang chứa của bộ đệm , BUFFER : Mảng có số phần tử

int buffer[BUFFER_SIZE];
int in=0; // Trỏ tới vị trí trống kế tiếp.
int out=0; // Trỏ tới vị trí trống cần được tiêu thụ

int nextProduced=1; // Mỗi lần thay đổi giá trị tăng lên 1 lần

void Producer(){ // Nhà sản xuất....
while (1){

while(((in+1)%BUFFER_SIZE)==out); // Vòng lặp chờ lệnh...
buffer[in]=nextProduced++;
in=(in+1)%BUFFER_SIZE; // Sản xuất xong
SuspendThread(GetCurrentThread()); // SuspendThread : Tạm ngừng công việc của luồng, 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.
//GetCurrentThread : Trả về mục quản của hệ điều hành.
}
}
void Consumer(){ // ... Tiêu thụ (nextConsumed)
int nextConsumed;
while (1){
while(in==out); //
nextConsumed=buffer[out]; // Lấy sản phẩm từ buffer
out=(out+1)%BUFFER_SIZE;

Sleep(GetTickCount()%5000); // Sleep : Ngủ một khoảng thời gian cho trước
// GetTickCount : Nhận số miligiay 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
// 5000 : Nhà tiêu thụ ngủ 5s sau đó lên kiểm tra .
}
}
----------
Các bạn xem và bổ sung nha ! Smile

BuiHuongTra(I12A)

Tổng số bài gửi : 12
Join date : 16/02/2012
Age : 29
Đến từ : Phú Yên

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Thảo luận Bài 5

Bài gửi  nguyen_tuan_phat_I12A on 2/4/2012, 22:13

CPU đa nhân, CPU đa lõi (tiếng Anh: multi-core) là bộ vi xử lý trung tâm (Central Processing Unit) có nhiều đơn vị vi xử lý được tích hợp trên cùng một CPU vật lý duy nhất. Một cách khác, chúng giống như sự ghép nối nhiều CPU thông thường trước đây trở thành một CPU duy nhất.

CPU đa nhân nhân được giới thiệu lần đầu tiên vào năm 2001 bởi hãng IBM với loại CPU Power4 dành riêng cho các máy chủ. Bắt đầu từ đó các hãng sản xuất CPU khác bắt đầu chú ý đến thể loại CPU đa nhân và định hướng phát triển sản phẩm của mình theo theo thể loại này. Hai nhà sản xuất CPU cho PC lớn là AMD và Intel cũng có các phản ứng khác nhau: AMD đã bắt đầu có định hướng ngay cho CPU đa nhân, Intel còn dè dặt trong giai đoạn đầu, nhưng cũng bắt đầu vào cuộc.[1] Kể từ đó có một sự cạnh tranh giữa hai hãng để chiếm lĩnh thị phần CPU máy tính trên phương diện đa nhân, hiệu năng xử lý và giá bán, sự cạnh tranh này vẫn còn tồn tại cho đến thời điểm hiện nay và chưa có dấu hiệu kết thúc.


Phân loại máy tính và chức năng

Không như nhiều người hiểu rằng máy tính chỉ đơn giản là những chiếc máy giống như họ đã biết và từng làm việc hàng ngày (hoặc một số rất ít người hiểu chúng như những chiếc máy tính cầm tay dùng cho các phép tính cộng trừ đơn giản dành cho học sinh), chúng đã được làm nhiều loại để phục vụ cho các nhu cầu của những người sử dụng khác nhau hoặc cho nhiều người sử dụng. Phần phân loại dưới đây sơ lược giúp bạn hiểu thêm về nghĩa rộng hơn của máy tính quen dùng:

Phần lớn các máy tính trên thế giới hiện nay thuộc thể loại máy tính cá nhân, một cách hiểu đơn giản là chúng dành cho một người sử dụng (cá nhân) và làm việc với chúng trong duy nhất một thời điểm. Máy tính cá nhân có thể thực hiện nhiều chương trình khác nhau ở các thời điểm khác nhau, chúng có thể được sử dụng rộng rãi bởi những người sử dụng ở văn phòng như một công cụ trợ giúp cho công việc, hoặc được sử dụng ngoài nơi làm việc (ở nhà) với mục đích chủ yếu cho giải trí, truy cập thông tin thông qua mạng Internet toàn cầu hoặc các nhu cầu riêng khác.
Phần ít hơn là các máy tính được thiết kế cho các kỹ sư, kỹ thuật viên, các nhà khoa học hoặc những người sử dụng văn phòng với các ứng dụng không thông thường để thực hiện các phần mềm đòi hỏi đến năng lực lớn hơn và sự ổn định, các máy này thường được gọi là máy trạm (workstation)[2].
Phần còn lại có số lượng ít nhất, được thiết kế riêng biệt chỉ để thực hiện một vài nhiệm vụ mà có thể không cần đến sự điều khiển của con người một cách liên tục theo thời gian: ví dụ các máy chủ để phục vụ các mục đích khác nhau trong một mạng nhỏ hoặc các mạng Internet rộng lớn.

Khác với các loại các máy tính được liệt kê ở trên là các loại máy tính chuyên dụng đặc biệt, chúng thường thiết kế riêng cho một mục đích, chỉ sử dụng một vài phần mềm chuyên dụng: ví dụ các máy tính công nghiệp hoặc các máy tính ở một dạng nhỏ hơn sử dụng hệ điều hành nhúng cho các mục đích khác.

Trừ các máy tính trong những giai đoạn phát triển đầu tiên (thường chỉ thiết kế cho một vài chức năng) hoặc một số máy tính lớn phục vụ riêng biệt cho các mục đích khoa học ngày nay, các máy tính còn lại trong thời gian gần đây (được phân loại như trên) thường có thể dùng để thực hiện nhiều nhiệm vụ khác nhau. Người sử dụng có thể cài đặt các phần mềm khác nhau (miễn là chúng tương thích với hệ điều hành cài đặt trên máy tính đó). Các máy chủ thường được cho rằng chỉ phục vụ chuyên cho một mục đích, cung cấp một loại dịch vụ nhưng cũng có thể chuyển đổi, thiết đặt lại để phục vụ cho các nhiệm vụ khác.

Nhu cầu xử lý đa nhiệm

Phần trên mới cho thấy tất cả các máy tính có thể sử dụng cho các mục đích khác nhau, tuy nhiên trên thực tế các máy tính còn có thể dùng cho nhiều mục đích cho cùng một thời điểm.

Đối với máy tính cá nhân (cho văn phòng và gia đình), ví dụ một người sử dụng máy tính để soạn thảo một văn bản bằng tiếng Việt thì cũng đã có ít nhất hai phần mềm hoạt động: phần mềm soạn thảo văn bản và một phần mềm hỗ trợ bỏ dấu tiếng Việt nào đó. Trong ví dụ này nếu nói có hai phần mềm đồng thời hoạt động là chưa chính xác, bởi xét rộng ra thì đã có rất nhiều phần mềm đang hoạt động ở chế độ nền (background) trong hệ điều hành mà nhiều người sử dụng không nhận ra. Đối với các máy trạm với sự khác biệt chỉ ở các phần mềm chuyên dụng và đòi hỏi ổn định nên cũng tương tự đối với máy tính cá nhân.
Đối với các máy chủ thì ngay cả một số kỹ thuật viên hoặc người quản trị mạng cũng cho rằng chúng chỉ phục vụ một vài mục đích riêng biệt, tuy nhiên trên thực tế các máy chủ được kết hợp đồng thời cung cấp nhiều dịch vụ nếu như chúng đủ mạnh. Thực tế ở mức sử dụng trong một mạng nhỏ thì đã có rất nhiều máy chủ đã được thiết đặt để cung cấp nhiều dịch vụ đồng thời.

Những nội dung cần xử lý đồng thời trên thực hiện trên một máy tính sử dụng một CPU đơn nhân có thể tuỳ thuộc vào mức độ cần xử lý của các ứng dụng, số ứng dụng hoạt động cùng một thời điểm mà người sử dụng có thể không nhận thấy khi sử dụng đồng thời các ứng dụng yêu cầu xử lý thấp (chẳng hạn chỉ soạn thảo văn bản kết hợp nghe nhạc số dạng nén) trên một máy tính có một dung lượng bộ nhớ RAM không quá thấp so với yêu cầu của hệ điều hành. Tuy nhiên với các ứng dụng cần nhiều đến xử lý như thực hiện một trong các nội dung: xử lý đồ hoạ, biên tập video, chơi game, nghe nhạc và kết hợp đồng thời với các ứng dụng thông thường (duyệt web, soạn thảo...) cùng với một phần mềm diệt virus bảo vệ trực tiếp thì người sử dụng sẽ cảm nhận rõ ràng về sự chậm chạp của hệ thống. Cùng số lượng và mức độ của các ứng dụng đó, nếu được xử lý trên một máy tính có hai CPU độc lập thì hệ thống sẽ thực hiện nhanh hơn và hiếm khi xảy ra các hiện tượng chậm chạp xử lý ứng dụng, lỗi hệ thống, treo máy...

Khi mà các hệ điều hành và các ứng dụng ngày nay đã chú tâm hơn nhiều đến giao diện, sự ổn định, khả năng bảo mật...để đáp ứng mọi nhu cầu của người sử dụng máy tính thì càng đòi hỏi đến năng lực của CPU cần lớn lên. Nếu như các CPU thông dụng trong các máy tính cá nhân để bàn hiện nay có thể hoạt động trên các hệ điều hành lỗi thời như Windows 95, Windows 98 khá nhanh và tốt thì đến các hệ điều hành Windows XP hiện tại cũng trở lên chậm chạm và có thể còn chậm hơn nữa nếu sử dụng hệ điều hành Windows Vista gần đây nhất của hãng Microsoft trong thời điểm đầu năm 2008.

Luồng xử lý của CPU

Các CPU đã được hệ điều hành yêu cầu xử lý đồng thời các phần mềm một cách gián đoạn và xen kẽ nhau khi người sử dụng thực hiện đồng thời nhiều phần mềm (như trong các ví dụ nêu trên). Mỗi phần mềm nếu không đòi hỏi một sự xử lý liên tục thì chúng được đáp ứng từng phần. Đa số các phần mềm sử dụng trong văn phòng một cách thông thường nhất đều đã được xử lý như vậy. Ví dụ: khi bạn đang duyệt web và cùng soạn thảo một văn bản sẽ có các khoảng thời gian mà bạn phải đọc một trang web hoặc lúc bạn đang soạn thảo văn bản thì có nghĩa là trình duyệt web lúc đó có thể không cần thiết phải xử lý bởi chúng đã tải xuống (download) đủ thông tin để phục vụ hiển thị nội dung trang web đó. Đây chỉ là một ví dụ đơn giản với những ứng dụng đơn giản để cho thấy việc các CPU có thể phân tách để xử lý các nhiệm vụ một cách đồng thời.

Nếu như người sử dụng thực thi các phần mềm ứng dụng yêu cầu đến xử lý lớn một cách đồng đều thì dễ nhận thấy rằng hệ thống có thể trở nên chậm chạp bởi mỗi ứng dụng lại chỉ được xử lý lần lượt xen kẽ nhau. Nếu như có hai bộ xử lý đồng thời trong cùng một máy tính thì cả hai ứng dụng lớn này đều có thể thực hiện được tốt hơn hay không. Hoặc như có một CPU nhưng đồng thời đáp ứng yêu cầu của hai hoặc nhiều hơn các ứng dụng trong cùng một thời điểm thì có cải thiện được tốc độ làm việc chung của máy tính hay không ?
Hãy xem một ví dụ sau: Nếu có một nhóm người chờ trước cổng một phòng khám da liễu, phòng chờ cách cửa vào một khoảng xa.

CPU đơn nhân, đơn luồng: giống như việc chỉ có một cửa vào, và trong đó có một bác sĩ chỉ khám lần lượt từng người với điều kiện mỗi người hết 10 phút, trong đó ưu tiên khám hết nữ giới sau đó mới đến lượt nam giới - thời gian khám hết nhóm người đó sẽ rất lâu và nam giới phải chờ lâu hơn mặc dù đến sớm.
CPU đơn nhân, đa luồng: giống như việc có một cửa, mỗi người khám 10 phút, khám xen kẽ cả nam giới và nữ giới. Giải quyết được việc người nào đến trước thì xong trước.
CPU đơn nhân, đa luồng, có công nghệ phân luồng ảo: Giống như có một cửa, ai khám xong trước thì ra trước (có thể dưới 10 phút), có hai bác sĩ phụ nhau chia theo từng công đoạn lúc này thời gian nhanh hơn nhiều cho việc khám tất cả nhóm người.
CPU đa nhân: Giống như phòng khám có hai cửa, trong đó có hai nhóm bác sĩ độc lập và đồng thời có thể khám hai người một thời điểm.
CPU có lượng cache L2 lớn hoặc có thêm cache L3: Tương đương với phòng chờ ở ngay cửa của phòng khám (người được yêu cầu vào khám đi vào nhanh hơn).

Qua ví dụ trên ta thấy rằng CPU có khả năng xử lý nhiều luồng, đa nhân, có công nghệ siêu phân luồng...thì sẽ xử lý công việc nhanh hơn. Đây là lúc mà người đọc có thể trả lời câu hỏi phía trên một cách tự tin rằng “có, nó cải thiện được tốc độ làm việc chung”.

Hình thức sử dụng nhiều CPU trên cùng một máy tính hoặc nhiều máy tính kết nối với nhau để trở thành một hệ thống máy tính lớn hơn để cùng thực hiện một nhiệm vụ hoặc đồng thời nhiều nhiệm vụ có liên quan đến nhau đã được áp dụng từ trước khi xuất hiện các CPU hai nhân. Các máy trạm hoặc máy chủ trước đây thường được gắn nhiều hơn một CPU trên cùng một bo mạch chủ để có thể thực hiện công việc tối ưu hơn, tốc độ nhanh hơn. Đây có thể là những lý do đầu tiên để các nhà sản xuất phần cứng bắt tay vào nghiên cứu để cho ra đời các CPU đa nhân sau này.

nguyen_tuan_phat_I12A

Tổng số bài gửi : 15
Join date : 17/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Multi Threaded

Bài gửi  LeThanhTung (I11C) on 2/4/2012, 22:43

+Khái niệm : Luồng ( Tuyến) là một phần của tiến trình, thực thi độc lập ngay trong mã lệnh của tiến trình.
-Nếu như một hệ điều hành có nhiều tiến trình thì bên trong mỗi tiến trình ta có thể tạo ra nhiều luồng ( tuyến) hoạt động song song với nhau tương tự với các tiến trình hoạt động song song bên trong hệ điều hành.
+Ưu điểm của luồng (tuyến):
-Chúng có thể hoạt động trong cùng không gian địa chỉ của tiến trình.
-Tập hợp một nhóm các luồng (tuyến) có thể chia sẽ chung vùng nhớ của một tiến trình và do đó có thể sử dụng chung biến toàn cục của tiến trình.
-Cơ chế liên lạc giữa các luồng (tuyến) đơn giản và hiệu quả hơn cơ chế liên lạc giữa các tiến trình với nhau.
-Trong môi trường đồ họa: khi ta copy một file có kích thước lớn, chương trình sẽ được thiết kế sao cho:
+Một luồng (tuyến) thực thi thực hiện đọc ghi dữ liệu từ đĩa từ
+Luồng (Tuyến) khác sẽ đảm trách việc hiển thị đồng hồ theo dõi hoặc đo lường phần trăm hoàn thành của thao tác copy để người theo dõi được tiến độ.
VD : Trong lớp học có 2 luồng :
-Một là thầy
-Hai là các sinh viên
-Mỗi luồng đều có một code khác nhau: thầy dùng 1 code riêng, các sinh viên dùng 1 code riêng nhuung tất cả các code đều thống nhất trong 1 code chung duy nhất của trường.

LeThanhTung (I11C)

Tổng số bài gửi : 50
Join date : 28/08/2011

Xem lý lịch thành viên

Về Đầu Trang Go down

Trình bày nguyên lý tập luồng và Ví dụ minh họa

Bài gửi  TranMinhTuan143(I12A) on 2/4/2012, 23:47

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 trại 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)

TranMinhTuan143(I12A)

Tổng số bài gửi : 38
Join date : 22/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Giải thích 1 số hàm trong bài toán sản xuất tiêu thụ

Bài gửi  TranMinhTuan143(I12A) on 2/4/2012, 23:49

Hàm GetCurrentThread: dùng để lấy về mục quản của luồng sản xuất hiện hành(mục quản: là con số do hệ điều hành cấp ho luồng hiện hành)
Hàm SuspendThread: dùng để tạm ngưng công việc của hàm với mục quản cho trước
Hàm Sleep: dùng để ngủ 1 số miligiay cho trước,hết khoảng thời gian đó nhà tiêu thụ lại làm việc tiếp
Hàm GetTickCount(): dùng để lấy số miligiay 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 của luồng với mục quản cho trước
Hàm CloseHandle: dùng để hủy đối tượng cho trước 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

TranMinhTuan143(I12A)

Tổng số bài gửi : 38
Join date : 22/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

LẬP TRÌNH ĐA LUỒNG TRONG WINDOWS

Bài gửi  TranMinhTuan143(I12A) on 2/4/2012, 23:52

- Windows là hệ điều hành đồ họa trực quan, do đó các tài nguyên của hệ thống cung cấp rất đa dạng và phong phú. Lập trình trên windows phải hết sức thân thiện với người dùng thông qua giao diện đồ họa sẵn có của Windows.
- Windows sử dụng các hàm trong thư viện Win32 API: hệ điều hành Windows cung cấp hàng trăm hàm để cho những ứng dụng có thể truy cập các tài nguyên trong hệ thống. Những hàm đó được gọi là giao diện lập trình ứng dụng API( Application Programming Interface).
- ứng dụng windows vận hành như một tiến trình với 1 hoặc nhiều luồng : ứng dụng Win32 xử lý theo các sự kiện ( event – driven), các ứng dụng khi được viết sẽ liên tục chờ cho hệ điều hành truyền các dữ liệu nhập vào. Hệ thống sẽ đảm nhiệm truyền tất cả các dữ liệu nhập của ứng dụng vào các cửa sổ khác nhau. Mỗi cửa sổ sẽ có riêng một hàm gọi là hàm xử lý. Hệ thống sẽ gọi khi có bất cứ dữ liệu nhập vào được truyền đến cửa sổ, hàm này xử lý các dữ liệu nhập đó và trả quyền điều khiển về cho hệ thống. Hệ thống truyền các dữ liệu nhập vào thủ tục xử lý của cửa sổ thông qua một hình thức, gọi là thông điệp( message). Hệ thống sẽ phát sinh một thông điệp khi có một sự kiện nhập vào. Ví dụ khi người dùng nhấn một phím, di chuyển thiết bị chuột hay kích vào các điều khiển( control ) như thanh cuộn…
- ví dụ: tổng đài 1080
- ví dụ: 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.

TranMinhTuan143(I12A)

Tổng số bài gửi : 38
Join date : 22/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

ích lợi của xử lý đa luồng

Bài gửi  LeMinhDuc (I11C) on 3/4/2012, 11:02

1. Lập trình đa luồng dễ hơn lập trình đa tiến trình

2. Khả năng đáp ứng tốt hơn: các công việc sẽ được thực hiện nhanh hơn bởi chúng được quản lý bởi luồng riêng nên không phải chờ đợi để xử lý.
VD: Trên tuyến đường có nhiều làn thì lưu thông sẽ nhanh hơn

3. Khả năng chia sẽ tài nguyên cao hơn
VD: trên tuyến đường có nhiều làn đường nếu có 1 làn nào xảy ra tai nạn dẫn đến không đi được thì các xe còn có luồng khác để đi

4. Tiết kiệm bộ nhớ và tài nguyên

5. Tận dụng được sức mạnh của kiến trúc đa xử lý
VD: Máy intel core i là bộ đa xử lý nếu lập trình theo hướng đa luồng thì máy sẽ phát huy hết công suất

LeMinhDuc (I11C)

Tổng số bài gửi : 39
Join date : 26/08/2011

Xem lý lịch thành viên

Về Đầu Trang Go down

Những lợi ích của công nghệ đa luồng

Bài gửi  NguyenXuanTri28 on 3/4/2012, 12:14

Những lợi ích 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. Nếu chỉ có 1 cô phải trực 10 máy điện thoại thì khi chỉ có 1 cuộc điện thoại gọi đến thì cô sẽ trả lời tốt nhưng khi có khoảng 3 cuộc điện thoại trở lên thì cô không thể trả lời được kịp hết.
Nếu có nhiều cô cùng trực điện thoại thì lúc đó sẽ tốt hơn, đáp ứng được nhu cầu của khách hàng khi họ gọi đến .
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.

NguyenXuanTri28

Tổng số bài gửi : 39
Join date : 05/09/2011

Xem lý lịch thành viên

Về Đầu Trang Go down

Hãy phân tích nguyên lý tập luồng.Cho ví dụ

Bài gửi  NguyenXuanTri28 on 3/4/2012, 12:18

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ụ:
Trang bị cho 1 nhóm các chiến sĩ mặc áo giáp cầm vũ khí trong người nằm ngủ, khi có giặc tới ta cử 1 chiến sĩ ra chiến đấu, khi chiến sĩ đó hoàn thành nhiệm vụ trở về trạng thái ngủ, cứ tiếp tục như thế khi giặc đến thì 1 chiến sĩ lại ra chiến đấu...

NguyenXuanTri28

Tổng số bài gửi : 39
Join date : 05/09/2011

Xem lý lịch thành viên

Về Đầu Trang Go down

Giới thiệu một số loại luồng

Bài gửi  NguyenXuanTri28 on 3/4/2012, 12:19

Luồng Windows 2000

Windows 2000 cài đặt Win32 API. Win32 API là một API chủ yếu cho họ hệ điều hành Windows (Windows 95/98/NT và Windows 2000). Thực vậy, những gì được đề cập trong phần phần này áp dụng tới họ hệ điều hành nàyỨng dụng Windows chạy như một tiến trình riêng rẻ nơi mỗi tiến trình có thể chứa một hay nhiều luồng. Windows 2000 dùng ánh xạ một-một nơi mà mỗi luồng cấp người dùng ánh xạ tới luồng nhân được liên kết tới.Tuy nhiên, Windows cũng cung cấp sự hỗ trợ cho một thư viện có cấu trúc (fiber library) cung cấp chức năng của mô hình nhiều-nhiều. Mỗi luồng thuộc về một tiến trình có thể truy xuất một không gian địa chỉ ảo của tiến trình.Những thành phần thông thường của một luồng gồm:ID của luồng định danh duy nhất luồng Tập thanh ghi biểu diễn trạng thái của bộ xử lý Ngăn xếp người dùng khi luồng đang chạy ở chế độ người dùng. Tương tự, mỗi luồng cũng có một ngăn xếp nhân được dùng khi luồng đang chạy trong chế độ nhân Một vùng lưu trữ riêng được dùng bởi nhiều thư viện thời gian thực và thự viện liên kết động (DLLs).Tập thanh ghi, ngăn xếp và vùng lưu trữ riêng được xem như ngữ cảnh của luồng và được đặc tả kiến trúc tới phần cứng mà hệ điều hành chạy trên đó. Cấu trúc dữ liệu chủ yếu của luồng gồm:RTHREAD (executive thread block-khối luồng thực thi). KTHREAD (kernel thread-khối luồng nhân) TEB (thread environment block-khối môi trường luồng)Các thành phần chủ yếu của RTHREAD gồm một con trỏ chỉ tới tiến trình nào luồng thuộc về và địa chỉ của thủ tục mà luồng bắt đầu điều khiển trong đó. ETHREAD cũng chứa một con trỏ chỉ tới KTHREAD tương ứng.KTHREAD gồm thông tin định thời và đồng bộ hóa cho luồng. Ngoài ra, KTHREAD chứa ngăn xếp nhân (được dùng khi luồng đang chạy trong chế độ nhân) và con trỏ chỉ tới TEB.ETHREAD và KTHREAD tồn tại hoàn toàn ở không gian nhân; điều này có nghĩa chỉ nhân có thể truy xuất chúng. TEB là cấu trúc dữ liệu trong không gian người dùng được truy xuất khi luồng đang chạy ở chế độ người dùng. Giữa những trường khác nhau, TEB chứa ngăn xếp người dùng và một mảng cho dữ liệu đặc tả luồng (mà Windows gọi là lưu trữ cục bộ luồng)
Luồng Linux

Nhân Linux được giới thiệu trong ấn bản 2.2. Linux cung cấp một lời gọi hệ thống fork với chức năng truyền thống là tạo bản sao một tiến trình . Linux cũng cung cấp lời gọi hệ thống clone mà nó tương tự như tạo một luồng. clone có hành vi rất giống như fork, ngoại trừ thay vì tạo một bản sao của tiến trình gọi, nó tạo một tiến trình riêng chia sẻ không gian địa chỉ của tiến trình gọi. Nó chấm dứt việc chia sẻ không gian địa chỉ của tiến trình cha mà một tác vụ được nhân bản đối xử giống rất nhiều một luồng riêng rẻ.Chia sẻ không gian địa chỉ được cho phép vì việc biểu diễn của một tiến trình trong nhân Linux. Một cấu trúc dữ liệu nhân duy nhất tồn tại cho mỗi tiến trình trong hệ thống. Một cấu trúc dữ liệu nhân duy nhất tồn tại cho mỗi tiến trình trong hệ thống. Tuy nhiên, tốt hơn lưu trữ dữ liệu cho mỗi tiến trình trong cấu trúc dữ liệu là nó chứa các con trỏ chỉ tới các cấu trúc dữ liệu khác nơi dữ liệu này được được lưu. Ví dụ, cấu trúc dữ liệu trên tiến trình chứa các con trỏ chỉ tới các cấu trúc dữ liệu khác hiện diện danh sách tập tin đang mở, thông tin quản lý tín hiệu, và bộ nhớ ảo. Khi fork được gọi, một tiến trình mới được tạo cùng với một bản sao của tất cả cấu trúc dữ liệu của tiến trình cha được liên kết tới. Khi lời gọi hệ thống clone được thực hiện, một tiến trình mới chỉ tới cấu trúc dữ liệu của tiến trình cha, do đó cho phép tiến trình con chia sẻ bộ nhớ và tài nguyên của tiến trình cha. Một tập hợp cờ được truyền như một tham số tới lời gọi hệ thống clone. Tập hợp cờ này được dùng để hiển thị bao nhiêu tiến trình cha được chia sẻ với tiến trình con. Nếu không có cờ nào được đặt, không có chia sẻ xảy ra và clone hoạt động giống như fork. Nếu tất cả năm cờ được đặt, tiến trình con chia sẻ mọi thứ với tiến trình cha. Sự kết hợp khác của cờ cho phép các cấp độ chia sẻ khác nhau giữa hai mức độ cao nhất này. Điều thú vị là Linux không phân biệt giữa tiến trình và luồng. Thật vậy, Linux thường sử dụng thuật ngữ tác vụ-hơn là tiến trình hay luồng-khi tham chiếu tới dòng điều khiển trong chương trình. Ngoài tiến trình được nhân bản, Linux không hỗ trợ đa luồng, cấu trúc dữ liệu riêng hay thủ tục nhân. Tuy nhiên, những cài đặt Pthreads là sẳn dùng cho đa luồng cấp người dùng.

Luồng Java

Java là một trong số nhỏ ngôn ngữ cung cấp sự hỗ trợ tại cấp ngôn ngữ cho việc tạo và quản lý luồng. Tuy nhiên, vì các luồng được quản lý bởi máy ảo Java, không bởi một thư viện cấp người dùng hay nhân, rất khó để phân cấp luồng Java như cấp độ người dùng hay cấp độ nhân. Trong phần này chúng ta trình bày các luồng Java như một thay đổi đối với mô hình người dùng nghiêm ngặt hay mô hình cấp nhân.Tất cả chương trình tạo ít nhất một luồng điều khiển đơn. Thậm chí một chương trình Java chứa chỉ một phương thức main chạy như một luồng đơn trong máy ảo Java. Ngoài ra, Java cung cấp các lệnh cho phép người phát triển tạo và thao tác các luồng điều khiển bổ sung trong chương trình.

NguyenXuanTri28

Tổng số bài gửi : 39
Join date : 05/09/2011

Xem lý lịch thành viên

Về Đầu Trang Go down

Những lợi ích của công nghệ đa luồng

Bài gửi  ngothihanHC11TH2A on 3/4/2012, 14:12



-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ụ: Tổng đài viettel là 1 tập luồng. Trong đó mỗi cô trực tổng đài là 1 luồng. nếu chỉ có 1 cô trực thì sẽ chỉ trả lời được 1 cuộc điện thoại trong 1 khoảng thời gian, nếu có tới 2 cuộc gọi đến trong cùng thời gian thì sẽ không trả lời được. nếu có nhiều cô tổng đài cùng trực(đa luồng) sẽ đáp ứng được yêu cầu của 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ụ:2 học sinh(các luồng) cùng ngồi chung 1 cái ghế, khi đó cái ghế sẽ là tài nguyên sử dụng chung.
-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(các luồng) đang dùng chung 1 cái bảng. khi 1 bạn lên bảng làm xong bài tập 1, các bạn dưới lớp sẽ chép bài vào vở(backup), sau đó xóa bảng để bạn tiếp theo lên làm(chuyển ngữ cảnh).

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.


Được sửa bởi ngothihanHC11TH2A ngày 3/4/2012, 14:24; sửa lần 1.

ngothihanHC11TH2A

Tổng số bài gửi : 23
Join date : 16/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Nguyên Lý tập luồng và ví dụ

Bài gửi  nguyenthanhphongHC11TH2A on 3/4/2012, 14:22

-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 lớp học thầy giáo(tiến trình cha) thu bài kiểm tra của mỗi học sinh(các luồng). Mỗi bạn sẽ sẵn sàng bài kiểm tra và chờ tới lượt mình nộp bài. khi thầy đọc tới tên bạ nào thì bạn đó sẽ lên nộp(luồng được đưa vào vận hành),sau đó trở về chỗ ngồi(luồng được giải phóng).

nguyenthanhphongHC11TH2A

Tổng số bài gửi : 26
Join date : 16/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Thảo luận Bài 5

Bài gửi  PhamDucPhuong(I12A) on 3/4/2012, 15:29

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 I12A đang học là một tiến trình đang hoạt động
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.
- Lập trình đa luồng dễ hơn lập trình đa tiến trình
vd: viết hàm tạo mới tiến trình khó hơn tạo luồng mới nhiều

PhamDucPhuong(I12A)

Tổng số bài gửi : 17
Join date : 19/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

Những lợi ích của công nghệ đa luồng

Bài gửi  phamphihung55 on 3/4/2012, 16:19

Mô hình đa luồng
Nhiều hệ thống cung cấp sự hỗ trợ cả hai luồng nhân và luồng người dùng nên
tạo ra nhiều mô hình đa luồng khác nhau. Chúng ta sẽ xem xét ba loại cài đặt luồng
thông thường
Mô hình nhiều-một
Mô hình nhiều-một (như hình IV.2) ánh xạ nhiều luồng cấp người dùng tới
một luồng cấp nhân. Quản lý luồng được thực hiện trong không gian người dùng vì
thế nó hiệu quả nhưng toàn bộ quá trình sẽ bị khóa nếu một luồng thực hiện lời gọi hệ
thống khóa. Vì chỉ một luồng có thể truy xuất nhân tại một thời điểm nên nhiều luồng
không thể chạy song song trên nhiều bộ xử lý. Green threads-một thư viện luồng được
cài đặt trên các hệ điều hành không hỗ trợ luồng nhân dùng mô hình nhiều-một.
Mô hình một-một
Mô hình một-một (hình IV.3) ánh xạ mỗi luồng người dùng tới một luồng
nhân. Nó cung cấp khả năng đồng hành tốt hơn mô hình nhiều-một bằng cách cho một
luồng khác chạy khi một luồng thực hiện lời gọi hệ thống nghẽn; nó cũng cho phép
nhiều luồng chạy song song trên các bộ xử lý khác nhau. Chỉ có một trở ngại trong
mô hình này là tạo luồng người dùng yêu cầu tạo một luồng nhân tương ứng. Vì chi
phí cho việc tạo luồng nhân có thể đè nặng lên năng lực thực hiện của ứng dụng, các
cài đặt cho mô hình này giới hạn số luồng được hỗ trợ bởi hệ thống. Windows NT,
Windows 2000 và OS/2 cài đặt mô hình một-một này.
Mô hình nhiều-nhiều
Mô hình nhiều-nhiều (như hình VI.4) đa hợp nhiều luồng cấp người dùng tới
số lượng nhỏ hơn hay bằng các luồng nhân. Số lượng các luồng nhân có thể được xác
định hoặc một ứng dụng cụ thể hay một máy cụ thể (một ứng dụng có thể được cấp
nhiều luồng nhân trên một bộ đa xử lý hơn trên một bộ đơn xử lý). Trong khi mô hình
nhiều-một cho phép người phát triển tạo nhiều luồng người dùng như họ muốn, thì
đồng hành thật sự là không đạt được vì nhân có thể lập thời biểu chỉ một luồng tại mộ
thời điểm. Mô hình một-một cho phép đồng hành tốt hơn nhưng người phát triển phải
cẩn thận không tạo ra quá nhiều luồng trong một ứng dụng. Mô hình nhiều-nhiều gặp
phải một trong hai vấn đề khiếm khuyết: người phát triển có thể tạo nhiều luồng
người dùng khi cần thiết và các luồng nhân tương ứng có thể chạy song song trên một
bộ đa xử lý. Khi một luồng thực hiện một lời gọi hệ thống khóa, nhân có thể lập thời
biểu một luồng khác thực thi. Solaris 2, IRIX, HP-UX, và Tru64 UNIX hỗ trợ mô
hình này.
avatar
phamphihung55

Tổng số bài gửi : 83
Join date : 16/02/2012
Age : 27

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Thảo luận Bài 5

Bài gửi  VoTrongQuyet-I12A on 3/4/2012, 22:04

HoNguyenQuocTuy(I12A) đã viết:1. Sơ qua về luồng (Thread)

Bài viết này mình sẽ hướng dẫn cho các bạn mới tìm hiểu về đa luồng và ứng dụng của nó và được mô tả trên ngôn ngữ C# cho dễ hiểu. Trước tìm hiểu nó cũng vất vả vì nó khó hiểu giờ muốn giúp chút xíu gì đó cho các bạn (Bạn sẽ cảm thấy vô cùng đơn giản nếu làm việc nhiều với nó, đó chỉ là do kỹ năng của mình yếu lên cảm thấy phức tạp)
Một luồng là một chuỗi liên tiếp những sự thực thi (mã lệnh hay câu lệnh) trong chương trình (ứng dụng). Trong một chương trình C#, dễ thấy việc thực thi được bắt đầu bằng phương thức main() và tiếp tục cho đến khi kết thúc hàm main(). Cấu trúc này rất hay cho những chương trình có một chuỗi xác định những nhiệm vụ liên tiếp, nhưng thường thì trong một chương trình ứng có nhiều hơn một công việc vào cùng một lúc. Một ví dụ rất hay và khá thực tế mà mình thấy trên diễn đàn tin học của "can_qua", các bạn cùng tham khảo

Vấn đề quan trọng là bạn phải tìm ra một cách nào đó để chia một công việc lớn thành những công việc nhỏ mà trong đó có những việc có thể thực hiện một cách đồng thời. Ví dụ, mẹ giao việc cho con là "làm việc xong mới được đi coi xi-nê". "Công việc lớn" này có thể gồm 3 việc nhỏ "quét nhà", "rửa chén", và đi coi "xi-nê". Trong đó chỉ được "coi xi-nê" sau khi làm xong hai việc kia. Rõ ràng là bạn muốn làm xong việc nhà càng sớm càng tốt để vi vút, nên bạn kêu thằng em bạn quét nhà, bạn thì rửa chén, cả hai người cùng làm đồng thời. Rửa chén xong trước, bạn phải đợi thằng em bạn thông báo là quét nhà cũng xong thì bạn mới vù đi coi xi-nê được. Như vậy multithread cho "rửa chén" và "quét nhà" làm tăng hiệu suất thực hiện công việc của bạn (so với việc bạn làm tuần tự rửa chén, quét nhà, coi xi-nê).

2. Ví dụ nhỏ về đa luồng

Ví dụ này mình sẽ mô tả 2 luồng (cho đơn giản) được thực thi cùng một lúc.
Ở đây thì bạn cứ tưởng tượng ra rằng có hai thằng tên là A và B thi đếm từ 0 cho đến 100, thằng 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 thằng).

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
      }
Bây giờ thầy giáo (hoặc là bạn) bỗng cao hứng gọi 2 thằng lên thi đọc --> 2 thằng A và B cùng đọc Đến đây trong phương thức hàm main() của chương trình bạn sẽ phải gọi 2 thằng này
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();
  }

// Thư viện tham chiếu nằm trong namespace System.Threading;
// Bạn cần khai báo sử dụng nó using Sytem.Threading;
 
Truyền tham số cho Thread
Có nhiều cách truyền tham số, tuỳ theo nhu cầu mà dùng sao cho phù hợp
Thông qua phương thức Start(object) thì bạn có thể truyền tham số theo cách này.
Ví dụ:
Code:

  using System;
  using System.Threading;
  class ThreadSample
  {
    public static void Main()
    {
    Thread newThread = new Thread(ThreadSample.DoWork);
    newThread.Start(100); // Dữ liệu truyền vào là một số nguyên
   
    // Để Start luồng sử dụng phương thức thể hiện (instance method)
    // thì trước tiên ta cần khởi tạo nó trước khi gọi
   
    ThreadSample worker = new ThreadSample();
    newThread = new Thread(worker.DoMoreWork);
    newThread.Start("Truyền đối tượng cho thread thực thi");
   
    // Nếu biết trước được đối tượng truyền vào thì ta cần ghép kiểu cho nó
    // để việc sử dụng được hiệu quả hơn
    }
   
    public static void DoWork(object data)
    {
    Console.WriteLine("Ðây là luồng tĩnh.");
    Console.WriteLine("Dữ liệu truyền vào: Data = {0}", data);
    }
   
    public void DoMoreWork(object data)
    {
    Console.WriteLine("Đây là luồng cần được khởi tạo");
    Console.WriteLine("Dữ liệu truyền vào là: Data = {0}", data);
    }

  }
Đôi khi ta cũng sử dụng ThreadPool cho việc khởi chạy một luồng mới với tham số là _Param
Code:

 ThreadPool.QueueUserWorkItem(new WaitCallback(_ThreadProc), _Param);


Bạn hãy tham khảo về nó tại đây: http://dotnetperls.com/threadpool

Chờ đợi một luồng khác
Bằng việc sử dụng phương thức Join(); ta có thể cho phép chờ đợi một luồng khác thực hiện xong (để thu thập dữ liệu chẳng hạn - do chia nhỏ công việc mà), thì luồng đã gọi nó mới tiếp tục được công việc của nó
Code:

        static void Main(string[] args)
        {
            Console.WriteLine("Main thread: Gọi luồng thứ 2 ThreadProc()...");

            Thread t = new Thread(new ThreadStart(ThreadProc));
            t.Start();

            for (int i = 0; i < 50; i++)
            {
                Console.WriteLine("Main thread: Do Some Work.");
                Thread.Sleep(0);
            }

            Console.WriteLine("Main thread finished: And call t.Join()");
            Console.WriteLine("Main thread tạm thời đang được dừng lại");
            t.Join(); // Dừng tại đây

            // Sau khi ThreadProc hoàn tất Main thread tiếp tục công việc của nó
            // Tiếp tục thực thi 3 dòng lệnh tiếp theo
            Console.WriteLine("Thread.Join() has returned.");
            Console.WriteLine("Main đã làm xong việc");
            Console.ReadLine();
        }

        public static void ThreadProc()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("ThreadProc: {0}", i);
                Thread.Sleep(0);
            }
        }
Đối số cho Join() có thể là int hoặc TimeSpan, khoảng thời gian giới hạn mà Main thread có thể chờ được, ví dụ

Code:
t.Join(10000);

nghĩa là, sau 10s mà ThreadProc chưa làm xong việc của nó thì Main thread không chờ nữa, tiếp tục công việc khác

Admin
Cụ thể hơn: Luồng chính chờ luồng con kết thúc trong khoảng 10 giây. Nếu luồng con xong sớm hơn hoặc quá 10 giây thì lệnh kế tiếp (đi sau) lệnh t.Join(10000) sẽ được thực hiện.
http://vubka.blogspot.com/2010/06/vi-du-ve-luong-multithreading-c.html

VoTrongQuyet-I12A

Tổng số bài gửi : 24
Join date : 16/02/2012

Xem lý lịch thành viên

Về Đầu Trang Go down

câu 1:Trình bày nguyên lý tập luồng và Ví dụ minh họa

Bài gửi  PhamQuangHien_I12A on 3/4/2012, 22:23

*** 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 (tập luồng).
Đội binh này sẽ sẳn sàng chiến đầu trang bị vũ khí khi có mệnh lệnh (sẵn sàng chờ công việc).
Khi có địch đột nhập, Tướng lĩnh sẽ điều 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 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)

PhamQuangHien_I12A

Tổng số bài gửi : 62
Join date : 22/02/2012
Age : 28
Đến từ : Quãng Ngãi

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Thảo luận Bài 5

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Trang 6 trong tổng số 9 trang Previous  1, 2, 3, 4, 5, 6, 7, 8, 9  Next

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết