코드 영역엔 프로그램 코드

데이터 영역엔 전역

힙 영역엔 동적

스택 영역엔 지역

 

이렇게 메모리를 프로세마다 할당하면 프로세스간의 컨텍스트 스위칭 CS가 발생, 부담스럽다

 

근데 흐름을 분리하기 위해 필요한 것들은 각각의 독립된 코드가 있는데,

 

하나의 독립된 코드는 각각 필요한 함수를 호출한다. 함수를 호출하기 위해서는 스택이 필요하다.

 

스택 영역을 공유할 수는 있지만 흐름별로 스택을 독립시켜서 사용하면 관리가 한결 편해질 것이다.

 

코드 영역은 하나의 프로세스가 별개로 나눠서 사용 가능하다. 하지만 스택은 한 프로세스가 나눠서 사용할 수 없다.

 

 

 

그래서 나온게 쓰레드다.

 

메인 프로세스의 코드 영역에 각각의 쓰레드의 코드를 전세내서 방을 얻어내고, 데이터랑 힙은 같이 써도 크게 문제될 것이 없어 공유한다.

 

하지만 스택은 공유가 힘드니, 각각의 흐름을 위한 별도의 스택 메모리 공간만 마련해두면 하나의 프로세스로 별개의 흐름을 가질 수 있을 것이라는 아이디어에서 나타난 것이 쓰레드이다.

 

 

쓰레드 사용 시 코드 영역에 올라가는 코드를 적당히 살펴보면

 

전역함수

메인함수

m2

m3

 

있다고 해보면

 

함수 중에 add()함수가 있다. add함수는 메인함수에서 호출이 가능하다. 또한 m2, m3 코드에서도 add함수 호출이 불가능하다.

 

크게 보면, 하나의 프로세스이기 때문에 Code 영역, Data영역, Heap 영역에 각각의 쓰레드에서 해당 영역에 접근이 가능하다.

 

하지만 멀티 프로세스 상황에서 그러한 접근은 불가능하니, IPC같은 기법을 사용해서 접근하는 것이다.

 

멀티 프로세스는 구시대적인 것이고, 쓰레드는 진보되어있는 것이 아니라 서로 담당하는 영역이 다르다는 것으로 알아두어야 한다.

 

각각 적용하는 영역이 조금씩 다르다. 멀티 프로세스를 대체하는 것이 쓰레드라는 것은 아니라는 것.

 

프로세스가 담당하는 영역이 있고, 쓰레드가 담당하는 영역이 있다.

 

근데 이건 Windows 쓰레드가 아니다. 윈도우 쓰레드는 좀 다른가봄

 

 


 

윈도우 프로세스 쓰레드

 

 

사실 윈도우 OS의 스케줄러는 프로세스 스케줄링을 하는 것이 아니라, 쓰레드를 스케줄링 한다.

 

또한 프로세스의 상태정보는 프로세스에 존재하는 것이 아니라, 쓰레드가 가지고 있다.

 

하지만 프로세스만 있다고 봤을 때는, 프로세스가 상태 정보를 가지고 있다고 봐도 된다...

 

 

프로세스 A에서 쓰레드 1번과 2번이 엎치락뒤치락 실행중이다.

 

그 말은 쓰레드 3번은 우선순위가 낮거나, I/O에 의한 Blocked 상태에 있다는 것이다.

 

 

프로세스란?

일반인 : 실행중인 프로그램

개발자 : 메모리 구조(OS에 의해 할당되는 메인 메모리의 리소스 뿐 아니라 가상 메모리의 리소스까지 포함), 실행중인 프로그램에 독립적인 레지스터 Set, etc

 

하지만 쓰레드는 명확한 정의를 내리기 힘들다. 다만 쓰레드를 구성하는 것은 쓰레드의 메인 코드와, 독립된 스택이 있다.

쓰레드의 독립된 스택과 코드만으로 쓰레드라고 하기는 힘든게, 프로세스와 공유하기 때문에 이것이 쓰레드라고 하긴 어렵다고 함

 

결국은 쓰레드는 실행의 흐름이다. 정도가 그나마 명확한 정의라고 볼 수 있다.

 

실행 흐름의 주체는 프로세스가 아니다. 메인함수 또한 메인 쓰레드가 진행시키는 것이다. 기존에 공부했던 코드는 하나의 쓰레드, 하나의 메인 쓰레드가 총괄하는 것이다.

 

쓰레드가 실행할 수 있는 환경을 제공하는 것이 프로세스, 그 환경 안에서 쓰레드가 동작한다.

+ Recent posts