Tải bản đầy đủ (.ppt) (17 trang)

Đồ án hệ điều hành GIAO TIẾP GIỮA CÁC TIẾN TRÌNH BẰNG SHARED MEMORY

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 (391.13 KB, 17 trang )

LOGO

Trường Đại Học Bách Khoa
Đà Nẵng-Khoa CNTT

Đồ Án Hệ Điều Hành
Đề Tài: GIAO TIẾP GIỮA CÁC TIẾN TRÌNH
BẰNG SHARED MEMORY

Giáo viên Hướng Dẫn: Mai Văn Hà
SV thực hiện
: Sầm Văn Tài
Lớp
:07T1


Company Logo

Nội Dung Chính
1

Phần 1 :Tổng Quan Đề Tài

2

Phần 2:Cơ Sở lý Thuyết

3
4

Phần 3 :Cài Đặt Chương Trình



Phần 4: Kết Quả Và Đánh Giá


Company Logo

Phần I:Tổng Quan Đề Tài
 Bối Cảnh
 Vấn đề đặt ra :

 Tìm hiểu về tiến trình throng Linux.
 Cơ chế giao tiếp giữa các tiến trình bằng
vùng nhớ chung.
 Viết chương trình minh họa.
 Mục đích đề tài :

 Nghiên cứu lý thuyết.
 Kết quả mong muốn


Company Logo

Phần II:Cơ Sở Lý Thuyết





Tổng quan về hệ điều hành Linux.
Lịch sử ra đời.

Các chức năng của Linux.
Tiến trình
Khái niệm tiến trình.
Các trạng thái của tiến trình.
Cấu trúc của tiến trình.
Các kiểu giao tiếp giữa các tiến trình.
Shared memory và sự cần thiết của shared memory
trong giao tiếp giữa các tiến trình


Company Logo

Tạo phân đoạn nhớ chung
Một tiến trình cấp phát vùng nhớ chung bằng cách sử dụng hàm
shmget().
Cú pháp:
#include<sys/ipc.h>
#include<sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
Hàm shmget() sẽ tạo ra một vùng nhớ chia sẻ mới hoặc truy cập
đến một vùng nhớ chia sẻ nếu nó đã tồn tại


Company Logo

Giá trị trả về của hàm

Nếu thành công hàm shmget() trả về định danh ID của phân
đoạn để truy xuất đến vùng nhớ chung bởi các hàm tiếp theo
như shmat(), shmctl(),…. Nếu các tiến trình khác nhau gọi

hàm shmget() tạo phân đoạn nhớ chung với cùng khóa ,
chúng sẽ tham chiếu đến cùng một trang nhớ chung với
cùng một định danh id do shmget() trả về.
Nếu không thành công hàm sẽ trả về giá trị -1.


Company Logo

Kết gán và tháo rời
Kết gán

Sau khi đã tạo và phân bổ trang nhớ chung của hệ
thống, cần phải gọi hàm shmat() để kết gán vùng nhớ chung này
vào không gian địa chỉ của tiến trình hay hàm shmat() sẽ đưa
trang nhớ của hệ thống vào bảng quản lí trang nhớ của tiến
trình .Các tiến trình con được tạo bằng hàm fork() kế thừa các
phân đoạn nhớ chung đã được kết gán với tiến trình cha. Các tiến
trình con này có thể tháo bỏ phân đoạn nhớ chung này nếu chúng
có nhu cầu.
a. Cú pháp
#include<sys/shm.h>
#include<sys/types.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);


Company Logo

Kết gán và tháo rời
Các tham số
- shmid là định danh id của vùng nhớ chung do shmget() trả về.

- shmaddr là con trỏ đến địa chỉ nơi bắt đầu kết gán. Nếu bạn
đặt giá trị NULL hàm sẽ thực hiện kết gán vùng nhớ tại nơi bắt
đầu.Thường bạn rất khó tùy biến vùng địa chỉ kết gán khác cho nên
cách tốt nhất là hãy để hệ thống kết gán từ nơi bắt đầu của vùng
nhớ chỉ định do shmget() thiết lập trước đó.
Ngược lại nếu shmaddr không phải là con trỏ NULL , địa
chỉ trả về phụ thuộc vào giá trị SHM_RND được người gọi chỉ định
cho đối số shmflag.
- shmflg : đối số này do người lập trình chỉ định, là cờ cho phép
cấp quyền truy cập ,quyền đọc/ghi trên vùng nhớ chia sẻ đã được
kết gán.. Nó bao gồm các giá trị sau:
+ 0: không có bit cờ nào được chỉ định
+ SHM_RND: chỉ định rằng địa chỉ được xác định cho tham
số thứ hai nên được làm tròn xuống thành bội số của kích thước
trang. Nếu bạn không xác định cờ này thì bạn phải thực hiện canh
trang đối số thứ hai cho hàm shmat().


Company Logo

Kết gán và tháo rời
+ SHM_RDONLY: Theo mặc định thì vùng nhớ chia sẻ được kết gán
cho cả đọc và ghi bởi tiến trình đang gọi nếu tiến trình cho phép đọc và
ghi vào vùng nhớ. Khi giá trị SHM_RDONLY được chỉ định thì phân
đoạn nhớ chung này chỉ được đọc chứ không được ghi và tiến trình
Add Yourvậy
Title,cờ truy cập SHM_RDONLY
phải cho phép đọc vào đoạn nhớ.Như
được dùng khi một chương trình cần truy cập đến vùng nhớ chia sẻ với
mục đích dò tìm chứ không thay đổi nó. Khi cờ SHM_RDONLY cung

