PYTHON CONCURRENCY
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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:

Difference between process and thread Executing Processes png

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):

Difference between process and thread Scheduler png

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ự

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top