티스토리 뷰

2. 쓰레드의 이용

쓰레드 VS 프로세스

 

쓰레드는 단일 프로그램 안에서 다수의 프로세스(실행흐름)을 두기 위한 메커니즘

쓰레드는 프로세스와 같이 완전히 독립적인 구조가 아닙니다.

 

즉, 쓰레드들 사이의 공유하는 요소가 있고 이는 문맥교환에 걸리는 시간이 프로세스에 비해 짧기 때문에 시스템 성능의 향상을 이유로 다수의 프로세스를 처리할 때 시스템 성능 저하를 막기위해 쓰레드를 사용한다고 저번 포스팅에서도 알아 봤습니다. 쓰레드와 프로세스의 차이점을 인지하고 메모리 구조를 살펴보도록 하겠습니다.

 

메모리 구조(프로세스 VS 쓰레드)

*fork는 프로세스가 하나의자식 프로세스를 생성하는 함수입니다.

 

위의 그림을 예시로 하나의 부모 프로세스에서 두개의 자식프로세스를 생성한 경우의 메모리 구조를 살펴 봅시다.

 

프로그램이 하나 있으면 프로그램의 코드가 저장된 코드영역, 전역 변수나 스테이트 변수와 같은 변수들이 저장되는 데이터 영역이 있고, 그리고 동적 할당된 메로리가 저장되는 힙 영역, 그리고 지역변수들, 로컬 변수의 영역인 스택 영역이 있습니다. 이런 부모 프로세스를 fork 함수를 이용해 자식 프로세스1, 2를 만들었다고 할때. 이 둘의 프로세스는 시스템으로부터 독립된 영역의 메모리를 할당 받습니다.

 

즉, 메모리 구조상 모든 것이 부모 프로세스와 독립적입니다. 그래서 이런 프로세스간에 데이터 통신을 위해서는 프로세스간 통신(IPC)메커니즘이 필요합니다.

 

프로세스에서 두 개의 쓰레드를 생성한 경우

쓰레드는 부모 프로세스와 코드 영역, 데이터 영역, 힙 영역을 공유하고 오로지 독립적인 스택 영역만 갖고 있습니다. 보모 프로세스와 메모리를 공유하기 때문에 문맥교환에 걸리는 시간이 감소하게 됩니다.

 

"각 쓰레드의 스택영역만을 생성 - 나머지 영역은 부모 프로세스의 영역을 공유"

 

쓰레드의 특징

쓰레드마다 스택 영역을 돌립적으로 할당합니다.

[스택 영역]

함수 호출 시 되돌아갈 주소 값 및 지역변수(함수 안에서 선언한)를 저장하기 위한 메모리 공간, 함수 호출 시 필요한 메모리 영역

즉 추가적인 실행흐름을 만드는 것이 가능 바꿔 말하면 실행 흐름의 추가를 위한 최소조건 = 독립된 스택영역

 

코드 영역의 공유

프로세스는 코드영역을 공유하지 않기 때문에

프로세스1의 코드영역에 있는 함수를 프로세스2에서 호출할수 없게 됩니다. 하지만 쓰레드는 프로세스의 코드영역을 공유하기 때문에 다른 쓰레드에서 코드영역의 함수를 호출 할 수 있습니다.

 

데이터 영역과 힙영역의 공유

 

프로세스의 문제점

프로세스는 여러 개의 쓰레드를 가질 수 있음

쓰레드는 컨텍스트를 가진 CPU의 기본 유닛입니다. 쓰레드 컨텍스트는 쓰레드 ID, 프로그램 카운터, 레지스터 집합, 스택로 구성되어 있습니다.. 익숙한 웹 브라우저와 워드프로세스라는 프로그램을 예로 들어 보겠습니다.

 

 

 

현대의 운영체제(Lunux/Unix, Windows)는 멀티 쓰레딩을 지원합니다.

댓글