Hệ điều hành đóng vai trò trung gian trong việc giao tiếp giữa người sử dụng và phần cứng máy tính, cung cấp một môi trường cho phép người sử dụng phát triển Em xin chân thành cảm ơn thầ
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN
Trang 2LỜI CẢM ƠN
Nguyên lý hệ điều hành và Lập trình mạng là những kiến thức căn bản là nền tảng
mà mỗi lập trình viên phải hiểu rõ để phục vụ cho những kiến thức cao hơn
Hệ điều hành là tập hợp các chương trình phần mềm chạy trên máy tính, dùng để điều hành, quản lý các thiết bị phần cứng và tài nguyên phần mềm trên máy tính
Hệ điều hành đóng vai trò trung gian trong việc giao tiếp giữa người sử dụng và phần cứng máy tính, cung cấp một môi trường cho phép người sử dụng phát triển
Em xin chân thành cảm ơn thầy cô khoa Công Nghệ Thông Tin đã tạo điều kiện để
em nghiên cứu kĩ hơn những kiến thức này, và đặc biệt là cô Nguyễn Thị Lệ
Quyên đã nhiệt tình theo dõi, hướng dẫn em trong quá trình thực hiện đề tài này
Vì kiến thức còn hạn hẹp, nên không thể tránh khỏi những sai sót trong quá trình làm đề tài, rất mong nhận được sự góp ý của thầy cô để sản phầm được hoàn thiện hơn Em xin chân thành cảm ơn
Sinh viên thực hiện
Dương Văn Trang
Trang 3MỤC LỤC
PHẦN 1: NGUYÊN LÝ HỆ ĐIỀU HÀNH 5
I Cơ Chế Giao Tiếp Giữa Các Tiến Trình 5
1 Tiến Trình 5
2 Tương Tranh Giữa Các Process 5
II Đồng Bộ Hóa 6
1 Mục tiêu của đồng bộ 6
2 Miền găng 6
3 Nguyên tắc đồng bộ 6
4 Các giải thuật đồng bộ 7
4.1 Busy And Waiting 7
a Giải pháp phần mềm 7
b Giải pháp phần cứng 8
4.2 Sleep And Wakeup 9
a Semaphore s là một biến có các thuộc tính sau: 10
III Mô Phỏng Bài Toán Barber Sleeping Problem 12
1 Bài Toán 12
2 Phân tích 12
3 Sơ đồ bài toán 13
4 Triển Khai 14
5 Kết Quả 14
PHẦN 2: LẬP TRÌNH MẠNG 16
I Cơ sở lý thuyết 16
II Phân tích hệ thống 17
1 Mô hình ứng dụng 17
2 Mô hình use case ứng dụng 18
III Triển khai và đánh giá kết quả 18
1 Màn hình giao diện 18
IV Kết luận và hướng phát triển 21
1 Kết quả đạt được 21
Trang 42 Hướng phát triển 21
Trang 5PHẦN 1: NGUYÊN LÝ HỆ ĐIỀU HÀNH
Đề tài: ‘Tìm hiều cơ chế giao tiếp giữa các tiến trình (Inter-process communication IPC)
và đồng bộ hóa mô phỏng bài toán Anh thợ cắt tóc ngủ gật”
I Cơ Chế Giao Tiếp Giữa Các Tiến Trình
1 Tiến Trình
Process trong hệ điều hành Khái niệm: process là một chương trình đang hoạt động (đang chạy, đã được tải lên bộ nhớ chính để hoạt động)
Một chương trình có thể có hai (hay nhiều) process đang chạy, nhưng chúng được coi là hai (hay nhiều) quá trình độc lập với nhau
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
Các process cần phải giao tiếp với nhau vì:
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 thuận tiện trong chạy nhiều tác vụ cùng một lúc
2 Tương Tranh Giữa Các Process
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
Trang 6IPC 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
Để 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 Để giải quyết vấn đề vùng chia sẻ chung không bị ghi đề lên nhau hướng giải quyết của vấn đề này là đồng bộ hóa (synchronising)
II Đồng Bộ Hóa
1 Mục tiêu của đồng bộ
Đảm bảo truy xuất độc quyền
Đảm bảo cơ chế phối hợp giữa các tiến trình
2 Miền găng
Đoạn code trong các tiến trình đồng thời, có tác động đến các tài nguyên có thể trở thành tài nguyên găng được gọi là đoạn găng hay miền găng Tức là, các đoạn code trong các chường trình dùng để truy cập đến các vùng nhớ chia sẻ, các tập tin chia sẻ được gọi là các đoạn găng
Để hạn chế các lỗi có thể xảy ra do sử dụng tài nguyên găng, hệ điều hành phải điều khiển các tiến trình sao cho, tại một thời điểm chỉ có một tiến trình nằm trong đoạn găng, nếu có nhiều tiến trình cùng muốn vào( thực hiện) đoạn găng thì chỉ có một tiến trình được vào, các tiến trình khác phải chờ, một tiến trình khi ra khỏi( kết thúc) đoạn găng phải báo cho hệ điều hành và/ hoặc các tiến trình khác biết để các tiến trình này vào đoạn găng,vv Các công tác điều khiến tiến trình được thực hiện đoạn găng của
hệ điều hành được gọi là điều độ tiến trình qua đoạn găng Để công tác điều
độ tiến trình qua đoạn găng được thành công, thì cần phải có sự phối hợp giữa vi xử lí, hệ điều hành và người lập trình Vi xử lí đưa các chỉ thị, hệ điều hành cung cấp các công cụ để người lập trình cây dựng các sơ đồ điều
độ hợp lý, để đảm bảo sự độc quyền trong việc sử dụng tài nguyên găng của tiến trình
3 Nguyên tắc đồng bộ
Tại một thời điểm chỉ có một tiến trình trong miền găng
Trang 7 Dùng biến lock: các tiến trình chia sẻ một biến dùng chung lock
- Một tiến trình muốn vào miền găng phải kiểm tra giá trị của biến lock
- Nếu lock = 0, tiến trình đặt lại giá trị cho lock = 1 và đi vào miền găng
- Nếu lock = 1, tiến trình phải chờ đến khi lock = 0
while (TRUE){ while (lock == 1); // wait
lock = 1;
critical-section ();
lock = 0;
Noncritical-section (); }
Kiểm tra luân phiên: Hai tiến trình sử dụng chung biến turn
- Khởi tạo turn = 0
- Nếu turn = 0, tiến trình A được vào miền găng
- Nếu turn = 1, tiến trình A đi vào một vòng lặp chờ đến khi turn nhận giá trị 0
- Khi tiến trình A rời khỏi miền găng, nó đặt turn = 1 cho phép tiến trình B đi vào miền găng
Trang 8
Giải pháp của Peterson: Các tiến trình chia sẻ hai biến chung
- int turn; // đến lượt tiến trình nào
b Giải pháp phần cứng
Cấm ngắt: cho phép tiến trình cấm tất cả các ngắt trước khi vào
thống có nhiều bộ xử lý, lệnh cấm ngắt chỉ có tác dụng trên bộ xử
lý đang xử lý tiến trình, còn các tiến trình hoạt động trên các bộ
xử lý khác vẫn có thể truy xuất đến miền găng
while (TRUE) {int j = 1-i; // j là tiến trình còn lại interesse[i]= TRUE;
Trang 9Test-and-Setlock(boolean
target){
Test-and-Setlock = target; target = TRUE;
là FALSE Tiến trình phải kiểm tra giá trị của biến lock trước khi vào miền găng, nếu lock = FALSE, tiến trình có thể vào miền găng
Các giải pháp “busy waiting” buộc tiến trình phải liên tục kiểm tra điều kiện để phát hiện thời điểm thích hợp được vào miền găng Việc kiểm tra tiêu thụ rất nhiều thời gian sử dụng CPU, tiến trình đang chờ vẫn chiếm dụng CPU Xu hướng giải quyết vấn đề đồng bộ hóa là nên tránh các giải pháp “busy waiting”
4.2 Sleep And Wakeup
Một tiến trình chưa đủ điều kiện vào miền găng sẽ chuyển sang trạng thái blocked, từ bỏ quyền sử dụng CPU
Một tiến trình chưa đủ điều kiện vào miền găng, nó gọi SLEEP
để tự block đến khi có một tiến trình khác gọi WAKEUP để giải phóng cho nó
Một tiến trình gọi WAKEUP khi ra khỏi miền găng để đánh thức một tiến trình đang chờ
Trang 10a Semaphore s là một biến có các thuộc tính sau:
Một giá trị nguyên dương e(s)
Một hàng đợi f(s) lưu danh sách các tiến trình đang bị khóa (chờ) trên semaphore s
Hai thao tác được định nghĩa trên semaphore:
Down(s): giảm s đi 1 đơn vị nếu e(s) > 0, và tiếp tục xử lý Ngược lại, nếu e(s) ≤ 0, tiến trình phải chờ đến khi e(s) >0
Up(s): s lên 1 đơn vị Nếu có một hoặc nhiều tiến trình đang chờ trên semaphore s, bị khóa bởi thao tác Down, thì hệ thống
sẽ chọn một trong các tiến trình này để kết thúc thao tác Down và cho tiếp tục xử lý
Có thể dùng semaphore để giải quyết vấn đề truy xuất độc quyền hay tổ chức phối hợp giữa các tiến trình
int busy;//busy=1 miền găng đang bị chiếm int blocked;// số tiến trình đang bị khóa while (TRUE){
if (busy){
blocked = blocked + 1;
sleep();
}else busy = 1;
}
Trang 11status (Q) = ready;
enter(Q,ready-list);
}
b Monitor là đối tượng được cung cấp sẵn bởi hệ thống
Monitor là một cấu trúc đặc biệt bao gồm các thủ tục, các biến và cấu trúc dữ liệu có các thuộc tính sau :
- Trong monitor, ta có thể định nghĩa nhiều biến điều kiện Biến điều kiện chỉ có tên, không có kiểu và không có giá trị nên ta không dùng nó như biến bình thường Chỉ có 2 tác vụ định sẵn có thể truy xuất biến điều kiện :
- hàm wait(cond) : bắt process ngủ chờ trên biến điều kiện cond
- hàm signal(cond) : đánh thức các process đang ngủ chờ trên biến cond
- Về mặt điều khiển, Monitor chỉ cho phép tối đa 1 process được vào thi hành 1 tác vụ nào đó của Monitor tại từng thời điểm Nhờ tính chất này,
ta dễ dàng giải quyết việc loại trừ tương hỗ giữa các process khi chúng truy xuất đồng thời 1 tài nguyên dùng chung nào đó bằng cách đặt mỗi đoạn CS vào 1 tác vụ riêng và đặt tất cả các tác vụ này trong một Monitor nào đó
c Message Passing giải pháp này dựa trên cơ sở trao đổi thông điệp với hai primitive Send
và Receive để thực hiện sự đồng bộ hóa:
Send(destination, message): gởi một thông điệp đến một tiến trình hay gởi vào hộp thư
Receive(source,message): nhận một thông điệp thừ một tiến trình hay từ bất kỳ một tiến trình nào, tiến trình gọi sẽ chờ nếu không có thông điệp nào để nhận
Có nhiều cách thức để thực hiện việc truy xuất độc quyền bằng cơ chế trao đổi thông điệp Đây là một mô hình đơn giản: một tiến trình kiểm soát việc sử dụng tài nguyên và nhiều tiến trình khác yêu cầu tài nguyên này Tiến trình có yêu cầu tài nguyên sẽ gởi một thông điệp đến tiến trình kiểm soát và sau đó chuyển sang trạng thái blocked cho đến khi
Trang 12nhận được một thông điệp chấp nhận cho truy xuất từ tiến trình kiểm soát tài nguyên.Khi sử dụng xong tài nguyên , tiến trình gởi một thông điệp khác đến tiến trình kiểm soát để báo kết thúc truy xuất Về phần tiến trình kiểm soát , khi nhận được thông điệp yêu cầu tài nguyên, nó
sẽ chờ đến khi tài nguyên sẵn sàng để cấp phát thì gởi một thông điệp đến tiến trình đang bị khóa trên tài nguyên đó để đánh thức tiến trình này
while (TRUE) { Send(process controler, request message);
Receive(process controler, accept message);
critical-section ();
Send(process controler, end message);
Noncritical-section ();
} Các primitive semaphore và monitor có thể giải quyết được vấn đề truy xuất độc quyền trên các máy tính có một hoặc nhiều bộ xử lý chia sẻ một vùng nhớ chung Nhưng các primitive không hữu dụng trong các hệ thống phân tán, khi mà mỗi bộ xử lý sỡ hữu một bộ nhớ riêng biệt và liên lạc thông qua mạng Trong những hệ thống phân tán như thế, cơ chế trao đổi thông điệp tỏ ra hữu hiệu và được dùng để giải quyết bài toán đồng bộ hóa
III Mô Phỏng Bài Toán Barber Sleeping Problem
1 Bài Toán
Một tiệm hớt tóc có 1 phòng đợi n ghế, và phòng cắt tóc với 1 ghế cắt tóc Nếu không các khách thì người thợ đi ngủ Nếu một khách mới vào và không còn ghế trống thì người khách rời tiệm Nếu người thợ đang cắt tóc,
và vẫn còn ghế trống thì khách hàng chọn 1 ghế ngồi đợi Nếu người thợ ngủ, thì khách hàng đánh thức anh ta Viết chương trình để đồng bộ khách hàng và thợ cắt tóc
2 Phân tích
Tiệm có lúc vắng, lúc nhiều khách Thợ nên ngủ khi không có khách
Nếu được đánh thức, thợ sẽ mời từng khách đến ghế cắt và cắt tóc cho khách cho đến khi hết khách, thợ lại tiếp tục ngủ
Khi đến tiệm, nếu thấy còn ghế chờ, khách sẽ ngồi vào 1 ghế, đánh
Trang 13thức thợ rồi ngủ ngay Khi nào thợ đánh thức và mời đến ghế cắt thì khách thức dậy và đến ngồi vào ghế cắt rồi ngủ chờ thợ cắt xong, trả tiền và ra về
(Hình 1 minh họa Sleeping Barber Problem)
3 Sơ đồ bài toán
(Hình 2 Mô hình bài toán thợ cắt tóc)
Trang 144 Triển Khai
Class Barber.java class tạo các tiến trình của thợ cắt tóc
Class Customer.java class tạo các tiến trình của customer
Class Display.java: class xây dựng giao diện
Class App.java: class tạo đối tượng chạy chương trình
5 Kết Quả
(Hình 3 Giao diện chương trình )
Trang 15IV Kết luận và hướng phát triển
2 Hướng phát triển
Giải quyết bài toán Sleeping Barber Problem bằng các giải pháp đồng bộ khác
Trang 16PHẦN 2: LẬP TRÌNH MẠNG
Đề tài: Xây dựng ứng dụng chat đa phương tiện
Giới thiệu: Ngày nay, những ứng dụng realtime như mạng xã hội, chat, game online,… đang ngày càng phát triển thì công nghệ realtime luôn được ưa chuộng hơn bao giờ hết Một trong những công nghệ phục vụ realtime mạnh mẽ nhất trong
đó phải kể đến NodeJs và Socket.io Trong phạm vi đồ án em đã xây dựng một ứng dụng chat realtime nhỏ trên Android
V Cơ sở lý thuyết
Node.js Socket.io NodeJS là ngôn ngữ lập trình mã nguồn mở, ngôn ngữ lập trình phía server, bắt đầu được phát triển từ năm 2009, là nền tảng cho việc xây dựng các ứng dụng web Mặc dù NodeJS không phải là một JavaScript framework nhưng hầu hết các module của nó được viết bằng JavaScript
Hoạt động với một luồng duy nhất và có khả năng asynchronous (bất đồng bộ)
(Hình 4 Mô hình hoạt động của Server Node.js)
Socket.io cung cấp cho lập trình viên các đặc trưng như event, room và tự động phục hồi lại kết nối
Khi client muốn kết nối tới Socket.io server, nó sẽ gửi cho server một
“handshake HTTP request” Server sẽ phân tích request đó với những thông tin cần thiết trong suốt quá trình kết nối Nó sẽ tìm cấu hình của
middleware mà đã được đăng ký với server và thực thi chúng trước khi đưa
ra sự kiện kết nối Khi kết nối thành công thì connection event listener được
Trang 17thực thi, tạo ra một instance mới của socket có thể coi như định danh của client mà mỗi một client kết nối tới sẽ có 1 định danh
(Hình 5 Mô hình chat realtime sử dụng socket.io)
Trang 182 Mô hình use case ứng dụng
(Hình 7 Sơ đồ usecase ứng dụng)
Các chức năng của ứng dụng:
Gửi tin nhắn dạng văn bản, hình ảnh, âm thanh
Người dùng có thể biết tên user người gửi tin nhắn đến, và trạng thái đang
gõ bàn phím
Tất cả dữ liệu gửi lên server và gửi về client đều ở dạng JSONObject Với dữ liệu dạng hình ảnh, máy client sẻ chuyển dữ liệu ảnh sang dạng byte sau đó đóng gói vào một JSONObject rồi gửi lên server Máy nhận sẻ giải
mã ngược dạng byte sang dạng bitmap và hiển thị ra màn hình
Với dữ liệu âm thanh máy gửi sẻ chuyển dữ liệu mp3 sang byte trước khi gửi lên server Máy nhận sẻ giải mã sang dạng mp3 rồi phát lên cho người dùng
VII Triển khai và đánh giá kết quả
1 Màn hình giao diện
Trang 19Màn hình login, có thể đăng nhập với một username bất kì
(Hình 8 Giao diện Login)
Trang 20Màn hình sau khi Login
(Hình 9 Giao diện chat)
Sau khi gửi ảnh
(Hình 10 Kết quả gửi ảnh)
Trang 21Giao diện nhập tin nhắn âm thanh
Sau khi người gửi,gửi tin nhắn âm thanh, bên máy nhận lập tức sẻ phát âm thanh ra
(Hình 11 Giao diện gửi âm thanh)
VIII Kết luận và hướng phát triển
gõ tin nhắn, biết được tên username gửi tin nhắn
Tuy nhiên còn nhiều mặt hạn chế như:
- Ứng dụng chưa có chức năng gửi emotion, ảnh động gif, gửi nhận video
- Giao điện chưa bắt mắt, sơ sài…
2 Hướng phát triển