Thảo luận Bài 5

Trang 2 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

Ưu điểm và nhược điểm của một ứng dụng đa luồng( Multithreaded )

Bài gửi  tranvanthien27(I12C) on 28/3/2012, 22:42

1- Lợi thế của một ứng dụng Multithreaded
* Cải thiện hiệu suất và đồng thời
Đối với các ứng dụng nhất định, hiệu quả và đồng thời có thể được cải thiện bằng cách sử dụng đa luồng và multicontexting với nhau. Trong các ứng dụng khác, hiệu suất có thể không bị ảnh hưởng hoặc thậm chí bị suy thoái bằng cách sử dụng đa luồng và multicontexting với nhau. Làm thế nào hiệu suất bị ảnh hưởng phụ thuộc vào ứng dụng của bạn.
* Đơn giản hóa mã hóa các cuộc gọi thủ tục từ xa và các cuộc hội thoại
Trong một số ứng dụng nó được dễ dàng hơn để mã cuộc gọi thủ tục khác nhau từ xa và các cuộc hội thoại trong chủ đề riêng biệt hơn để quản lý chúng từ cùng một thread.
* Đồng thời tiếp cận với nhiều ứng dụng
BEA Tuxedo khách hàng của bạn có thể được kết nối với nhiều ứng dụng cùng một lúc.
* Giảm số lượng máy chủ cần thiết
Bởi vì một máy chủ có thể gửi chủ đề dịch vụ nhiều, số lượng máy chủ để bắt đầu cho ứng dụng của bạn bị giảm. Khả năng này cho nhiều đề cử đặc biệt hữu ích cho các máy chủ thoại, nếu không phải được dành riêng cho một khách hàng cho toàn bộ thời gian của cuộc hội thoại.
Đối với các ứng dụng, trong đó chủ đề của khách hàng được tạo ra bởi Microsoft Internet Information Server API hoặc giao diện Netscape Enterprise Server (có nghĩa là, các NSAPI), việc sử dụng nhiều đề tài là điều cần thiết nếu bạn muốn có được những lợi ích đầy đủ khả năng bởi những công cụ này.

2- Nhược điểm của một ứng dụng Multithreaded
* Khó khăn của việc viết mã
ứng dụng Multithreaded và multicontexted không dễ dàng để viết. Chỉ lập trình viên có kinh nghiệm nên thực hiện mã hóa cho các loại ứng dụng.
• Khó khăn của gỡ rối
Đó là khó khăn hơn nhiều để tái tạo một lỗi trong ứng dụng đa luồng hoặc multicontexted hơn là để làm như vậy trong một ứng dụng đơn luồng đơn contexted,. Kết quả là, nó là khó khăn hơn, trong trường hợp trước đây, để xác định và xác minh nguyên nhân gốc rễ khi lỗi xảy ra.
• Khó khăn của việc quản lý đồng thời
Các nhiệm vụ quản lý tương tranh giữa các chủ đề rất khó khăn và có tiềm năng để giới thiệu những vấn đề mới vào ứng dụng.
• Khó khăn thử nghiệm
Kiểm tra một ứng dụng đa luồng là khó khăn hơn thử nghiệm một ứng dụng đơn luồng, vì khuyết tật này thường liên quan đến thời gian và khó khăn hơn để sinh sản.
• Khó khăn của porting mã hiện tại
Code hiện tại thường đòi hỏi quan trọng tái kiến trúc để tận dụng đa luồng. Các lập trình viên cần phải:
o Hủy bỏ các biến tĩnh
o Thay thế bất kỳ chức năng cuộc gọi mà không phải là thread-safe
o Thay thế các mã khác mà không phải là thread-safe
Bởi vì các cảng đã hoàn thành phải được kiểm tra và tái kiểm tra, công việc yêu cầu một cổng đa luồng ứng dụng là đáng kể.

tranvanthien27(I12C)

Tổng số bài gửi : 62
Join date : 15/02/2012
Age : 27
Đến từ : Tuy Hòa - 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  tranvanthien27(I12C) on 28/3/2012, 22:43

NguyenHoangThangI12A đã viết:Câu 2: Trình bày nguyên lý tập nguồn và cho ví dụ minh họa
Tập luồng (Thread Pools):
• Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
• Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
• Khi tiến trình cha (ví dụ Web Server) nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
• Phục vụ xong, luồng được đưa trả về tập luồng.
• Nếu số yêu cầu lớn hơn số luồng trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
Ví dụ:
Trong một doanh trai quân đội sẽ có một tướng lĩnh (tiến trình cha) và sẽ có một đội binh (tập luồng).
Đội binh này sẽ sẵn sàng chiến đầu khi có mệnh lệnh (sẵn sàng chờ công việc).
Khi có một tên địch đột nhập, Tướng lĩnh sẽ điều binh sĩ 1 (một luồng) đi bắt tên địch (một luồng được đánh thức và đưa vào vận hành).
Trong khi đó, lại có thêm một tên địch khác đột nhập (nhận thêm một yêu cầu), Tướng lĩnh sẽ điều binh sĩ 2 (một luồng) đi bắt địch (một luồng khác được đánh thức và đưa vào vận hành).
Sau khi bắt địch xong, binh sĩ sẽ trở về doanh trại (luồng được trả về tập luồng)


Mình cũng cho 1 cái VD:
Trong công ty có 1 phòng kỹ thuật (tiến trình cha). Trong phòng kỹ thuật có các nhân viên kĩ thuật(tập luồng).
Có 1 khách hàng bị trục trặc về thiết bị của họ ( bị hư máy tính). Phòng kỹ thuật sẽ nhận được yêu cầu. và sẽ điều 1 nhân viên đi khắc phục sự cố cho khách hàng. Khắc phục xong thì nhân viên đó sẽ quay về nơi làm việc của họ và chờ sẵn sàng.

tranvanthien27(I12C)

Tổng số bài gửi : 62
Join date : 15/02/2012
Age : 27
Đến từ : Tuy Hòa - Phú Yên

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

