ucos2 스터디 - 1

2018. 1. 11. 00:12

ucos2는 친구에게 배우기로 했습니다.

오늘분 정리하였습니다.

 

0.

 - rtos는 하드 리얼타임 시스템이며, 하드리얼타임 시스템은 정확한 동작과 함께 반드시 정해진 시간내에 동작을 끝마쳐야한다.

 

1. 전경/배경(foreground/background) 시스템(firmware의 경우에 해당한다)

 - isr 같은 예외사항만 전경 프로세스로 처리하고, 배경 프로세스에는 나머지 모듈이나 함수를 호출하는 무한루프로 구성한다.

 

   

 

=> ISR 동작중에 ISR이 추가로 발생하여 먼저 실행되는 경우: 시스템마다 다르다(즉 시스템이 설정가능해야한다. 예를들어 isr우선순위가 정할수 있는 시스템이면 위의 그림과 같이 동작한다.)

 

참조(인터럽트, ISR의 처리방식)

https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8#%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8_%EC%B2%98%EB%A6%AC%EC%A0%88%EC%B0%A8

http://raisonde.tistory.com/entry/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%A2%85%EB%A5%98

 

 

2. 크리티컬 섹션(critical section of code)

 - 크리티컬 섹션은 그 영역이 실행할 때 나누어 지면 안되는 영역을 의미한다.

 - 크리티컬 섹션이 실행하고 있는 도중에는 인터럽트와 같은 예외사항으로 중단될 수 없다.

 - 크리티컬 섹션을 실행하기 직전에 인터럽트를 비활성화 하고, 크리티컬 섹션이 끝나고 나서는 인터럽트를 다시 활성화 해야한다.

 

 

3. 자원

 - 테스크가 사용하는 모든 요소를 의미한다.

 - ex: I/O장치, 변수, 구조체 또는 배열 등

 

 

4. 공유자원

 - 여러 테스크에서 공통적으로 참조하는 자원(즉, I/O장치 뿐만 아니라 변수, 구조체, 배열도 공유자원이 될 수 있다.)

 - 중복 참조를 방지하기 위해 상호배제(mutual exclusion)를 이용한다.

 

 

5. 멀티테스킹

 - 다수의 작업(혹은 프로세스, 태스크)이 CPU를 나누어 사용하는 것을 말한다.

 

 - 상세설명

 한 개의 CPU를 가진 개인용 컴퓨터가 특정 순간에 수행할 수 있는 태스크의 개수는 하나뿐이다. 따라서 멀티태스킹은 스케줄링이라는 방식을 사용하여 컴퓨터 사용자에게 병렬 연산이 이루어지는 것과 같은 환경을 제공한다. 스케줄링 방식은 CPU 사용시간을 일정한 기준에 따라 나누어 각 태스크가 사용할 수 있도록 분배한다. 분배받은 시간동안 태스크가 CPU를 사용할 때 다른 태스크들은 자신의 차례가 오기를 기다린다. 분배받은 시간이 종료되어 태스크가 사용하던 CPU를 다른 태스크가 사용할 수 있도록 재배정하는 것을 문맥교환이라 하는데 스케줄링에서 이 문맥교환이 충분히 자주 발생하게 되면 컴퓨터 사용자는 병렬 연산이 이루어진 것처럼 느끼게 된다.

 

=> 요약하자면 스케줄러가 태스크들을 스케줄링해서 멀티태스킹이라는 기능을 구현하면, 관측자는 여러 태스크들이 동시에 동작하는 것 처럼 느껴진다.

 

 

6. 테스크

 - 태스크는 자기자신이 cpu를 독점하고 있다고 생각하는 단순한 프로그램이다.(os가 이를 관리한다)

 - 테스크는 5가지 중 한가지의 상태에 있으면서 무한루프를 수행한다.

 

 - 테스크의 상태

수면상태(dormant): task가 메모리에 올라가 있지만, 실행할 필요가 없어 ready의 리스트에 올라가지 않은 상태 

준비상태(ready): 언제라도 실행할 수 있는 상태이지만 더 높은 우선순위의 task의 실행이 끝나기를 기다리는 상태

실행상태(running): task가 cpu를 점유하고 실행되고 있는 상태

대기상태(waiting): I/O처리나 공유자원의 사용권한 획득 등 특정 이벤트를 기다리고 있는 상태

인터럽트 서비스 루틴 상태(ISR): 인터럽트가 발생하여 cpu가 현재 인터럽트에 관한 처리를 하고 있는 상태

 

 

7. 문맥전환(context switch)

 - 현재 실행중인 task를 잠시 중단하고 다른 task를 실행하는 과정을 의미한다.

   

 - 상세과정

각 테스크가 실행될 때 cpu는 TCB에서 sp를 cpu의 sp레지스터에 복사하여 동작하게 된다. 그러다가 문맥전환이 일어나게 되면 cpu의 sp값을 현재까지 진행되었던 태스크에 해당하는 TCB에 저장하고, 새로 실행할 태스크에 해당하는 TCB에서 sp를 cpu sp레지스터에 복사해 해당 태스크를 실행하게 된다.

