1 TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO TIỂU LUẬN NHẬP MÔN HỆ ĐIỀU HÀNH HỌC KÌ II Nhóm 04 Tổ 02 Họ Tên SV Huỳnh Minh Ngọc MSSV 52100651 Niên học 2021 2022 2 LỜI CẢM ƠN Đầu tiên[.]
Hệ thống nhúng (Embedded Operating Systems)
Định nghĩa
- Hệ thống nhúng hầu hết luôn chạy trên hệ điều hành thời gian thực.
Chúng được áp dụng khi có yêu cầu nghiêm ngặt về thời gian cho hoạt động của bộ xử lý hoặc luồng dữ liệu, do đó, chúng chỉ được sử dụng cho một thiết bị điều khiển trong các ứng dụng chuyên dụng cụ thể.
- Một định nghĩa khác của Stankovic:
Hệ thời gian thực là một hệ thống mà độ chính xác không chỉ dựa vào kết quả logic mà còn phụ thuộc vào thời điểm đưa ra kết quả Điều này nhấn mạnh tầm quan trọng của hệ thời gian thực trong việc tính toán thời gian và thời điểm phản hồi của hệ thống.
- Để nhấn mạnh quan điểm này, tác giả Robert Oshana cũng nhắc đến:
“Hãy luôn ghi nhớ điều này khi đề cập đến hệ thời gian thực, rằng: đưa ra quá muộn đáp án đúng thì cũng là kết quả sai.”
Cách thức hoạt động
Các cảm biến sẽ truyền dữ liệu đến máy tính, nơi mà dữ liệu này được phân tích và máy tính có khả năng điều chỉnh các điều khiển để thay đổi các đầu vào từ cảm biến.
- Hệ thống thời gian thực có các giới hạn thời gian cố định và được xác định rõ ràng:
Tính kịp thời: quá trình xử lí phải được thực hiện đúng trong khoảng thời gian đã ràng buộc.
Tính chính xác: nó chỉ hoạt động đúng nếu nó trả về đúng trong giới hạn thời gian ràng buộc, ngược lại sẽ thất bại.
Máy tính thời gian thực khác biệt so với các loại máy tính truyền thống ở chỗ chúng yêu cầu thực hiện các tác vụ chính xác trong khoảng thời gian cố định, trong khi các máy tính trước đây không bắt buộc phải phản hồi nhanh chóng.
Ví dụ: Các ứng dụng như Word, Excel sẽ mất khoảng thời gian thực thi và hiển thị khác nhau ở mỗi lần được kích hoạt.
Hình 1 1: Hệ thống thời gian thực cứng và thời gian thực mềm
- Hệ thống xử lí thời gian thực cứng (Hard real-time): các công việc tuyệt đối phải được hoàn thành đúng, chính xác trong thời gian quy định.
Ứng dụng: trong các lĩnh vực quan sự, y tế, ngành công nghiệp, hàng không, robotics, hệ thống phun nhiên liệu cho động cơ – ô tô,…
Phẫu thuật robot từ xa yêu cầu sự đồng bộ hoàn hảo giữa hệ thống và hành động của bác sĩ, vì nếu hệ thống hoạt động quá nhanh hoặc quá chậm, có thể gây nguy hiểm đến tính mạng bệnh nhân Tương tự, các hệ thống xe hơi không người lái dựa trên nền tảng QNX cũng cần đảm bảo tính chính xác và độ tin cậy cao Trong lĩnh vực phóng vệ tinh, việc vòi phun của tên lửa không hoạt động đúng thời gian quy định có thể dẫn đến thất bại và gây thiệt hại tài chính nghiêm trọng.
Hệ thống xử lý thời gian thực mềm (Soft real-time) cho phép thời gian thực thi có thể bị vi phạm trong những khoảng nhỏ không thường xuyên, miễn là điều này không gây ra thiệt hại nào.
Ứng dụng: hệ thống âm thanh kĩ thuật số, điện thoại,…
Khi mở ổ CD/DVD của máy tính cá nhân (PC) có sự chậm trễ nhưng hoàn toàn không gay ra thiệt hại nào.
Câu 2: Trình bày về Thread usage (Web server) (đọc và giải thích hình 2.8) Trả Lời:
I Máy chủ web (Web server)
Web server là một máy chủ lớn kết nối với mạng máy tính, quản lý và lưu trữ dữ liệu với tốc độ cao Mỗi máy chủ có địa chỉ IP riêng và có khả năng đọc nhiều ngôn ngữ như HTML, HTM, và các loại file khác Với dung lượng lớn, máy chủ đảm bảo vận hành hiệu quả kho dữ liệu trên internet.
Cổng giao tiếp riêng biệt của mỗi máy chủ giúp hệ thống máy tính hoạt động hiệu quả hơn Để cung cấp dữ liệu liên tục cho mạng lưới máy tính, máy chủ cần đảm bảo hoạt động ổn định.
Máy chủ web theo luồng xử lý từng yêu cầu bằng cách tạo ra một luồng mới cho mỗi yêu cầu, khác với phương pháp truyền thống là sử dụng một quy trình mới cho mỗi yêu cầu.
Máy chủ web hoạt động với một hàng đợi cho các yêu cầu HTTP và một nhóm các luồng để xử lý chúng Khi nhận được yêu cầu, máy chủ sẽ lấy yêu cầu đầu tiên từ hàng đợi và chỉ định một luồng từ nhóm để thực hiện Các yêu cầu sẽ được xếp hàng trong hàng đợi nếu chúng đến nhanh hơn khả năng xử lý của các luồng hoặc khi nhóm đã hết luồng.
Ví dụ: Người dùng truy cập vào website tdtu.edu.vn Khi đó, server sẽ cung cấp tất cả dữ liệu về website đó thông qua lệnh giao tiếp.
Một tiến trình có khả năng tạo ra nhiều luồng, mỗi luồng thực hiện chức năng riêng biệt và có thể thực thi đồng thời thông qua việc chia sẻ CPU Các luồng trong cùng một tiến trình chia sẻ không gian địa chỉ nhưng có con trỏ lệnh, tập các thanh ghi và stack riêng biệt Ngoài ra, một luồng cũng có thể tạo ra các tiến trình con và nhận các trạng thái khác nhau giống như một tiến trình.
3 Máy chủ đơn luồng và máy chủ đa luồng (Single threaded web and multithreaded server web)
- Máy chủ đơn luồng: là loại máy chủ đơn giản nhất, chỉ sinh ra một luồng duy nhất nên khi đó:
Chỉ xử lý được một yêu cầu tại một thời điểm.
Các yêu cầu chỉ có thể được xử lý tuần tự.
Các yêu cầu có thể được xử lý bởi các tiến trình khác nhau và được gửi đến các server khác nhau.
Hệ thống không đảm bảo tính trong suốt khi các yêu cầu gửi lên chưa được xử lý kịp thời và đang phải chờ trong hàng đợi, điều này khiến người dùng không cảm nhận được sự minh bạch của hệ thống.
Là vòng lặp để đọc các yêu cầu và chuyển chúng đến Dispatcher để xử lý.
Máy chủ đa luồng là loại máy chủ có khả năng xử lý nhiều luồng đồng thời, với mỗi luồng đảm nhận việc xử lý một yêu cầu riêng biệt từ các máy khách Khi có yêu cầu mới, máy chủ sẽ khởi động một luồng mới để đáp ứng kịp thời.
Hình 2 2: Hoạt động của multithreaded server web
Việc áp dụng cơ chế đa luồng trong hệ thống cho phép trao đổi thông tin giữa client và server diễn ra song song với các công việc xử lý khác, từ đó nâng cao tốc độ và hiệu suất của hệ thống.
4 Đọc và giải thích hình
Web server process: Tiến trình máy chủ web
Luồng điều phối là một luồng chuyên dụng có nhiệm vụ quản lý và phân phối các yêu cầu công việc Khi nhận được yêu cầu, luồng này sẽ phân tích và chuyển tiếp đến các luồng thích hợp để xử lý hiệu quả.
Luồng làm việc, hay còn gọi là luồng người xử lý, là một loại thread được lập trình viên tạo ra để thực hiện các công việc không liên quan đến giao diện của chương trình.
Network connection: các yêu cầu công việc từ mạng gửi vào
Bộ nhớ đệm trang web (web page cache) là một hệ thống lưu trữ tạm thời các nội dung tĩnh thường xuyên được truy cập Chức năng của nó là giúp tăng tốc độ truy cập cho các lần truy cập sau bằng cách cung cấp dữ liệu nhanh hơn mà không cần phải truy xuất từ bộ nhớ chính.
Hệ điều hành thời gian thực (Real-time Operating Systems)
Phân loại
Hình 1 1: Hệ thống thời gian thực cứng và thời gian thực mềm
- Hệ thống xử lí thời gian thực cứng (Hard real-time): các công việc tuyệt đối phải được hoàn thành đúng, chính xác trong thời gian quy định.
Ứng dụng: trong các lĩnh vực quan sự, y tế, ngành công nghiệp, hàng không, robotics, hệ thống phun nhiên liệu cho động cơ – ô tô,…
Phẫu thuật robot từ xa yêu cầu sự đồng bộ hoàn hảo giữa hệ thống và hành động của bác sĩ, vì nếu tốc độ không phù hợp, có thể gây nguy hiểm cho tính mạng bệnh nhân Tương tự, các hệ thống xe hơi không người lái dựa trên nền tảng QNX cũng cần đảm bảo tính chính xác và an toàn trong mọi tình huống Trong lĩnh vực phóng vệ tinh, việc vòi phun của tên lửa không hoạt động đúng thời gian quy định có thể dẫn đến thất bại nghiêm trọng và gây thiệt hại tài chính lớn.
Hệ thống xử lý thời gian thực mềm (Soft real-time) cho phép thời gian thực thi có thể bị vi phạm trong một khoảng nhỏ không thường xuyên, miễn là điều này không gây ra thiệt hại nào.
Ứng dụng: hệ thống âm thanh kĩ thuật số, điện thoại,…
Khi mở ổ CD/DVD của máy tính cá nhân (PC) có sự chậm trễ nhưng hoàn toàn không gay ra thiệt hại nào.
Câu 2: Trình bày về Thread usage (Web server) (đọc và giải thích hình 2.8) Trả Lời:
Máy chủ web (Web server)
Máy chủ web
Web server, hay máy chủ web, là một máy tính lớn kết nối với mạng máy tính mở rộng, chứa toàn bộ dữ liệu mà nó quản lý Mỗi máy chủ sở hữu một địa chỉ IP riêng và có khả năng đọc nhiều ngôn ngữ như HTML, HTM, và các loại file khác Với dung lượng lớn và tốc độ cao, máy chủ web đảm bảo việc lưu trữ và vận hành hiệu quả kho dữ liệu trên internet.
Cổng giao tiếp riêng biệt của mỗi máy chủ giúp hệ thống máy tính hoạt động hiệu quả hơn Để cung cấp dữ liệu liên tục cho mạng lưới máy tính, máy chủ cần đảm bảo hoạt động ổn định.
Máy chủ web theo luồng xử lý từng yêu cầu bằng cách tạo ra một luồng mới cho mỗi yêu cầu, khác với phương pháp xử lý từng yêu cầu thông qua một quy trình mới.
Máy chủ web hoạt động với một hàng đợi cho các yêu cầu HTTP và một nhóm luồng để xử lý chúng Khi nhận được yêu cầu, máy chủ sẽ lấy yêu cầu đầu tiên từ hàng đợi và chỉ định một luồng từ nhóm để thực hiện Các yêu cầu sẽ được xếp hàng trong hàng đợi nếu chúng đến nhanh hơn khả năng xử lý của luồng hoặc khi nhóm luồng đã hết.
Ví dụ: Người dùng truy cập vào website tdtu.edu.vn Khi đó, server sẽ cung cấp tất cả dữ liệu về website đó thông qua lệnh giao tiếp.
Luồng (Thread)
Một tiến trình có khả năng tạo ra nhiều luồng, mỗi luồng thực hiện chức năng riêng biệt và có thể thực thi đồng thời thông qua việc chia sẻ CPU Các luồng trong cùng một tiến trình chia sẻ không gian địa chỉ nhưng có con trỏ lệnh, tập các thanh ghi và stack riêng biệt Ngoài ra, một luồng cũng có thể tạo ra các tiến trình con và nhận các trạng thái khác nhau giống như một tiến trình.
3 Máy chủ đơn luồng và máy chủ đa luồng (Single threaded web and multithreaded server web)
- Máy chủ đơn luồng: là loại máy chủ đơn giản nhất, chỉ sinh ra một luồng duy nhất nên khi đó:
Chỉ xử lý được một yêu cầu tại một thời điểm.
Các yêu cầu chỉ có thể được xử lý tuần tự.
Các yêu cầu có thể được xử lý bởi các tiến trình khác nhau và được gửi đến các server khác nhau.
Hệ thống không đảm bảo tính trong suốt khi các yêu cầu gửi lên chưa được xử lý kịp thời và đang phải chờ trong hàng đợi, điều này khiến người dùng không cảm nhận được sự minh bạch của hệ thống.
Là vòng lặp để đọc các yêu cầu và chuyển chúng đến Dispatcher để xử lý.
Máy chủ đa luồng là loại máy chủ có khả năng xử lý nhiều luồng đồng thời, với mỗi luồng đảm nhận việc xử lý một yêu cầu riêng biệt từ các máy khách Khi có yêu cầu mới, máy chủ sẽ khởi động một luồng mới để đáp ứng kịp thời.
Hình 2 2: Hoạt động của multithreaded server web
Việc áp dụng cơ chế đa luồng trong hệ thống cho phép trao đổi thông tin giữa client và server diễn ra song song với các công việc xử lý khác, từ đó nâng cao tốc độ và hiệu suất hoạt động của hệ thống.
Đọc và giải thích hình
Web server process: Tiến trình máy chủ web
Luồng điều phối là một luồng chuyên dụng có nhiệm vụ quản lý và phân phối các yêu cầu công việc Khi nhận được yêu cầu, luồng này sẽ phân tích và chuyển tiếp chúng đến các luồng phù hợp để xử lý hiệu quả.
Luồng làm việc (worker thread) là một loại luồng mà lập trình viên tạo ra để thực hiện các tác vụ không liên quan đến giao diện người dùng.
Network connection: các yêu cầu công việc từ mạng gửi vào
Bộ nhớ đệm trang web (web page cache) là một hệ thống lưu trữ tạm thời các nội dung tĩnh thường xuyên được truy cập, giúp tăng tốc độ truy xuất dữ liệu cho các lần truy cập sau mà không cần phải truy cập vào bộ nhớ chính.
Không gian người dùng là khu vực địa chỉ mà mã thực thi bị hạn chế truy cập Trong không gian này, bảng quản lý luồng lưu trữ được đặt và tiến trình chịu trách nhiệm điều phối các luồng.
Kernel space (không gian nhân): bảng quản lý thread lưu trữ ở phần kernel và việc điều phối các luồng là do hệ điều hành chịu trách nhiệm
Trong mô hình đơn luồng, người điều phối (dispatcher) nhận và kiểm tra các yêu cầu công việc từ mạng Sau đó, nó chọn một luồng làm việc không hoạt động (idle or blocked) và gửi yêu cầu đến luồng đó bằng cách ghi một con trỏ tới thông báo đặc biệt liên kết với mỗi luồng Cuối cùng, người điều phối đánh thức luồng đang bị chặn, chuyển nó từ trạng thái bị chặn sang trạng thái sẵn sàng.
Khi nhân viên thức dậy, nó sẽ kiểm tra khả năng đáp ứng yêu cầu từ bộ đệm của trang Web Nếu không có dữ liệu từ bộ đệm, nó sẽ bắt đầu đọc để lấy các trang từ đĩa và thực hiện thao tác chặn cho đến khi hoàn tất Trong khi luồng chặn đang hoạt động trên đĩa, một luồng khác sẽ được chọn để chạy, có thể là bộ điều phối hoặc một nhân viên khác đã sẵn sàng.
Mô hình này cho phép máy chủ được cấu trúc dưới dạng các luồng tuần tự, trong đó mỗi web server bao gồm hai luồng chính: luồng dispatcher và luồng worker, đảm nhiệm các nhiệm vụ khác nhau.
Chương trình của người điều phối bao gồm một vòng lặp vô hạn để nhận yêu cầu công việc và giao nó cho nhân viên
Mỗi mã nhân viên thực hiện một vòng lặp vô hạn, trong đó chấp nhận yêu cầu từ người điều phối và kiểm tra bộ nhớ cache của Web để xác định xem trang có sẵn hay không Nếu trang có trong cache, nó sẽ được trả lại cho khách hàng, và nhân viên sẽ chờ yêu cầu mới Ngược lại, nếu trang không có, nhân viên sẽ lấy trang từ đĩa và tiếp tục quy trình tương tự.
Hình 2 4: Sơ lược về code cho hình 2 3 (a) Dispatcher thread (b) Worker thread
- Ở đây, TRUE được giả định là hằng số 1 Ngoài ra, buf và page là để lưu giữ một yêu cầu công việc và một trang Web tương ứng.
Vậy khi máy chủ web không có luồng thì thực thi như thế nào?
Máy chủ Web có thể hoạt động theo cách không có luồng, tức là hoạt động như một luồng duy nhất Trong mô hình này, vòng lặp chính của máy chủ nhận và xử lý từng yêu cầu một cách tuần tự, hoàn thành yêu cầu trước khi tiếp nhận yêu cầu tiếp theo Trong thời gian chờ đợi dữ liệu từ đĩa, máy chủ không hoạt động và không xử lý các yêu cầu khác Nếu máy chủ Web chạy trên một máy chuyên dụng, CPU sẽ không hoạt động trong thời gian chờ đợi này.
Kết quả thực tế cho thấy rằng số lượng yêu cầu được xử lý mỗi giây có thể thấp hơn mong đợi Mặc dù các luồng đạt được hiệu suất đáng kể, nhưng mỗi luồng vẫn được lập trình tuần tự theo cách thông thường Do đó, cần tìm kiếm giải pháp khác cho vấn đề này trong phần tiếp theo.
Giải pháp thứ ba Máy trạng thái hữu hạn
Hai thiết kế được xem xét là máy chủ Web đa luồng và máy chủ Web đơn luồng Mặc dù các luồng không khả dụng, nhưng các nhà thiết kế hệ thống nhận thấy rằng hiệu suất kém do sử dụng luồng đơn là một vấn đề nghiêm trọng Nếu có phiên bản không chặn của lệnh gọi hệ thống đọc, một cách tiếp cận thứ ba có thể được thực hiện.
Khi một yêu cầu được gửi đến, một luồng duy nhất sẽ kiểm tra yêu cầu đó Nếu yêu cầu có thể được đáp ứng từ bộ nhớ cache, điều này là lý tưởng Tuy nhiên, nếu không, một hoạt động đĩa không chặn sẽ được thực hiện để xử lý yêu cầu.
Máy chủ ghi lại trạng thái yêu cầu hiện tại trong một bảng và tiếp tục nhận yêu cầu tiếp theo, có thể là công việc mới hoặc câu trả lời từ đĩa Nếu là công việc mới, nó sẽ được bắt đầu ngay lập tức Ngược lại, nếu là câu trả lời từ đĩa, thông tin liên quan sẽ được tìm nạp từ bảng và xử lý Đối với I/O đĩa không chặn, phản hồi có thể được gửi dưới dạng tín hiệu hoặc ngắt.
Trong thiết kế này, mô hình "quy trình tuần tự" không còn được áp dụng trong hai trường hợp đầu tiên Cần lưu và khôi phục trạng thái của tính toán một cách rõ ràng trong bảng khi máy chủ chuyển đổi giữa các yêu cầu Chúng tôi đang gặp khó khăn trong việc mô phỏng các luồng và ngăn xếp của chúng Thiết kế này, trong đó mỗi tính toán có trạng thái đã lưu và có các sự kiện có thể thay đổi trạng thái, được gọi là máy trạng thái hữu hạn (finite-state machine).
Phương pháp này duy trì ý tưởng về quy trình tuần tự thực hiện các lệnh gọi chặn, như I/O đĩa, trong khi vẫn đạt được tính song song Máy chủ đơn luồng giữ được sự đơn giản của việc chặn các cuộc gọi hệ thống nhưng lại ảnh hưởng đến hiệu suất Cách tiếp cận này đạt hiệu suất cao nhờ vào tính song song, nhưng sử dụng các cuộc gọi và ngắt không chặn, dẫn đến khó khăn trong lập trình.
Câu 3: Thread Scheduling (phần LOAD SHARING)
Lập lịch luồng (Thread Scheduling)
Một ứng dụng có thể được triển khai dưới dạng một tập hợp các luồng hợp tác, cho phép thực thi đồng thời trong cùng một không gian địa chỉ.
Trên một bộ xử lý đơn, luồng hỗ trợ cấu trúc chương trình và chồng chéo I/O với xử lý, mang lại lợi ích chi phí thấp hơn so với chuyển đổi quy trình Tuy nhiên, sức mạnh của luồng trở nên rõ ràng hơn trong hệ thống đa xử lý.
Trong môi trường này, các luồng có thể được sử dụng để khai thác tính song song (parallelism) thực sự trong một ứng dụng
Nếu các luồng khác nhau của một ứng dụng được chạy đồng thời trên các bộ xử lý riêng biệt, thì có thể đạt được hiệu suất đáng kể
Đối với các ứng dụng yêu cầu sự tương tác đáng kể giữa các luồng, tính song song trung bình (medium-grain parallelism) là một yếu tố quan trọng cần được xem xét.
Sự khác biệt nhỏ trong việc lập lịch và quản lý luồng có thể có tác động đáng kể đến hiệu suất
- Trong số nhiều đề xuất về lập lịch luồng đa bộ xử lý và phân công bộ xử lý, có bốn cách tiếp cận chung nổi bật:
Chỉ định bộ xử lý chuyên dụng
Chia sẻ tải (Load sharing)
Load sharing là quá trình mà các tác vụ không được gán cho một bộ xử lý cụ thể Hệ thống duy trì một hàng đợi toàn cục gồm các luồng đã sẵn sàng, và mỗi bộ xử lý sẽ chọn một luồng từ hàng đợi khi không hoạt động Thuật ngữ load sharing được sử dụng để phân biệt với load-balancing, trong đó công việc được phân bổ một cách đồng đều trên các bộ xử lý.
- Đây là cách tiếp cận đơn giản nhất và trực tiếp nhất từ môi trường đơn xử lý
Tải được phân bổ đồng đều giữa các bộ xử lý, đảm bảo rằng không có bộ xử lý nào bị nhàn rỗi trong khi vẫn còn công việc cần thực hiện.
Không cần phải thiết lập lịch tập trung hay quy về một chỗ; khi một bộ xử lý khả dụng, hệ điều hành sẽ tự động chạy quy trình lập lịch trên bộ xử lý đó để chọn luồng tiếp theo.
Hàng đợi toàn cục có thể được tổ chức và truy cập thông qua các lược đồ dựa trên mức độ ưu tiên, đồng thời xem xét lịch sử thực thi và các nhu cầu xử lý dự kiến.
- Theo [LEUT90], ta có ba phiên bản load sharing khác nhau:
Ai đến trước được phục vụ trước (Firsr-come-first-served/FCFS):
Kỹ thuật First-come-first-served (FCFS) cho phép quá trình đến trước được thực thi trước, nghĩa là quá trình nào yêu cầu CPU trước sẽ được cấp phát CPU trước Chế độ hoạt động của FCFS là Non-Preemptive, tức là khi một quá trình đang chạy, bộ xử lý sẽ tiếp tục thực thi cho đến khi quá trình đó hoàn thành hoặc bị chặn do I/O Hệ thống sử dụng hàng đợi FIFO để quản lý các quá trình.
Tiến trình đi vào được vào cuối hàng đợi
Tiến trình được được lựa chọn để xử lí lấy từ đầu hàng đợi iv Ưu điểm:
Là phiên bản cơ bản nhất và dễ cài đặt nhất
Không gặp vấn đề đói CPU (Starvation) có nghĩa các quá trình có độ ưu tiên thấp sẽ không bao giờ được cấp CPU. v Nhược điểm:
Thời gian chờ trung bình của thuật toán FCFS thường dài, đặc biệt khi một tiến trình có burst-time lớn được thực thi trước Điều này dẫn đến việc các tiến trình có burst-time nhỏ phải chờ rất lâu mới đến lượt thực hiện.
Hiệu ứng nối đuôi (Convoy effect) xảy ra khi CPU bị lãng phí thời gian do có quá nhiều thời gian trống Khi chúng ta cấp phát CPU cho các quá trình ngắn sau các quá trình dài, điều này dẫn đến thời gian chờ đợi trung bình (Average waiting time) tăng cao, làm cho hệ thống CPU hoạt động không hiệu quả.
Hệ thống FCFS không hoạt động hiệu quả trong môi trường chia sẻ thời gian, vì mỗi người dùng cần được cấp phát CPU theo khoảng thời gian đều đặn Tuy nhiên, trong FCFS, CPU chỉ được cấp phát cho luồng tiếp theo khi luồng hiện tại hoàn tất thực thi hoặc gặp lệnh chặn từ I/O.
Trong chế độ không chiếm ưu thế (Non Preemptive), mức độ ưu tiên của các quá trình không ảnh hưởng đến việc thực thi Điều này có nghĩa là nếu một quá trình có mức ưu tiên thấp đang chạy trong thời gian dài, các quá trình có mức ưu tiên cao hơn sẽ phải chờ cho đến khi quá trình thấp ưu tiên hoàn thành Tình huống này có thể xảy ra khi có các ngắt để tránh sự cố hệ thống, và điều này có thể dẫn đến nguy cơ sập hệ thống.
Số luồng nhỏ nhất trước (Smallest number of thread first) là một phương pháp tổ chức hàng đợi sẵn sàng theo dạng hàng đợi ưu tiên, trong đó các luồng từ các công việc có số lượng luồng đột xuất nhỏ nhất được ưu tiên cao nhất Các công việc có mức độ ưu tiên ngang nhau sẽ được sắp xếp theo thứ tự đến trước Tương tự như FCFS, một luồng đã được lên lịch sẽ tiếp tục chạy cho đến khi hoàn thành hoặc bị chặn.
Ưu tiên công việc có số luồng nhỏ nhất không theo lịch (Preemptive smallest number of threads first) là phương pháp phân bổ mức độ ưu tiên cao nhất cho các công việc có số lượng luồng đột xuất ít nhất Khi một công việc mới với số lượng luồng ít hơn xuất hiện, nó sẽ chiếm ưu thế và tạm dừng các luồng của công việc đang thực thi.
Nhận xét: Qua các mô tả trên thì ta nhận thấy FCFS vượt trội hơn so với giải pháp còn lại.
Nhược điểm của chia sẻ tải
Nút thắt cổ chai xảy ra khi hàng đợi trung tâm chiếm một vùng bộ nhớ cần được truy cập theo cách thực thi loại trừ lẫn nhau, đặc biệt khi nhiều bộ xử lý tìm việc cùng lúc Vấn đề này trở nên nghiêm trọng hơn khi bộ đa xử lý có hàng chục hoặc hàng trăm bộ xử lý, do đó, việc giải quyết nguy cơ về nút cổ chai là rất cần thiết.
Hiện tượng nút thắt cổ chai xảy ra khi một quy trình lớn chiếm dụng CPU trong thời gian dài, trong khi nhiều quy trình nhỏ khác cần ít thời gian để thực thi Điều này dẫn đến việc các quy trình nhỏ bị trì hoãn, vì chúng chỉ có thể nhận lại CPU khi quy trình lớn hoàn thành hoặc khi có lệnh chặn từ I/O Kết quả là toàn bộ hàng đợi phía sau bị ảnh hưởng và trì hoãn.
Các luồng khởi đầu không thể tiếp tục thực thi trên cùng một bộ xử lý, dẫn đến việc bộ nhớ đệm cục bộ trên mỗi bộ xử lý trở nên kém hiệu quả hơn.
Không phải tất cả các luồng trong một chương trình đều có thể truy cập vào các bộ xử lý đồng thời Nếu chương trình yêu cầu mức độ phối hợp cao giữa các luồng, quá trình chuyển mạch có thể ảnh hưởng đáng kể đến hiệu suất.
Chia sẻ tải, mặc dù có một số nhược điểm tiềm ẩn, vẫn là một trong những phương pháp phổ biến nhất được áp dụng trong các hệ thống đa xử lý hiện nay.
Các cơ chế hoạt động chung
Semaphore Một giá trị số nguyên được sử dụng để báo hiệu giữa các quá trình
Có 3 hoạt động thực thi (trong đó đều là các nguyên tử): khởi tạo, tăng và giảm
Thao tác giảm dần có thể chặn một quá trình, trong khi thao tác tăng dần sẽ bỏ chặn một quá trình Khái niệm này được gọi là semaphore đếm (counting semaphore) hoặc semaphore tổng quát (general semaphore).
Một semaphore chỉ nhận các giá trị 0 và 1.
Mutex tương tự như Semaphore nhị phân, nhưng điểm khác biệt chính là khi tiến trình khóa mutex, giá trị của nó sẽ được đặt bằng 0, trong khi khi mở khóa, giá trị sẽ được đặt bằng 1.
Một kiểu dữ liệu được sử dụng để chặn một luồng hay một quá trình cho đến khi đáp ứng đúng điều kiện.
Thực hiện trên cơ chế loại trừ lẫn nhau Là một quá trình thực hiện trong một vòng lặp vô hạn.
Bảng 3 1: Định nghĩa một số cơ chế hoạt động
Semaphore
Semaphore, được Edsger Dijkstra đề xuất vào năm 1965, là một kỹ thuật quan trọng trong việc quản lý các quá trình Đây là một trong những bước tiến đầu tiên trong việc giải quyết các vấn đề liên quan đến bộ xử lý.
Có nhiều quá trình có thể hợp tác bằng cách chia sẻ tín hiệu đơn giản, nhằm đảm bảo một quá trình dừng lại tại một vị trí xác định cho đến khi nhận được tín hiệu báo cụ thể.
Semaphore là một biến đặc biệt được sử dụng để chia sẻ giữa các luồng, giúp giải quyết vấn đề quan trọng và đạt được mức độ đồng bộ hóa trong môi trường đa xử lý.
Semaphore chỉ có thể được truy cập thông qua hai phép toán nguyên tử tiêu chuẩn: semSignal(s) và semWait(s) Phép toán semSignal(s), ký hiệu là P, có nguồn gốc từ tiếng Hà Lan "proberen", có nghĩa là "kiểm tra".
Semaphore được sử dụng để truyền tín hiệu Hàm semWait(s) có ký hiệu V, từ tiếng Hà Lan là "verhogen", có nghĩa là "tăng dần" Hàm này nhận tín hiệu qua semaphore, và nếu tín hiệu chưa được truyền, bộ xử lý sẽ tạm dừng cho đến khi quá trình truyền hoàn tất.
- Các phép toán thực thi như sau:
Một semaphore có thể được khởi tạo từ một giá trị số nguyên không âm
semWait: nó làm nhiệm vụ giảm giá trị semarphore Nếu kết quả nhỏ hơn 0 thì quá trình thực thi semWait sẽ bị chặn
semSignal là hàm có chức năng tăng giá trị semaphore Nếu giá trị trả về nhỏ hơn hoặc bằng 0, quá trình sẽ bị chặn do hoạt động chờ đợi; ngược lại, quá trình sẽ được bỏ chặn.
Ngoài 3 thao tác này thì không có cách nào để kiểm tra hoặc thực thi trên semarphore.
- Ba hệ quả thú vị của Semaphore:
Không có cách nào biết trước một tiến trình làm giảm một semaphore liệu nó sẽ bị chặn hoặc không.
Sau khi một tiến trình tăng semaphore và một tiến trình khác được đánh thức, cả hai tiến trình sẽ chạy đồng thời Trong tình huống này, không có cách nào để xác định tiến trình nào sẽ tiếp tục hoạt động trên hệ thống đơn xử lý.
Khi tạo một semaphore thì chúng ta không biết liệu tiến trình khác có đang chờ hay không, vì thế số lượng bỏ chặn có thể bằng 0 hoặc 1.
Semaphore nhị phân
Semaphore nhị phân chỉ nhận giá trị 0 hoặc 1 và thường được gọi là Mutex clocks trên một số hệ thống, vì chúng cung cấp chế độ loại trừ lẫn nhau Sự khác biệt cơ bản đã được đề cập trong phần 1.
Hình 4 3: Semaphore nhị nhân nguyên thủy
Một semaphore có thể khởi tạo bởi hai giá trị 0 hoặc 1.
Hàm semWaitB kiểm tra giá trị của semaphore được truyền vào Nếu giá trị bằng 1, hàm sẽ gán lại thành 0 và chặn tiến trình semWaitB Nếu giá trị bằng 0, chỉ cần thực hiện chặn.
semSignalB kiểm tra sự tồn tại của các tiến trình bị chặn Nếu phát hiện có tiến trình bị chặn, nó sẽ thực hiện gỡ chặn Ngược lại, nếu không có tiến trình nào bị chặn, giá trị của semaphore sẽ được gán bằng 1.
Hạn chế về thời gian chờ bận (busy waiting)
Hạn chế của hệ thống hiện tại là sự chờ đợi bận, dẫn đến lãng phí thời gian của CPU và hiệu suất thấp Do đó, cần thiết phải áp dụng một giải pháp hàng đợi để cải thiện tình hình này.
Đối với semaphores đếm và semaphores nhị phân, hàng đợi giữ các tiến trình đang chờ Thứ tự xóa tiến trình khỏi hàng đợi theo phương pháp nhập trước xuất trước (FIFO) đảm bảo công bằng, với quá trình bị chặn lâu nhất được giải phóng trước Semaphore sử dụng phương pháp này được gọi là semaphore mạnh, trong khi semaphore không xác định thứ tự xóa tiến trình là semaphore yếu.
Hình 4 4: Cơ chế hoạt động Semaphore
- Hình là một ví dụ về hoạt động của một semaphore mạnh Ở đây các quả trình A,
B và C phụ thuộc vào kết quả từ quá trình D Khi A thực hiện lệnh semWait trên semaphore, semaphore giảm xuống 0, cho phép A tiếp tục và tham gia lại hàng đợi sẵn sàng B sau đó chạy và thực hiện lệnh semWait, nhưng bị chặn, tạo điều kiện cho D chạy Khi D hoàn thành, nó thực hiện lệnh semSignal, cho phép B di chuyển đến hàng đợi sẵn sàng D tham gia lại hàng đợi và C bắt đầu chạy nhưng cũng bị chặn khi thực hiện lệnh semWait A và B tiếp tục chạy và bị chặn trên semaphore, cho phép D tiếp tục thực hiện.
Khi D có kết quả, nó sẽ phát tín hiệu semSignal, chuyển C vào hàng đợi sẵn sàng Trong các chu kỳ tiếp theo, D sẽ giải phóng A và B khỏi trạng thái bị chặn.