69 điểm bởi alstjr7375 2022-12-28 | 10 bình luận | Chia sẻ qua WhatsApp

Bắt đầu từ phần tổng hợp thuật ngữ đơn giản, bài viết mở rộng phạm vi đến cả đồ họa và bán dẫn.

  1. Thuật ngữ
    • Đồng thời / song song
    • Bất đồng bộ / non-blocking
    • Tiền nhiệm / không tiền nhiệm
  2. Hệ điều hành và bộ xử lý
    • Hệ điều hành
    • Bộ xử lý
  3. Coroutine và fiber
    • Fiber
    • Coroutine
  4. Generator, Async/Await, continuation
    • Generator
    • Async / Await
    • Continuation
  5. Promise và Future
  6. I/O multiplexing
    • Multiplexing
    • Socket
    • Các mô hình I/O
  7. Ring buffer, các mô hình I/O hiện đại, LMAX Disruptor
    • Ring buffer
    • Các mô hình I/O hiện đại
    • LMAX Disruptor
  8. Các primitive đồng bộ hóa
    • Sự cần thiết
    • Thread safety
    • Spinlock
    • Mutex
    • Semaphore
    • STM
    • GIL
  9. Cách tiếp cận của các ngôn ngữ script khác và các mẫu Reactor/Proactor
    • Ractor (Ruby)
    • Node.js (mẫu Reactor)
    • Mẫu Proactor
  10. CSP và actor
    • CSP
    • Actor
  11. Green thread, goroutine và các công nghệ runtime bất đồng bộ hiện đại
    • Green thread
    • Các runtime CSP hiện đại
    • Các runtime actor hiện đại
  12. Song song hóa
    • SIMD và pipelining
    • OpenMP & MPI
    • Các kỹ thuật song song hiện đại
    • Kiến trúc lambda
  13. GPU
    • Pipeline và shader
    • Màn hình
    • Buffering
    • Đồng bộ dọc
    • Frame pacing và beam racing
    • Compositor
    • API / thư viện đồ họa
  14. Các loại chip khác
    • Tổng quan
    • DSP
    • FPGA
    • TPU
  15. Tài liệu tham khảo

10 bình luận

 
roxie 2022-12-31

Đồng bộ và bất đồng bộ là ai xác nhận việc hoàn thành tác vụ
Blocking và non-blocking là có quyền điều khiển hay không

Tôi thấy câu này được lặp lại y hệt trên vô số blog, nên tò mò không biết nguồn gốc ban đầu là từ đâu.

Phần lớn các blog mải tham chiếu lẫn nhau nên tôi không thể đoán ra nguyên văn gốc, và thứ duy nhất tôi tìm được là tài liệu AIO của IBM, nhưng có vẻ như tài liệu này chỉ nói trong phạm vi kernel I/O mà thôi. Ngoài ra tôi cũng nghe nói chính cách phân biệt đó tự thân đã gây tranh cãi.

Đây có phải là một tiêu chí phán định có độ tin cậy cao không?

 
alstjr7375 2022-12-31

Trước hết, có lẽ có thể dựa trên phía mạch điện để hiểu đồng bộ/bất đồng bộ.
Mạch đồng bộ dùng xung nhịp để căn thời gian, còn mạch bất đồng bộ được kích hoạt bởi sự kiện hoặc đầu vào khác.
Tức là, cũng không quá gượng ép nếu định nghĩa API bất đồng bộ là cách thức được kích hoạt bởi callback hoặc tương tự như vậy.
https://developer.mozilla.org/en-US/docs/…

Với API blocking/non-blocking, có thể xem định nghĩa phù hợp là liệu có bắt buộc phải chờ tác vụ hoàn thành hay không.
Tuy nhiên, để không phải chờ thì cần có một cách triển khai mà hàm được gọi nắm quyền điều khiển, nên có vẻ người ta thường giải thích theo hướng đó nhiều hơn.
https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/

Tôi đã lược bớt phần này để đi nhanh cho gọn, nhưng sẽ thử bổ sung thêm nội dung này.

 
roxie 2023-01-01

Tôi đồng ý với tất cả những gì bạn đã nói. Tuy nhiên, tôi vẫn khó có thể thực sự chắc chắn về việc liệu có nên vẽ hai trục tiêu chí này trên một mặt phẳng chia thành bốn góc phần tư hay không, liệu có thể vẽ như vậy hay không, và liệu chúng có được phân tách một cách phù hợp hay không. Với tôi, BlockingSync về mặt khái niệm có cảm giác chia sẻ 90% cùng một ngữ cảnh. Non-Blocking & Async cũng vậy.

 
alstjr7375 2023-01-01

Dù Blocking-Sync và Non-Blocking-Async thường được dùng cùng nhau, vẫn có những trường hợp cần phân biệt rõ.

  • Blocking-Async: I/O multiplexing như select
  • Non-Blocking-Sync: polling dữ liệu

Vì vậy, tôi lại cho rằng nên phân biệt và sử dụng chúng tách bạch.

 
roxie 2023-01-02

Có vẻ như tôi gần như không hiểu các ví dụ mà bạn nêu ra, nên cũng khó đồng cảm hơn.

Bài viết này giải thích như sau:

Cuối cùng, user process đã yêu cầu select sẽ nhìn vào giá trị trả về để quyết định có công việc tiếp theo hay không. Vì nhiều yêu cầu I/O đi vào theo cách không thể dự đoán được đang được quản lý cùng lúc, nên cũng có trường hợp xem đây là Asynchronous, nhưng rốt cuộc bản thân từng thao tác I/O thực tế lại thể hiện hành vi Synchronous.

Tôi muốn biết bạn có ý kiến gì về điều này. Thật ra đến thời điểm này, tôi cảm thấy cách phân loại 2x2 này không còn nhiều ý nghĩa nữa. Có vẻ như tùy theo từng domain và từng góc nhìn mà cách diễn giải lại rất khác nhau.

 
alstjr7375 2023-01-02

Tiếp theo, khi chờ phản hồi từ kernel, sẽ có tín hiệu callback từ kernel cho biết giá trị kết quả đã được chuẩn bị xong, và user process sẽ sao chép dữ liệu vào buffer của chính mình.

Vì phần này là cách kích hoạt bằng callback mà bạn đã đồng ý ở trên, nên nếu nhất thiết phải phân biệt/định nghĩa thì có vẻ gọi là Blocking-Async sẽ phù hợp hơn.
Tôi nghĩ rằng tùy theo góc nhìn, cũng có những trường hợp trông khá mơ hồ.

Tuy nhiên, polling là một ví dụ rất rõ ràng: https://en.wikipedia.org/wiki/Polling_(computer_science)

Trong trường hợp polling, vì phải lặp đi lặp lại việc kiểm tra xem dữ liệu đã sẵn sàng hay chưa, nên đây là một ví dụ phù hợp của Sync-Blocking.

 
wonkwh 2022-12-29

Wow, cảm ơn vì tài liệu rất hay.

 
kayws426 2022-12-29

Đọc rất hay!

 
bus710 2022-12-28

Cuộn mãi không thấy điểm dừng luôn, run thật đấy.
Có vẻ cũng đáng đọc thử một lần cuốn sách "7 mô hình đồng thời" nói về chủ đề tương tự.

 
alstjr7375 2022-12-29

So sánh mục lục thì thấy khá giống nhau.
Có vẻ là một cuốn sách hay.