Tìm hiểu về khái niệm Inter Process Communication

Một process (tiến trình) trong hệ điều hành có thể được tiến hành độc lập hoặc giao tiếp với nhau. Process độc lập là khi process không ảnh hưởng hoặc bị ảnh hưởng bởi các process khác trong hệ thống, và không chia sẻ data với bất kì process nào. Process giao tiếp khi process đó có thể ảnh hưởng hoặc bị ảnh hưởng bởi các process khác trong hệ thống, và sự chia sẻ data có diễn ra.

Thông thường, Inter Process Communication sẽ được hiện thực hóa, code trên những hệ thống máy tính song song (parallel computer), với những máy ảo nhỏ (Virtual Private Server – VPS), việc lập trình IPC là không cần thiết. Stream Hub sẽ không nói về cách hiện thực IPC trong code mà nêu ra một số vấn đề liên quan đến IPC.

Vì sao các process phải giao tiếp với nhau?

Việc cho phép truyền data giữa các process (bạn có thể tìm hiểu process là gì) là do những lý do sau:

  • Giúp chia sẻ thông tin giữa các users.
  • Giúp speech up các tác vụ trong máy tính.
  • Giúp xây dựng modun.
  • Giúp thuận tiện trong chạy nhiều tác vụ cùng một lúc.

IPC là viết tắt của từ gì?

Inter Process communication (hay còn gọi là IPC) – giao tiếp giữa các process – là một phương thức không thể thiếu trong việc giúp các process trao đổi thông tin với nhau.

Hai models chính của IPC là shared memory (chia sẻ bộ nhớ) – với nhiệm vụ hình thành khu vực lưu trữ bộ nhớ chung – và message passing (truyền tin) – với nhiệm vụ truyền tải tin nhắn liên tục giữa các process.

There are two primary models of interprocess communication: shared memory andmessage passing.

W3School

Cả hai model trên đều phổ biến trong các hệ điều hành. Model message passing hữu ích cho việc trao đổi số lượng nhỏ các data và dễ thực hiện hơn trong hệ cơ sở dữ liệu phân tán – hệ thống phân tán (distributed system). Ngược lại, shared memory có thể nhanh hơn message passing vì các hệ thống truyền thông điệp thường thực hiện thông qua system call (mà chúng tốn nhiều thời gian hơn và phải có sự can thiệp của kernel – nhân hệ điều hành).

Sm And Mp
Sm And Mp

Trong hệ thống shared memory, các system call chỉ thực hiện khi cần thiết lập các vùng bộ nhớ chung. Nghĩa là các processor CPU có thể tự do đọc ghi trong phần bộ nhớ này.

Các nghiên cứu gần đây đã chỉ ra rằng message passing tốt hơn shared memory khi sử dụng trong các hệ thống core processing vì các sự cố đồng bộ cache mà shared memory dễ gặp phải khi các data chạy qua caches.

Ipc

Shared-Memory Systems

IPC sử dụng model shared memory sẽ cần những process tham gia mở một vùng nhớ chung. Vùng nhớ chung này được tạo thành từ nhiều vùng nhớ riêng của mỗi process.

Các process khác muốn tiếp cận vùng nhớ đó sẽ phải lưu địa chỉ của vùng nhớ chung ấy vào vùng nhớ riêng của mình . Mà thông thường, các hệ điều hành sẽ chặn không cho các process xâm nhập bộ nhớ của nhau.

Để sử dụng model shared memory, các process cần cho phép việc truy cập bộ nhớ của nhau để có thể sử dụng và viết data trên vùng chia sẻ chung. Các tiến trình sẽ quyết định kiểu data nào được chia sẻ và vùng chia sẻ chung ở đâu. Tất nhiên chúng phải bảo đảm các vùng chia sẻ chung không bị ghi đè lên nhau.

Một ví dụ đơn giản về việc ăn ở quán ăn cho model này. Giả sử, bạn gọi 10 phần ăn, các món ăn được đem lên dần dần. Cho thức ăn là data cần truyền, người ăn là process cần data và đầu bếp là process cung cấp data. Việc đầu bếp và người ăn cùng thực hiện nhiệm vụ của mình trong cùng thời điểm để đảm bảo thời gian ăn không bị ngắt quãng và lâu. chính là cơ chế IPC. Và chi tiết hơn, họ cùng share một lượng data/ thức ăn. Với điều kiện, người ăn không được ăn (write data) lên phần mà đầu bếp chưa chế biến.

Vấn đề IPC trong hệ thống Shared Memory

Trong ví dụ về quán ăn ở trên, bạn có nhận ra sự không tốt? Giả sử nếu nhiều thực khách cùng lúc order một món ăn, món ăn đó sẽ ra sao? Quay trở lại vấn đề trong hệ thống shared memory, nếu nhiều processor cùng truy cập một vùng nhớ (memory) sẽ gây ra sai sót tính toán.