cấp , nếu chương trình ghi đè lên vùng nhớ chia sẻ thì trình bẫy lỗi sẽ
làm cho chương trình đó bị bãi bỏ, do đó duy trì tính toàn vẹn của vùng
nhớ chia sẻ. Nếu không có tùy chọn này thì phân đoạn vùng nhớ dùng
chung sẽ được kết gán trong chế độ đọc và ghi.
Trong trường hợp hàm shmat() gọi thành công, hệ thống cập
nhật những thành phần của cấu trúc shmid_ds kết nối vùng nhớ chia
sẻ như sau:
- shm_attime : nhận ngày hiện hành.
- shm_lpid
: nhận pid của tiến trình hiện thời
- shm_nattach: được tăng lên một giá trị


Company Logo

Tháo rời
Để tiến hành tháo bỏ vùng nhớ dùng chung ra khỏi tiến trình ta sử dụng
hàm shmdt(). Hàm này sẽ giải phóng phân đoạn nhớ chung trong bảng
quản lý trang nhớ của tiến trình. Sau khi tháo bỏ kết gán, tiến trình của bạn
không thể truy xuất đến vùng nhớ chung nữa. Bởi vì vùng nhớ này không
còn gắn với không gian địa chỉ của tiến trình. Tuy nhiên, vùng nhớ vật lý
thực sự do hệ thống nắm giữ vẫn tồn tại và bạn có thể gọi hàm shmat() để
kết gán lại.
Hàm này được sử dụng khi một tiến trình không còn truy cập đến
vùng nhớ dùng chung nữa.
Cú pháp
#include<sys/types.h>
#include<sys/shm.h>
Int shmdt(const void*shm_addr)



Company Logo

Chép dữ liệu vào vùng nhớ dùng
chung

 Sau khi nhớ chung của hệ thống vào vùng nhớ của tiến trình. Bạn
đọc ghi trên vùng nhớ này bằng cách chuyển con trỏ dữ liệu đến địa
chỉ vùng nhớ do shmat() trả về
Giả sử ta ghi một mảng cấu trúc vào vùng nhớ chung này thì mô hình
sau sẽ mô tả được cách bố trí dữ liệu:

shm_addr

*dem

sv[0]


Company Logo

Hủy vùng nhớ dùng chung
Khi tiến trình không cần sử dụng vùng nhớ chung nữa bạn nên giải phóng
nó. Nhằm tránh sự xâm phạm đến giới hạn hệ thống trên tổng số các phân
đoạn nhớ chung. Công việc này được thực hiện bởi hàm shmctl(). Khác
với hàm tháo kết gán shmdt() chỉ bỏ ánh xạ logic giữa vùng nhớ vật lý và
không gian nhớ của tiến trình.Hàm shmctl() với đối số IPC_RMID sẽ thật
sự giải phóng vùng nhớ vật lý toàn cục trả lại tài nguyên cho hệ thống. Mỗi
khi vùng nhớ được giải phóng thì không còn tiến trình nào có thể đọc ghi
trên vùng nhớ này được nữa.

Vùng nhớ chung chỉ được giải phóng khi tiến trình sau cùng có kết
gán với nó tháo bỏ kết gán.
Không riêng gì tiến trình đã tạo ra vùng nhớ chung, bất kì tiến trình
nào có quyền ghi trên vùng nhớ chung đều có khả năng xóa nó.
Cú pháp
#include<sys/ipc.h>
#include<sys/shm.h>
int shmctl(int shmid,int cmd,struct shmid ds*buf);


Company Logo

Vấn Đề Đồng Bộ Tiến Trình

Là phương pháp nhanh nhất trao đổi giữa các tiến trình nhưng
vấn đề đặt ra là đồng bộ giữa 2 hay nhiều tiến trình trong việc
đọc ghi dữ liệu chung tại vùng nhớ chung chia sẻ khi có 2 hay
nhiều tiến trình cùng truy xuất dễ xảy ra tranh chấp và không
thể giao tiếp giữa 2 tiến trình cùng cấp.

ur
Yo

ur
Yo

t
Tex

t

Tex

t
Tex
ur
Yo


Company Logo

Giải quyết tranh chấp sử dụng cơ chế
Semaphone
Đối tượng semaphore khởi đầu mang giá trị
dương, khi một tiến trình yêu cầu sử dụng tài
nguyên thì nó sẽ thông báo với semaphore.
Semaphore sẽ kiểm tra giá trị của mình, nếu còn >
0 sẽ tự động giảm giá trị đi 1 và cho phép tiến trình
sử dụng tài nguyên. Nếu giá trị semaphore <= 0 hệ
thống sẽ tạm dừng tiến trình (đặt tiến trình vào
trạng thái chờ). Khi tiến trình đã sử dụng xong tài
nguyên nó sẽ trả lại quyền sử dụng tài nguyên cho
tiến trình khác.


Company Logo

Kết Quả Chạy Chương Trình


Company Logo


Nhận xét
1.Những kết quả đạt được:
•Nắm được các kiến thức cơ bản về cơ chế giao tiếp giữa
các tiến trình bằng Share memory.
•Viết và chạy được chương trình với bài toán đơn giản +, -, (,
).
2.Hướng phát triển:
Đồ án chỉ dừng lại trong phạm vi tìm hiểu sự giao tiếp giữa
các tiến trình bằng cơ chế Share memory và viết chương trình
mô phỏng đơn giản.
Share memory là chỉ một trong rất nhiều cơ chế giao tiếp
giữa các tiến trình của Linux. Ta có thể phát triển từ Share
memory để có thể giải quyết bài toán này trên các kiểu giao tiếp
khác như : Tín hiệu (Signal), Pipe, trao đổi thông điệp
(Message), Sockets.


LOGO



×