Thảo luận Bài 5

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

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

Thảo luận Bài 5

Bài gửi  Admin on 22/3/2013, 23:03

Thảo luận những vấn đề liên quan đến Bài 5.

Admin
Admin

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

Xem lý lịch thành viên http://hedieuhanh.forumvi.net

Về Đầu Trang Go down

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

Bài gửi  HoangThanhThien(I22B) on 22/3/2013, 23:08

Tập luồng:
1. Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
2. Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
3. 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.
4. Phục vụ xong, luồng được đưa trả về tập luồng.
5. 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ụ 1: Trong một lớp học, sẽ có một thầy giáo (tiến trình cha) và sẽ có nhiều học sinh gọi là (tập luồng)
Mọi học sinh luôn sẵn sàng nghe lời, mệnh lệnh của thầy giáo (sẵn sang chờ công việc)
Khi có cuộc thi học sinh giỏi do trường tô chức, ngày đầu tiên thi môn Văn thì thầy giáo sẽ chọn những học sinh giỏi môn Văn (một luồng) đi ra thi, tranh giải với lớp khác (luồng được đánh thức và đưa ra vận hành)
Trong khi đó, ngày thứ hai thi môn Toán( nhận thêm yêu cầu), thầy giáo sẽ cử nhóm học sinh giỏi môn Toán (một luồng) ra thi để giành chiến thắng (luồng được đánh thức và đưa ra vận hành). Sau khi thi xong và chiến thắng, giành được giải, tất cả học sinh giỏi đó về lớp học (luồng được trả về tập luồng)

Ví dụ 2: Anh lập trình viên khi xây dựng ứng dụng, thì trước tiên anh phải trao dồi và học kiến thức trước.


Được sửa bởi HoangThanhThien(I22B) ngày 22/3/2013, 23:21; sửa lần 1.

HoangThanhThien(I22B)

Tổng số bài gửi : 43
Join date : 14/03/2013

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

Về Đầu Trang Go down

So sánh luồng và tiến trình truyền thống

Bài gửi  HuynhDucQuang(I22B) on 22/3/2013, 23:09

- 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.

HuynhDucQuang(I22B)

Tổng số bài gửi : 38
Join date : 08/03/2013
Đến từ : 11H1010104

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

Về Đầu Trang Go down

Lợi ích đa luồng

Bài gửi  HuynhDucQuang(I22B) on 22/3/2013, 23:12

1. Đáp ứng yêu cầu tốt hơn vì có nhiều luồng trả lời. Giả sử một luồng đang bận thì sẽ có những luồng khác trả lời.
VD: Khi gọi đến tổng đài cần tư vấn. Giả sử có nhiều người đang gọi cùng một lúc mà chỉ có một nhân viên trực máy thì sẽ gây ra tình trạng bận máy liên tục => Chưa đáp ứng tốt nhu cầu của khách hàng. Nhưng nếu có nhiều nhân viên trực => phục vụ được nhiều khách hàng đồng thời.

2. Chia sẽ tài nguyên tốt hơn so với đa tiến trình. Vì các luồng cùng nằm trong một tiến trình, nên việc chia sẽ nội dung trong một tiến trình sẽ dễ đang hơn.
VD: Khi cần mượn xe thì mượn người trong gia đình lúc nào cũng dễ dàng hơn mượn người ngoài.

3. Tiết kiệm hơn vì việc cấp phát bộ nhớ từ tiến trình cho luồng nhanh hơn.
VD: Khi có ai đó trong nhà lập gia đình, thì họ sẽ cần một nơi để ở. Nếu ngăn vách để tạo thêm một phòng sẽ tiết kiệm hơn so với việc mua nhà riêng.

4. Tận dụng được đa xử lý (nhiều CPU, thường là các máy server). HĐH sẽ cấp cho mỗi một luồng chính nguyên cả CPU => tốc độ sẽ nhanh hơn gấp nhiều lần so với sử dụng chỉ một CPU
VD: Gia đình có một máy tính, nếu hai người cần sử dụng thì chỉ mỗi người có thể sử dụng ở một thời điểm => tốn thời gian. Nhưng nếu có 2 máy thì thì công việc sẽ hoàn tất nhanh hơn.

5. Lập trình đa luồng dễ hơn đa tiến trình vì việc tương tác, truyền thông, liên lạc, dùng chung tài nguyên dễ hơn rất nhiều so với đa tiến trình.