Nói một cách “toán” hơn, nếu ta khai báo x với giá trị ban đầu là 0. Cùng lúc processor 1 tăng biến x lên 1 và processor 2 tăng biến x lên 2, x sẽ có kết quả là? Câu trả lời nếu processor nào chạy xong sau, x sẽ có giá trị đó; và đương nhiên chúng ta không thể biết được processor nào kết thúc sau.

Hướng giải quyết của vấn đề này là đồng bộ hóa (synchronising) shared data. Nghĩa là nếu processor đầu, sau, cùng lúc tăng giá trị lần lượt lên 1 và 2; thì giá trị cuối cùng luôn luôn là 3 (kệ thằng nào thay đổi giá trị sau cùng kết quả vẫn là 3 sau khi đồng bộ hóa).

Message-Passing Systems

Bên cạnh việc dùng shared memory, một cách khác để liên kết các process lại với nhau là sử dụng message passing.

Message passing cung cấp một cơ chế cho phép các tiến trình liên lạc và đồng bộ mà không cần chia sẻ vùng nhớ (address space) của nhau. Điều này đặc biệt hữu ích trong những hệ cơ sở dữ liệu phân tán (distributed database), nơi mà các process nằm trên các máy tính khác nhau kết nối qua hệ thống mạng. Cụ thể là chương trình chat qua Internet như messenger được thiết kế để người dùng kết nối với nhau thông qua việc trao đổi các tin nhắn.

Mp
Mp

Cơ sở truyền in cung cấp ít nhất hai nguồn:

Gửi (tin) <=> nhận (tin)

Process gửi tin có thể cố định hoặc biến đổi về kích thước. Ví dụ, nếu process P và Q muốn trao đổi, các tin cần phải được gửi và nhận giữa hai đầu: một liên kết truyền tin phải tồn tại giữa hai process.

Message-Passing Systems có 2 cách thức: kết nối trức tiếp vào kết nối gián tiếp.

Kết nối trực tiếp

o Đối với kết nối trực tiếp: mỗi process muốn truyền tin cần phải đặt tên cho tin nhắn hoặc tên người gửi

  • Symmetry: cần cả tên người gửi và tên tin nhắn để process đó thực hiện thao tác gửi
  • Asymmertry: chỉ cần tên tin nhắn là process đó có thể gửi cho bất kì process nào khác

Kết nối gián tiếp

o Đối với kết nối gián tiếp: các tin được nhận thông qua các hộp thư hoặc các cổng.

  • Hộp thư: Nơi tin nhắn được gửi vào hoặc được lấy ra. Mỗi một hộp thư sẽ được xác định bởi 1 ID duy nhất. Các process có thể liên lạc với nhau thông qua nhiều hộp thư, nhưng chỉ khi các hộp thư đó được thiết lập như hộp thư chung giữa hai process.
  • Kết nối được đồng bộ hoặc không được đồng bộ – blocking và nonblocking

o Chặn gửi: process gửi tin bị chặn cho đến khi tin nhắn đã được nhận bởi process còn lại hoặc tới khi tin vào hộp thư.

o Không chặn gửi: process gửi tin xong thì tiếp tục hoạt động.

o Chặn nhận: Process nhận tin chặn cho đến khi một tin nhắn có sẵn.

o Không chặn nhận: process nhận tin sẽ nhận một tin hoàn chỉnh hoặc một giá trị null.

Dù là dùng Message Passing hay Shared-memory system, vẫn sẽ có trường hợp process A “đợi” process B có thông tin rồi mới thực hiện. Nếu nhiều process cùng “đợi”, sẽ dẫn đến timeout rất lâu, bạn sẽ không muốn khi gửi gói tin/ gửi request và phải đợi rất lâu để có thể nhận data trả về, vậy có cách nào khắc phục tình trạng này? Đó không phải là công việc mà bạn phải lo lắng, bởi hệ điều hành đã thực hiện việc này cho chúng ta, câu trả lời là bộ định thời.

Định thời CPU (Process Scheduling)

Mục tiêu của IPC nói trên là để các process khác nhau có thể nhận thông tin của nhau, và nếu bạn muốn quá trình gửi – nhập được diễn ra đúng và chính xác, đó là việc của bộ định thời.

Mục tiêu của việc đa chương trình là lúc nào cũng có những chương trình (process khác nhau) chạy xuyên suốt để tối đa hóa sử dụng CPU. Mục tiêu của việc chia sẻ thời gian là chuyển đổi CPU giữa những quá trình đó một cách thường xuyên để người dùng có thể tương tác với mỗi chương trình trong lúc nó hoạt động.