* TCB: task control block, task에 대한 정보들이 들어있다

* sp: 스텍포인터, 스택의 위치를 나타내는 포인터

 

 

8. 커널(kernel)

 - 멀티태스킹 시스템의 한부분으로, 문맥전환과 같은 태스크관리와 태스크간 통신을 책임진다.

 - 커널을 사용하면 하나의 응용프로그램을 커널이 관리하는 몇 개의 태스크 형태로 분리할 수 있으므로 시스템 디자인이 간단해진다.

 

 

9. 스케줄러(scheduler)

 - 디스패처(dispatcher)라고도 부른다. 커널의 일부분이며 다음 순서로 실행할 태스크를 결정하는 역할을 한다.

 - 대부분의 rtos에서는 우선순위를 기준으로 태스크의 실행 순서를 결정한다.

 - 우선순위 기반의 커널에는 비선점형과 선점형 2가지가 존재한다.

 

 

10. 비선점형(nonpreemptive) 커널

 - 비동기적인 이벤트는 ISR이 처리한다. 따라서 하위 우선순위 테스크가 실행되고 있을때 ISR이 발생하면, ISR은 높은 우선순위의 태스크를 실행 준비상태로 만든다. 그리고 현재 진행중이었던 하위 우선순위의 태스크가 마저 실행되고 높은 우선순위의 태스크가 이어서 실행된다.

 

 - 특징

인터럽트 지연시간이 짧다

데이터 손상 걱정 없이 비재진입(non-reentrant)함수를 사용할 수 있다.

세마포어를 사용하여 공유데이터를 보호할 필요가 줄어든다.

하지만 공유 I/O장치는 여전히 상호배제(mutual exclusion) 세마포어가 필요하다

태스크레벨의 응답성은 전경/배경 시스템보다 느려질 수 있다.

 

 

11. 선점형(preemptive) 커널

 - 시스템의 응답성이 중요한 경우에 사용된다.(즉, 대부분의 rtos는 선점형을 사용한다.) cpu의 제어권은 실행 준비가 된 최상위 우선순위 태스크가 가지게 된다. 즉, ISR이 최상위 우선순위 태스크를 실행 준비상태로 만들면 ISR이 종료되는 순간 이전 태스크는 일시 중단되고 최상위 태스크가 실행된다. 이후 이전 태스크(상대적으로 낮은 우선순위의 태스크)가 마저 실행된다.

 

 - 특징

확정적(deterministic)이다(=태스크 레벨의 응답시간을 최소화 할 수 있다.)

상호배제(mutual exclusion) 세마포어를 이용하여 함수의 독립적인 접근을 보장해야 비재진입(non-reentrant)함수를 사용할 수 있다.(즉 여러 task가 동시에 같은 함수를 호출 할 수 없다.)

ucos에서는 우선순위 숫자가 작을 수록 우선권이 높다.

 

 

------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

아래의 질문과 답변들은 제가 오늘 스터디 내용을 공부하면서 궁금한 점을 찾고 또 찾고 하다보니 점점 깊숙히 들어가 정리하게된 내용입니다.(몇시간이... 훌쩍...)

------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

 

 

※ 일반 os의 멀티태스킹은 여러개의 프로세스를 각각 나누어 조금씩 실행시킨다. 하지만 rtos의 경우에는 하나의 테스크가 쭉 실행되는데(선점일 경우에는 선점한 태스크가 최상위 우선순위이면 끝까지 실행되니까) 이것이 멀티태스킹이라고 할 수 있는가?

 

 - task는 아주 작은 단위로 이루어져 있기 때문에 사람이 보기에는 동시에 실행되는 것 처럼 보인다. 따라서 이는 멀티태스킹이라고 말할 수 있다. 또한 rtos에서의 스캐줄러는 이러한 선점을 고려하여 스케줄링하게 된다.

 

 

※ 비우선순위와 우선순위의 비선점형과 우선순위의 선점형과의 차이

 - 비우선순위

프로세스를 스레드 단위로 나누어(하나의 프로세스 크다면), 이를 스케줄러가 스케줄링하여 멀티스레드한다.

혹은 여러 프로세스들이 존재한다면 프로세스들끼리도 스케줄링하여 멀티태스킹을 한다.

 

 - 비선점형

ready에서 대기중인 태스크간에 우선순위는 적용되지만, 현재 실행되고 있는 태스크를 중단시키고 ready에서 대기중인 태스크가 선점할 수 없다.

 

 - 선점형

ready에서 대기중인 태스크간에 우선순위도 적용되고, 새롭게 ready상태로 오는 태스크가 ready에서 대기중인 태스크들+현재 실행되고 있는 태스크를 포함하여 최상위 우선순위를 가지면 현재 실행되고 있는 태스크를 중단시키고 해당 태스크가 선점하게 된다.

 

 

※ 태스크와 프로세스, 스레드의 차이

 - 멀티테스킹환경이 아닌 일괄처리 시절 당시(즉 옛날..)의 작업 단위를 테스크라고 불렀습니다.