HuynhDucQuang(I22B)

Tổng số bài gửi : 38
Join date : 08/03/2013
Đến từ : 11H1010104

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

Về Đầu Trang Go down

Phân biệt khái niệm luồng, tiến trình và cho biết những ưu điểm, lợi ích của công nghệ đa luồng, cho ví dụ minh họa

Bài gửi  HoangThanhThien(I22B) on 22/3/2013, 23:13

A. Luồng: 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
Ví dụ: Lớp học là tiến trình

B. 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ụ: Thầy giáo là lớp học là luồng chính(đơn luồng), học sinh là luồng phụ (đa luồng)

***Những ưu điểm, ích lợi của công nghệ đa luồng là
1. Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
Ví dụ: Tổng đài 1088. Khi khách hàng điện thoại hỏi 1088, về vấn đề gì họ chưa hiểu, thì một trong người trực điện thoại thứ 1 sẽ trả lời. Nếu trong thời điểm đó khách hàng thứ hai gọi 1088, thì một người trực thứ 2 sẽ trả lời cho khách hàng. Nên giải quyết vấn đề nhanh hơn cho khách hàng.

2. Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
Ví dụ: Trong nhà có 3 chiếc xe máy A, B, C. Người trong gia đình có thể luân phiên nhau chạy chiếc nào mình thích.

3. Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn
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, nhưng có quyền hạn trong lớp của mình thôi.

4. Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng.
Ví dụ: Trong nhà có nhiều cái quạt, nên nó có thể phục vụ làm mát cho từng thành viên trong gia đình.

5. Lập trình đa luồng dể hơn lập trình đa tiến trình ( việc tương tác truyền thông dùng chung tài nguyên sử dụng chung dễ hơn nhiều so với đa tiến trình truyền thông)


HoangThanhThien(I22B)

Tổng số bài gửi : 43
Join date : 14/03/2013

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  HuynhDucQuang(I22B) on 22/3/2013, 23:17

HoangThanhThien(I22B) đã viết:Tập luồng (Thread Pools):
1. Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
2. Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
3. 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.
4. Phục vụ xong, luồng được đưa trả về tập luồng.
5. 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.

Mình xin vổ sung thêm:
2. Chờ trong trạng thái ngủ.
4. Và quay lại trạng thái ngủ.

Tập luồng được tạo sẳn trước nhằm mục đính giảm thời gian khởi tạo khi cần xử lý một yêu cầu. Lấy ví dụ rằng các chiến sĩ nếu được mặc áo giáp sẳn, có binh khí kế bên rồi đi ngủ chờ giặc đến là đánh sẽ sẳn sàng nhanh hơn, tốt hơn những chiến sĩ khi nghe có giặc đến mới mặc áo giáp, mang giày và lấy binh khí.

HuynhDucQuang(I22B)

Tổng số bài gửi : 38
Join date : 08/03/2013
Đến từ : 11H1010104

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  HoangThanhThien(I22B) on 22/3/2013, 23:35

HuynhDucQuang(I22B) đã viết:
HoangThanhThien(I22B) đã viết:Tập luồng (Thread Pools):
1. Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
2. Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
3. 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.
4. Phục vụ xong, luồng được đưa trả về tập luồng.
5. 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.

Mình xin vổ sung thêm:
2. Chờ trong trạng thái ngủ.
4. Và quay lại trạng thái ngủ.

Tập luồng được tạo sẳn trước nhằm mục đính giảm thời gian khởi tạo khi cần xử lý một yêu cầu. Lấy ví dụ rằng các chiến sĩ nếu được mặc áo giáp sẳn, có binh khí kế bên rồi đi ngủ chờ giặc đến là đánh sẽ sẳn sàng nhanh hơn, tốt hơn những chiến sĩ khi nghe có giặc đến mới mặc áo giáp, mang giày và lấy binh khí.

Ví dụ của bạn rất hay Smile, giống dạng muốn xây dựng ứng dụng web chẳng hạn, thì phải học cơ bản HTML, CSS..... cho hiễu rỏ mới bắt tay làm. Nó sẳn sàng nhanh hơn bạn ha, hơn là đùng 1 cái vào làm mới học thì trể r Smile

HoangThanhThien(I22B)

Tổng số bài gửi : 43
Join date : 14/03/2013

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