Một chương trình di chuyển giữa các hàng đợi khác nhau trong suốt thời gian của nó. Hệ điều hành sẽ phải chọn ra những chương trình từ những hàng chờ vào một lúc nào đó. Việc chọn lựa chương trình được tiến hành bởi một scheduler thích hợp.

Thông thường, trong một hệ thống, nhiều chương trình được chọn để xem xét hơn là hoạt động ngay lập tức. Những chương trình được lưu trữ trong bộ nhớ của thiết bị (thông thường là ổ đĩa), đó là nơi lưu trữ để hoạt động sau này. long-term scheduler hoặc job scheduler sẽ chọn những chương trình từ chỗ này và tải chúng vào bộ nhớ để hoạt động. Short-term scheduler hoặc CPU scheduler sẽ chọn từ những chương trình đã sẵn dàng để hoạt động và phân bổ CPU cho một trong số chúng

Sự khác nhau cơ bản giữa hai bộ lập trình này nằm ở tần suất hoạt động. Short-term scheduler phải chọn một chương trình mới cho CPU thường xuyên. Mỗi chương trình có thể hoạt động chỉ trong vòng một vài phần nghìn giây trước khi chờ một yêu cầu I/O.

Thông thường, Short-term scheduler hoạt động tối thiểu mỗi 100 phần nghìn giây. Bởi vì những hoạt động như vậy, Short-term scheduler phải nhanh. Nếu tốn 10 phần nghìn giây để quyết định hoạt động một chương trình 100 phần nghìn giây thì 10/(100+10)=9 phần trăm CPU đang được dùng chỉ để lên kế hoạch (phần trăm lãng phí).

Một số thuật ngữ khác trong quá trình liên lạc giữa các process

o Zero capacity: bộ đệm không cho phép bất cứ tin nhắn chờ nào, cũng có nghĩa là process gửi tin sẽ bị chặn đến khi bên kia nhận tin.

o Bounded capacity: sẽ có một giới hạn n các tin nhắn được chờ trong buffer. Có nghĩa là nếu vẫn chưa tới giới hạn, các tin có thể tiếp tục được tạo ra bởi process gửi tin. Nếu đã có n tin nhắn đang chờ được nhận, process này sẽ bị chặn đến khi hàng tin nhắn được trống (bên kia nhận tin)

o Unbounded capacity: lượng tin nhắn chờ là vô tận, nghĩa là process gửi không bao giờ bị chặn.

Trường hợp zero capacity thường được xem là trường hợp giữa hai process không có bộ nhớ đệm, còn hai trường hợp bounded và unbound thì có bộ đệm giữa hai process.

Ví dụ thực tế của IPC – trình duyệt Chrome

Như bạn đã biết, không như những trình duyệt khác (ví dụ Firefox phiên bản cũ, phiên bản mới thì mình không biết), thường có tình trạng đứng 1 tab là đứng hết cả trình duyệt. Nhưng trình duyệt Chrome thì không như vậy.

Đó là nhờ cơ chế multiprocess, mỗi tab của Chrome là một process độc lập với nhau, và chúng luôn chạy đồng thời với nhau.

Kiến trúc multiprocess của Chrome hoạt động trên cơ chế nhận biết 3 kiểu của process:

Brownser process: kiểm soát user interface, disk và network. Chỉ có duy nhất 1 process loại này.

Renderer process: bao gồm cách thức render/ hiển thị một trang web. Mỗi lần bạn bật 1 tab mới, Chrome sẽ tự động tạo 1 process loại này cho bạn. Renderer process chạy trên các sandbox, nghĩa là chúng không cho các process trên trình duyệt có khả năng tiếp cận ổ cứng, hệ thống mạng của người dùng, nhằm tăng độ bảo mật.

Plug-in process: hay còn gọi là extension trên trình duyệt, đây là loại process cần được giao tiếp với hai loại process còn lại. (Ví dụ: Flash)

Một process (tiến trình) trong hệ điều hành có thể được tiến hành độc lập hoặc giao tiếp với nhau. Process độc lập là khi process không ảnh hưởng hoặc bị ảnh hưởng bởi các process khác trong hệ thống, và không chia sẻ data với bất kì process nào. Process giao tiếp khi process đó có thể ảnh hưởng hoặc bị ảnh hưởng bởi các process khác trong hệ thống, và sự chia sẻ data có diễn ra.

Thông thường, Inter Process Communication sẽ được hiện thực hóa, code trên những hệ thống máy tính song song (parallel computer), với những máy ảo nhỏ (Virtual Private Server – VPS), việc lập trình IPC là không cần thiết. Stream Hub sẽ không nói về cách hiện thực IPC trong code mà nêu ra một số vấn đề liên quan đến IPC.

Trả lời