Processes vs Threads

Mở đầu

Process và thread là 2 khái niệm khá phổ biến và gây nhập nhằng cho nhiều developer. Hôm nay mình sẽ phân tích rõ hơn về bản chất của 2 khái niệm này.

Processes vs Threads

Một process là một thực thể thực thi của một ứng dụng. Điều này có nghĩa là gi? Như thế này nhé, khi bạn kích đúp chuột vào biểu tượng Microsoft Word, bạn đã khởi động một process để chạy Word. Một thread là một phần thực thi trong một process. Đơn giản có thể hiểu một process có thể chứa nhiều thread. Khi bạn khởi động Word, hệ điều hành đã tạo một process và bắt đầu thực thi một thread chính của process đó.

Điều quan trọng cần chú y là một thread có thể làm bất cứ thứ gì mà một process có thể làm. Bởi vì một process có thể bao gồm nhiều threads, một thread có thể xem như là một process nhỏ, nhẹ (lightweight) . Điểm khác biệt cơ bản giữa thread và process là công việc mỗi cái được sử dụng để hoàn thành. Threads được sứ dụng cho các nhiệm vụ nhỏ. trong khi đó process được sử dụng cho một nhiệm vụ lớn (heavyweight), cơ bản như việc thực thi ứng dụng chẳng hạn.

Một điểm khác biệt nữa giữa một thread và một process là các threads trong cùng 1 process thì có thể chia sẽ tài nguyên (địa chỉ bộ nhớ) , còn các process khác nhau thì không. Điều đó cho phé các threads có thể đọc và ghi các cấu trúc dữ liệu, các biến giống nhau và cũng có thể liên lạc vs nhau dễ dàng. Giao tiếp giữa các process được biết như IPC (inter-process communication) khá là phức tạp.

MultiThreading

Threads tất nhiên là cho phép multi-threading. Một ví dụ về lợi ích của multithreading là bạn có một thread xử lý việc in tài liệu như một thread nền, tại thời điểm đó, có một thread khác đang chạy để chấp nhận input của người dùng đánh vào để tạo một văn bản mới.

Nếu chúng ta giả sử ứng dụng chỉ sử dụng một thread đơn. ứng dụng chỉ có ttheer làm một việc tại một thời điểm. Vì vậy tại một thời điểm, việc in và và tạo một văn bản mới sẽ không thể thực hiện được trong một ứng dụng đơn luồng (single threaded application).

Mỗi process có bộ nhớ riêng của nó nhưng các threads trong cùng một process thi chia sẻ chung bộ nhớ. Threads có thể chia sẻ bất cứ tài nguyên nào trong một process. Nghĩa là rất dễ dàng để chia sẻ dữ liệu giữa các threads. Nhưng cũng cần chú ý tới thứ tự của các thread, nguyên nhân dẫn tới các lỗi tồi tệ khi thay đổi cấu trúc của tài nguyên.

Lập trình Multithreaded phải cẩn thận để ngăn chặn các lỗi đáng tiếc có thể xảy ra. Lĩnh vực code có thể thay đổi cấu trúc dữ liệu được chia sẻ bởi nhiều threads được gọi là lĩnh vực đặc biệt (critical sections). Khi một critical section đang chạy trong một thread thì ko có bất kì thread nào được phép gây ảnh hưởng tới nó. Nó được gọi là đồng bộ. Vì vậy lập multithreading yêu cầu phải lập trình cẩn thận.

Kết luận

Như vậy có thể tóm tắt sự khác nhau giữa process và thread như sau:

  1. Threads dễ dàng để tạo hơn là process vì chúng không cần yêu cầu thêm bộ nhớ riêng.

  2. 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ớ.

  3. Các thread được xem là nhẹ (lightweight) bởi vi chúng được sử dụng ít tài nguyên hơn so với process.

  4. Các process là độc lập với nhau. Các thread thì chia sẻ chung địa chỉ ô nhớ.

  5. Một process có thể chứa nhiêu threads.

Tham khảo