2012-01-30 39 views
6

Tôi đã đi qua một hướng dẫn Java, nơi nó đã được đề cập rằng đa luồng thực tế không xảy ra trong một máy có một bộ xử lý duy nhất. Nó đề cập rằng hệ điều hành allots một khoảng thời gian quy định cho quá trình Java và lập kế hoạch thread JVM chọn lên các chủ đề để chạy một thread tại một thời điểm trong một khoảng thời gian nhỏ.Java đa luồng trong một máy tính xách tay có bộ vi xử lý quad-core

Tôi có một máy tính xách tay mà bộ vi xử lý quadcore - có thể chạy một chương trình đa luồng nhanh hơn lập trình bằng cách chạy một sợi trong mỗi lõi? Lý do tại sao tôi hỏi câu hỏi này là vì cuốn sách đề cập rằng chỉ có một hệ thống đa xử lý thực sự mới có thể thực hiện nhiều việc cùng một lúc.

+1

Đã đi trước và thêm thẻ đa luồng vào đây - nó không chỉ là một câu hỏi trung tâm Java. Hy vọng rằng bạn sẽ nhận được một số câu trả lời tuyệt vời. – Makoto

+0

Bài viết bạn đọc có lẽ là từ thời gian trước các bộ vi xử lý đa lõi, vì vậy hãy chỉ sử dụng máy tính đa xử lý có thể sử dụng nó. – Hurda

Trả lời

7

Ngay cả một CPU đơn lẻ cũng có thể thực hiện "nhiều thứ cùng một lúc" theo nghĩa lỏng lẻo, nhưng chúng không thực sự song song. Bạn có thể bắt đầu 100 luồng để chạy trên một lõi đơn và chúng sẽ nhận được lát thời gian trong đó mỗi chuỗi có thể chạy một vài hướng dẫn, do đó tạo ra ấn tượng rằng tất cả chúng đều đang thực thi cùng một lúc.

Như tôi đã nói trong một bài SO: multithreading on dual core machine?

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. Chủ đề hạt nhân, là các chuỗi được quản lý bởi hệ điều hành, được á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.

Chủ đề Java là chủ đề người dùng. 4 lõi trong CPU của bạn được tính là các 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.

Bây giờ, sau khi nói điều này, nói chung có hai loại hoạt động chủ đề, mỗi quirks riêng của họ:

  1. I/O đề: những chủ đề dành phần lớn thời gian của họ chờ đợi vào đọc/ghi các hoạt động từ một luồng và bị chặn trong thời gian chờ đợi (chúng không được lên lịch thực hiện cho đến khi một sự kiện xảy ra để đánh thức chúng). Có ánh sáng trên CPU và rất nhiều trong số chúng có thể chạy đồng thời ngay cả trên một lõi đơn.
  2. Chủ đề tính toán: các chuỗi này thực hiện rất nhiều thao tác thu thập số và sử dụng CPU đến mức tối đa. Thường bắt đầu từ hơn (2x số lõi khả dụng), các chủ đề như vậy sẽ làm giảm hiệu suất, vì CPU có một số đơn vị chức năng giới hạn: ALU, FPU, v.v.

Lớp thứ hai của chủ đề trên cho phép bạn thực sự thấy lợi ích hoặc chạy một chương trình java đa luồng trên CPU quad-core của bạn. Dưới đây là một ví dụ đơn giản của một chương trình mà thực hiện bình phương của 1.000.000.000 số tuần tự đầu tiên và sau đó song song sử dụng một hồ bơi thread với 4 chủ đề:

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

class ThreadTask implements Runnable { 

    private int total = 0; 

    public ThreadTask(int total) { 
     this.total = total; 
    } 

    @Override 
    public void run() { 
     int value = 0; 
     for(int i = 0; i < total; i++) { 
      value = i * i; 
     } 
    }  
} 

public class Test { 

