Có hai loại hệ điều hành đa nhiệm chính, ưu tiên và hợp tác. Cả hai đều cho phép nhiều tác vụ được xác định trong hệ thống, điểm khác biệt là cách chuyển đổi tác vụ hoạt động. Tất nhiên với một bộ xử lý lõi đơn, chỉ có một tác vụ thực sự đang chạy tại một thời điểm.
Cả hai loại HĐH đa nhiệm đều yêu cầu một ngăn xếp riêng cho từng tác vụ. Vì vậy, điều này ngụ ý hai điều: thứ nhất, bộ xử lý cho phép các ngăn xếp được đặt ở bất cứ đâu trong RAM và do đó có hướng dẫn để di chuyển con trỏ ngăn xếp (SP) xung quanh - tức là không có ngăn xếp phần cứng có mục đích đặc biệt như ở cấp thấp PIC. Điều này để lại loạt PIC10, 12 và 16.
Bạn có thể viết một hệ điều hành gần như hoàn toàn bằng C, nhưng trình chuyển đổi tác vụ, nơi SP được di chuyển xung quanh phải được lắp ráp. Tại nhiều thời điểm, tôi đã viết trình chuyển đổi tác vụ cho PIC24, PIC32, 8051 và 80x86. Tất cả đều khác nhau tùy thuộc vào kiến trúc của bộ xử lý.
Yêu cầu thứ hai là có đủ RAM để cung cấp cho nhiều ngăn xếp. Thông thường người ta muốn có ít nhất vài trăm byte cho một ngăn xếp; nhưng ngay cả ở mức chỉ 128 byte cho mỗi tác vụ, tám ngăn xếp sẽ yêu cầu 1K byte RAM - bạn không phải phân bổ cùng ngăn xếp kích thước cho mỗi tác vụ. Hãy nhớ rằng bạn cần đủ ngăn xếp để xử lý tác vụ hiện tại và bất kỳ cuộc gọi nào đến các chương trình con lồng nhau của nó, nhưng cũng có không gian ngăn xếp cho một cuộc gọi bị gián đoạn vì bạn không bao giờ biết khi nào sẽ xảy ra.
Có các phương pháp khá đơn giản để xác định số lượng stack bạn đang sử dụng cho mỗi tác vụ; ví dụ: bạn có thể khởi tạo tất cả các ngăn xếp thành một giá trị cụ thể, giả sử 0x55 và chạy hệ thống một lúc rồi dừng và kiểm tra bộ nhớ.
Bạn không nói bạn muốn sử dụng loại PIC nào. Hầu hết các PIC24 và PIC32 sẽ có nhiều chỗ để chạy HĐH đa nhiệm; PIC18 (PIC 8 bit duy nhất có ngăn xếp RAM) có kích thước RAM tối đa 4K. Thật là iffy xinh đẹp.
Với đa nhiệm hợp tác (đơn giản hơn cả hai), chuyển đổi tác vụ chỉ được thực hiện khi tác vụ "từ bỏ" quyền điều khiển của nó trở lại HĐH. Điều này xảy ra bất cứ khi nào tác vụ cần gọi một thói quen của hệ điều hành để thực hiện một số chức năng mà nó sẽ chờ, chẳng hạn như yêu cầu I / O hoặc cuộc gọi hẹn giờ. Điều này giúp HĐH dễ dàng chuyển đổi ngăn xếp hơn, vì không cần thiết phải lưu tất cả các thanh ghi và thông tin trạng thái, SP chỉ có thể được chuyển sang một tác vụ khác (nếu không có tác vụ nào khác sẵn sàng để chạy, một ngăn xếp nhàn rỗi là kiểm soát nhất định). Nếu tác vụ hiện tại không cần thực hiện cuộc gọi HĐH nhưng đã chạy được một thời gian, nó cần từ bỏ quyền kiểm soát một cách tự nguyện để giữ cho hệ thống phản hồi.
Vấn đề với đa nhiệm hợp tác là nếu tác vụ không bao giờ từ bỏ quyền kiểm soát, nó có thể hog hệ thống. Chỉ có nó và bất kỳ thói quen ngắt nào xảy ra để được kiểm soát có thể chạy, do đó, hệ điều hành dường như sẽ bị khóa. Đây là khía cạnh "hợp tác" của các hệ thống này. Nếu bộ định thời watchdog được triển khai chỉ được đặt lại khi thực hiện chuyển đổi tác vụ, thì có thể bắt các tác vụ sai lầm này.
Windows 3.1 trở về trước là các hệ thống hợp tác, đó là một phần lý do tại sao hiệu năng của chúng không được tốt lắm.
Đa nhiệm ưu tiên là khó thực hiện hơn. Ở đây, các tác vụ không bắt buộc phải từ bỏ điều khiển bằng tay, nhưng thay vào đó, mỗi tác vụ có thể được cung cấp một lượng thời gian tối đa để chạy (giả sử 10 ms), và sau đó một chuyển đổi tác vụ được thực hiện cho tác vụ có thể chạy tiếp theo nếu có. Điều này đòi hỏi phải tự ý dừng một tác vụ, lưu tất cả thông tin trạng thái và sau đó chuyển SP sang tác vụ khác và bắt đầu nó. Điều này làm cho trình chuyển đổi tác vụ phức tạp hơn, yêu cầu nhiều ngăn xếp hơn và làm chậm hệ thống xuống một chút.
Đối với cả đa nhiệm hợp tác và ưu tiên, các ngắt có thể xảy ra bất cứ lúc nào sẽ tạm thời làm mất tác vụ đang chạy.
Như supercat chỉ ra trong một nhận xét, một ưu điểm của đa nhiệm hợp tác là việc chia sẻ tài nguyên dễ dàng hơn (ví dụ như phần cứng như ADC đa kênh hoặc phần mềm như sửa đổi danh sách được liên kết). Đôi khi hai tác vụ muốn truy cập vào cùng một tài nguyên cùng một lúc. Với lập lịch ưu tiên, hệ điều hành có thể chuyển đổi các tác vụ ở giữa một tác vụ bằng cách sử dụng tài nguyên. Vì vậy, khóa là cần thiết để ngăn chặn một nhiệm vụ khác đến và truy cập vào cùng một tài nguyên. Với đa nhiệm hợp tác, điều này không cần thiết bởi vì tác vụ sẽ kiểm soát khi nó sẽ tự giải phóng nó trở lại HĐH.