쓰레드의 진실 -----------------------------------------------------------------------------------------------------------------

프로세스가 실행될때 윈도우에서는 무조건 적으로 쓰레드를 하나 생성한다. 즉 프로세스A에 속한 쓰레드 A를 생성한다고 보면 된다.

그럼 컨텍스트 스위칭이란? 프로세스A에 속한 쓰레드 A와 프로세스B에 속한 쓰레드B간에 벌어지는 작업 즉 프로세스와 프로세스간에 존재하는 쓰레드를 의미한다.

그림으로 보면 아래와 같다고 할 수 있다.




커널 레벨 쓰레드와 유저레벨 쓰레드 ---------------------------------------------------------------------------------------------

유저 영역 -> 하나의 프로세스에 할당되는 메모리 공간이 존재할때 사용자에 의해서 할당되는 메모리 공간을 의미한다.

커널 영역 -> 하나의 프로세스에 할당되는 메모리 공간에서 당연히 운영체제또한 차지하는 메모리 공간이 있을 것이다. 운영체제라는 하나의 소프트 웨어를 실행시키기 위해서 필요한 메모리 공간을 커널영역이라고 한다. 

프로그래머가 개발한 프로세서A B C의 실행코드는 유저영역에 존재하지만 스케줄러나 쓰레드 정보는 커널영역에 존재한다. 오늘날의 대부분의 운영체제에서는 이러한 커널레벨을 기반으로 하여 쓰레드 모델을 지원한다.

만약 운영체제에서 커널레벨을 기반으로한 쓰레드를 지원하지 않거나 프로그래머가 커널레벨을 기반으로한 쓰레드를 사용하지 않을 경우 커널레벨에 의존적이지 않은 쓰레드 기능을 지원하는 라이브러리를 활용할수 있다. 이렇게 유저가 직접 쓰레드를 만드는 것을 유저레벨 쓰레드라고 한다.

즉 유저레벨 쓰레드와 커널레벨 쓰레드는 기능을 제공하는 주체가 누구냐에 따라서 달라진다.


32비트 CPU에서는 총 4기가의 메모리를 지원하고 그 영역을 절반으로 나누어 유저영역과 커널영역을 지정한다고 생각하면 된다.


커널 모드 유저 모드 ---------------------------------------------------------------------------------------------

운영체제는 커널영역의 보호를 위해서 커널 모드와 유저모드라는 것을 정의하고 있다. 일반적인 응용프로그램이 실행될 때 시스템은 유저모드 상태에 있다. 이 경우 제한된 영역의 메모 접근할수 있다. 그러나 커널모드에서는 전 영역의 메모리 접근이 가능하다. 따라서 커널레벨 쓰레드는 커널 모드에서만 동작한다.



Posted by JJOREG

멀티프로세스 기반 프로그램의 한계 -----------------------------------------------------------------------------

둘 이상의 서로 다른 프로그램을 실행하기 위해서는 당연히 둘 이상의 프로세스를 각각의 메모리영역을 메인메모리에 할당해야 한다. 또한 하나의 프로그램이 두가지 이상의 일을 동시(정확히는 동시가 아니지만)에 처리하기 위해서도 둘 이상의 프로세스가 필요하다.

하지만 이는 필연적으로 많은 횟수의 컨텍스트 스위칭(프로세스가 전환될 때마다 프로세스의 데이터를 CPU에 옮기는 작업)으로 인해서 성능 저하가 올수가 있기 때문이다.

그럼 이를 위한 해결책이 무엇일까? 단순하다. 컨텍스트 스위칭의 횟수를 줄이거나 정보의 개수를 줄이면 된다.


탄생 쓰레드! ------------------------------------------------------------------------------------------------

1. 쓰레드는 하나의 프로그램 내에서 여러개의 실행흐름을 두기 위한 모델이다.

2. 쓰레드는 각 실행흐름을 위한 메모리가 프로세스처럼 완벽한 독립구조가 아니다. 쓰레드들 사이에는 공유하는 요소가 존재한다.

3. 쓰레드는공유하는 요소가 있는 관계로 컨텍스트 스위칭에 걸리는 시간이 프로세스보다 짧다.



쓰레드의 특성! -----------------------------------------------------------------------------------------------

1. 쓰레드마다 스텍을 독립적으로 생성한다. 

-> 함수호출시 필요한 메모리 공간을 독립하면서 실행흐름을 추가시킬수 있는 최소한의 조건을 만족시킨다.

