2013-06-07 32 views
5

Có một minh họa trong kernel nguồn tài liệu/bộ nhớ barriers.txt, như thế này:như thế nào là một rào cản bộ nhớ trong kernel Linux được sử dụng

CPU 1     CPU 2 
    ======================= ======================= 
      { B = 7; X = 9; Y = 8; C = &Y } 
    STORE A = 1 
    STORE B = 2 
    <write barrier> 
    STORE C = &B   LOAD X 
    STORE D = 4    LOAD C (gets &B) 
          LOAD *C (reads B) 

Nếu không có sự can thiệp, CPU 2 có thể cảm nhận được sự kiện trên CPU 1 trong một số trật tự một cách hiệu quả ngẫu nhiên, bất chấp những rào cản ghi do CPU 1:

+-------+  :  :    :  : 
    |  |  +------+    +-------+ | Sequence of update 
    |  |------>| B=2 |-----  --->| Y->8 | | of perception on 
    |  | : +------+  \   +-------+ | CPU 2 
    | CPU 1 | : | A=1 |  \  --->| C->&Y | V 
    |  |  +------+  |  +-------+ 
    |  | wwwwwwwwwwwwwwww |  :  : 
    |  |  +------+  |  :  : 
    |  | : | C=&B |--- |  :  :  +-------+ 
    |  | : +------+ \ |  +-------+  |  | 
    |  |------>| D=4 | ----------->| C->&B |------>|  | 
    |  |  +------+  |  +-------+  |  | 
    +-------+  :  :  |  :  :  |  | 
            |  :  :  |  | 
            |  :  :  | CPU 2 | 
            |  +-------+  |  | 
     Apparently incorrect ---> |  | B->7 |------>|  | 
     perception of B (!)  |  +-------+  |  | 
            |  :  :  |  | 
            |  +-------+  |  | 
     The load of X holds ---> \  | X->9 |------>|  | 
     up the maintenance   \  +-------+  |  | 
     of coherence of B    ----->| B->2 |  +-------+ 
              +-------+ 
              :  : 

tôi không hiểu, vì chúng ta có một ghi rào cản, vì vậy, bất kỳ s xé phải có hiệu lực khi C = & B được thực thi, có nghĩa là Whence B bằng 2. Đối với CPU 2, B phải là 2 khi nó nhận giá trị C, là & B, tại sao nó sẽ nhận B là 7. Tôi thực sự bối rối.

Trả lời

8

Điểm mấu chốt còn thiếu là giả định sai lầm rằng cho chuỗi:

LOAD C (gets &B) 
LOAD *C (reads B) 

tải đầu tiên phải đặt trước tải thứ hai. Một kiến ​​trúc một cách yếu ớt ra lệnh có thể hoạt động "như thể" sau đây xảy ra:

LOAD B (reads B) 
LOAD C (reads &B) 
if(C!=&B) 
    LOAD *C 
else 
    Congratulate self on having already loaded *C 

Các đầu cơ "LOAD B" có thể xảy ra, ví dụ, vì B là trên dòng bộ nhớ cache tương tự như một số biến đáng chú ý khác hoặc phần cứng trước tìm nạp trước đã nắm lấy nó.

+0

Rất súc tích và phù hợp với điểm – dspjm

6

Từ phần của tài liệu mang tên "GÌ CÓ THỂ KHÔNG được giả định về rào cản NHỚ?":

Không có đảm bảo rằng bất kỳ truy cập bộ nhớ xác định trước một rào cản bộ nhớ sẽ hoàn bằng cách hoàn thành một rào cản bộ nhớ hướng dẫn; rào cản có thể được xem xét để vẽ một đường trong hàng đợi truy cập của CPU mà truy cập của loại thích hợp có thể không vượt qua.

Không có gì bảo đảm rằng một CPU sẽ thấy đúng thứ tự các hiệu ứng từ truy cập một CPU thứ hai, thậm chí nếu CPU thứ hai sử dụng một rào cản bộ nhớ , trừ khi là người đầu tiên CPU cũng sử dụng hàng rào bộ nhớ phù hợp (xem phần phụ về "Ghép nối hàng rào SMP").

Rào cản bộ nhớ (theo cách đơn giản) là đảm bảo không phải trình biên dịch cũng như phần cứng trong CPU thực hiện bất kỳ nỗ lực thông minh nào để sắp xếp lại (hoặc lưu trữ) hoạt động qua hàng rào và CPU nhận thức chính xác những thay đổi đối với bộ nhớ được thực hiện bởi các phần khác của hệ thống. Điều này là cần thiết khi tải (hoặc cửa hàng) mang ý nghĩa bổ sung, như khóa một khóa trước khi truy cập vào bất cứ thứ gì chúng ta đang khóa. Trong trường hợp này, cho phép trình biên dịch/CPU làm cho việc truy cập hiệu quả hơn bằng cách sắp xếp lại chúng là nguy hiểm cho hoạt động chính xác của chương trình của chúng tôi.

Khi đọc tài liệu này, chúng ta cần phải giữ hai điều trong tâm trí:

  1. Đó một tải có nghĩa là truyền một giá trị từ bộ nhớ (hoặc bộ nhớ cache) để đăng ký một CPU.
  2. Điều đó trừ khi các CPU chia sẻ bộ nhớ cache (hoặc không có bộ nhớ cache nào cả), có thể cho các hệ thống bộ nhớ cache của chúng được trong giây lát đồng bộ hóa của chúng tôi.

Thực tế # 2 là một trong những lý do khiến một CPU có thể nhận biết dữ liệu khác với dữ liệu khác. Mặc dù các hệ thống bộ nhớ đệm được thiết kế để cung cấp hiệu suất tốt và sự mạch lạc trong trường hợp chung, nhưng có thể cần một số trợ giúp trong các trường hợp cụ thể như các trường hợp được minh họa trong tài liệu.

Nói chung, giống như tài liệu cho thấy, các rào cản trong hệ thống liên quan đến nhiều hơn một CPU nên được ghép nối để buộc hệ thống đồng bộ hóa nhận thức của cả hai (hoặc tất cả tham gia) CPU. Hình ảnh một tình huống trong đó một CPU hoàn thành tải hoặc lưu trữ và bộ nhớ chính được cập nhật, nhưng dữ liệu mới vẫn chưa được truyền đến bộ nhớ cache của CPU thứ hai, dẫn đến thiếu sự kết hợp giữa cả hai CPU.

Tôi hy vọng điều này sẽ hữu ích. Tôi muốn đề nghị đọc lại memory-barriers.txt với điều này trong tâm trí và đặc biệt là phần có tiêu đề "HIỆU QUẢ CỦA CACHE CPU".

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