Về Đầu Trang Go down

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

Bài gửi  TranThiNgocQuynh(I12C) on 28/3/2012, 22:53

Giống nhau:
+ Đều có thông tin trạng thái. Thông tin này được lưu trữ trong PCB
+ Luồng còn được gọi là tiến trình nhẹ (Light Weight Process)
+ Nhiều luồng hoặc nhiều tiến trình có thể liên quan đến một chương trình
+ Chia sẻ tài nguyên cho nhau
+ Tăng tốc tính toán
+ Đảm bảo tính đơn thể

Khác nhau:
+ Do luồng cùng vận hành trong một vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn đa tiến trình
Ví dụ: Trong lớp học, các bạn (luồng) trong cùng một lớp dễ mượn tập hơn các bạn học khác lớp.
+ Do luồng dùng chung tài nguyên nên việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn tiến trình.
Ví dụ: Trong nhà, ngăn riêng một phòng để ở sẽ nhanh hơn việc chờ nhà nước cấp cho một căn hộ.
+ Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng.
+ Lập trình đa luồng dễ hơn đa tiến trình.

TranThiNgocQuynh(I12C)

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

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

Về Đầu Trang Go down

Thêm ví dụ về Đa luồng vs Đa tiến trình

Bài gửi  NguyenNgocDuy(I12A) on 28/3/2012, 22:59

lol! Ví dụ về đa luồng:
Một công ty có 2 bộ phận là: bán hàng và bộ phận sản xuất. Tại một thời điểm, mỗi bộ phận đều thực hiện nhiệm vụ riêng từng bộ phận(nhưng cả 2 bộ phận vẫn dưới sự chỉ đạo của ban giám đốc. Ban giám đốc như CPU(hihi...cái này hơi trừu tượng 1 tí)). Bộ phận sản xuất chỉ lo nhiệm vụ sản xuất sản phẩm, bộ phận bán hàng chỉ lo nhiệm vụ bán hàng. Giả sử, bộ phận sản xuất gặp trục trặc hay có vấn đề nghỉ 1 ngày thì cũng không hề ảnh hưởng đến bộ phận bán hàng và ngược lại.

lol! Ví dụ về đa tiến trình:
Công ty may mặc có bộ phận sản xuất quần áo may mặc. Bộ phận này chia làm nhiều khâu:khâu Cắt, khâu Ráp, khâu May, Khâu Đóng gói(Mỗi khâu xem như là một thread). Nếu như bình thường hoạt động thì các khâu này có khả năng làm cùng nhau nhưng theo quy trình là Cắt -> Ráp -> May -> Đóng gói. Giả sử khâu Cắt bị vấn đề, các khâu khác sẽ không thể làm tiếp.


Được sửa bởi NguyenNgocDuy(I12A) ngày 28/3/2012, 23:04; sửa lần 2.
avatar
NguyenNgocDuy(I12A)

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

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

Về Đầu Trang Go down

Y nghĩa 1 vài hàm trong bài toán sản xuất - tiêu thụ

Bài gửi  tranvanthien27(I12C) on 28/3/2012, 23:01

Y nghĩa 1 vai ham trong bài toán sản xuất - tiêu thụ
#include -->khai báo
#include
#include
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in=0;
int out=0;
int nextProduced=1;
void Producer(){
while (1){
// ... (nextProduced) quá trình tạo ra 1 sản phẩm
while(((in+1)%BUFFER_SIZE)==out); ---> vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm… khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
buffer[in]=nextProduced++; --> chèn sản phẩm vô ngăn chứa
in=(in+1)%BUFFER_SIZE; --> tìm vị trí khác để Producer chèn thêm sản phầm vào
SuspendThread(GetCurrentThread());lấy luồng hiện hành, SuspendThread hàm API dùng để tạo ngưng 1 luồng.
}
}
void Consumer(){
int nextConsumed;
while (1){
while(in==out); --> vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
------vòng lặp while thoát khi có 1 ngăn chứa sản phầm---------
nextConsumed=buffer[out]; --> lấy sản phẩm ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; --> tìm vị trí khác để Consumer lấy sản phẩm nếu out đang nằm ở cuối mảng thì out sẽ trở về đầu mảng
// ... (nextConsumed) ----quá trình tiêu thụ sàn phẩm-----
Sleep(GetTickCount()%5000); --> hàm API đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm,thời gian tính bằng ms trôi qua kể từ khi hệ thống khởi động tới thời điểm hiện tại, chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này tạm dừng trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nộii dung Buffer
const char * LeftMargin="\n\t";
int i;
printf(LeftMargin);
for(i=0; i<(in*5);i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0; iprintf("S%2d, ",buffer[i]);
printf("S%2d",buffer[BUFFER_SIZE-1]);
printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');printf("^out");
printf("\n");
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2; --> biến Handle chứa mục quản nhà SX
HANDLE ConsumerHandle1, ConsumerHandle2; --> biến Handle chứa mục quản nhà tiêu thụ

DWORD ProducerID1, ProducerID2; --> chứa ID nhà sx
DWORD ConsumerID1, ConsumerID2; --> chứa ID nhà 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); //khởi tạo nhà SX với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo là trạng thái luôn luôn ngủ

ProducerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2); // tuong tu
// tao 2 luồng tiêu thụ trong trang thái ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1); //khởi tạo nhà tiêu thụ với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái luôn luôn thức.

ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID2); //tuong tu
while(1){
printf("\n- Nhấn P/p để sản xuất,0 để kết thúc:”);
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1); //đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); ///đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case '0': /// giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1); --> làm luồng chính trễ 1 mili giây trước khi in bộ đệm
ShowBuffer(); -->in bộ đệm
}
}

tranvanthien27(I12C)

Tổng số bài gửi : 62
Join date : 15/02/2012
Age : 27
Đến từ : Tuy Hòa - Phú Yên

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

Về Đầu Trang Go down

