Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Sự khác biệt giữa các Processes and Threads
Trong lập trình và kỹ thuật máy tính, hiểu rõ về các tiến trình (process) và luồng (thread) là điều vô cùng quan trọng để tối ưu hóa hiệu suất và quản lý tài nguyên hiệu quả. Hai khái niệm này, mặc dù thường bị nhầm lẫn, nhưng lại có vai trò và cách thức hoạt động khác nhau trong hệ thống. Trong bài viết này, bạn sẽ tìm hiểu về các Processes and Threads, cũng như các điểm khác biệt chính giữa chúng, giúp bạn có cái nhìn tổng quan và sâu sắc hơn về cách mà các chương trình hoạt động trên máy tính.
Giới thiệu về các Processes and Threads trong Python
Giả sử bạn có một chương trình Python đơn giản:
x = 10 y = 20 z = x + y
Máy tính không hiểu Python. Chúng chỉ hiểu mã máy, là tập hợp các lệnh chứa số 0 và 1.
Do đó, bạn cần một Trình thông dịch Python (Python Interpreter) để thực thi chương trình Python này, nó sẽ dịch mã Python sang mã máy.
Bài viết này được đăng tại [free tuts .net]
Khi bạn thực hiện lệnh python app.py
, trình thông dịch Python (CPython) biên dịch file app.py
thành mã máy. Sau đó, hệ điều hành (OS) cần tải chương trình vào bộ nhớ (RAM) để chạy chương trình.
Khi OS tải chương trình vào bộ nhớ, nó sẽ di chuyển các lệnh đến CPU để thực thi thông qua bus.
Nói chung, OS di chuyển các lệnh vào một hàng đợi, còn được gọi là pipeline. Sau đó, CPU sẽ thực thi các lệnh từ pipeline.
Theo định nghĩa, một processes là một phiên bản của một chương trình đang chạy trên máy tính. Và một luồng là một đơn vị thực thi trong một tiến trình.
Lưu ý rằng nếu bạn khởi chạy một chương trình nhiều lần, bạn sẽ có một chương trình duy nhất nhưng nhiều processes , mỗi tiến trình đại diện cho một phiên bản của chương trình.
Một chương trình giống như một lớp trong khi các processes giống như các đối tượng của lớp đó.
Hình ảnh sau minh họa luồng của việc chạy một chương trình Python trên máy tính:
Sự khác biệt giữa các Processes and Threads trong Python
Thực thi CPU đơn lõi
Cho đến nay, bạn đã học cách phát triển một chương trình có một tiến trình với một luồng. Do đó, đôi khi các thuật ngữ Processes and Threads thường được sử dụng thay thế cho nhau.
Một chương trình có thể có một hoặc nhiều tiến trình và một tiến trình có thể có một hoặc nhiều luồng.
Khi một chương trình có nhiều tiến trình, nó được gọi là xử lý đa tiến trình (multiprocessing). Nếu một chương trình có nhiều luồng, nó được gọi là xử lý đa luồng (multithreading).
Bộ xử lý đơn lõi
Trong quá khứ, một CPU chỉ có một lõi. Nói cách khác, nó chỉ có thể chạy một tiến trình tại một thời điểm. Để thực thi nhiều tiến trình "cùng một lúc", OS sử dụng một thành phần phần mềm gọi là bộ lập lịch (scheduler):
Bộ lập lịch giống như một công tắc chuyển đổi các tiến trình. Nhiệm vụ chính của bộ lập lịch là chọn các lệnh và gửi chúng để thực thi đều đặn.
Bộ lập lịch chuyển đổi giữa các tiến trình nhanh chóng (khoảng 1 ms) đến mức tạo ra ảo giác rằng máy tính có thể thực thi nhiều tiến trình đồng thời.
Bộ xử lý đa lõi
Ngày nay, CPU thường có nhiều lõi, ví dụ, hai lõi (dual-core) và bốn lõi (quad-core).
Số lượng lõi sẽ xác định số lượng tiến trình mà CPU có thể thực thi đồng thời. Nói chung, càng nhiều lõi thì CPU càng có thể thực thi nhiều tiến trình đồng thời.
Ví dụ, một CPU dual-core có thể thực thi đúng hai tiến trình đồng thời và một CPU quad-core có thể thực thi tối đa bốn tiến trình đồng thời.
Xử lý đa tiến trình sử dụng CPU đa lõi trong một máy tính duy nhất, thực sự thực thi nhiều tiến trình song song.
Nhiệm vụ ràng buộc CPU và ràng buộc I/O
Nói chung, các chương trình xử lý hai loại nhiệm vụ: ràng buộc I/O hoặc ràng buộc CPU.
- Nhiệm vụ ràng buộc I/O (I/O-bound tasks) dành nhiều thời gian hơn để thực hiện I/O so với tính toán. Các ví dụ điển hình của nhiệm vụ ràng buộc I/O là yêu cầu mạng, kết nối cơ sở dữ liệu và đọc/ghi file.
- Ngược lại, nhiệm vụ ràng buộc CPU (CPU-bound tasks) sử dụng nhiều thời gian hơn để tính toán so với việc tạo yêu cầu I/O. Các ví dụ điển hình của nhiệm vụ ràng buộc CPU là nhân ma trận, tìm số nguyên tố, nén video và truyền video.
Về mặt kỹ thuật, xử lý đa luồng phù hợp với nhiệm vụ ràng buộc I/O, và xử lý đa tiến trình phù hợp với nhiệm vụ ràng buộc CPU.
Bảng sau minh họa sự khác biệt chính giữa một tiến trình và một luồng:
Tiêu chí |
Processes |
Threads |
---|---|---|
Chia sẻ bộ nhớ | Bộ nhớ không được chia sẻ giữa các tiến trình | Bộ nhớ được chia sẻ giữa các luồng trong một tiến trình |
Kích thước bộ nhớ | Lớn | Nhỏ |
Xử lý ràng buộc CPU và I/O | Tối ưu hóa cho nhiệm vụ ràng buộc CPU | Tối ưu hóa cho nhiệm vụ ràng buộc I/O |
Thời gian khởi tạo | Chậm hơn so với luồng | Nhanh hơn so với tiến trình |
Khả năng gián đoạn | Các tiến trình con có thể bị gián đoạn |
Các luồng không thể bị gián đoạn |
Kết bài
Qua hướng dẫn này, mình đã tìm hiểu rõ ràng về các tiến trình (process) và luồng (thread), cũng như những khác biệt quan trọng giữa chúng. Việc hiểu và áp dụng đúng đắn các khái niệm này không chỉ giúp tối ưu hóa hiệu suất của ứng dụng mà còn nâng cao khả năng quản lý và sử dụng tài nguyên hệ thống một cách hiệu quả. Dù bạn đang làm việc với các tác vụ yêu cầu nhiều tính toán hay các tác vụ liên quan đến I/O, việc lựa chọn giữa đa tiến trình và đa luồng sẽ đóng vai trò then chốt trong việc đạt được hiệu quả cao nhất. Hy vọng qua bài viết này, bạn đã có được cái nhìn rõ ràng và sâu sắc hơn về Processes and Threads, và có thể áp dụng chúng một cách hiệu quả trong các dự