Tải bản đầy đủ (.pdf) (8 trang)

Bài giảng Hệ điều hành Unix: Chương 9 - Ngô Duy Hòa

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (630.67 KB, 8 trang )

Nội dung bài học
Bài 9. Unix IPC
Interprocess Communication






Signal.
Pipes.
Message Passing.
Shared memory.

Ngơ Duy Hòa – KHMT - CNTT

1. Signal

Các khái niệm cơ bản
• Signal: - software interrupt: hỗ trợ thực hiện các
sự kiện khơng đồng bộ (asynchonous event)
đến tiến trình hoặc một nhóm tiến trình.:
– Sinh ra do người dùng nhấn 1 tổ hợp phím (Ctrl+C,
Ctrl+Z,..)
– Sinh ra do 1 tiến trình này gửi đến tiến trình khác.

• Về bản chất, signal là 1 số nguyên dương,
tương ứng với chỉ số trong bảng Signal Table.
• Mỗi 1 signal đều có 1 chương trình xử lý mặc
định trong kernel.


Các khái niệm cơ bản
• Vai trị của Signal:
– Thơng báo cho tiến trình biết 1 sự kiện xảy ra.
– Yêu cầu tiến trình xử lý sự kiện tương ứng.

• Các loại signal: Trong Linux có 2 loại:
– Regular Signal: tập các signal chuẩn trong các hệ
thống Unix/Linux. Nhận giá trị: 1-31
– Real-time Signal: các signal hỗ trợ làm việc ở chế độ
real-time. Thường được dùng trong các phiên bản
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:
• real-time signal ln được đưa vào hàng đợi (queue) và xử
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 -<signal> <PID>
• Trong đó <signal> 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

ã Nu pid > 0 ặ gi 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 ti ang nm trong ú.
ã Nu pid = -1 ặ gửi đến tất cả tiến trình ngoại trừ tiến
trình init (PID = 1)
ã Nu pid < -1 ặ gi 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 mc
nh ặ cn bt 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

System call: popen, pclose

Phân tích ý tưởng

Ý 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
• Ngun 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

server.c
Nhận yêu cầu từ
Client

Các hàm sử dụng

client.c
Gửi yêu cầu tới
server

Real_mod = Set_mod & ~ Umask

7


Các khái niệm cơ bản

3. System IPC

• System IPC cung cấp cho người dùng các
công cụ OS hỗ trợ cho việc trao đổi dữ
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
ngun 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
Shell

Liệt kê các tài nguyên

• 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 ngun: ipcrm
Chạy bằng

– Xóa message queue: ipcrm msg [IPC ID]
– Xóa semaphore: ipcm sem [IPC ID]
– Xóa shared memory: ipcm shm [IPC ID]

IPC ID – IPC keys
• Vì các tài ngun được dùng chung cho nhiều
tiến trình,nên nó phải có định danh và trong hệ
thống là duy nhất.
• 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
đó:

root

IPC ID – IPC keys
• OS hỗ trợ cơng cụ tạo định danh tài nguyên hệ
thống dựa trên:
– Tên file (trong File System tên file là duy nhất)
– Một số bất kỳ thường để phân biệt giữa các project
khác nhau.

– Đị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




×