Code Thực Thi Vấn Đề " Sản xuất - Tiêu thụ"

Bài gửi  NguyenVanBenI12C on 28/3/2012, 23:01

Code:
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#define BUFFER_SIZE 10;
int buffer[BUFFER_SIZE];
int in;
int out;
int nextproduced=1;
void Producer()
{
   while(1)//vòng lặp bất tận
   {
      while(((in+1)% BUFFER_SIZE)==out);
      buffer[in]=nextproduced ++;//khi gán xong sẽ tăng lên 1
      in=(in+1)% BUFFER_SIZE;
      SuspendThread(GetcurrenThread());//luồng trạng thái hiện hành được chuyển sang trạng thái ngủ cho đến khi được đánh thức
      //GetcurrenThread()-> trả về mục quản của luồng hiện hành
      
   }
}
void Consumed()
{
   int nextconsumed;
   while(1)
   {
      while(in==out);
      nextconsumed = buffer[out];
      out=(out+1)% BUFFER_SIZE;
      Sleep(GetTickCount()% 5000);//ngủ 1 khoảng thời gian cho trước
      //GetTickCount() -> nhận số mili giây trôi qua kể từ khi hệ điều hành khởi động cho đến thời điểm gọi hàm này

   }
}
Các bạn bổ xung tiếp nha!


Được sửa bởi NguyenVanBenI12C ngày 29/3/2012, 09:57; sửa lần 1.

NguyenVanBenI12C

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

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

Bài gửi  HoNgocTuan142(I12A) on 28/3/2012, 23:01

hoanggiangI12C đã viết:Thầy hỏi tai sao nên dùng code chung và dùng có chung có ưu điểm gì: .Có bạn trả lời rằng là dễ quản lý.Thầy nói đúng nhưng chưa chính xác lắm.và thầy nói nếu có sữa code thì thầy chỉ sửa 1 lần .Nếu sữa code riêng lẽ thì phải sữa rất nhiều. Còn theo em thì sử dụng 1 code chung sẽ dễ đồng bộ và dễ quản lý hơn. Tuy nhiên ở thực tế ta nên dùng 2-3 code chung để giả sử có bị virus hay bị 1 ai đó thay đổi code thì vẫn còn các code khác để sử dụng.

tất cả các ý này thầy và các bạn có trao đổi ở trên lớp rồi. nhưng thật sự là ý kiến về việc sử dụng chung code và việc phát sinh sự cố đó rất hay, rất thực tế.
thật sự là như vậy. giả sử khi phát sinh sự cố (bị vius gặm nhấm phần code chung này đi chẳng hạng pale ) đó là vấn đề lớn.

ví dụ thực tế trong lớp học, nếu giáo viên dán 1 thông báo ngoài cửa yêu cầu mọi người trong lớp thực hiện theo, nhưng có 1 phần tử xấu nào đấy "cao hứng" sửa lại nội dung => người đọc trước khi sửa làm đúng, người đọc sau khi sửa làm sai.
thế thì giải quyết đơn giản như sau: in thông báo ra vài bảng và trao cho các cán bộ lớp, nếu có trường hợp các thông báo từ các cán bộ lớp khác nhau thì sẽ quyết định làm theo số nhiều (làm theo các bảng thông báo nào giống nhau).

áp dụng vấn đề này vào việc sử dụng chung code trong đa luồng. bình thường các luồng trong 1 tiến trình có (hoặc không) sử dụng chong 1 code (code này điều khiển sự hoạt động của luồng). nhưng nếu code bị hư hỏng (có thể do vius gặm nhấm) thì hoạt động của các luồng sẽ bị sai lệch. giải quyết như trên, ta cho các luồng trong tiến trình sử dụng một code chung và giấu bớt vài code giống vậy đi, nếu code này bị hỏng thì còn có code khác (đa vẫn tốt hơn đơn).

nhưng giả sử ví dụ ta chia 1 code chung ra thành 3 code giống nhau (để tránh trường hợp số code bị sai và số code đúng = nhau)
T/H1: ta cho chạy 1 code và giấu 3 code còn lại. nếu vậy thì có phải trong khi tiến trình được thực thi thì các luồng phải luôn so sánh code chính với các code còn lại (đã được giấu đi) ??? như vậy có tốn CPU không ??? điều này mình nghĩ có lẽ hơi khó khăn vì phải so sánh 1 code luôn được thực thi với 1 code đã được giấu đi (bằng cách nào đó).
T/H2: ta cho 3 code cùng chạy song song, mình nghĩ như thế này sẽ dễ dàng cho việc so sánh code hơn. nhưng nếu virus tấn công được code này cũng sẽ tấn công được code khác. T/H này thì sử dụng 1 code chung sẽ tốt hơn.
T/H3: ta cho 2 code cùng chạy song song và giấu 1 code còn lại, như thế vẫn đảm bảo được sự thuận lợi khi so sánh giữa 2 code thực thi và khi 2 code này có sự khác nhau thì mới cần tới sự can thiệp của code thứ 3.

không biết điều này mình nghĩ có đúng không, đó là thắc mắc của mình. mong Thầy và các bạn giải đáp thêm cho.

Admin
- Đặt vấn đề đúng và thiết thực.
- Cách giải quyết cũng hợp lý. Sau này, theo cách đó, em sẽ có nhiều sáng kiến trong công việc ! Học HĐH cũng tác dụng đấy chứ !
avatar
HoNgocTuan142(I12A)

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

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

Về Đầu Trang Go down

Khái niệm Luồng và so sánh với tiến trình truyền thông

Bài gửi  tranvanthien27(I12C) on 28/3/2012, 23:13