Về Đầu Trang Go down

Câu 1: Trình bày khái niệm luồng (thread) . Phân tích những lợi ích của công nghệ đa luồng

Bài gửi  NguyenThanhQuoc(I22A) on 22/3/2013, 23:37

Khái niệm luồng:
Luồng (Thread) 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 như tiến trình truyền thống (HWP-Heavy Weight Process).
Tiến trình có thể có một luồng chính với nhiều luồng phụ. Mỗi luồng có khả năng chia sẻ tài nguyên với các luồng khác trong tiến trình.
Nhiều luồng có thể dùng chung code với nhau.
So sánh luồng và tiến trình truyền thống:
Một tiến trình truyền thống hay tiến trình nặng có một luồng điều khiển đơn.
*Sự giống nhau:
- Đều có thông tin trạng thái
- Luồng cũng là tiến trình nhưng là tiến trình nhẹ (Light Weigh Process)
- Đa luồng hay đa 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ể
- 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
- Do dù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
- Cấp phát tài nguyên bộ nhớ cho tiến trình khá tốn kém.
- Lập trình đa luồng thì dễ hơn lập trình đa tiến trình.

*Sự 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 không cần gởi, nhận thông điệp.
- 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.
Những lợi ích của công nghệ đa luồng:
-khả năng đáp ứng tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường(Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
Vd: Tổng đài 1088 là nơi chuyên trả lời các thắc mắc của chúng ta. Trong tổng đài có nhiều nhân viên trực điện thoại. Mỗi nhân viên là một luồng(thread), khi một nhân viên bận thì có các nhân viên khác luôn trong tư thế sẵn sàng đáp ứng các nhu cầu cho chúng ta.
-chia sẻ tài nguyên: Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong một vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
Vd: Trong một lớp học có thầy giáo và các học sinh. Cả lớp đó là một tiến trình, thầy giáo là luồng chính, các bạn học sinh là luồng phụ cùng học chung một bài học và cách làm việc giống nhau. Các học sinh dùng chung tài nguyên như máy chiếu, bảng, micro,...Việc dùng chung tài nguyên giữa các học sinh trong một lớp thì dễ dàng hơn nhiều so với việc dùng tài nguyên của lớp khác(một tiến trình khác).
-đa luồng sẽ tiết kiệm hơn vì việc tạo mới luồng nhanh 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ồng dù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.
-lập trình đa luồng dễ hơn lập trình đa tiến trình vì việc tương tác, truyền thông, liên lạc, dùng chung tài nguyên dễ hơn rất nhiều so với đa tiến trình.

NguyenThanhQuoc(I22A)

Tổng số bài gửi : 18
Join date : 09/03/2013
Age : 24
Đến từ : lớp TH10a3, Dh mở tp.hcm

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

Về Đầu Trang Go down

vị dụ thêm về lợi ích của đa luồng so với đa tiến trình

Bài gửi  NguyenQuangHuy(I22B) on 22/3/2013, 23:39

Trong thực tế vào năm 1999, 1 trang web đăng ký việc làm vào thời điểm này chỉ cần từ 5 người trở lên cùng quay số ( đăng nhập internet bằng dial_up) và nhập thông tin cá nhân vào database của trang web thì server bị treo vì ưng dụng công nghệ web động CGI(common gateway interface) công nghệ này xử lý theo đa tiến trình gây quá tai server ,sau này được thay bằng công nghê ASP (active server pages) xử lý đa luồng và vấn đề đã được giải quyết triệt để, tiết kiệm được tiền đầu tư thêm phân cứng không cần thiết.

NguyenQuangHuy(I22B)

Tổng số bài gửi : 3
Join date : 15/03/2013
Age : 28
Đến từ : Hồ chí Minh

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  HoangThanhThien(I22B) on 22/3/2013, 23:40

huynguyen đã viết:Trong thực tế vào năm 1999, 1 trang web đăng ký việc làm vào thời điểm này chỉ cần từ 5 người trở lên cùng quay số ( đăng nhập internet bằng dial_up) và nhập thông tin cá nhân vào database của trang web thì server bị treo vì ưng dụng công nghệ web động CGI(common gateway interface) công nghệ này xử lý theo đa tiến trình gây quá tai server ,sau này được thay bằng công nghê ASP (active server pages) xử lý đa luồng và vấn đề đã được giải quyết triệt để, tiết kiệm được tiền đầu tư thêm phân cứng không cần thiết.

bạn biết ví dụ này của ai kể lại không Very Happy

HoangThanhThien(I22B)

Tổng số bài gửi : 43
Join date : 14/03/2013

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

Về Đầu Trang Go down

Code của thầy về sản xuất tiêu thụ đa luồng cho những bạn không kịp ghi hay nghỉ !

Bài gửi  NguyenQuocHuy (I22B) on 22/3/2013, 23:53

#include < stdio . h >
#include < conio . h >
#include < windows . h > // Sử dụng được hàm win32 API

#define BUFFER_SIZE 10 // định nghĩa một buffer có 10 khoang chứa

int buffer[BUFFER_SIZE];
int in=0; // giá trị vị trí xếp sản phẩm vào
int out=0;// giá trị 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, 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ẽ đượ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,(chờ in tăng lên 1) rồi mới showbuffer !
ShowBuffer();
}
}