2. 코드 영역을 공유한다.

-> CPU는 당연히 필요한 종류의 명령어만 가지게 된다. 하지만 두개의 프로세스가 서로 다른 명령어를 가지고 있다면 당연히 프로세스 끼리는 각기 실행흐름을 실행 시킬 수 없다. 



하지만 쓰레드는 2개의 쓰레드에 있는 모든 명령어 종류를 공유함으로서 그 문제를 해결한다.




만약 MAIN프로세스가 있고 그 아래로 A쓰레드와 B쓰레드가 존재한다고 하면 각 쓰레드의 메인함수또한 마치 명령어 처럼 호출이 가능한 상태로 코드 영역에 등록된다.

3. 데이터 영역과 힙을 공유한다.


서로간의 데이터와 힙 영역을 공유하기 때문에 힙이나 데이터 영역에 메모리 공간을 할당해서 서로 통신하는 것이 가능하다. 

C++의 관점으로 본다면 전역변수와 NEW연산자를 통해서 동적 할당된 메모리 공간은 공유가 가능하다.

하지만 이것은 장점만 있는 것이 아니다. 동기화 문제를 통해서 프로그램에 오작동을 일으킬 여지도 도사리고 있다.

Posted by JJOREG

OS? RTOS? -------------------------------------------------------------------------------------------------

OS는 운영체제를 의미한다. 근데 앞쪽에 RT(Real Time)OS가 붙은 OS는 뭘까?

RTOS(Real Time)와 OS의 차이점은 응답성(응답속도)에 있다고 한다. 즉 일반적으로 RTOS가 일반 OS보다 더 빠른 시간안에 응답을 보내고 프로그램을 실행한다.

그럼 RTOS가 더 좋아보이지만 위의 말은 약간 잘못되어있다. 수정하자면 아래와 같다.

일반적으로 RTOS가 자신이 특화된 작업에 대하여 일반 OS보다 더 빠른 시간안에 응답을 보내고 프로그램을 실행한다.

로 고쳐야 한다. 특화된 작업목적에 있는 작업들은 빠르게 처리하지만 다른 작업에 있어서는 평균적인 속력도 못내는 경우가 존재한다.


선점형(Preemptive) OS 비선점형(Non - Preemptive) OS --------------------------------------------------------

비선점형 OS -> 여러개의 프로세스가 실행될때 높은 우선순위의 프로세스가 등장한다고 해서 실행의 대상을 바로 변경하지 않는다. 새로 등장한, 보다 높은 우선순위의 프로세스가 실행되기 위해서 현재 실행 중인 프로스세가 명시적으로 CPU를 양보할 때가지 혹은, I/O작업 등으로 블로킹 상태에 놓일 때까지 기다려야만 한다. 윈도우 3.X버전 등이 이에 속한다.

프로그래머가 자신이 개발한 프로그램이 CPU를 독점하지 않도록 신경을 써줘야 한다.


선점형 OS -> 단순하게 우선순위가 높은  프로세스가 먼저 실행된다고 생각하면 된다. 하지만 우선순위가 동일한 프로스세가 실행중이면 스케줄러가 적절히 시간을 나눠서 프로세스를 실행시킨다. 현재의 윈도우등이 이에 속한다.


스케줄러가 동작하는 시기 --------------------------------------------------------------------------------------

CASE 1 : 작업이 자원을 선점당하지 않고 쓸 수 있는 지정된 시간 간격.

CASE 2 : 프로세스가 생성 및 소멸될 때마다.

CASE 3 : 현재 실행 중인 프로세스가 블로킹 상태에 놓일 때마다.


프로세스의 우선순위 값 --------------------------------------------------------------------------------------

 Priority 

 meaning 

 IDLE_PRIORITY_CLASS

 기준 우선순위 4

 NOMAL_PRIORITY_CLASS

 기준 우선순위 9  

 HIGH_PRIORITY_CLASS 기준 우선순위 13

 REALTIME_PRIORITY_CLASS

 기준 우선순위 24

 ABOVE_NORMAL_PRIORITY_CLASS

 NOMAL_PRIORITY_CLASS보다 높고 HIGH_PRIORITY_CLASS 보다 낮다. Windows NT and ME에서는 지원하지 않는다.

 BELOW_NORMAL_PRIORITY_CLASS

 IDLE_PRIORITY_CLASS보다 높고 NOMAL_PRIORITY_CLASS보다 낮다. Windows NT and ME에서는 지원하지 않는다. 




Posted by JJOREG