티스토리 뷰

∙기타

프로세스와 쓰레드

coor 2022. 3. 18. 12:16

● 프로세스란

- 프로그램을 실행하면 OS로부터 실행에 필요한 메모리를 할당받는 것으로 
프로세스의 자원을 이용해서 실제로 작업하는 수행하는 것이 쓰레드이다.

예시

작업 관리자를 보면 각 프로세스가 실행되는 것을 볼 수 있다. 
이렇게 프로세스가 실행중인 프로그램이 될려면 점유 시간, 메모리, 파일, 입출력 장치 같은 자원이 필요하고
또 현재 활동을 나타내는 프로그램 카운터, 프로세스이 현재 활동도 포함하고 있다.

프로그램은 컴파일한 코드와 초기화 전역변수, 문자열과 문자열 상수 등 정적 데이터를 포함하는 정적인 개체이다.
그리고 이 프로그램일 실행이 되면 프로세스가 되는 것이다. 

 

1. 프로세스 메모리 구조

스택
스택 영역은 함수를 호출할 때 지역변수, 매개변수들이 저장되는 공간이다. 메인(main) 함수 안에서 변수들도 당연 이에
포함된다. 그리고 함수가 종료되면 해당 함수에 할당된 변수들을 메모리에서 해체한다. 한마디로 stack 자료구조의 pop같은 기능이다. 만약 '재귀'를 호출할 때 재귀가 깊거나 무한대로 흘러가게 되면 stack overflow 오류가 나온다. 그 이유는 stack 메모리 영역에 해당 함수의 지역변수, 매개변수들이 계속 할당되다가 OS에서 할당해준 stack 영역의 메모리 영역을 넘어버리면 오류가 발생한다.


힙 영역은 사용자에 의해 관리되는 영역입니다. 흔히 동적으로 할당할 할 변수들이 여기에 저장된다라고 보시면 된다.
Java에서 new 연산자로 생성하는 경우 또는 class, 참조 변수들도 힙 영역에 차지하게 된다. 

데이터
데이터 영역은 우리가 작성한 전역 변수, 정적 변수 등이 저장되는 공간이다. 이들의 특징을 보면 보통 메인(main)함수 
(프로그램 실행 전)에 선언되어 프로그램이 끝날 때까지 메모리에 남아있는 변수들이다. 좀 더 구체적으로 말하자면 데이터 영역도 크게 두 가지로 나뉜다. 초기화 된 변수 영역과 초기화되지 않는 변수 영역으로 나뉜다.

코드
코드 영역은 코드를 실행하기 위한 저장되어 있는 영역으로, 프로그램을 싱행시키기 위한 구성되는 것들이 저장된 영역이다. 한마디로 명령문들이 저장되는 것인데, 제어문, 함수, 상수들이 이 영역에 저장된다.

 

 

● 쓰레드란

쓰레드는 프로세스 내에서 각각 stack만 따로 할당받고 코드,데이터,힙 영역은 공유한다. 모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 한다.

멀티쓰레딩의 장점
- CPU의 사용률을 향상시킨다.
- 자원을 보다 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성이 향상된다.
- 작업이 분리되어 코드가 간결해진다.

노래를 들으면서 게임을 할 수 있는 이유가 바로 멀티쓰레드로 작성되어 있기 때문이다. 만약 싱글쓰레드로 작성되어 있다면 노래를 들으면서 게임은 할 수 없다. 하지만 장점만 존재하지 않는다. 멀티쓰레드 프로세스는 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화, 교착상태 같은 문제들을 고려해서 신중히 프로그래밍 해야 한다. 

교착상태란 
- 두 쓰레드가 자원을 점유한 상태에서 서로 상대편이 점유한 자원을 사용하려고 기다리느라 진행이 멈춰 있는 상태를 말한다.