NguyenQuocHuy (I22B)

Tổng số bài gửi : 49
Join date : 10/03/2013

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

Về Đầu Trang Go down

Lập trình đa luồng đồng hành trong Windows

Bài gửi  ChauQuangCam (I22B) on 23/3/2013, 00:10

- 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 da 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ó trên 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ể sử dụng truy cập các tài nguyên trong hệ thống. Những hàm đó được gọi là giao diện ứng dụng 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: Ứ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 đả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 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 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 . Hệ thống sẽ phát sinh thông điệp khi có một sự kiện nhập vào, ví dụ như khi người dùng nhấn một phím, di chuyển chuột,....
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 -> Đa luồng trong windows

ChauQuangCam (I22B)

Tổng số bài gửi : 23
Join date : 11/03/2013

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  ChauQuangCam (I22B) on 23/3/2013, 00:16

NguyenQuocHuy (I22B) đã viết:#include < stdio . h >
#include < conio . h >
#include < windows . h > // Sử dụng được hàm win32 API

#define BUFFER_SIZE 10 // định nghĩa một buffer có 10 khoang chứa

int buffer[BUFFER_SIZE];
int in=0; // giá trị vị trí xếp sản phẩm vào
int out=0;// giá trị 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, 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ẽ đượ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);
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,(chờ in tăng lên 1) rồi mới showbuffer !
ShowBuffer();
}
}

Cho mình hỏi từ "[i]mục quản
" lúc thầy giải thích Hàm ý nghĩa nó là gì vậy???

ChauQuangCam (I22B)

Tổng số bài gửi : 23
Join date : 11/03/2013

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  HuynhDucQuang(I22B) on 23/3/2013, 01:15

ChauQuangCam (I22B) đã viết:
Cho mình hỏi từ "mục quản" lúc thầy giải thích Hàm ý nghĩa nó là gì vậy???
Mục quản (handle) cũng giống như ID vậy đó bạn, dùng để phân biệt các luồng với nhau.

NguyenQuocHuy (I22B) đã viết:#include < stdio . h >
#include < conio . h >
#include < windows . h > // Sử dụng được hàm win32 API

#define BUFFER_SIZE 10 // định nghĩa một buffer có 10 khoang chứa

int buffer[BUFFER_SIZE];
int in=0; // giá trị vị trí xếp sản phẩm vào
int out=0;// giá trị 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, 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ẽ đượ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, (chờ in tăng lên 1) rồi mới showbuffer ! Bước này nhằm mục đích đồng bộ hoá các luồng, nếu không sẽ cho ra kết quả sai. Đồng bộ hoá trong bài toán này để biến in tăng thêm 1 rồi mới xuất buffer ra màn hình
ShowBuffer();
}
}

HuynhDucQuang(I22B)

Tổng số bài gửi : 38
Join date : 08/03/2013
Đến từ : 11H1010104

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  NguyenHoangKimVu (I11C) on 23/3/2013, 07:24

