멀티 태스킹 운영 체제에는 선점 및 협력의 두 가지 주요 유형이 있습니다. 둘 다 시스템에서 여러 작업을 정의 할 수 있지만 차이점은 작업 전환의 작동 방식입니다. 물론 단일 코어 프로세서에서는 한 번에 하나의 작업 만 실제로 실행됩니다.
두 가지 유형의 멀티 태스킹 OS는 각 작업마다 별도의 스택이 필요합니다. 따라서 이는 두 가지 사항을 의미합니다. 첫째, 프로세서는 스택을 RAM의 어느 곳에 나 배치 할 수 있으므로 스택 포인터 (SP)를 움직일 수있는 명령이 있습니다. PIC. 이것은 PIC10, 12 및 16 시리즈를 제외합니다.
거의 전적으로 C로 OS를 작성할 수 있지만 SP가 이동하는 작업 스위처는 어셈블리에 있어야합니다. 여러 차례에 걸쳐 PIC24, PIC32, 8051 및 80x86 용 작업 전환기를 작성했습니다. 내장은 프로세서의 아키텍처에 따라 상당히 다릅니다.
두 번째 요구 사항은 여러 스택을 제공하기에 충분한 RAM이 있어야한다는 것입니다. 일반적으로 스택에 적어도 몇 백 바이트를 원합니다. 그러나 작업 당 128 바이트로도 8 개의 스택에는 1K 바이트의 RAM이 필요합니다.하지만 각 작업마다 동일한 크기의 스택을 할당 할 필요는 없습니다. 현재 작업을 처리하기 위해 충분한 스택이 필요하고 중첩 된 서브 루틴을 호출 할 때 인터럽트 호출을위한 스택 공간도 필요합니다.
각 작업에 얼마나 많은 스택을 사용하고 있는지 결정하는 간단한 방법이 있습니다. 예를 들어 모든 스택을 특정 값 (예 : 0x55)으로 초기화하고 잠시 동안 시스템을 실행 한 다음 메모리를 중지하고 검사 할 수 있습니다.
어떤 종류의 PIC를 사용하고 싶은지는 말하지 않습니다. 대부분의 PIC24 및 PIC32에는 멀티 태스킹 OS를 실행할 수있는 충분한 공간이 있습니다. PIC18 (RAM에 스택이있는 유일한 8 비트 PIC)의 최대 RAM 크기는 4K입니다. 꽤 괜찮습니다.
협력적인 멀티 태스킹 (둘 중 더 간단한)을 사용하면 작업 전환이 작업을 제어 할 수있는 경우에만 작업 전환이 이루어집니다. 이는 작업이 I / O 요청 또는 타이머 호출과 같이 대기 할 일부 기능을 수행하기 위해 OS 루틴을 호출해야 할 때마다 발생합니다. 따라서 모든 레지스터와 상태 정보를 저장할 필요가 없으므로 OS가 스택을 쉽게 전환 할 수 있습니다. SP를 다른 작업으로 전환 할 수 있습니다 (실행할 다른 작업이없는 경우 유휴 스택이 있음) 주어진 통제). 현재 작업이 OS 호출을 할 필요는 없지만 잠시 동안 실행 된 경우 시스템 응답을 유지하기 위해 자발적으로 제어권을 포기해야합니다.
협력적인 멀티 태스킹의 문제는 작업이 제어권을 포기하지 않으면 시스템을 손상시킬 수 있다는 것입니다. 제어가 제공되는 인터럽트 루틴 만 실행할 수 있으므로 OS가 잠기는 것처럼 보입니다. 이것이이 시스템의 "협동적인"측면입니다. 작업 전환이 수행 될 때만 재설정되는 워치 독 타이머가 구현되면 이러한 잘못된 작업을 잡을 수 있습니다.
Windows 3.1 및 이전 버전은 협력적인 운영 체제 였기 때문에 부분적으로 성능이 그렇게 좋지 않았습니다.
선점 형 멀티 태스킹은 구현하기가 더 어렵습니다. 여기서 작업은 수동으로 제어를 포기할 필요는 없지만 각 작업에 최대 실행 시간 (예 : 10ms)을 부여한 다음 다음 실행 가능한 작업 (있는 경우)으로 작업 전환을 수행합니다. 이를 위해서는 임의로 작업을 중지하고 모든 상태 정보를 저장 한 다음 SP를 다른 작업으로 전환하고 시작해야합니다. 이로 인해 작업 전환기가 더 복잡해지고 더 많은 스택이 필요하며 시스템 속도가 약간 느려집니다.
협동 및 선점 형 멀티 태스킹의 경우 언제든지 실행중인 작업을 일시적으로 선점하는 인터럽트가 발생할 수 있습니다.
수퍼 캣이 의견에서 지적한 것처럼, 협업 멀티 태스킹의 장점 중 하나는 리소스를 공유하기가 쉽다는 것입니다 (예 : 멀티 채널 ADC와 같은 하드웨어 또는 링크 된 목록 수정과 같은 소프트웨어). 때로는 두 작업이 동시에 동일한 리소스에 액세스하려고합니다. 선점 예약을 사용하면 OS가 한 작업 중간에 리소스를 사용하여 작업을 전환 할 수 있습니다. 따라서 다른 태스크가 들어 와서 동일한 자원에 액세스하지 못하게하려면 잠금 이 필요합니다. 협력적인 멀티 태스킹을 사용하면 작업이 자체적으로 OS로 다시 릴리스 될시기를 제어하므로이 작업이 필요하지 않습니다.