프로세스와 스레드 한번에 이해하기

 

 

프로세스와 스레드 한번에 이해하기


이번에는 프로세스와 스레드에 관해서 이야기를 해볼까한다 우선 프로세스를 알아보기전에 프로그램은 무엇일까 한번 생각해보자 우리가 흔히 자주 접하고 자주 사용하는 프로그램이라는 단어의 정의를 한번 생각해보자

 

프로그램은 ' 어떤 작업을 하기위한 파일 ' 이라는 뜻으로

우리가 게임을 하기위해 게임 ' 프로그램 ' 을 실행하고 문서작업을 위해 엑셀 프로그램을 킨다고 말한다

또한 프로그램이란 단어는 넓은 의미를 가지고있는데

 

우리가 자주보는 TV에서 리얼리티쇼, 드라마, 인기작품들을 TV프로그램이라고 부른다

TV프로그램들은 촬영을 하고 프로그램을 통해 편집하고 가공하여 사용자들에게 보여지는것이므로

하나의 프로그램이라고 할수있다 그렇다면 프로세스는 무엇일까?

 

프로세스도 좁은의미에서는 PC에서 사용하는것처럼 보이지만 넓은 의미에서는 사무용어로도 많이쓰인다

프로세스는 일의 과정이나 공정을 의미하는데

 

우리가 처음 회사에 신입으로 들어가게되면 회사 업무 프로세스를 인수인계받는다

출근하면 이것부터하고.. 그다음이거.. 그다음이거.. 퇴근하기전엔 이거좀 체크해줘.. 라는 식으로

일의 흐름을 전달받게되고 이것을 수행하게된다

 

이걸 그대로 옮겨서 생각해보면 프로세스는 컴퓨터에서 연속적으로 실행되고있는 프로그램이라고 볼수있다

 

 

 

 

 

우선 우리가 게임하다가 빡종..? 할때 쓰던 작업관리자를 봐보자 위쪽 상단탭에 프로세스란 항목이 보이는데 

프로세스 항목중에 ' 백그라운드 프로세스 ' 란 글자가 보인다

백그라운드 프로세스는 눈에보이진않지만 프로그램을 동작하기위해서 뒤에서 힘쓰고있는 녀석들이라고 볼수있다

 

 

 

 

 

 

아래로 쭉 내리다보면 현재 내 컴퓨터에 실행중인 Discord를 볼수있는데 여러개의 프로세스가 실행중인걸 볼수있다 하지만 왜지? 디스코드란 프로그램은 한번만 켰는데 왜 프로세스가 여러개가 보일까

 

자 여기서 프로세스의 정의를 한번 다시 짚어보자

프로세스란 ' 운영체제로부터 시스템자원을 할당받는 작업의 단위 ' 를 말한다 이게 무슨말이냐면

 

 

 

 

 

프로세스들은 각각 독립적인 메모리를 가지는데 Code, Data, Stack, Heap 구조를 할당받는다

서로 독립적이게 작동하기떄문에 1번 프로세스는 2번프로세스의 자원을 얻을수없다 

물론 다른 프로세스의 자원을 얻기위한 프로세스간의 통신 IPC를 사용하면 되지만 우선 기본적으로는

독립적인 메모리이기때문에 간섭할수없다

 

또한 하나의 프로세스는 기본적으로 하나의 메인스레드를 가지고있다 스레드에 관한것은 곧 아래에서 만날수있을것이다

 

정리해보자면 우리가 프로그램을 실행하게되면 프로그램은 여러 과정을 거쳐 메모리위에 올라가게된다

그리고 이 프로그램을 동작하기위해 OS에서 CPU를 할당받고 동작을 하게된다

 

이떄 Code, Data, Stack, Heap구조를 할당받으면서 실행중이게 된다

한마디로 프로세스는 현재 실행중인 프로그램의 흐름이라고 생각해도 무방하다

 

위에 예시로든 Discord같은 경우는 GUI, 알람, 통화가 전부 각각 따로 동작하기때문에 프로세스를 여러개 두고

사용자가 해당기능을 사용하면 담당하는 프로세스가 그일을 처리하는것으로 볼수있다

자 이제 프로그램이 프로세스를 실행시켰으니 그다음 스레드에 관해서 알아보자 스레드는 프로세스 내부에 있다고 생각하면 편할거같다

 

 

 

 

프로그램이 실행되어 프로세스를 할당받고나면 안에 Code, Data, Stack, Heap 구조가 생긴다고 말했는데

스레드는 프로세스안에 동작하는 녀석으로 프로세스가 하나의 가게라고 생각한다면 스레드는 안에 일하는 알바생이라고 비유할수있다

 

여기서 스레드는 프로세스안에 Code, Data, Heap의 자원을 공유받고 각각의 Stack을 따로 배정받는다

Stack을 따로 배정받는 이유에 대해서 생각해보면

 

 

 

 

 

우리가 메인메서드를 실행하게되면 호출스택에 main() 메서드가 쌓이게된다

그리고 main()메서드는 안에서 동작하면서 또다른 메서드가 필요하면 그 메서드를 부르게되고 위에다시쌓인다

그렇게 아래에있는 메서드가 하나씩부르면서 차곡차곡 쌓이다가 맨위에 메서드가 더이상 작업할게없어서 종료되면 해당하는 메서드는 빠져나가고 그다음 맨위에있는 메서드가 실행되게 된다

 

이것을 계속반복하여 main()메서드가 사라지면 프로세스가 종료된다

 

만약 둘 이상의 스레드를 만드는데 Stack을 공유하지않으면 무엇부터 실행해야되는지 알수없을것이다

그래서 스레드별로 Stack을 할당해줘서 따로 실행하게 만들어주면 어느정도 독립성을 부여해줄수있을것이다 여기서 한번 정리해보자

 

프로그램은 어떤 작업을 위한 실행 파일이라고 할수있고

프로세스는 파일을 실행하기위해 OS로부터 Code, Data, Stack, Heap의 구조로 시스템자원을 할당받는다

그리고 스레드는 프로세스안에서 작업을 처리하기위해 동작한다고 볼수있다

 

여기서 이제 프로세스와 스레드의 차이점을 한번 알아보자

 

스레드는 같은 Heap영역을 공유하기떄문에 다른스레드들이 다른스레드에 쉽게 접근할수있다

하지만 프로세스는 서로 독립적인 메모리를 가지고있기떄문에 자원을 접근할수없다

접근하기위해서는 IPC 프로세스 통신기술을 사용하여야 하는데 되게 복잡한 과정을 거친다

 

여기서 스레드는 자원을 공유함으로써 동기화의 문제가 생길수있는데

이것을 해결하기위해서는 세심한 설계가 필요하다

 

 

 

 

'컴퓨터 > 컴퓨터공학' 카테고리의 다른 글

메모리의 구조 (코드, 데이터, 힙, 스택)  (0) 2023.01.29