HoangThanhThien(I22B) đã viết:Tập luồng:
1. Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
2. Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
3. 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.
4. Phục vụ xong, luồng được đưa trả về tập luồng.
5. 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ụ 1: Trong một lớp học, sẽ có một thầy giáo (tiến trình cha) và sẽ có nhiều học sinh gọi là (tập luồng)
Mọi học sinh luôn sẵn sàng nghe lời, mệnh lệnh của thầy giáo (sẵn sang chờ công việc)
Khi có cuộc thi học sinh giỏi do trường tô chức, ngày đầu tiên thi môn Văn thì thầy giáo sẽ chọn những học sinh giỏi môn Văn (một luồng) đi ra thi, tranh giải với lớp khác (luồng được đánh thức và đưa ra vận hành)
Trong khi đó, ngày thứ hai thi môn Toán( nhận thêm yêu cầu), thầy giáo sẽ cử nhóm học sinh giỏi môn Toán (một luồng) ra thi để giành chiến thắng (luồng được đánh thức và đưa ra vận hành). Sau khi thi xong và chiến thắng, giành được giải, tất cả học sinh giỏi đó về lớp học (luồng được trả về tập luồng)

Ví dụ 2: Anh lập trình viên khi xây dựng ứng dụng, thì trước tiên anh phải trao dồi và học kiến thức trước.

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 sang 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).

NguyenHoangKimVu (I11C)

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

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

Về Đầu Trang Go down

Luồng xử lý của CPU!!!

Bài gửi  NgoVanTuyen(I22B) on 23/3/2013, 07:27

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.[list][*]

NgoVanTuyen(I22B)

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

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

Về Đầu Trang Go down

Những mô hình đa luồng

Bài gửi  NgoVanTuyen(I22B) on 23/3/2013, 07:30

+ 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 một-một :á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ộtluồ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 đ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ìnhnhiề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ý.

NgoVanTuyen(I22B)

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

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  NguyenHoangKimVu (I11C) on 23/3/2013, 07:36

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 -> Đa 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.

NguyenHoangKimVu (I11C)

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

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

Về Đầu Trang Go down

Những thành phần của luồng trong hệ điều hành

Bài gửi  NguyenManhHuy(I22B) on 23/3/2013, 08:30

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).

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 quá 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)

NguyenManhHuy(I22B)

Tổng số bài gửi : 30
Join date : 09/03/2013
Age : 28
Đến từ : 12H1010047

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

Về Đầu Trang Go down

so sánh sự khác nhau giữa lập trình đa luồng và đa tiến trình

Bài gửi  NguyenManhHuy(I22B) on 23/3/2013, 08:32

Bài sau đây đã dược post trên trang của thầy và được thầy xem qua, mình đem về để chúng ta cùng tham khảo nhé/
Giống nhau :

1. Đều có thông tin trạng thái
2. Luồng còn được gọi là tiến trình nhẹ
3. Nhiều luồng or nhiều tiến trình có thể liên quan đến một chương trình
4. Chia sẻ tài nguyên cho nhau
5. Tăng tốc tính toán
6. Đảm bảo tính đơn thể

Khác nhau

1. 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
VD : Mượn đồ dùng trong gia đình thì dể hơn mượn của hàng xóm
2. Do luồng chung tài nguyên với cha & các luồng khác nên việc tạo lập & 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ộ
3. Cấp phát bộ nhớ & tài nguyên cho tiến trình thì tốn kém hơn luồng
4. Lập trình đa luồng thì dể hơn đa tiến trình

NguyenManhHuy(I22B)

Tổng số bài gửi : 30
Join date : 09/03/2013
Age : 28
Đến từ : 12H1010047

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

Về Đầu Trang Go down

Câu 1:Trình bày khái niệm luồng.So sánh luồng với tiến trình.Phân tích lợi ích của công nghệ đa luồng(giống và khác nhau).

Bài gửi  dangmonghai(I12A) on 23/3/2013, 08:37

+Khái niệm đa luồng: Luồng còn gọi là tiến trình nhẹ (Light Weight Process), cũng là một đơn vị cơ bản sử dụng CPU.
+So sánh:
- Tiến trình (Process) là chuơng trình trong thời gian thực hiện (đặt dưới sự quản lý của HĐH).
- Luồng (Thread) còn gọi là tiến trình nhẹ (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 truyền thống ( Heavy Weight Process).
- Tiến trình có thể có một luồng chính với nhiều luồng phụ. Mỗi luồng có khả năng chia sẻ tài nguyên với các luồng khác trong tiến trình.
- Nhiều luồng có thể cùng chung một mã chương trình.
+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 (ví dụ, luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
- Chia sẽ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong một vùng địa chỉ, do đó dễ chia sẻ tài nguyên hơn so với trường hợp đa tiến trình.
- Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là một công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, chuyển ngữ cảnh chậm hơn 5 lần).
- Tận dụng được thế mạnh của kiến trức đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể được chạy bởi CPU riêng.
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.Tương tác dùng chung giữa các tiến trình dễ hơn đa tiền trình truyền thông.

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).