    public static void main(String[] args) throws InterruptedException { 

     int total = 1000000000; 

     long start = System.currentTimeMillis(); 
     long value = 0; 
     for(int i = 0; i < total; i++) { 
      value = i * i; 
     }  
     long stop = System.currentTimeMillis(); 

     System.out.println((stop - start) + " ms"); 

     ExecutorService exec = Executors.newFixedThreadPool(4); 
     start = System.currentTimeMillis(); 
     for(int i = 0; i < 4; i++) { 
      exec.submit(new ThreadTask(total/4)); 
     } 
     exec.shutdown(); 
     exec.awaitTermination(10, TimeUnit.SECONDS); 
     stop = System.currentTimeMillis(); 

     System.out.println((stop - start) + " ms");  
    } 
} 

Hãy thoải mái để điều chỉnh giá trị của total nếu nó đang chạy quá nhanh . Bây giờ tôi đang làm việc trên một chiếc netbook với Intel Atom, vì vậy nó không thực sự nhanh chóng.

+0

Cảm ơn Tudor - sẽ thử điều này :) –

1

Ngay cả với chỉ một bộ xử lý nhiều luồng có thể làm cho chương trình của bạn nhanh hơn, tất cả đều phụ thuộc vào công việc bạn đang cố gắng tăng tốc. Ví dụ, nếu chủ đề của bạn đang chờ IO. Nếu nó hoàn toàn là tính toán thì bạn có thể muốn giới hạn các chuỗi của bạn với số lõi của bạn.

Đo lường thử nghiệm bằng thử nghiệm.

2

Bộ xử lý đa lõi có thể 'thực sự' song song công việc trong ứng dụng của bạn với số lõi bạn có. Trong trường hợp của bạn, đó sẽ là 4 chủ đề. Đọc thêm về đa lõi và đa bộ xử lý tại Wikipedia. Có nói rằng, bạn có thể nhận ra lợi ích hiệu suất với một thuật toán đa luồng trên một CPU lõi, mặc dù thực tế là bạn chỉ có một bộ xử lý.

Cải thiện hiệu suất thu được bằng cách sử dụng bộ xử lý đa nhân phụ thuộc rất nhiều vào thuật toán phần mềm được sử dụng và triển khai . Đặc biệt, các lợi ích có thể bị giới hạn bởi phần của phần mềm có thể được song song để chạy trên nhiều lõi cùng một lúc; hiệu ứng này được mô tả bởi luật của Amdahl. Trong trường hợp tốt nhất có thể nhận ra các yếu tố tăng tốc gần số lõi hoặc thậm chí nhiều hơn nếu sự cố được chia nhỏ để vừa với bộ nhớ cache của mỗi lõi, tránh sử dụng chậm hơn nhiều bộ nhớ hệ thống chính. Tuy nhiên, hầu hết các ứng dụng không phải là được tăng tốc quá nhiều trừ khi các lập trình viên đầu tư một số tiền khó khăn là nỗ lực để tính lại toàn bộ vấn đề 2. Sự song song của phần mềm là một chủ đề nghiên cứu quan trọng đang diễn ra.

Đồng thời xem câu hỏi này StackOverflow.

1

Tôi có thể xác nhận rằng, trên máy tính xách tay i3 của tôi, các thuật toán chạy song song tiến gần gấp đôi các thuật toán nối tiếp.

ngữ cảnh khác được thêm bên dưới ...

Đây là các thuật toán tính toán cao không có I/O. Về cơ bản, tính toán số liệu thống kê trên N mảng lớn, trong đó mỗi mảng có thể được thực hiện một cách độc lập. Tôi thấy rằng sử dụng một hồ bơi thread của 2-4 chủ đề tất cả sản lượng về cùng một tốc độ tăng - 2X. Đi tới 8 chủ đề trở lên, mọi thứ bắt đầu chậm lại một chút khi bạn tranh luận nhiều hơn (và đang sử dụng nhiều bộ nhớ hơn). Trên một bộ xử lý với nhiều lõi, các giá trị này sẽ thay đổi.

Các vấn đề liên quan