본문 바로가기

안드로이드 Android

프로세스와 스레드

안녕하세요 LONER입니다. 오늘도 블로그 포스팅을 통해서 저의 지식을 정리해보도록 가겠습니다. 누군가에게 제 지식이 도움이 되길 바라며 개발자가 반드시 알아야할 기본적인 소양중 하나인 운영체제 지식을 한번 살펴보도록 하겠습니다. 오늘은 잊을만하면 등장하는 프로세스(process)스레드(thread)에 대해 정리해보려고 합니다. 


우선 프로세스스레드를 알아보기 전에 메모리 구조에 대해 알아보도록 하겠습니다. 컴퓨터 프로그램이 실행되기 위해서는 당연히 프로그램이 메모리에 로드(load) 되어야합니다. 그리고 프로그램 안에서 사용할 변수들을 담을 메모리도 같이 필요합니다. 운영체제는 프로그램을 실행 하기 위해서 다양한 메모리를 제공해야합니다.

이 포스팅은 프로그램이 운영체제로 부터 받는 다양한 메모리중 가장 대표 격인 4가지 공간을 소개해보도록 하겠습니다.1) 코드 영역 2) 데이터 영역 3) 스택 영역 4) 힙 영역 이렇게 4가지로 나뉩니다. 이 4가지를 이해하면 프로세스 혹은 스레드를 이해하는데 더 도움을 받으실 수 있을겁니다.

1. 코드 영역 


운영체제에서 할당해주는 메모리의 코드 영역실행할 프로그램 코드를 저장하는 영역으로 사용이 됩니다. 마치 간단한 메모장의 텍스트가 적혀있는 것처럼 코드 영역에 코드가 텍스트처럼 존재하기 때문에 텍스트 영역이라고 부르기도 합니다. CPU가 이 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.

더 정확히는 프로세스가 실행할 코드와 상수가 컴퓨터가 알아들을 수 있는 기계어의 형태로 저장되는 저장 공간 입니다. 컴파일 타임에 이 영역이 결정되고 중간에 코드를 바꿀 수 없습니다.


2. 데이터 영역


데이터 영역전역 변수 혹은 static 변수 (정적) 등등이 저장되는 공간입니다. 코드 영역과 달리 전역 변수나 static 변수를 수정 할 수 있습니다. 데이터 영역은 프로그램의 시작과 함께 생성이 됩니다. 반면 프로그램이 소멸되어야 데이터 영역도 같이 소멸됩니다.

3. 스택 영역

스택은 마치 프링글스 과자통과 같다.


개발자라면 한번쯤 들어봤을 그 스택 입니다. 프로세스의 메모리공간을 관리하기 위한 알고리즘 중 하나 입니다. 스택 영역은 함수와 관련이 매우 깊습니다. 함수안에 있는 지역변수,매개변수,리턴값,다시 돌아갈 주소값 등등이 저장됩니다. 그래서 스택은 함수 호출 동시에 생성이되고 함수 종료시 소멸됩니다.

스택 영역안에 함수 관련정보가 저장된 곳을 스택프레임이라고 부르기도 합니다. 개발자가 한번쯤 들어봤을 그 스택의 알고리즘 답게 당연히 push로 데이터를 저장하고 pop으로 데이터를 꺼내씁니다. 그렇게 후입 선출로 방식에 따라 동작합니다. 

그리고 컴파일 타임에 이 스택의 크기가 정해지기 때문에 무한한 스택 공간을 제공 받을 수 없습니다. 그래서 우리가 흔히 많이 들어본 스택 오버 플로우는 정해진 공간에 비해 더 많은 데이터를 넣게 됬을 때 발생하는 경우 입니다. 

스택 폭발!!!


4. 힙 영역

누가 내 프로그램을 사용하는가


