2022. 4. 14. 08:39ㆍCS/운영체제
Task
microC/ OS-2는 Process를 Task로 구현하였다.
PCB를 TCB로 부름.
프로세스와의 차이점.
task는 스스로 stack을 가지고 있음. 그러나 코드, data, heap은 공유함. (쓰레드처럼)
64개 최대 개수. 각 task는 유니크한 priority를 가짐. (0 ~ 63)
priority로 각 task는 식별 될 수 있다. ID처럼 사용됨.
Task의 메타데이터는 TCB에 저장된다.
TCB Allocation/Deallocation
task가 생성되면, 새로운 TCB가 생성되고 할당된다.
task가 종료되면, 그 TCB는 소멸한다.
TCB는 Task의 수만큼 필요하기 때문에 64개.
TCB의 메모리 할당은 동적인 것이 아니라, system 초기화에 의해서 64개의 free TCB 배열이 만들어진다.

task가 생성이되면 어떻게 free TCB를 찾을까. 불가능한 priority를 가진 TCB를 찾는다.
task가 종료가 되면 TCB를 어떻게 릴리즈할까?
시스템이 초기화되면 OSTCBFreeList를 생성한다. 모든 free TCB는 단방향 링크드리스트로 연결되어 있다.
OSTCBFreeList는 첫 번째 freeTCB를 가르킨다. task가 생성되면 첫번째.
아래 그림과 같이 task 생성 시 목록에서 첫 번째 사용 가능한 TCB가 잘라지고 작업에 할당됩니다.


어떻게 실시간 task를 추적할 것이냐?
OSTCBList는 처음 만들어진 TCB를 가르키고 있다.
시스템이 시작됬을 때, 이건 비어있다. (포인터는 아무것도 가르키지 않음.)
task가 생성이 되면, 아래와 같이 만들어진 TCB는 OSTCBList와 연결된다.

task가 종료가 되면, 아래와 같이 TCB는 연결이 해제되고 OSTCBFreeLIst에 연결됨.

TaskAPI
OSTaskQuery : 해당 Task의 PCB 정보 복사
(PCB를 메모리에 복사, 이 함수를 사용하려면 해당하는 task의 PCB를 찾아야 함.)
어떻게 생성된 task의 PCB를 확인할 수 있을까.
OSTCBPrioTbl array : Task 생성 유무 확인
task의 TCB를 추적하는 방법.
64개의 요소가 존재. 각 요소는 TCB를 가르킴. priority와 같은 index를 같고 있음.
만일 task가 존재하지 않는다면, 0(or Null)을 저장하고 있음.
OSTaskCreate() : Task 생성
1. 이미 존재하는 지 확인.
2. task 스택 초기화.
3. 새로운 TCB 할당, 초기화.
4. CPU 스케쥴링
Os_TCBInit() : task 생성시 TCB생성. free TCB를 초기화함.
1. OSTCBList에 새로운 TCB를 등록한다.
2. OSTCBList에 TCB를 링크함.
3. OSRDGrp와 OSRdyTbl에 새로운 priority를 추가. (추후 CPU 스케쥴링에서 설명됨)
'CS > 운영체제' 카테고리의 다른 글
| LRU 구현하기 (0) | 2022.05.17 |
|---|---|
| 순환 리스트로 구현한 라운드 로빈 스케쥴러 (C언어) (0) | 2022.05.17 |
| OS : CPU Scheduling & Context Switch (microC/ OS-2) (0) | 2022.04.14 |
| OS : Thread (microC/ OS-2) (0) | 2022.04.14 |
| OS : Process (microC/ OS-2) (0) | 2022.04.14 |