이러한 작업의 단위를 결정하는 요소는 스케줄링을 어떤 단위로 하는가 입니다. 최근에는 그 단위가 쓰레드죠.(프로세스가 아닙니다. 프로세스를 스레드 단위로 잘게 나누어 다수의 스레드를 동시에 처리하게끔 동작하는데, 이를 멀티스레딩이라고 합니다.)
즉 Task가 이전에는 당시 작업의 최소 단위였던 process로 불리었으나, thread기술이 개발된 이후로는 task가 작업의 최소 단위가 되었으니 task는 thread와 동일하게 여기지게 됩니다.

 

참조

https://kldp.org/node/140262

http://egloos.zum.com/sword33/v/6000691

http://wanzargen.tistory.com/27

 

 

※ 프로그램과 프로세스, 그리고 스레드
 - 프로그램과 프로세스
프로그램은 컴퓨터를 실행시키기 위한 일련의 순차적으로 작성된 명령어 모음을 의미한다.
프로세스는 컴퓨터에서 연속적으로 실행되고 있는 프로그램을 의미한다.
즉, 프로그램이 보조기억장치(hdd, rom등)에서 주기억장치(ram)로 적재되면 이를 프로세스라고 부른다.

 

 - 스레드란
하나의 프로세스 내에는 여러 스레드로 구성된다. 주 프로세스(이를 메인 스레드라고도 한다)와 함께 실행되는 여러 흐름의 단위를 스레드라고 한다.
하나의 프로세스가 하나의 스레드로 구성되어 있다면 이 스레드를 중량 프로세스(이 경우 스레드의 개념이 불확실하다), 하나의 프로세스가 여러 스레드로 구성되어 있다면 이들을 경량 프로세스라고도 한다.


 - 스레드의 목적: 하나의 프로세스를 여러 스레드로 나누어 코어의(멀티프로세서라면 각 코어의) 이용성을 증가시킨다.

 

 - 스레드의 특징
스레드 생성시 운영체제는 부모 프로세스와 공유하는 자원은 초기화하지 않는다.
프로세스를 새로 생성하는 것보다 기존프로세스에서 스레드를 생성하는 것이 더 빠르다.
자원 생성과 관리의 중복성을 최소화하여 메모리에 대한 효율성을 증가시킨다.
스레드간에는 커널의 개입없이 서로 통신을 하기 때문에 프로세스에 비해 빠르며(sys call을 커널이 처리해야하니까), 이는 코어의 이용성을 증가시킨다.
스레드의 종료 또한 빠르다

 

 - 프로세스와 스레드간의 비교
프로세스간에는 독립적이기 때문에 메모리영역(text, data, bss, heap, stack)을 서로 공유하지 않는다.(리눅스에서는 text영역만 공유)
스레드간에는 text, data, bss, heap을 서로 공유하지만, stack은 개별적으로 생성된다.(즉, 공유되는 섹션을 이용해 통신이 가능하다. 단, 메모리에 동시 접근하는 것에는 주의해야함)
프로세스간에는 커널을 통해 서로 통신을 하지만, 스레드간에는 커널의 개입없이 서로 통신이 가능하고 독립적으로 실행된다.

 

참조
프로그램과 프로세스: http://tip.daum.net/question/124629
스레드란
http://nickjoit.tistory.com/8
https://lalwr.blogspot.kr/2016/02/process-thread.html
https://brunch.co.kr/@kd4/3

 

 

※ 멀티ㅇㅇ간의 차이
 - 멀티프로세싱은 여러개의 프로세서를 사용하여 다수의 작업(프로세스들)을 처리하는 것이다.
=>ram이나 hhd와 같은 자원을 공유하여 비용절감(경제성), 하나의 프로세서가 고장나더라도 나머지가 이를 부담(안정성)

 

 - 멀티프로그래밍은 프로세스가 특정 작업을 기다릴때(ex: 인터럽트 응답) 프로세서 또한 대기해야된다. 이러한 낭비를 줄이기 위해 기다리는 시간동안 프로세서가 다른 프로세스를 처리하는 것을 의미한다.
=>프로세서의 자원낭비(연산시간)의 최소화

 

 - 멀티태스킹은 여러개의 프로세스를 번갈아 실행하여 여러개의 프로세스들이 동시에 실행되는 것처럼 보이게 한다.
=>동시에 실행되는 것처럼 보이게함(즉 여러개의 프로세스들을 병렬처리할 수 있게함)

 

 - 멀티스레드는 하나의 프로세스을 여러개의 기능으로 나누어(주 프로세스[메인 스레드]와 여러 스레드들로 나누어) 번갈아 실행한다.
=>(한개 단위의)코어의 이용성을 증가시키고 자원을 공유하여 메모리에 대한 효율성을 증가시킨다.

 

 

 - 결론: 위 4가지의 궁극적인 목적은 '운영체제의 기능인 시스템 작업을 보다 효율적으로 관리하기 위해서'이다.

 

참조
http://doorbw.tistory.com/26
http://skmagic.tistory.com/261
https://ko.wikipedia.org/wiki/%EB%8B%A4%EC%A4%91%EC%9E%91%EC%97%85

 

'Study > RTOS' 카테고리의 다른 글

ucos2 스터디 - 2  (0) 2018.01.11

+ Recent posts