CPU có bị đóng băng hoàn toàn khi sử dụng DMA không?


19

Tôi có câu hỏi khá đơn giản, nhưng tôi không thể tìm thấy câu trả lời cho nó ở bất cứ đâu.

Trên hệ thống Von-Neumann nơi mã và dữ liệu nằm trong cùng một RAM, CPU phải lấy tất cả các hướng dẫn của nó từ bộ nhớ. Giờ đây, để di chuyển một lượng lớn dữ liệu giữa các thành phần máy tính, có bộ điều khiển Truy cập bộ nhớ trực tiếp cho phép các thiết bị ngoại vi có quyền truy cập vào RAM hệ thống chính.

Câu hỏi của tôi là: nếu DMA cho phép truyền dữ liệu (có thể rất dài) giữa, giả sử, đĩa cứng và RAM, điều đó không có nghĩa là CPU không thể sử dụng RAM và do đó không thể tìm nạp lệnh tiếp theo?

Tóm lại, DMA có nghĩa là để thay thế bộ xử lý phân xử tất cả các lần đọc và ghi I / O, để giải phóng bộ xử lý để làm những việc khác. Tuy nhiên, nếu nó không thể tìm nạp các hướng dẫn từ RAM, thì dù sao nó cũng chưa được giải phóng.

Có một số chi tiết mà tôi đang thiếu ở đây?

Cảm ơn


7
Vâng. DMA hiếm khi chạy ở băng thông đầy đủ của bộ nhớ. Nó chỉ đánh cắp một chu kỳ (hoặc một loạt các chu kỳ) mọi lúc, sau đó, được kiểm soát bởi tốc độ của thiết bị I / O.
Dave Tweed

Máy tính gia đình Amiga đã khắc phục điều này bằng cách quan sát rằng CPU được sử dụng thực sự chỉ truy cập vào xe buýt hai chu kỳ, sau đó dừng xe buýt trong hai chu kỳ, khi vẫn chạy ở tốc độ tối đa. Các thiết bị ngoại vi dựa trên DMA (đồ họa, âm thanh, đĩa) đã sử dụng các chu trình ở giữa. Không phải là một câu trả lời cho câu hỏi của bạn vì câu hỏi là giả thuyết và máy tính luôn bị hủy hoại bởi các chi tiết thực tế. :)
ống

2
@pipe: Điều đó không đúng. Amiga đã sử dụng CPU M68K, có một bus hoàn toàn không đồng bộ. Bạn có thể nghĩ đến Apple II, điều này đã lợi dụng thực tế là CPU 6502 của nó chỉ sử dụng bus cho một nửa mỗi chu kỳ xung nhịp và sử dụng nửa còn lại cho đầu ra video, cũng phục vụ để giữ cho DRAM được làm mới.
Dave Tweed

4
Các CPU hiện đại có bộ nhớ cache trung bình giải quyết 95% truy cập bộ nhớ. Miễn là CPU không cần RAM, DMA dù sao cũng không can thiệp.
MSalters

2
@DaveTweed Không. Nếu bạn nhìn vào thời gian xe buýt cho 68000, mỗi "chu kỳ xe buýt" (đọc hoặc ghi) được chia thành 8 trạng thái, lấy tối thiểu 4 chu kỳ đồng hồ thực tế, trong đó chỉ một số trong số chúng điều khiển bus dữ liệu. Việc ghép kênh này đòi hỏi một số phần cứng bổ sung, bởi vì nó điều khiển bus địa chỉ mọi lúc.
đường ống

Câu trả lời:


18

Bạn đã đúng rằng CPU không thể truy cập vào bộ nhớ trong khi truyền DMA. Tuy nhiên, có hai yếu tố kết hợp cho phép truy cập bộ nhớ song song rõ ràng của CPU và thiết bị thực hiện chuyển DMA:

  • CPU mất nhiều chu kỳ xung nhịp để thực hiện một lệnh. Một khi nó đã tìm nạp lệnh, có thể mất một hoặc hai chu kỳ, nó thường có thể thực thi toàn bộ lệnh mà không cần truy cập bộ nhớ thêm (trừ khi đó là lệnh tự truy cập bộ nhớ, chẳng hạn như movlệnh có toán hạng gián tiếp).
  • Thiết bị thực hiện chuyển DMA chậm hơn đáng kể so với tốc độ CPU, do đó CPU sẽ không cần phải dừng lại trên mọi hướng dẫn mà chỉ thỉnh thoảng khi thiết bị DMA truy cập vào bộ nhớ.

