Liên lạc giữa các tiến trình

Một phần của tài liệu Cấu trúc, nguyên lý, phân tích mã nguồn CentOS (Trang 54)

- Signal: tín hiệu sẽ tương tự như các ngắt tác động đến tiến trình. Một tín hiệu được sử dụng để thông báo cho tiến trình về một sự kiện nào đó xảy ra. Có nhiều tín hiệu được định nghĩa, ví dụ như:

Mỗi tiến trình sở hữu một bảng biểu diễn tín hiệu khác nhau. Với mỗi tín hiệu sẽ tương ứng với một trình xử lý tín hiệu. Các tín hiệu có thể được gửi đi bởi phần cứng, nhân gửi đến một tiến trình, một tiến trình gửi đến một tiến trình khác hay người dùng. Khi một tiến trình nhận được tín hiệu, nó có thể xử lý tín hiệu theo các cách như: bỏ qua tín hiệu, xử lý tín hiệu theo mặc định hay xử lý tín hiệu đó theo cách riêng của mỗi tiến trình.

- Pipe: hai tiến trình sẽ trao đổi thông qua một luồng dữ liệu dùng chung, việc đọc và viết sẽ được sử dụng các hàm vào ra trong thư viện chuẩn của HDH. Pipe sẽ thực hiện sao cho dữ liệu đầu ra của một tiến trình là dữ liệu đầu vào của tiến trình khác. Nhưng việc truy xuất, dùng chung đường dữ liệu này chỉ có thể thực hiện được khi các tiến trình có cùng huyết thống. Cơ chế pipe được thiết lập bằng việc sử dụng ký tự “|”.

Ví dụ: ta thực hiện xem file baitap.txt và đếm số dòng có trong file. cat baitap.txt | wc -l

Task A Task B Communication pipe

- Message Queues: hàng thông điệp là một danh sách liên kết các thông

điệp được lưu trong kernel và được nhận dạng bởi một trường định dạng thông điệp (message queues ID). Mỗi thông điệp có một trường kiểu nguyên dương, có độ dài không âm và các byte dữ liệu. Kernel định nghĩa mỗi cấu trúc cho các kiểu liên lạc (IPC) và qui chiếu tới bằng một số nguyên định dạng không âm (gọi ID), khi một cấu trúc IPC được tạo ra thì một khóa (key) phải được xác định (là tên người dùng tự chọn), kiểu dữ liệu của key là một số nguyên dài (long integer). Để gửi thông điệp cho các tiến trình, hệ thống cung cấp các system call:

+ msgget(): dùng để lấy hay tạo một mô tả thông điệp.

+ msgctl(): có tùy chọn lập các thông số hay trả về các thông số kết hợp với việc mô tả thông điệp, có tùy chọn hủy mô tả.

+ msgsnd(): gửi một thông điệp.

+ msgrcv(): nhận một thông điệp.

Kernel sẽ thực hiện lưu các thông điệp trên một hàng liên kết cho mỗi một mô tả và dùng msgqid làm chỉ số để vào trường đầu tiên của hàng đợi. Cấu trúc dữ liệu cho hàng đợi:

+ các con trỏ trỏ vào thông điệp đầu tiên và thông điệp cuối của danh sách.

+ số các thông điệp và tổng số byte dữ liệu trên danh sách.

+ PIDs của các tiến trình cuối cùng thực hiện gửi, nhận thông điệp. + tem thời gian cho biết các thao tác thông điệp cuối cùng thực hiện.

Để tạo một thông điệp mới ta thực hiện lời gọi hệ thống msgget(), kernel sẽ tìn trường thông điệp ứng với key đi kèm xem đã có chưa. Nếu chưa có đầu vào nào tương ứng với key đó thì kernel sẽ cấp một hàng thông điệp mới và khởi động các cấu trúc của hàng

- Shared Memmory: các tiến trình có thể liên lạc với nhau qua một phần trong không gian địa chỉ ảo của mình, được gọi là vùng nhớ chia sẻ (shared memory), sau đó thực hiện đọc/ghi dữ liệu vào đó. Shmget() sẽ tạo một miền chia sẻ mới hay trả về nếu miền chia sẻ đã tồn tại. Shmat() sẽ gắn một miền nhớ vào không gian địa chỉ ảo của một tiến trình, shmdt() sẽ thực hiện gỡ bỏ vùng chia sẻ. Sau khi một miền được gắn vào không gian của tiến trình thì miền đó sẽ được xem như một phần bộ nhớ của tiến trình.

Một phần của tài liệu Cấu trúc, nguyên lý, phân tích mã nguồn CentOS (Trang 54)