Bài viết nằm trong series Multi-thread programming in depth
Có hai loại thread. cụ thể là:
- CPU thread: đại diện cho nhân của CPU core, processor. Ví dụ như chúng ta hay nghe đến Intel Core i5 4 cores - 4 threads.Có thể hiểu là hardware thread.
- OS thread: là thread của hệ điều hành, có thể gọi là software thread để phân biệt với CPU thread. Java thread tương ứng với một OS thread, tuy nhiên cần lưu ý rằng về bản chất nó là 2 thứ khác nhau.
1. Process
Có nhiều cách để giải thích Process là gì?
Hiểu đơn giản thì khi double-click chạy một ứng dụng(Chrome, Skype, Terminal,...), một process được chạy. Chúng ta hoàn toàn có thể mở 2 ứng dụng Chrome hoặc mở n ứng dụng khác nhau cùng lúc. Đó chính là Process. Ấy là lối suy nghĩ khi bạn dùng Windows.
Nếu bạn sử dụng các OS như ubuntu chẳng hạn, thì hướng tiếp cận về thread sẽ sâu hơn. Các câu lệnh hay process manager như top
, htop
, ps
, Monitor của Ubuntu sẽ thấy số thread/ process đang chạy. Vd ở lệnh top thì ta thấy result outpuit có Tasks
ở góc trên chỉ ra số process + thread đang active. Nếu shift + H, thì sẽ thấy số Threads. Nôm na như thế, chi tiết các bạn đọc qua docs của man nhé. Mỗi process được gán cho 1 số ProcessID (PID), dùng lệnh kill -9 <PID>
để tắt chương trình bị "treo". Khi chạy 1 chương trình, hệ điều hành sẽ tạo ra 1 (hay vài) process.
- Process là một chương trình phần mềm đang được thực thi trên máy tính, có rất nhiều process được khởi tạo và chạy đồng thời.
- Một process sẽ được gắn 1 số ProcessID (PID).
- Process bao gồm thông tin data và state process.
Tiếp theo, khi mà bạn đang code hì hục để cho kịp deadline đồng thời phải reply tin nhắn của tester qua Chrome/ Skype và InteliJ. Bạn phải Alt + Tab liên tục mỗi khi nghe tiếng noti đầy ám ảnh . Và đương nhiên không có cách nào để reply tin nhắn ngay trên InteliJ rồi. Một ví dụ khác, bạn có 2 browser Chrome, nhưng có thể kéo tab từ browser này sang browser còn lại.
Các Process không liên quan đến nhau, không sử dụng chung vùng nhớ, không truy cập trực tiếp dữ liệu của nhau.
2. Thread
Trong Ubuntu terminal, gõ man 7 pthreads
- POSIX thread, là "OS thread" trên Linux nói rằng
A single process can contain multiple threads, all of which are executing the same program. These threads share the same global memory (data and heap segments), but each thread has its own stack (automatic variables).
Theo man 3 pthreads
trên OpenBSD:
A thread is a flow of control within a process. Each thread represents a minimal amount of state: normally just the CPU state and a signal mask. All other process state (such as memory, file descriptors) is shared among all of the threads in the process. In OpenBSD, threads use a 1-to-1 implementation, where every thread is independently scheduled by the kernel.
Theo man 3 pthread
trên FreeBSD:
POSIX threads are a set of functions that support applications with re- quirements for multiple flows of control, called threads, within a process. Multithreading is used to improve the performance of a program.
Từ các description trên thì chúng ta thấy rút ra rằng:
- Thread là một flow of control trong một process.
- Thread là đơn vị cơ bản để hệ điều hành quản lý và thực thi.
- Các threads trong cùng process sẽ chia sẻ chung vùng nhớ (shared address space), do đó chúng có thể truy cập đến data của nhau hay nói cách khác là của process.
- Việc tạo mới/hủy thread đơn giản và tốn ít công hơn so với việc tạo mới/hủy một process.
Từ kết luận của thread ta có bổ sung cho process như sau:
- Vùng nhớ của các process là hoàn toàn độc lập (isolation) với nhau, việc trực tiếp chia sẻ bộ nhớ là điều không thể (Có thể nhưng tốn cost và effort)
- Việc giao tiếp giữa các process khó hơn so với việc giao tiếp giữa các thread. Việc thêm mới một process khó hơn việc thêm mới một thread.
3. Inter-process communication (IPC)
Với kết luận trên, các process sẽ không thể trực tiếp truy cập vào vùng nhớ của nhau. Vậy, ta có thể gián tiếp làm điều đó bằng cách để các process giao tiếp với nhau. Thuật ngữ diễn tả hành động đó là Inter-process communication (IPC).
Cụ thể hơn, IPC là gì? Nghe thì nguy hiểm nhưng thực chất đều là những thứ rất quen thuộc:
- Sockets and pipes. Giao tiếp thông qua network ví dụ như UDP, TCP, RESTful API hoặc các hệ thống Message broker như RabbitMQ, Kafka...
- Remote procedure calls thông qua gRPC.
- Shared memory.
4. Time for discussion
Vậy là từ bài viết này, ắt hẳn các bạn đã phần nào hiểu thế nào là process và thread. Vậy multi-process, multi-thread là gì, nên sử dụng multi-thread hay multi-process thì tốt hơn cho ứng dụng? Bên cạnh đó chúng ta sẽ tìm hiểu thêm CPU chạy thread hay process?
Để trả lời câu hỏi trên thì đó là không có câu trả lời trọn vẹn. Sẽ phụ thuộc vào nhiều yếu tố như môi trường chạy, ngôn ngữ lập trình hay sự khác nhau giữa các hệ điều hành hoặc mục đích sử dụng.
Reference
- https://man7.org/linux/man-pages/man7/pthreads.7.html
- https://man.openbsd.org/pthreads.3
- https://man.freebsd.org/cgi/man.cgi?query=pthread
- https://viblo.asia/p/003-thread-va-process-gDVK2eeA5Lj
After credit
Đón chờ bài viết sau về chủ đề Multi-thread, Multi-process, CPU chạy thread hay process? nhé!!!