Admin
- Đây là khẳng định sai từ khoá trước !
- Đúng hơn phải là: Lớp là Tiến trình đa luồng bao gồm Giáo viên là Luồng chính, còn Các HV là các Luồng phụ !

dangmonghai(I12A)

Tổng số bài gửi : 15
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. Cho ví dụ

Bài gửi  NguyenTanDat(I22B) on 23/3/2013, 09:18

-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 luôn trong trạng thái sẵn sàng chiến đấu khi có mệnh lệnh (sẵn sàng chờ công việc).
Khi có quân địch đột nhập, tướng lĩnh sẽ điều một binh sĩ (một luồng) đi chiến đấu (một luồng được đánh thức và đưa vào vận hành).
Sau khi hoàn thành nhiệm vụ binh sĩ sẽ trở về doanh trại (luồng được trả về tập luồng) và vẫn luôn trong thạng thái sẵn sàng.

NguyenTanDat(I22B)

Tổng số bài gửi : 12
Join date : 09/03/2013

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  NguyenTanDat(I22B) on 23/3/2013, 09:37

-Hàm GetCurrendThread(): 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(): tạm ngừng công việc của luồng với mục quản cho trước.
-Hàm Sleep(GetTickCount()%5000): luồng sau khi tiêu thụ xong sẽ ngủ từ (0 -> 4.999 miligiay).
-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 ShowBuffer(): đưa nội dung của Buffer lên màn hình.
-Hàm ResumeThread(): đánh thức luồng với mục quản cho trước.
-Hàm CloseHandle(ProducerHandle1): dùng để hủy luồng với mục quản cho trước chấm dứt công việc của nó.
-Hàm Sleep(1): luồng chính ngủ 1 miligiay rồi mới chạy tiếp ( chờ 1 chút trước khi show).

NguyenTanDat(I22B)

Tổng số bài gửi : 12
Join date : 09/03/2013

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  LeAnhToan48(I22B) on 23/3/2013, 10:25

huynguyen đã viết:Trong thực tế vào năm 1999, 1 trang web đăng ký việc làm vào thời điểm này chỉ cần từ 5 người trở lên cùng quay số ( đăng nhập internet bằng dial_up) và nhập thông tin cá nhân vào database của trang web thì server bị treo vì ưng dụng công nghệ web động CGI(common gateway interface) công nghệ này xử lý theo đa tiến trình gây quá tai server ,sau này được thay bằng công nghê ASP (active server pages) xử lý đa luồng và vấn đề đã được giải quyết triệt để, tiết kiệm được tiền đầu tư thêm phân cứng không cần thiết.
Ví dụ này là của bản thân thầy trải nghiệm mà ta Very Happy

LeAnhToan48(I22B)

Tổng số bài gửi : 38
Join date : 08/03/2013

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

Về Đầu Trang Go down

Tại sao tiến trình truyền thống thì "nặng" còn luồng thì "nhẹ" ?

Bài gửi  LeAnhToan48(I22B) on 23/3/2013, 10:27

Vì tạo luồng dễ dàng, nhanh và ít tốn kém hơn là tạo hẳn một tiến trình. Tạo một tiến trình thì khó, chậm và tốn nhiều thời gian, chi phí.
Ví dụ: thêm 1 lớp học trong trường thì khó hơn là thêm 1 chỗ ngồi cho 1 sinh viên trong lớp. Khi thêm 1 lớp học thì phải đảm bảo đủ số lượng sinh viên để mở lớp, đảm bảo có đủ các trang thiết bị phục vụ cho lớp học đó và còn phải có giờ giấc, lịch học hẳn hoi. Trong khi thêm 1 ghế cho 1 sinh viên vào lớp trễ thì quá dễ dàng.

LeAnhToan48(I22B)

Tổng số bài gửi : 38
Join date : 08/03/2013

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 Today at 22:03


Sponsored content


Về Đầu Trang Go down

Trang 1 trong tổng số 8 trang 1, 2, 3, 4, 5, 6, 7, 8  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