Giáo trình Bài mở đầu - Bài 9: Unix IPC Interprocess Communication - Ngô Duy Hòa
Bạn đang xem tài liệu "Giáo trình Bài mở đầu - Bài 9: Unix IPC Interprocess Communication - Ngô Duy Hòa", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- giao_trinh_bai_mo_dau_bai_9_unix_ipc_interprocess_communicat.pdf
Nội dung text: Giáo trình Bài mở đầu - Bài 9: Unix IPC Interprocess Communication - Ngô Duy Hòa
- Nội dung bài học • Signal. Bài 9. Unix IPC • Pipes. Interprocess Communication • Message Passing. • Shared memory. Ngô Duy Hòa – KHMT - CNTT 1. Signal Các khái niệm cơ bản Các khái niệm cơ bản • Vai trò của Signal: • Signal: - software interrupt: hỗ trợ thực hiện các – Thông báo cho tiến trình biết 1 sự kiện xảy ra. sự kiện không đồng bộ (asynchonous event) – Yêu cầu tiến trình xử lý sự kiện tương ứng. đến tiến trình hoặc một nhóm tiến trình.: •Các loại signal: Trong Linux có 2 loại: – Sinh ra do người dùng nhấn 1 tổ hợp phím (Ctrl+C, – Regular Signal: tập các signal chuẩn trong các hệ Ctrl+Z, ) thống Unix/Linux. Nhận giá trị: 1-31 – Sinh ra do 1 tiến trình này gửi đến tiến trình khác. – Real-time Signal: các signal hỗ trợ làm việc ở chế độ •Về bản chất, signal là 1 số nguyên dương, real-time. Thường được dùng trong các phiên bản tương ứng với chỉ số trong bảng Signal Table. embedded linux. Signal nhận giá trị: 32-63. – Phân biệt: Khi 1 signal được gửi nhiều lần liền nhau: •Mỗi 1 signal đều có 1 chương trình xử lý mặc • real-time signal luôn được đưa vào hàng đợi (queue) và xử định trong kernel. lý nhiều lần, • regular signal chỉ xử lý một lần. 1
- PCB & Signal Table Cơ chế thực hiện • Khi 1 tiến trình nhận được 1 signal: –Giátrị signal sẽ được dùng để xác định vị trí signal trong signal table. –Mỗi phần tử trong bảng sẽ trỏ đến vị trí hàm xử lý signal tương ứng. Theo mặc định thì các hàm này được xây dựng sẵn trong kernel. –Nếu người dùng muốn xử lý theo cách của mình Æ xây dựng hàm xử lý riêng cho signal rồi thông báo cho hệ thống. –Nếu signal bị nằm trong danh sách block Æ tiến trình sẽ không xử lý công việc gì. Shell command & Signal • Trong Shell, có thể dùng hàm kill để gửi 1 signal đến 1 tiến trình thông qua PID của tiến trình. • Cú pháp: $ kill - •Trong đó thường bắt đầu bằng cụm từ: SIG (ví dụ SIGINT). • Trong Shell có thể bỏ qua SIG,chỉ cần ghi các ký tự đứng sau. • Xem danh sách các signal: $ kill -l Ví dụ minh họa non-stop.c 2
- System call & Signal •Nếu pid > 0 Æ gửi signal đến tiến trình có PID. •Nếu pid = 0 Æ gửi signal đến nhóm tiến trình mà tiến trình hiện tại đang nằm trong đó. •Nếu pid = -1 Æ gửi đến tất cả tiến trình ngoại trừ tiến trình init (PID = 1) •Nếu pid < -1 Æ gửi đến các tiến trình trong nhóm tiến trình -PID Ví dụ sử dụng: kill Bẫy tín hiệu Cơ chế thực hiện •Trong một số trường hợp, người dùng không muốn OS xử lý các tín hiệu mặc định Æ cần bắt và xử lý riêng cho signal •Hầu hết các signal đều có thể bắt, ngoại trừ 2 tín hiệu sau: – SIGKILL: tắt tiến trình ngay lập tức. –SIGSTOP: tạm ngưng tiến trình hiện tại. Tiến trình được kích hoạt trở lại nếu được nhận tín hiệu SIGCONT. 3
- Bẫy và xử lý signal Ví dụ với signal • Chú ý: sighandler_t là một con trỏ hàm, nhận tham số truyền vào la 1 biến int. • Có 2 hàm handler có sẵn: – SIG_IGN: signal sẽ không được xử lý. – SIG_DFL: signal được xư lý theo mặc định. Một số các hàm khác Các hàm system call hỗ trợ •Vấn đề tranh chấp xử lý tín hiệu: –Một tín hiệu đang được xử lý thì một tín hiệu tiếp theo được gửi đến. –Về nguyên tắc thì OS lại xử lý tín hiệu mới sau đómới thực hiện với tín hiệu trước. – Æ kết quả xử lý tín hiệu không được đảm bảo. • Cách giải quyết: –Thiết lập mặt nạ các tín hiệu để không cho các tín hiệu xen vào quá trình đang xử lý. Sử dụng sigprocmask Cách sử dụng •Ý tưởng: – Dùng 1 biến thuộc cấu trúc sigset_t để lưu trữ một tập các signal làm mặt nạ. – Gán cơ chế làm việc đối với tập tín hiệu đó: • SIG_BLOCK: tập tín hiệu trong mặt nạ bị khóa. • SIG_UNBLOCK: tập tín hiệu không bị khóa. • SIG_SETMASK: đặt lại mặt nạ mới. – Dùng các hàm: • sigaddset ( ) thêm 1 signal vào mặt nạ. • sigdelset( ) xóa 1 tín hiệu khỏi mặt nạ, 4
- Sử dụng sigaction 2. Pipe (FIFO) Cơ chế làm việc • PIPE là 1 đối tượng của OS, hỗ trợ giao tiếp giữa các tiến trình: – Output của tiến trình này là Input của tiến trình kia. –Thực hiện theo nguyên tắc FIFO. – PIPE_BUF = PAGE_SIZE = 4K •Có2 loại PIPE trong OS: – PIPE không định danh (unnamed pipe) –PIPE có định danh (named pipe). 5
- Unnamed PIPE System call: pipe • Nguyên tắc làm việc: –Hai tiến trình phải cùng dùng chung 1 pipe duy nhất. – 1 pipe được tạo ra sẽ cung cấp cho tiến trình 2 giá trị file descriptor: •Một đóng vai trò ghi dữ liệu vào pipe •Một đóng vai trò đọc dữ liệu từ pipe. –Các tiến trình dùng các file descriptor này để đọc và ghi dữ liệu vào pipe. Ví dụ minh họa Phân tích ý tưởng System call: popen, pclose Ý tưởng •Mục đích: –Nếu chỉ dùng fork(),pipe() cho mô hình trên sẽ tương đối phức tạp. –OS hỗ trợ các hàm popen( ) : để mở 1 pipe theo chế độ (đọc, ghi). – Hàm pclose( ): để đóng pipe. fp = popen(“cmd”, “r”) fp = popen(“cmd”, “w”) 6
- Named PIPE • Nguyên tắc làm việc: – Còn được gọi là FIFO. Được tạo ra bởi hàm mkfifo( ) – Được coi như 1 file trong hệ thống, cho phép các tiến trình mở file để đọc và ghi dữ liệu. – Khác so với file thường: Nó không cho phép tiến trình đồng thời mở FIFO để vừa đọc và ghi dữ liệu.(O_RDONLY hoặc O_WRONLY). Dùng các lệnh trong Shell Các hàm sử dụng server.c client.c Nhận yêu cầu từ Gửi yêu cầu tới Client server Real_mod = Set_mod & ~ Umask 7
- Các khái niệm cơ bản • System IPC cung cấp cho người dùng các công cụ OS hỗ trợ cho việc trao đổi dữ 3. System IPC liệu giữa các tiến trình. – Message Queue – Shared Memory – Semaphore •Các đối tượng này được coi như các tài nguyên hệ thống để các tiến trình có thể truy cập và sử dụng. Quản lý các tài nguyên IPC trong Liệt kê các tài nguyên Shell • Dùng lệnh ipcs để liệt kê các tài nguyên IPC đang có mặt trong hệ thống. –Liệt kê message queue: ipcs –q –Liệt kê semaphore: ipcs –s –Liệt kê shared memory: ipcs –m –Liệt kê tất cả: ipcs –a hoặc ipcs mặc định • Để xóa các tài nguyên: ipcrm – Xóa message queue: ipcrm msg [IPC ID] Chạy bằng – Xóa semaphore: ipcm sem [IPC ID] root – Xóa shared memory: ipcm shm [IPC ID] IPC ID – IPC keys IPC ID – IPC keys •OS hỗ trợ công cụ tạo định danh tài nguyên hệ • Vì các tài nguyên được dùng chung cho nhiều thống dựa trên: tiến trình,nên nó phải có định danh và trong hệ – Tên file (trong File System tên file là duy nhất) thống là duy nhất. –Một số bất kỳ thường để phân biệt giữa các project khác nhau. • Xét tình huống: server & client cùng sử dụng 1 tài nguyên IPC cho công việc riêng của mình,khi đó: – Định danh tài nguyên được tạo ra trong chương trình của cả server & client phải giống nhau. – Định danh tài nguyên được tạo ra không bị trùng với tài nguyên cùng loại có sẵn trong OS. 8