2012-04-09 24 views
9

Tôi đang tìm kiếm các thiết kế hệ điều hành khác nhau với hy vọng viết một hệ điều hành đa nhiệm đơn giản cho DCPU-16. Tuy nhiên, tất cả mọi thứ tôi đọc về việc thực hiện đa nhiệm ưu tiên được tập trung xung quanh các ngắt. Nghe có vẻ như trong thời đại của phần cứng và phần mềm 16 bit, đa nhiệm hợp tác là phổ biến hơn, nhưng điều đó đòi hỏi mọi chương trình phải được viết với đa nhiệm trong đầu.Là một hệ điều hành đa nhiệm ưu tiên có thể có trên DCPU-16 ngắt quãng không?

Có cách nào để thực hiện đa tác vụ ưu tiên trên kiến ​​trúc gián đoạn không? Tất cả những gì tôi có thể nghĩ là một thông dịch viên sẽ tự động chuyển đổi nhiệm vụ, nhưng nó sẽ có hiệu suất rất lớn (có thể theo thứ tự 10-20x + nếu nó phải phân tích mọi hoạt động và không để bất cứ thứ gì chạy tự nhiên, tôi tưởng tượng).

+0

Lưu ý rằng DCPU-16 có ngắt tại . – blueshift

+0

Có phải không? Kể từ ngày 4 tháng 5 năm 2014, phiên bản tài liệu có sẵn trên trang web (http://0x10c.com/doc/dcpu-16.txt) vẫn là 1.1 và không bị gián đoạn. Có tài liệu nào về các tính năng mới không? –

+0

Tôi giả sử bạn không reddit hoặc sử dụng diễn đàn. Kiểm tra [cậu bé xấu này (spec 1.7)] (http://pastebin.com/raw.php?i=Q4JvQvnM)! Chúng tôi trò chuyện về điều này trên freenode IRC# 0x10c-dev nếu bạn muốn ghé qua. – blueshift

Trả lời

4

Thực hiện đa tác vụ ưu tiên thường được thực hiện bằng cách thay đổi trạng thái bài đăng/sự kiện thú vị thành bộ lập lịch, quyết định nhiệm vụ nào sẽ tạm ngừng và tác vụ mới nào để bắt đầu/tiếp tục dựa trên mức độ ưu tiên. Tuy nhiên, các sự kiện thú vị khác có thể xảy ra khi một tác vụ đang chạy thực hiện cuộc gọi đến một thói quen hệ điều hành, có thể có cùng tác dụng.

Nhưng tất cả những điều quan trọng là một số sự kiện được ghi ở đâu đó và người lên lịch quyết định ai sẽ chạy. Vì vậy, bạn có thể thực hiện tất cả sự kiện/lập lịch sự kiện như vậy chỉ xảy ra trên các cuộc gọi hệ điều hành.

Bạn có thể thêm cuộc gọi nghiêm trọng vào bộ lập lịch tại các điểm "thuận tiện" trong mã ứng dụng nhiệm vụ khác nhau để làm cho hệ thống của bạn chuyển đổi thường xuyên hơn. Cho dù nó chỉ chuyển mạch, hoặc sử dụng một số thông tin cơ bản như thời gian trôi qua kể từ khi cuộc gọi cuối cùng là một chi tiết lịch trình.

Hệ thống của bạn sẽ không phản hồi nhanh như hệ thống bị gián đoạn, nhưng bạn đã cho nó bằng cách chọn CPU bạn đã làm.

+1

Vì vậy, điều này có những bất lợi của HTX đa nhiệm trong đó không có giới hạn trên nghiêm ngặt về thời gian CPU có thể chạy mà không nhấn lên lịch trình (ví dụ, nếu một quá trình đi vào vòng lặp không liên quan đến bất kỳ cuộc gọi hệ điều hành nào). hijacks OS gọi cho các mục đích lập lịch trình, nó sẽ hoạt động trên bất kỳ chương trình nào thực hiện cuộc gọi hệ điều hành? –

+2

@AndrewG. chính xác. Và đây là cách mà Mac OS cổ điển thêm đa nhiệm, ban đầu như là một phần mở rộng trong Hệ thống 5. Các cuộc gọi thích hợp vào hệ điều hành được coi là các cơ hội đa nhiệm hợp tác. Như bạn nói, không có giới hạn trên nghiêm ngặt - ví dụ:một quá trình mà, có lẽ do một lỗi trong thiết kế, đi vào một vòng lặp vô hạn mà không có các cuộc gọi hệ điều hành sẽ treo toàn bộ hệ thống. – Tommy

+0

@Tommy đó là những gì một bộ đếm thời gian watchdog phần cứng mà khẳng định đặt lại CPU và trong bộ nhớ RAM thường xuyên thiết lập lại mà thư giãn ngăn xếp trở lại điểm vào chương trình là cho. Xem lời giải thích của tôi về lý do tại sao đó không phải là cực kỳ điên rồ. –

2

Tôi nghĩ đánh giá của bạn là chính xác. Việc đa nhiệm ưu tiên xảy ra nếu bộ lập lịch có thể làm gián đoạn (theo ý nghĩa từ điển không bị thổi phồng) một tác vụ đang chạy và chuyển sang một nhiệm vụ tự động khác. Vì vậy, phải có một loại diễn viên nào đó nhắc nhở người lập lịch hành động. Nếu không có thiết bị ngắt (theo ý nghĩa kỹ thuật bị thổi phồng) thì có rất ít điều bạn có thể làm nói chung.

Tuy nhiên, thay vì chuyển sang phiên dịch đầy đủ, một ý tưởng xảy ra chỉ là lập trình lại mã chương trình được cung cấp động. Vì vậy, trước khi tham gia vào một quá trình, trình lập lịch biết trạng thái xử lý đầy đủ, bao gồm cả giá trị bộ đếm chương trình mà nó sẽ nhập vào. Sau đó nó có thể quét từ đó, thay thế, hoặc là mã lệnh thứ hai mươi hoặc mã lệnh nhảy tiếp theo không có ngay lập tức tại bộ đếm chương trình với một bước nhảy trở lại vào bộ lập lịch biểu. Khi quá trình trả về, bộ lập lịch sẽ đặt lệnh gốc trở lại. Nếu đó là một bước nhảy (có điều kiện hoặc ngược lại) thì nó cũng có tác dụng nhảy một cách thích hợp.

Tất nhiên, lược đồ này chỉ hoạt động nếu mã chương trình không tự sửa đổi chính nó. Và trong trường hợp đó bạn có thể tiền xử lý nó để bạn biết trước nơi nhảy không có tìm kiếm tuyến tính. Bạn về mặt kỹ thuật có thể cho phép viết mã tự sửa đổi tốt nếu nó sẵn sàng đề cử tất cả các địa chỉ có thể được sửa đổi, cho phép bạn chắc chắn tránh những địa chỉ đó trong các sửa đổi động của lịch trình của bạn.

Bạn sẽ kết thúc sắp xếp chạy một trình thông dịch, nhưng chỉ cho các bước nhảy.

4

Thực ra là có. Phương pháp hiệu quả nhất là chỉ cần vá thời gian chạy trong bộ nạp. Công cụ hạt nhân/daemon có thể có các bản vá tùy chỉnh để có phản hồi tốt hơn. Thậm chí tốt hơn, nếu bạn có quyền truy cập vào tất cả các nguồn, bạn có thể vá trong trình biên dịch.

Bản vá có thể bao gồm một bộ lập lịch phân phối.Mỗi chương trình có thể được vá để có bộ đếm thời gian chờ rất thấp; khi tải, nó sẽ đặt hẹn giờ và trên mỗi lần trả về từ trình lên lịch, nó sẽ đặt lại. Một phương pháp đơn giản sẽ cho phép mã chỉ cần thực hiện một số

if (timer - start_timer) yield to scheduler; 

không mang lại hiệu suất quá lớn. Vấn đề chính là tìm các điểm tốt để bật chúng vào. Giữa mỗi cuộc gọi hàm là một sự khởi đầu, và phát hiện các vòng lặp và chèn chúng là nguyên thủy nhưng hiệu quả nếu bạn thực sự cần phải trả trước một cách có trách nhiệm.

Nó không hoàn hảo, nhưng nó sẽ hoạt động.

Vấn đề chính là đảm bảo rằng thời gian trả về là độ trễ thấp; theo cách đó, nó chỉ là một so sánh và nhánh. Ngoài ra, xử lý các ngoại lệ - các lỗi trong mã gây ra, nói, các vòng lặp vô hạn - theo một cách nào đó. Bạn về mặt kỹ thuật có thể sử dụng một bộ đếm thời gian phần cứng watchdog khá đơn giản và khẳng định một thiết lập lại trên CPU mà không cần xóa bất kỳ RAM nào; một thói quen trong RAM sẽ là nơi các điểm vector RESET, mà sẽ kiểm tra và thư giãn ngăn xếp trở lại cuộc gọi chương trình (do đó đâm chương trình nhưng bảo quản mọi thứ khác). Nó giống như một chương trình phá hỏng chương trình nếu không có sự cố. Hoặc bạn có thể POTENTIALLY thay đổi nó thành nhiều nhiệm vụ theo cách này, RESET như là một ngắt, nhưng đó là khó khăn hơn nhiều.

Vì vậy ... có. Nó có thể nhưng phức tạp; sử dụng các kỹ thuật từ trình biên dịch JIT và các trình dịch động (các trình giả lập sử dụng chúng).

Đây là một chút giải thích lúng túng, tôi biết, nhưng tôi rất mệt mỏi. Nếu nó không đủ rõ ràng, tôi có thể quay lại và dọn dẹp nó vào ngày mai.

Bằng cách này, khẳng định đặt lại trên một chương trình giữa CPU có vẻ điên rồ, nhưng đó là một kỹ thuật được chứng minh và được chứng minh về thời gian. Phiên bản đầu của Windows thậm chí đã làm nó để chạy chế độ tương thích, tôi nghĩ 386, đúng, bởi vì không có cách nào để chuyển trở lại 32-bit từ chế độ 16-bit. Các bộ xử lý và hệ điều hành khác cũng đã thực hiện nó.

EDIT: Vì vậy, tôi đã thực hiện một số nghiên cứu về DCPU là gì, haha. Nó không phải là một CPU thực sự. Tôi không có ý tưởng nếu bạn có thể khẳng định thiết lập lại trong giả lập của Notch, tôi sẽ hỏi anh ta. Kỹ thuật tiện dụng, có nghĩa là.

+0

Nó sẽ được chính xác để tóm tắt đề xuất của bạn như là đa nhiệm hợp tác tự động? – Tommy

+1

Tóm tắt ngắn có :-P –

0

cách khác là để giữ cho các nhiệm vụ nhỏ dựa trên một hàng đợi sự kiện (như các ứng dụng GUI hiện hành)

này cũng là hợp tác xã nhưng có tác dụng không cần hệ điều hành các cuộc gọi mà bạn vừa trở về từ nhiệm vụ và sau đó nó sẽ tiếp tục các công việc tiếp theo

nếu sau đó bạn cần phải tiếp tục một nhiệm vụ bạn cần phải vượt qua "chức năng" bên cạnh và một con trỏ đến dữ liệu bạn cần vào hàng đợi nhiệm vụ

+0

Điều này không yêu cầu tất cả các chương trình trên hệ thống phải chia nhỏ quá trình xử lý thành các nhiệm vụ nhỏ kết thúc bằng một cuộc gọi hệ điều hành (chủ yếu là đa nhiệm hợp tác)? Hoặc bạn sẽ tự động kiểm tra và viết lại tác vụ? –

+0

@AndrewG. tôi đã không nói điều đó trong câu thứ hai của tôi? nhưng có, có nó sẽ, mặc dù nhiều hơn một trở lại hàng đợi khi bạn đang thực hiện –

+0

Bạn nói đúng, tôi hiểu sai. Được rồi, cảm ơn. –

Các vấn đề liên quan