Kết hợp lại, hai yếu tố này có nghĩa là thiết bị thực hiện chuyển DMA sẽ ít ảnh hưởng đến tốc độ CPU.

EDIT: Quên đề cập rằng còn có yếu tố bộ đệm CPU, miễn là mã mà CPU đang thực thi nằm trong bộ đệm thì sẽ không cần truy cập vào bộ nhớ thực để tìm nạp lệnh, vì vậy việc chuyển DMA sẽ không diễn ra để cản trở (mặc dù nếu hướng dẫn cần truy cập bộ nhớ thì rõ ràng sẽ có quyền truy cập bộ nhớ thực - có khả năng phải chờ nghỉ trong việc sử dụng bộ nhớ của thiết bị DMA).


4
Là một phương pháp bổ sung, một số hệ thống có thể cung cấp nhiều kênh để truy cập bộ nhớ. CPU có thể được phép sử dụng một kênh trong khi động cơ DMA hoạt động trên kênh kia
Cort Ammon - Phục hồi Monica

1
@CortAmmon Tôi tin rằng bộ nhớ kênh đôi thường trải đều trên không gian địa chỉ vật lý, vì vậy, ví dụ nếu bạn có 2GB RAM thì 1GB thấp hơn nằm ở kênh đầu tiên và 1GB trên nằm trên kênh thứ hai. Trong trường hợp đó, nếu cả CPU và DMA muốn truy cập cùng một vùng bộ nhớ 1GB, chúng sẽ nằm trên cùng một kênh và do đó có khả năng xung đột.
Micheal Johnson

Tôi không chắc có nhiều hệ thống thực sự đã từng sử dụng một kiến ​​trúc KFC thực sự hay không. Nút cổ chai quá hẹp. Nó thực sự là một thiết bị lý thuyết được sử dụng trong CS. Gần nhất tôi có thể nghĩ đến là một thiết bị Texas 16 bit của 1970 có đăng ký RAM. Tôi đang nghĩ về một card đồ họa nơi sử dụng RAM cổng kép. Các chip như ARM đặc biệt là các chip cao cấp hoàn thành tương tự trên nhiều bus nội bộ (AHP, APB, Stacks). futureelectronics.com/en/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/...
ChrisR

1
Tôi không nghĩ rằng câu hỏi là hỏi về CPU Von-Neumann nghiêm ngặt mà là một cái thực tế, như x86 hay ARM, vốn là Von-Neumann lỏng lẻo. Trong trường hợp Von-Neumann nghiêm ngặt, không có bất kỳ thanh ghi bên trong nào, khả năng CPU tiếp tục chạy trong DMA đi xuống điểm thứ hai của tôi trong câu trả lời của tôi, rằng DMA không sử dụng toàn bộ băng thông bộ nhớ.
Micheal Johnson

20

Nếu có một giao diện bộ nhớ duy nhất, sẽ có phần cứng để phân xử giữa các yêu cầu. Thông thường, bộ xử lý sẽ được ưu tiên hơn I / O mà không bỏ đói I / O, nhưng ngay cả khi I / O luôn được ưu tiên, bộ xử lý sẽ có một số cơ hội để truy cập bộ nhớ vì I / O có xu hướng có nhu cầu băng thông thấp hơn và không liên tục.

