Thêm thread có làm code chạy nhanh hơn không? Câu trả lời phụ thuộc vào việc thread đang tính toán hay đang chờ.
Bài full: https://zemit.substack.com/p/concurrency-va-parallelism-mot-au
Trước hết là ba khái niệm hay bị dùng lẫn, mình ghép với hình ảnh bếp nhà hàng cho dễ nhớ:
- 𝗣𝗿𝗼𝗰𝗲𝘀𝘀 là một chương trình đang chạy, có vùng nhớ riêng, ví dụ một JVM. Giống một chi nhánh nhà hàng có kho riêng mà chi nhánh khác không nhìn thấy.
- 𝗧𝗵𝗿𝗲𝗮𝗱 là một mạch chạy lệnh bên trong process. Các thread dùng chung heap, mỗi thread có stack riêng. Giống một đầu bếp.
- 𝗖𝗼𝗿𝗲 là phần cứng chạy lệnh, tại một thời điểm mỗi core chỉ chạy một thread. Giống một bếp lửa.
Chi nhánh có 12 bếp lửa và 100 đầu bếp đều đang có món cần đứng bếp thì mỗi lúc cũng chỉ 12 người đang nấu.
Từ đây chia ra hai loại việc:
- 𝗖𝗣𝗨-𝗯𝗼𝘂𝗻𝗱 (nén, mã hóa, băm mật khẩu, parse JSON lớn): thread cần core suốt thời gian chạy. Thread vượt số core chỉ thêm người xếp hàng và thêm chi phí đổi người đứng bếp (context switch). Mình đo 100 task tính toán trên máy 12 logical core: 12 thread mất khoảng 1 giây, 100 thread cũng khoảng 1 giây.
- 𝗜𝗢-𝗯𝗼𝘂𝗻𝗱 (chờ database, gọi API, chờ ổ đĩa): thread đang chờ rời khỏi core, bếp lửa trống cho người khác nấu. 100 task chờ 100 ms giảm từ 11 giây xuống 0,12 giây khi tăng từ 1 lên 100 thread.
Vậy khi nào nên tăng thread? Trước khi tăng, cần trả lời hai câu: thread chờ cái gì, và thứ cần chờ có bao nhiêu chỗ. Việc tính toán thì số thread quanh số core là đủ. Việc chờ IO thì tăng được, nhưng chỉ tới khi thứ đang được chờ hết chỗ: connection pool có 10 connection, mỗi query giữ 50 ms thì trần là 200 query mỗi giây, dù ứng dụng chạy 50 hay 500 thread.
Đây là bài 1 của series Concurrency, đọc miễn phí trọn vẹn, link mình gắn ở comment.

إرسال تعليق