Một luồng thường được gọi là tiến trình nhẹ (lightweight proces-LWP), là một đơn vị cơ bản của việc sử dụng CPU; nó hình thành gồm: một định danh luồng (thread ID), một bộ đếm chương trình, tập thanh ghi và ngăn xếp. Nó chia sẻ với các luồng khác thuộc cùng một tiến trình phần mã, phần dữ liệu, và tài nguyên hệ điều hành như các tập tin đang mở và các tín hiệu.
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. Nếu tiến trình có nhiều luồng điều khiển, nó có thể thực hiện nhiều hơn một tác vụ tại một thời điểm.

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
Ví dụ: Mình cần mượn xe đi đâu đó thì mượn xe trong gia đình để đi thì dễ hơn mượn của người ngoài
- 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 phòng riêng ra trong nhà thì dễ hơn việc xây thêm hay mua thêm một nhà khác.
- 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.

tranvanthien27(I12C)

Tổng số bài gửi : 62
Join date : 15/02/2012
Age : 27
Đến từ : Tuy Hòa - Phú Yên

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

Về Đầu Trang Go down

CPU của Intel sử dụng công nghệ đa luồng

Bài gửi  NguyenNgocDuy(I12A) on 28/3/2012, 23:15

Các bạn có thể đi vào chi tiết ưu và nhược điểm của các dòng CPU lõi kép của Intel, để thấy được những sản phẩm thực tế sử dụng chức năng đa luồng:
1. Pentium D
Thế hệ đầu tiên và có thể nói là có nhiều nhược điểm nhất là Pentium D.
- Cache trên thực tế được áp dụng công nghệ Share Cache của hai nhân. Nhưng thực tế lớn nhất chỉ có 2.77 MB cho 4.0 MB lý thuyết
- Sức mạnh xử lý đa luồng được nhiều người mong đợi nhưng khá thất vọng.
- Sử dụng hai nhân có xung quá cao, sự điều phối xử lý chưa được thông minh cho lắm dẫn đến khi chạy tiêu thụ điện năng quá cao làm cho CPU rất nóng. Đây là nhược điểm nhiều người phàn nàn nhất.
- Chưa được áp dụng những công nghệ mới của kiến trúc Core.
Có thể nói Pentium D mới chỉ là thử nghiệm cho thế hệ đa nhân của Intel nên chưa thực sư đáp ứng mong đợi.
Những ưu điểm nổi trội của Pentium D:
- Sức mạnh sử lý đa luồng mạnh hơn Petium 4 rất nhiều .
- Bộ đệm được trang bị lên gấp đôi trên lý thuyết và 150% trên thực tế.
Pentium D phổ biến nhất ngày nay là
D925 - 3.0 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit . Lớn nhất có Pentium D 3.4 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit.
2.Pentium Dual Core
Đây là thế hệ đa nhân ngay sau Pentium D .
Ưu điểm : Hai nhân nên xử lý đa luồng rất mạnh .
- Điều phối xử lý thông mình hơn nên có thể hạ thấp được xung nhịp của Cores xuống còn 1.6 GHz (E2140), 1.8 GHz (E2160), 2.0 GHz (E2180). Do vậy tiết kiệm điện và tỏa ít nhiệt lượng hơn, khắc phục được nhược điểm lớn nhất của Pentium D.
- Thực tế nếu được hỗ trợ thêm GPU của VGA mạnh thì Pentium Dual Core chạy rất mạnh trong các tác vụ xử lý đồ họa cao cấp.
- Sử dụng kiến trúc Intel Core mới nhất của Intel (được áp dụng trong các CPU Core 2 thế hệ sau).
Nhược điểm:
- Share Cache trên nền Lõi cũ nên chỉ tăng được L2 Cache lên 1.0 MB.
3.Core 2 Duo, Core 2 Extreme và Core 2 Quad
Có đầy đủ các ưu điểm của Pentium E. Ngoài ra còn có các cải tiến sau.
- Khả năng điều phối sử lý thông minh hơn nhiều, điều này có hai tác dụng.
Thứ nhất là tăng khả năng xử lý trên lý thuyết lên đến 40%.
Sức mạnh xử lý đa luồng cũng mạnh lên rất nhiều
- Áp dụng công nghệ Share Cache tăng gấp đôi dung lượng bộ đệm trên lý thuyết và 165% trên thực tế.
- Tiết kiệm điện năng khoảng 40% có được nhờ công nghệ chia sẻ xử lý thông minh.


(Sưu tầm) lol! lol! lol!
avatar
NguyenNgocDuy(I12A)

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

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

Về Đầu Trang Go down

THỰC THI VẤN ĐỀ " SẢN XUẤT-TIÊU THỤ"

Bài gửi  letanthanh18(I12A) on 28/3/2012, 23:18

Code:

#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BUFFER_SIZE  10  // số khoang chứa bộ đệm

int buffer[BUFFER_SIZE]; //  mảng số nguyên gồm buffer_size phần tử
int in=0;         // trỏ đến vị trí trống kế tiếp
int out=0;         // trỏ đến vị trí sản phẩm

int nextProduced=1;      //khi sản phẩm được sản xuất thì nextProduced tăng 1

void Producer(){
   while (1){      //  vòng lặp bất tận
      // ... Sản xuất (nextProduced)

      while(((in+1)%BUFFER_SIZE)==out); //  khi sản phẩm được sản xuất
      buffer[in]=nextProduced++;   // gán sản phẩm vào  mảng buffer và tăng nextProduced thêm 1
      in=(in+1)%BUFFER_SIZE;      // xoay vòng khi mảng buffer đầy
      SuspendThread(GetCurrentThread());   //luồng sản xuất hiện hành được chuyển sang trạng thái ngủ cho đến khi gọi lại sản xuất (GetCurrentThread( ) : trả về mục quản của luồng hiện hành)
   }
}

void Consumer(){
   int nextConsumed; 
   while (1){
      while(in==out);   //chờ bận
      nextConsumed=buffer[out];
      out=(out+1)%BUFFER_SIZE; // xoay vòng khi buffer đầy
      // ... Tiêu thụ (nextConsumed)
      Sleep(GetTickCount()%5000); // nghỉ 1 khoảng thời gian cho trước là 5s
      /* GetTickCount( ) : nhận số milli giây trôi qua từ khi HĐH khởi động cho đến khi gọi hàm này*/
   }
}