Ngoài ra, thường có nhiều hơn một giao diện cho bộ nhớ. Bộ xử lý hiệu suất cao hơn thường có bộ đệm (nếu DMA không kết hợp, bộ đệm thậm chí không phải bị rình mò; ngay cả khi rình mò, chi phí chung sẽ nhỏ do chênh lệch băng thông giữa bộ đệm và bộ nhớ chính hoặc (khi DMA chuyển sang L3 bộ đệm) giữa bộ đệm L3 và bộ đệm L1), cung cấp giao diện riêng để truy cập bộ nhớ. Bộ vi điều khiển thường sẽ truy cập các hướng dẫn từ một bộ nhớ dựa trên flash riêng biệt, cho phép tìm nạp trong bộ nhớ DMA sang bộ nhớ trên chip và thường có bộ nhớ kết hợp chặt chẽ với giao diện độc lập (cho phép nhiều truy cập dữ liệu để tránh xung đột DMA).

Ngay cả với một giao diện bộ nhớ duy nhất, băng thông cao nhất thường sẽ cao hơn băng thông thường được sử dụng. (Đối với tìm nạp lệnh, ngay cả một bộ đệm nhỏ có tải xuống trung bình rộng hơn từ bộ nhớ sẽ cho phép tìm nạp lệnh từ bộ đệm trong khi một tác nhân khác đang sử dụng giao diện bộ nhớ, khai thác xu hướng mã không phân nhánh.)

Cũng lưu ý rằng vì bộ xử lý truy cập dữ liệu, nếu có một giao diện bộ nhớ duy nhất, phải có cơ chế phân xử giữa truy cập dữ liệu và truy cập lệnh.

Nếu bộ xử lý (với giao diện bộ nhớ đơn) bị buộc phải thực hiện sao chép từ bộ đệm thiết bị I / O sang bộ nhớ chính, thì nó cũng sẽ phải tìm nạp các hướng dẫn để thực hiện sao chép. Điều này có thể có nghĩa là hai lần truy cập bộ nhớ cho mỗi từ được truyền ngay cả trong một ISA có các hoạt động của bộ nhớ (một ISA lưu trữ tải có thể yêu cầu ba lần truy cập bộ nhớ trở lên nếu không cung cấp địa chỉ bộ nhớ tăng sau); đó là ngoài truy cập I / O mà trong các hệ thống cũ có thể chia sẻ cùng giao diện với bộ nhớ chính. Một công cụ DMA không truy cập các hướng dẫn trong bộ nhớ và do đó tránh được chi phí này.


2

Vì chỉ có một hệ thống bus, bị chặn bởi quyền truy cập bộ nhớ của DMA, CPU không thể hoạt động trong khi DMA đang di chuyển dữ liệu và do đó bị dừng lại.

Ý tưởng đằng sau điều này là như sau:

Nếu bạn muốn sao chép dữ liệu liên tiếp từ bộ nhớ, thì CPU sẽ phải làm một cái gì đó như thế:

Tính địa chỉ-> đọc dữ liệu-> tính địa chỉ mới (+ 1 từ) -> đọc dữ liệu ...

Trong khi đó, DMA thực hiện tính toán địa chỉ mới song song (tùy thuộc vào chế độ) và do đó nhanh hơn. Vì vậy, DMA có thể hoạt động ở thông lượng xe buýt đầy đủ (về mặt lý thuyết).


"vì chỉ có một hệ thống xe buýt duy nhất" ... không phải là một giả định an toàn để thực hiện với các máy tính hiện đại có bộ nhớ và các xe buýt ngoại vi chạy ở tốc độ khác nhau và với dịch giao thức xảy ra giữa chúng.
rackandboneman

3
Trên các máy tính cũ: Có một sự giám sát thiết kế trong Apple II (hoặc một số người tiền nhiệm / nguyên mẫu của nó?), Trong đó họ thực sự đã dừng CPU. Các thanh ghi trong 6502 được thực hiện dưới dạng bộ nhớ động. Cách họ tạm dừng CPU đã dừng làm mới. Chiều dài DMA tối đa kết thúc rất phụ thuộc vào máy.
rackandboneman