힙 영역런타임에 관리가 되거나 결정이 되는 영역입니다. 그래서 개발자 보다는 프로그램 사용자에 의해서 메모리 공간이 동적으로 할당되거나 해제 되는 공간입니다. 스택보다 할당할 수 있는 메모리 공간이 훨씬 더 많다는게 매우 큰 장점 입니다. 하지만 힙 영역을 잘 관리 하지않는다면 메모리 누수가 발생하기 때문에 반드시 안쓰는 값은 할당을 해제해야합니다.

프로세스스레드를 설명드리기전에 이렇게 크게 4가지를 살펴보았습니다. 프로세스 혹은 스레드 설명할 때 잊을만 하면 등장하는 녀석들이라서 기억해두시면 매우 좋을 것 같습니다. 그 다음 본격적으로 프로세스스레드에 관해서 한번 정리를 해보도록 하겠습니다.


프로세스 (Process)

멋있어서 가져온 사진입니다.



면접에서 대답하면 좋을만한 소개부터 하겠습니다. 프로세스는 실행중인 프로그램의 디스크로부터 메모리에 적재되어 있는 CPU의 할당을 받을 수 있는 것을 뜻합니다. 여기서 프로그램은 "어떤 작업을 실행할 수 있음" 의미하고 프로세스는 "작업을 실행하고 있는 상태"라고 볼 수 있습니다.

프로세스는 메모리에 올라와서 실행되고 있는 독립적인 개체를 뜻합니다. 프로세스는 프로그램에게 독립된 영역을 할당 받게 됩니다. 이 영역은 위에 언급한 코드, 데이터, 스택, 힙이 포함 되어 있습니다. 그리고 프로세스는 기본적으로 최소 1개이상의 스레드를 가지고 있습니다. 이를 메인스레드 라고 합니다.

그리고 프로세스는 각각마다 별도의 주소 공간에서 실행되며, 다른 프로세스의 변수나 자료에 접근할 수 없도록 되어있습니다. 


스레드 (Thread)

실제 안드로이드 코딩을 할때 가장 직접적으로 와닿는 명칭인 스레드에 대해 소개해보도록 하겠습니다. 프로세스에서 반드시 1개이상의 스레드를 가지고 있어야 했습니다. 이 말은 즉 스레드 또한 프로세스 내에서 동작됩니다. (그렇기 떄문에 프로세스와 스레드를 이해하지 못하는 분들에게 흔히 프로세스는 공장이고 스레드는 생산직 직원이라고 비유 설명을 하는 경우도 많이 봤습니다. 그럼 프로그램은 돈 많은 사장인가)

스레드는 프로세스의 실행 단위라고 보시면 됩니다. 가장 실질적인 행위를 하는 녀석 입니다. 그리고 스레드는 프로세스 내에서 스택만 따로 할당을 받게 됩니다. 그외 코드,데이터, 힙은 프로세스 내에서 공유해서 사용합니다. 즉 2개의 스레드가 있다면 2개의 스레드가 하나의 코드,데이터,힙 영역을 같이 쓸 수 있다는 얘기입니다. 

가끔 스레드가 실수로 같은 자원을 건드려 에러 뜨는 경우도 있다. 인형 찢어지겠다.


그렇기 때문에 안드로이드에서 쓰레드를 생성하고 스레드에서 처리한 결과나 전역변수를 다른 스레드와 공유할 수 있는 이유가 스레드스택만 할당받고 힙,코드,데이터를 따로 쓰기 때문 입니다. 스레드는 스택, ID, 프로그램 카운터, 레지스터 집합으로 구성됩니다.

이상 스레드와 프로세스에 대해 정리를 해봤습니다. 위에 정리한 것 말고도 프로세스 컨트롤 버스컨텍스트 스위칭이나 멀티스레드 등등에 관해 언급이라도 해볼까 했으나 대부분의 개발 지식이 그렇듯 어느정도 지식단계를 밞아가야 이해가 되기때문에 추가적으로 적지는 않았습니다. (사실상 위 내용도 어느정도 기본 정도의 개념은 알아야 이해할 수 있을 듯 하네요)


오늘도 소프트웨어 장인을 꿈꾸는 LONER 였습니다. 읽어주신 분이 계시다면 감사드립니다.