void ShowBuffer()
{   
// In nội dung Buffer   
}

int main(){
   HANDLE ProducerHandle1, ProducerHandle2;  // chứa mục quản luồng sản xuất ProducerHandle1, ProducerHandle2
   HANDLE ConsumerHandle1, ConsumerHandle2;  // chứa mục quản luồng tiêu thụ ConsumerHandle1, ConsumerHandle2
DWORD ProducerID1, ProducerID2;   //cấp ID (Identification number) cho sản phẩm mới được tạo
DWORD ConsumerID1, ConsumerID2;

   // 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);

   ProducerHandle2=CreateThread(0,0, (LPTHREAD_START_ROUTINE)Producer, 0, 4, &ProducerID2);

// Producer  tên hàm điều khiển của nhà sản xuất. 4 sau khi khởi tạo luồng sẽ ngủ

// Tạo 2 luồng tiêu thụ thi hành ngay
        ConsumerHandle1=CreateThread(0,0, (LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1);

   ConsumerHandle2=CreateThread(0,0, (LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID2);

 // Consumer  tên hàm điều khiển của nhà tiêu thụ. 0 sau khi khởi tạo luồng sẽ chạy ngay

   while(1){
      printf("\n- Nhấn P/p để sản xuất, 0 để kết thúc:”);
      switch (getch()){
         case 'P':
            ResumeThread(ProducerHandle1); // đánh thức luồng 1
            break;
         case 'p':
            ResumeThread(ProducerHandle2); // đánh thức luồng 2
            break;
         case '0':
            CloseHandle(ProducerHandle1); // đóng luồng nhà sản xuất 1
            CloseHandle(ProducerHandle2);
            CloseHandle(ConsumerHandle1); // đóng luồng nhà tiêu thụ 1
            CloseHandle(ConsumerHandle2);
            return 0;
      }
      Sleep(1);   // luồng chính ngủ 1 milli giây trước khi xuất kết quả ra màn hình
      ShowBuffer(); //xuất kết quả
   }
}



Được sửa bởi letanthanh18(I12A) ngày 29/3/2012, 00:22; sửa lần 1.

letanthanh18(I12A)

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

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

Về Đầu Trang Go down

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

Bài gửi  hoxuanvu_I12A on 28/3/2012, 23:31

+Đả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

hoxuanvu_I12A

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

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

Về Đầu Trang Go down

TẬP LUỒNG(Thread Pool)

Bài gửi  hoxuanvu_I12A on 28/3/2012, 23:33

-Tập luồng(Thread pools): khi một luồng chính tạo ra tập luồng (tập
luồng bao gồm nhiều luồng con sẵn sàn chờ công việc được giao )
-Khi tiến trình cha nhận được yêu cầu công việc , thì 1 luồng con trong tập được đánh thức và đưa vào vận hành .
-vận hành xong luồng con sẽ được trả về tập luồng .
-Nếu số yêu cầu lớn hơn số luồng trong tập luồng , tiến trình cha sẽ chờ đến khi có luồng được giải phóng .
Ví dụ:
Tổng
đài điện thoại 108 , có nhiều nhân viên trực điện thoại là các luồng
con ,cùng làm việc trong 1 văn phòng , mỗi nhân viên trực 1 điện thoại,
khi không có cuộc gọi đến của khách hàng nhân viên không làm việc đang
ở trạng thái ngủ , khi có cuộc gọi đến của khách hàng nhân viên trả lời
cuộc gọi chính là luồng được đánh thức và đưa vào vận hành, kết thúc
cuộc gọi của khách hàng , nhân viên lại được nghỉ .
Trong 1 Trung
đội các chiến sĩ vận quân trang đầy đủ đang ở trạng thái ngủ(Chính là
các luồng con) Tương lĩnh( la tiến trình cha), khi địch tới sẽ đánh thức
1, chiến sĩ dậy đối phó với địch,khi địch rút thì chiến sĩ đó lại tiếp
tục về vị trí ngủ, nếu có địch tiếp tục tới có thể đánh thức chiến sĩ
khác hoặc cũng là chiến sỉ đó.
Hay Web Phương Nam mà thầy trình bày
trên lớp ví dụ web chỉ có 100 luồng truy xuất request nếu vượt quá giới
hạn(101) thì phải chờ...

hoxuanvu_I12A

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

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

Về Đầu Trang Go down

Luồng xử lý của CPU

Bài gửi  hoxuanvu_I12A on 28/3/2012, 23:45

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.

hoxuanvu_I12A

Tổng số bài gửi : 34
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í dụ minh họa

Bài gửi  letanthanh18(I12A) on 28/3/2012, 23:48

_Tập luồng là tập các luồng giống nhau và cùng chung chức năng
_Tiến trình cha tạo sẵn một tập luồng khi khởi động
_Khi tạo lặp xong chưa có việc thì tập luồng sẽ ngủ, các luồng trong tập luồng luôn sẵn sàng chờ công việc
_Khi tiến trình cha nhận được 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ụ: Cảnh sát giao thông: khi ở đoạn đường nào đó kẹt xe, thì sở cảnh sát giao thông sẽ cử 1 anh cảnh sát giao thông tới để điều tiết giao thông. Khi không còn kẹt xe nữa thì anh cảnh sát giao thông sẽ trở về sở giao thông đợi việc tiếp theo.
Arrow I love you Arrow

letanthanh18(I12A)

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

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

Về Đầu Trang Go down

Ví Dụ về Đa Luồng Và Đa Tiến Trình:

Bài gửi  DoanNgocDan(I12A) on 28/3/2012, 23:56

Ví dụ 1:
• Ví Dụ Về Đa luồng:Trên 1 con đường có thể phân ra nhìu luồng xe khác nhau Nhưng các luồng dùng chung một tài nguyên là Mặt Đường
• Ví Dụ về Đa Tiến Trình: Mỗi con đường là 1 tiến trính: 2 con đường không thể dùng chung một mặt đường vì nếu thế thì 2 thành 1
 Lập trình đa luồng dễ hơn lập trình đa tiến trình  Xây 1 con đường phân ra nhìu luồng xe chạy dễ hơn là xây nhìu con đường
Ví dụ 2:
Ví Dụ Về Đa luồng: Trong một ngôi nhà phân ra 2 luồng phòng khác nhau, có chung trần nhà, không tách biệt lập với nhau. Nhưng 2 luồng phòng này dùng chung một tài nguyên là máy điều hòa.
Ví Dụ về Đa Tiến Trình: Mỗi phòng trong nhà là 1 tiến trình, 2 phòng tách biệt nhau, 2 phòng không thể dùng chung một máy điều hòa.
 Lập trình đa luồng dễ hơn lập trinh đa tiến trình  Một máy điều hòa chia ra nhìu luồng phòng tiết kiệm hơn là mỗi phòng 1 máy điều hòa.
avatar
DoanNgocDan(I12A)

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

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  HoNgocTuan142(I12A) on 28/3/2012, 23:57

NguyenVanBenI12C đã viết:
Code:
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#define BUFFER_SIZE 10;
int buffer[BUFFER_SIZE];
int in;
int out;
int nextproduced=1;
void Producer()
{
   while(1)//vòng lặp bất tận
   {
      while(((in+1)% BUFFER_SIZE)==out);
      buffer[in]=nextproduced ++;//khi gán xong sẽ tăng lên 1
      in=(in+1)% BUFFER_SIZE;
      SuspendThread(GetcurrenThread());//luồng trạng thái hiện hành được chuyển sang trạng thái ngủ cho đến khi được đánh thức
      //GetcurrenThread()-> trả về mục quản của luồng hiện hành
      
   }
}
void Consumed()
{
   int nextconsumed;
   while(1)
   {
      while(in==out);
      nextconsumed = buffer[out];
      out=(out+1)% BUFFER_SIZE;
      Sleep(GetTickCount()% 5000);//ngủ 1 khoảng thời gian cho trước
      //GetTickCount() -> nhận số mili giây trôi qua kể từ khi hệ điều hành khởi động cho đến thời điểm gọi hàm này

   }
}
Các bạn bổ xung tiếp nha!

mình xi bổ xung và chỉnh sửa lại một tí
Code:
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#define BUFFER_SIZE 10;
int buffer[BUFFER_SIZE];
int in;
int out;
int nextproduced=1;
//nha san xuat
void Producer()
{
   while(1)//vòng lặp bất tận
   {
      while(((in+1)% BUFFER_SIZE)==out); //Busy Waiting vòng lặp quẩn tại đây cho đến khi
                                                        có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm
                //khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
      buffer[in]=nextproduced ++;  //chèn sản phẩm vô ngăn chứa
      in=(in+1)% BUFFER_SIZE;  //tìm vị trí khác để Producer chèn thêm sản phầm vào
      SuspendThread(GetcurrenThread()); //luồng trạng thái hiện hành được chuyển sang trạng thái ngủ cho đến khi được đánh thức
      //GetcurrenThread()-> trả về mục quản của luồng hiện hành
   }
}

//nha tieu thu
void Consumed()
{
   int nextconsumed;
   while(1)
   {
      while(in==out);  //vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
                //vòng lặp while thoát khi có 1 ngăn chứa sản phầm
      nextconsumed = buffer[out]; //lấy sản phẩm ra khỏi ngăn
      out=(out+1)% BUFFER_SIZE;  //tìm vị trí khác để Consumer lấy sản phẩm
      Sleep(GetTickCount()% 5000);
                //Sleep()  ngủ 1 khoảng thời gian cho trước
      //GetTickCount() -> nhận số mili giây trôi qua kể từ khi hệ điều hành khởi động
                    cho đến thời điểm gọi hàm này
   }
}
//ham MAIN
int main()
{
        HANDLE ProducerHandle1; //biến Handle chứa mục quản NSX
        HANDLE ConsumerHandle1; // biến Handle chứa mục quản NTT

        DWORD ProducerID1, ProducerID2; //chứa ID NSX
        DWORD ConsumerID1, ConsumerID2; //chứa ID NTT
        ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,
                                                                                                      &ProducerID1);
        //khởi tạo NSX với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo:trạng thái ngủ

        ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,
                                                                                                      &ConsumerID1);
        //khởi tạo NTT với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
        while(1)
        {
                printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
                switch (getch())
                {
                      case 'P': //nhấn phím P=Producing
                                ResumeThread(ProducerHandle1);
                                // đánh thức Producer lúc này đang ở trạng thái ngủ
                                break;
                      case 'p':
                                ResumeThread(ProducerHandle2); // tương tự như trên
                                break;
                      case '0': //giải phóng Producer và Consumer khỏi bộ nhớ
                                CloseHandle(ProducerHandle1);
                                CloseHandle(ConsumerHandle1);
                                return 0;
                }
                Sleep(1); //ngừng 1 khoảng thời gian nhất định
                ShowBuffer(); //show kết quả sau khi sản xuất tiêu thụ
        }
}
còn hàm ShowBuffer() mình sẽ bổ sung sau

ví dụ:
avatar
HoNgocTuan142(I12A)

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

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

Về Đầu Trang Go down

Lập trình đa luồng trong Windows & dot.net

Bài gửi  DoanNgocDan(I12A) on 28/3/2012, 23:59

  • Windows sử dụng các hàm trong thư viện Win32 API.

  • Ứng dụng Windows vận hành như một tiến trình với 1 hoặc nhiều luồng.

  • Bài toán Sản xuất - Tiêu thụ có thể được thực thi bằng Ứng dụng đa luồng (Visual C++ 6.0).

  • Nhận độ ưu tiên của luồng bằng hàm: “int GotThroadPriority (HANDLE throadHandle)".

  • Thay đổi độ ưu tiên của luồng bằng hàm: “BOOLSetThroadPriority (HANDLE threadHandle, int priority)”.

Với độ ưu tiên priority:
THREAD_PRIORITY_LOWEST (-2)
THREAD_PRIORITY_BELOW_NORMAL (-1)
THREAD_PRIORITY_NORMAL (0)
THREAD_PRIORITY_ABOVE_NORMAL (+1)
THREAD_PRIORITY_HIGHEST (+2)
Có thể lập trình đa luồng với Visual Basic 6.0:
Sản xuất – Tiêu thụ
Animations
Colors
avatar
DoanNgocDan(I12A)

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

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

Về Đầu Trang Go down

Trình bày khái niệm Luồng. So sánh luồng với tiến trình

Bài gửi  vothingocthuy87(I11C) on 29/3/2012, 00:03

- 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ư của 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ể cùng chung một mã chương trình

vothingocthuy87(I11C)

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

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

Về Đầu Trang Go down

Khái niệm đa luồng? So sánh luồng với tiến trình (giống và khác nhau ở chỗ nào?)

Bài gửi  TranMinhTuan143(I12A) on 29/3/2012, 00:07

• Khái niệm đa luồng: Luồng còn gọi là tiến trình nhẹ (LWP-Light Weight Process), cũng là một đơn vị cơ bản sử dụng CPU.
• Nhiều luồng có thể dùng chung 1 mã tiến trình rất có lợi khi thay đổi, phát triển thì chỉ cần sửa 1 chổ nhưng cho tất cả các luồng của tiến trình.
* So sánh:
Giống:
- Luồng cũng có thông tin trạng thái như của tiến trình truyền thống (HWP- Heavy Weight Process).
Khac
-tiến trình truyền thống to hơn có nhiều luồng bên trong
- 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ẹ (LWP-Light Weight Process), một đơn vị cơ bản sử dụng CPU.
- 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
+Khác nhau:
_Luồng ở bên trong tiến trình mà HĐH vẫn truy xuất vào trong tiến trình được.
_Tiến trình truyền thống: bao gồm nhiều luồng bên trong vận hành.
Ví dụ:
* Luồ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)
* Tiến trình:
Ví dụ: Lớp I12A đang học là một tiến trình.

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

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