Vì câu hỏi là về kiến ​​trúc von neumann và DMA, điều này nghe có vẻ giống như một câu hỏi liên quan đến vi điều khiển (sau đó một lần nữa các ổ cứng được đề cập trong ví dụ). Cũng như Paul A. Clayton chỉ ra rằng nó thậm chí còn phức tạp hơn khi bạn xem xét bộ đệm đa cấp. Người ta cũng có thể nghĩ về một cpu trong đó nhiều opcode được chứa trong một từ và được thực thi sau một hoặc một cpus khác có bộ đệm riêng, nơi cpu có thể thực thi mã, nhưng đầu ra phải được đệm ... vì vậy, đúng vậy ngay có những khả năng vô tận.
NeinDochOah

2

Nói chung là không.

Trong hầu hết các kiến ​​trúc hệ thống, tất cả các yêu cầu truy cập bộ nhớ đều có mức độ ưu tiên được gán cho chúng. Khi có nhiều yêu cầu bộ nhớ đồng thời hơn hệ thống có thể xử lý tại một thời điểm, các yêu cầu có mức độ ưu tiên cao hơn sẽ được phục vụ trước. Các yêu cầu bộ nhớ do CPU khởi tạo thường được ưu tiên cao nhất có thể.


0

Nói chung là không.

Một số hệ thống chắc chắn, chỉ có một chủ tại một thời điểm. Một chút của một thiết kế cũ hơn nếu đó là trường hợp (ngay cả các thiết kế cũ thường có giải pháp song song). Một loại xe buýt hiện đại mặc dù mỗi xe buýt (địa chỉ, ghi dữ liệu, đọc dữ liệu) hoạt động độc lập và có thẻ hoặc id trên mỗi chu kỳ đồng hồ để hiển thị giao dịch mà một chu kỳ đồng hồ được liên kết với. Vì vậy, bạn có thể có nhiều / rất nhiều giao dịch trên chuyến bay cùng một lúc ở cả hai hướng, với các giao dịch khác nhau được xáo trộn với nhau trên các đường dẫn đọc hoặc ghi dữ liệu. Ai được đi tiếp theo sẽ được ưu tiên dựa trên, không có quy tắc nào cho thấy các giao dịch trên xe buýt sẽ phải được thực hiện theo thứ tự các hướng dẫn phần mềm được đưa ra, bộ xử lý có thể xác định nó có thể bắt đầu sớm hơn các giao dịch khác, và các phản ứng tự nhiên sẽ quay trở lại theo các thứ tự khác nhau tùy thuộc vào mức độ gần và nhanh của mục tiêu. Tương tự như vậy các lần tìm nạp không theo thứ tự, dự đoán nhánh sẽ loại bỏ các lần tìm kiếm ngẫu nhiên bất cứ khi nào nó cảm thấy thích.

Một giao dịch dma lớn sẽ đòi hỏi nhiều băng thông xe buýt hơn, nhưng để nói rằng bộ xử lý bị trì hoãn, không nhất thiết phải như vậy, cũng phụ thuộc vào kiến ​​trúc và mã. Mã có thể có một lệnh nói dừng cho đến khi kết thúc tín hiệu / sự kiện truyền này xảy ra, và sau đó chắc chắn bộ xử lý sẽ hoàn thành những gì nó có thể làm trong đường ống và sau đó bị đình trệ. Nhưng điều đó hoặc một số kiến ​​trúc có thể không yêu cầu bạn trì hoãn, không thực sự khôn ngoan để trì hoãn dù sao, rất nhiều băng thông lãng phí. Điều gì sẽ là điểm của dma dù sao nếu nó không hoạt động song song, chỉ cần mã hóa chuyển trong một vòng lặp, tìm nạp thêm một số chu kỳ có thể tùy thuộc vào kiến ​​trúc mà chúng không tốn kém như chi phí logic dma, sức mạnh, v.v. dma hoạt động cho kiến ​​trúc và hệ thống cụ thể mà bạn đang sử dụng và quyết định xem nó có đáng để sử dụng không,

Không có câu trả lời chung cho cách thức hoạt động của dma, nó phụ thuộc rất nhiều vào thiết kế hệ thống và tất cả các thành phần trong hệ thống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.