2012-01-10 35 views
7

Tôi có bộ xử lý lõi kép và theo lời giải thích, tôi chỉ có thể sử dụng 2 luồng nhưng thực sự tôi có thể khởi chạy nhiều hơn 2 luồng cùng một lúc:đa luồng trên máy lõi kép?

Đây là bản sao giải thích:

phương pháp hardware_concurrency tĩnh(), được cung cấp bởi lớp boost :: chủ đề, trả về số chủ đề mà có thể thể chất được thực hiện đồng thời dựa trên số cơ bản CPU hoặc CPU lõi. Gọi chức năng này trên máy tính hai lõi thường được sử dụng , giá trị 2 được trả về. Điều này cho phép một phương thức đơn giản để xác định số lượng chủ đề tối đa của luồng mà nên được sử dụng đồng thời bởi một ứng dụng đa luồng nhất định.

hardware_concurrency() phương thức trả về số 2 trong trường hợp của tôi, nhưng chương trình này sử dụng 4 đề cùng lúc:

#include <iostream> 
#include <boost\thread.hpp> 

using namespace std; 
using boost::thread; 
using namespace boost::this_thread; 
using boost::posix_time::seconds; 

void f1() 
{ 
    for(int i = 0; i < 10; ++i) 
    { 
     cout << i << endl; 
     sleep(seconds(2)); 
    } 
} 

void f2() 
{ 
    for(int i = 0; i < 10; ++i) 
    { 
     cout << i << endl; 
     sleep(seconds(2)); 
    } 
} 

int main() 
{ 
    // 4 threads are executed on dual core machine (no problem) 
    thread thr1(f1); 
    thread thr2(f2); 
    thread thr3(f1); 
    thread thr4(f2); 
    cin.ignore(); 
    return 0; 
} 

bất cứ ai có thể giải thích hành vi đó?

+7

Bạn có thể làm cho nhiều chủ đề như bạn muốn (lên đến giới hạn), nhưng 2 là (có thể là) số tối ưu, một cho mỗi lõi. Ngoài ra, nó nói "thể chất thực hiện cùng một lúc". Bạn có thể kiếm được nhiều hơn 2, nhưng chúng sẽ không thể chạy cùng một lúc; hệ điều hành sẽ phải ưu tiên những người đang chạy để cho người khác chạy. Ngoài ra, nó nói "nên", không "có thể". –

+0

và tác dụng phụ nào bằng cách sử dụng ví dụ 10 ứng dụng luồng trên máy lõi kép? có tệ hay không? cảm ơn rất nhiều. – codekiddy

+1

Các hiệu ứng phụ (có thể) giới hạn cho ứng dụng của bạn chạy chậm hơn (vì hệ điều hành phải lo lắng về việc cho phép mọi luồng khác có thời gian chạy, trong đó 2, cho phép chạy cả tốc độ liên tục), mặc dù có thể được bù đắp bằng cách có thể làm nhiều hơn "cùng một lúc" (không thực sự cùng một lúc, nhưng độc lập). –

Trả lời

19

Các chủ đề hạn thường bao gồm ba lớp trừu tượng:

  1. đề tài là chủ đề đưa ra bởi các ứng dụng và được ánh xạ N: M để:
  2. Kernel đề, đó là chủ đề của quản lý hệ điều hành, ánh xạ N: M tới:
  3. Chủ đề phần cứng, là các tài nguyên thực tế có sẵn.

4 chủ đề bạn đã nói được khởi chạy bởi ứng dụng là từ loại 1 (chủ đề người dùng), trong khi giá trị 2 được trả về bởi hàm đó đề cập đến loại 3 (chuỗi phần cứng). Vì ánh xạ là N: M trên các lớp, bạn có thể thấy rằng bạn có thể có một số luồng người dùng được ánh xạ tới một số chuỗi phần cứng nhỏ hơn.

Có nói điều này, thường bắt đầu hơn 2x số lượng các chủ đề phần cứng nếu bạn đang thực hiện tính toán chuyên sâu sẽ làm tổn thương hiệu suất do chuyển mạch ngữ cảnh và tranh chấp tài nguyên.

+1

+1, giải thích tốt về mối quan hệ giữa các loại chủ đề khác nhau –

+0

vâng +1 Từ tôi nữa. Lời giải thích hay. –

+0

cảm ơn rất nhiều vì lời giải thích đó. – codekiddy

6

Bạn luôn có thể chạy nhiều luồng, ngay cả trên máy lõi đơn. Mặc dù, họ không thể chạy song song. (Hơn 2 trong trường hợp của bạn)

Ví dụ, một thread làm GUI, người kia lấy về một số công việc từ máy chủ ...

Xem this cho một lời giải thích sâu hơn.

1

Bạn có thể sử dụng nhiều chủ đề hơn số lõi bộ xử lý. Điều này có thể có một số lợi ích: bạn có thể ẩn thông tin liên lạc (ví dụ: tệp I/O hoặc mạng) với tính toán hoặc nhận được nhiều thời gian xử lý hơn trong các hệ thống cắt thời gian. Với hai lõi, chỉ có hai luồng vật lý sẽ được thực thi cùng một lúc, nhưng có nhiều luồng hơn có thể tăng hiệu suất. Đó là điều bạn cần phải điều chỉnh.

1

Có sự khác biệt giữa kết quả tối ưu và có thể; đó cũng là một sự khác biệt giữa các chủ đề phisically và lý thuyết chạy cùng một lúc.Trong một máy tính lõi kép, có 2 CPU, có thể thực thi hai luồng cùng một lúc. Nhưng ý nghĩa của bất kỳ thư viện luồng/hệ thống luồng nào là bạn có thể tạo ra một cách hợp lý thành các chuỗi có nghĩa là bạn muốn. Những chủ đề này sẽ không thực sự chạy cùng một lúc, chúng sẽ được chuyển qua định kỳ thay vì tạo ảo tưởng như thể chúng đang chạy một cách giả lập.

1

Đầu tiên gọi là lập trình song song và điều thứ hai là đa nhiệm có thể được thực hiện ngay cả trong một máy xử lý đơn