Bài gửi  TranMinhTuan143(I12A) on 29/3/2012, 00:11

- Khả năng đáp ứng tốt hơn, khi 1 luồng bị treo hoặc quá bận thì luồng khác vẫn làm việc 1 cách bình thường (Luồng chính của người dùng vẫn tương tác tốt với người dùng trong khi vẫn lấy được dữ liệu về.
VD: Tổng đài 188 là 1 vd minh họa của đa luồng (1 cô nhân viên trực trả lời tổng đài khi 1 khách hàng gọi hỏi (7 kì quan trên thế giới là những kì quan nào…) Trong khi đó nhân viên đó đang bận nhưng tổng đài có rất nhiều cô nhân viên khác phục vụ (gọi là đa luồng), 1 cô phục vụ (gọi là đơn luồng), cô nhân viên đó đang bận vẫn có sự trả lời của cô khác cứ như thế làm việc gọi là đa luồng.
- Đa luồng chia sẽ tài nguyên dể dàng, mặc định các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng vận hành cùng 1 địa chỉ do đó dể dùng chung tài nguyên hơn so với trường hợp đa tiến tình.
VD: Trong lớp học việc dùng chung 1 cái bảng dể sửa dể thay đổi, nếu thay đổi sẽ thay đổi tất cả.
- Đa luồng tiết kiệm hơn: Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồ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. Việc tạo mới 1 luồng sẽ dể hơn rất nhiều so với việc tạo mới 1 tiến tình mới.
VD: Trong 1 gia đình có anh chị sắp xây dựng 1 gia đình mới nếu như xây thêm 1 căn nhà (hoặc căn phòng) sẽ tốn kém và khó hơn rất nhiều so với việc ngăn 1 căn phòng trong 1 gia đình lớn thành nhiều ngăn (chia ra nhiều phòng sẽ nhanh hơn và tiết kiệm hơn rất nhiều so với tạo dựng mới, tiết kiệm hơn rất nhiều.
- Tận dụng được thế mạnh của kiến trúc đa xử lý : Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng. Việc chuyển từ luồng này sang luồng kia là rất nhanh.
- Lập trình đa luồng dể hơn là lập trình đa tiến trình

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

Nói về tập luồng

Bài gửi  maihuynam(I91c) on 29/3/2012, 00:12

Nguyên lý tập nguồn và ví dụ minh họa
Tập luồng : Tiến trình cha sẽ tạo lập sẵn một tập luồng ngay sau khi khởi động.
- Các luồng trong tập luồng luôn luôn trong trạng thái sẵn sàng làm việc.
- Khi tiến trình cha tiếp nhận công việc mới nào đó, một luồng được đánh thức và thực thi.
- Nếu số yêu cầu lớn hơn số luồng còn lại, tiến trình phải chờ.
- Khi một luồng thực thi xong công việc của mình lại được trở về tập luồng và sẵn sàng tiếp nhận công việc mới.
Ví dụ về tập luồng:
Trong game cờ tướng, mỗi quân cờ là một tập luồng, bao gồm nhiều con cờ là các luồng. Vậy có 2 tập luồng tương ứng với 2 quân cờ xanh và đỏ. Trong mỗi quân cờ có nhiều luồng là xe, pháo , mã ,…Vào thời điểm T1 , tập luồng quân xanh được phép thực thi, thì một luồng (con cờ) được đánh thức và thực thi. Sau đó con cờ được trả về tập luồng và trong trạng thái sẵn sang nếu có yêu cầu mới.

maihuynam(I91c)

Tổng số bài gửi : 4
Join date : 26/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  LeThiMaiPhuongI12A on 29/3/2012, 00:25

HoNgocTuan142(I12A) đã viết:
NguyenVanBenI12C đã viết:
Code:
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#define BUFFER_SIZE 10;
int buffer[BUFFER_SIZE];
int in;
int out;
int nextproduced=1;
void Producer()
{
   while(1)//vòng lặp bất tận
   {
      while(((in+1)% BUFFER_SIZE)==out);
      buffer[in]=nextproduced ++;//khi gán xong sẽ tăng lên 1
      in=(in+1)% BUFFER_SIZE;
      SuspendThread(GetcurrenThread());//luồng hiện hành được chuyển sang trạng thái ngủ cho đến khi được đánh thức
      //GetcurrenThread()-> trả về mục quản của luồng hiện hành
      
   }
}
void Consumed()
{
   int nextconsumed;
   while(1)
   {
      while(in==out);
      nextconsumed = buffer[out];
      out=(out+1)% BUFFER_SIZE;
      Sleep(GetTickCount()% 5000);//ngủ 1 khoảng thời gian cho trước
      //GetTickCount() -> nhận số milli giây trôi qua kể từ khi hệ điều hành khởi động cho đến thời điểm gọi hàm này

   }
}
Các bạn bổ xung tiếp nha!

mình bổ sung và chỉnh sửa lại một tí
Code:
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#define BUFFER_SIZE 10;
int buffer[BUFFER_SIZE];
int in;
int out;
int nextproduced=1;
//nha san xuat
void Producer()
{
   while(1)//vòng lặp bất tận
   {
      while(((in+1)% BUFFER_SIZE)==out); //Busy-Waiting vòng lặp chờ bận quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm
                //khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
      buffer[in]=nextproduced ++;  //chèn sản phẩm vô ngăn chứa
      in=(in+1)% BUFFER_SIZE;  //tìm vị trí khác để Producer chèn thêm sản phầm vào
      SuspendThread(GetcurrenThread()); //luồng hiện hành được chuyển sang trạng thái ngủ cho đến khi được đánh thức
      //GetcurrenThread()-> trả về mục quản của luồng hiện hành
   }
}

//nha tieu thu
void Consumed()
{
   int nextconsumed;
   while(1)
   {
      while(in==out);  //vòng lặp Busy-Waiting quẩn tại đây khi các ngăn chứa sản phầm đều trống
                //vòng lặp while thoát khi có 1 ngăn chứa sản phầm
      nextconsumed = buffer[out]; //lấy sản phẩm ra khỏi ngăn
      out=(out+1)% BUFFER_SIZE;  //tìm vị trí khác để Consumer lấy sản phẩm
      Sleep(GetTickCount()% 5000);
                //Sleep()  ngủ 1 khoảng thời gian cho trước
      //GetTickCount() -> nhận số milli giây trôi qua kể từ khi hệ điều hành khởi động
                    cho đến thời điểm gọi hàm này
   }
}
//ham MAIN
int main()
{
        HANDLE ProducerHandle1; //biến Handle chứa mục quản NSX
        HANDLE ConsumerHandle1; // biến Handle chứa mục quản NTT

        DWORD ProducerID1; //chứa ID NSX
        DWORD ConsumerID1; //chứa ID NTT
        ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,
                                                                                                      &ProducerID1);
        //khởi tạo NSX với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo:trạng thái ngủ

        ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,
                                                                                                      &ConsumerID1);
        //khởi tạo NTT với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
        while(1)
        {
                printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
                switch (getch())
                {
                      case 'P': //nhấn phím P=Producing
                                ResumeThread(ProducerHandle1);
                                // đánh thức Producer lúc này đang ở trạng thái ngủ
                                break;
                      case 'p':
                                ResumeThread(ProducerHandle2); // tương tự như trên
                                break;
                      case '0': //giải phóng Producer và Consumer khỏi bộ nhớ
                                CloseHandle(ProducerHandle1);
                                CloseHandle(ConsumerHandle1);
                                return 0;
                }
                Sleep(1); //ngừng 1 khoảng thời gian nhất định trước khi ShowBuffer
                ShowBuffer(); //show kết quả sau khi sản xuất tiêu thụ
        }
}
còn hàm ShowBuffer() mình sẽ bổ sung sau

ví dụ:
mình bổ sung 1 tí:
sleep(1): trước khí show buffer luồng chính trễ đi 1 mili giây trước khi thực hiện đưa nôi dung buffer ra màn hình
kết quả đúng:sau khi đưa sản phẩm 2 vào bộ đệm in tăng lên 1
kết quả sai: sản phẩm 2 đã đưa vào bộ đệm mà in chưa tăng lên 1

Admin
Hiểu bài tốt.

LeThiMaiPhuongI12A

Tổng số bài gửi : 12
Join date : 15/02/2012
Age : 27
Đến từ : Long An

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

Về Đầu Trang Go down

Lợi ích của đa luồng

Bài gửi  dangmonghai(I12A) on 29/3/2012, 00:44

- 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ề).
- 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.
- 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).
- 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 vì trao đổi dữ liệu dễ dàng hơn.

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

Ví dụ nhỏ về Đa Luồng trong C#

Bài gửi  TranHoangNhanI12C on 29/3/2012, 00:50

Mình thấy ví dụ này khá hay và cũng dể hiểu nhưng hơi dài,mình nghĩ mấy bạn nên tham khảo:
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).

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

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 Very Happy)
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");
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ụ:
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

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

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

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

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

Sưu tầm tại: http://vubka.blogspot.com/2010/06/vi-du-ve-luong-multithreading-c.html

TranHoangNhanI12C

Tổng số bài gửi : 45
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

Bài gửi  dangmonghai(I12A) on 29/3/2012, 01:00

- Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
- Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
- Khi tiến trình cha nhận thêm một yêu cầu, một luồng được đánh thức
và đưa vào vận hành.
- Phục vụ xong, luồng được đư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ụ: ứng dụng sử dụng tập luồng như: Web Server, Database Server.

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

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

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Trang 2 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