Process và Thread

Sự khác nhau giữa Process và Thread

Process và Thread

Process là quá trình hoạt động của một ứng dụng. Điều đó nghĩa là gì? Có thể lấy một ví dụ như sau, khi bạn click đúp chuột vào biểu tượng MS Word, một process chạy ứng dụng Word được khởi tạo. Thread là một bước điều hành bên trong một process. Một process dĩ nhiên có thể chứa nhiều thread bên trong nó. Khi chúng ta chạy ứng dụng Word, hệ điều hành tạo ra một process  và bắt đầu chạy các thread chính của process đó.

Điểm quan trọng nhất cần chú ý là một thread có thể làm bất cứ nhiệm vụ gì một process có thể làm. Tuy nhiên, vì một process có thể chứa nhiều thread, mỗi thread có thể coi như là một process nhỏ. Vậy, điểm khác biệt mấu chốt giữa thread và process là công việc mỗi cái thường phải làm.

Một điểm khác biệt nữa đó là nhiều thread nằm trong cùng một process dùng một không gian bộ nhớ giống nhau, trong khi process thì không. Điều này cho phép các thread đọc và viết cùng một kiểu cấu trúc và dữ liệu, giao tiếp dễ dàng giữa các thread với nhau. Giao thức giữa các process, hay còn gọi là IPC (inter-process communication) thì tương đối phức tạp bởi các dữ liệu có tính tập trung sâu hơn.

Để dễ hình dung, bạn có thể tưởng tượng hệ thống ống nước. Mỗi ống nước là 1 process, giả sử ống đang chứa nước (main thread), bạn đổ thêm xăng và dầu (add thread) vào thì ống đó hiện đang chảy 3 luồng.

Về mặt ứng dụng, giả sử Google Chome (giả sử nhé). Khi bạn start chrome thì bạn đang start 1 process, mở thêm 1 tab thì bạn mở thêm 1 thread.

Về mặt lập trình, khi bạn chạy 1 chương trình thì bạn đang chạy 1 process (process start sẽ tạo ra 1 thread gọi là main thread). Nếu bạn cần làm 1 việc gì đó nặng (vd call api), bạn start 1 thread mới, nó vẫn nằm trong process nhưng không làm ảnh hưởng tới main thread.

Đa luồng (Mutilple threading)

Thread, dĩ nhiên cho phép chạy đa luồng. Minh hoạ dễ hiểu cho tính ưu việt của sự đa luồng là trình xử lý Word có thể vừa in tài liệu sử dụng một thread nền, vừa cùng lúc chạy một thread khác nhận dữ liệu vào từ người dùng để gõ một văn bản mới.

Nếu bạn đang làm việc với ứng dụng sử dụng một thread duy nhất, mà ứng dụng đó chỉ có thể làm một việc đơn lẻ vào một thời điểm – thì việc vừa in văn bản vừa tiếp nhận thông tin người dùng là bất khả thi trong ứng dụng đơn luồng này.

Mỗi một process có một vùng nhớ riêng của chúng, song các thread trong cùng một process thì dùng chung địa chỉ nhớ. Và các thread cũng dùng chung bất cứ tài nguyên nào nằm trong process đấy. Có nghĩa là rất dễ để chia sẻ dữ liệu giữa các thread, nhưng cũng rất dễ làm thread này nhảy sang thread khác, dẫn đến một số kết quả tồi tệ.

Các chương trình đa luồng cần được lập trình cẩn thận để tránh việc nhảy cóc như trên xảy ra.  Đoạn mã lệnh thay đổi cấu trúc dữ liệu chia sẻ giữa các đa luồng này được gọi là những đoạn quan trọng. Khi một đoạn quan trọng đang chạy ở thread này, cần đảm bảo không thread khác nào được phép sử dụng đoạn quan trọng này. Đây là quy đình đồng bộ hoá, nhằm tránh không bị dừng chương trình một cách bất ngờ ở đây. Và đó cũng là lý do tại sao đa luồng đòi hỏi lập trình một cách rất cẩn thận.

Nhìn chung, môi trường chuyển đổi của các thread đỡ tốn kém hơn so với giữa các  process. Đặt biệt là overhead (chi phí giao thức) giữa các thread đặc biệt thấp so với các process.

Sau đây là bảng tổng kết sự khác nhau giữa thread và process:

  • Để tạo nhiều thread thì dễ dàng hơn so với process vì chúng không cần các địa chỉ nhớ riêng rẽ (thread không cần yêu cầu thêm bộ nhớ riêng).
  • Việc chạy đa luồng cần được lập trình một cách chi tiết vì các thread chia sẻ các cấu trúc chung mà chỉ sử dụng được bởi từng thread vào mỗi thời điểm. Khác với thread, các process không dùng chung địa chỉ nhớ hay nói cách khác Multithreading yêu cầu lập trình cẩn thận hơn khi các threads chia sẽ cấu trúc dữ liệu. Nghĩa là nó chỉ được thay đổi cấu trúc dữ liệu bởi một thread tại một thời điểm. Không giống như thread, các process không thể chia sẻ chung một địa chỉ ô nhớ..
  • Thread được xếp hạng “nhẹ cân” bởi vì chúng sử dụng ít tài nguyên hơn so với các process.
  • Các process chạy độc lập với nhau. Các thread thì sử dụng chung các địa chỉ nhớ liên kết với nhau, vì thế cần thận trọng tránh việc thread này nhảy sang thread khác. (Điều đã được nhắc đến trong ý thứ 2 vừa trên)
  • Một process có thể chứa nhiều thread.

Bình luận

Bài viết liên quan