본문 바로가기
컴퓨터 COMPUTER/Linux 리눅스

5. [Processes] : 프로세스란 무엇인가

by 매실이 maesiri 2019. 1. 29.

컴공이라면 이미 여러번 마주쳤을 두 단어가 있다.

프로세스와 프로그램.

간단히 이 두 개념을 구분하자면, 어떠한 코드가 컴파일되면 프로그램이 되고, 프로그램을 실행하면 그것이 프로세스가 된다. 프로그램은 코드의 집합체라고 생각하면 간단한데, 이걸 RAM 에 올려 CPU 가 그걸 돌릴 때 프로세스라고 한다.



따라서, 운영체제에서는 프로세스를 다음과 같이 정의한다.

process : an instance of a running program. (a program in execution)

돌아가고 있는 프로그램의 객체라고 말한다.


그렇다면 프로세스는 무엇으로 이루어져 있을까? 참고로 운영체제를 공부하기 위해 반드시 처음부터 프로세스의 구성을 제대로 알고 있어야 한다. ★매우 중요★

① Images

1) code : ㄹㅇ 말그대로 코드

2) data : 변수 같은 것들

3) stack : 함수 내의 모든 위치들을 저장.. 좀 더 보면 알겠지만 스택에서의 위치를 통해 이 프로세스가 지금 함수 내의 어디에 있는지 알 수 있게 된다.

4) heap : 동적 메모리. malloc 과 같이 동적으로 메모리 공간을 사용하는 함수에 쓰기 위해 동적 메모리가 프로세스마다 존재한다.

② Process context

1) program context : 프로세스가 어디에서 진행 중인지 그 상황을 저장

- data register

- program counter (PC), stack pointer (SP)

SP 는 runtime stack 의 top 을 항상 가리키고 있다. 왜 존재하는지는 .. 좀 더 후에 !

2) kernel context : 커널에게 줄 정보를 저장

- pid, gid, sid, VM structure, .. 모두 공부하다 보면 뭔지 알게될 용어들이니, 지금은 그냥 그렇구나~ 하고 넘어가면 된다.

아래 그림은 프로세스의 IMAGE 를 나타낸 것이다.



이미지는 3GB 의 코드, 데이터, 스택, 힙과 1GB의 커맨드라인 명령어, 환경변수로 나뉜다.

낮은 주소에서 시작하는 3GB가 중요하다. 이 3GB 를 'runtime stack' 이라고 부른다.


- Code 는 이미지의 가장 낮은 주소에서 시작한다. 그 위로는 Data 가 있는데, 프로그램에서 초기화된 데이터까지는 읽고 시작한다. uninitialized data 는 kernel 에 의해 프로그램이 시작하기 전에 0으로 초기화된다.

- Stack 과 Heap 은 프로그램을 읽어가면서 메모리가 생성되고 지워지고 하는데, 그 방향을 위 그림의 화살표로 나타냈다. 스택은 높은 주소에서 아래쪽으로 내려오면서 쌓이고, 힙은 위로 올라가면서 생성된다.

- 힙에는 malloc 등을 통해 생성되어야 하는 동적메모리가 위치한다.

- 스택과 힙 사이에는 표준 라이브러리들의 이미지가 매핑된다. 예를 들면 libc.

- 프로그램 카운터 (PC) 는 위 런타임스택에서 현재 코드가 도는 위치로 계속 이동하여 프로그램이 어디까지 돌았는지 알려준다.


각 프로세스마다 Image, Process context 를 담은 아주 큰 자료구조를 가지고 있는데, 이를 Process Control Block (PCB), 혹은 Process Descriptor (PD) 라고 한다.

리눅스의 이 커다란 자료구조 코드 내부를 뜯어보면, struct mm_struct *mm, 이라는 부분이 Task Image(Code, Data, Stack) 를, 그리고 struct_thread_struct thread; 부분이 Program context 를 나타내는데 이 작은 부분을 제외한 모든 다른 부분은 Kernel context 를 나타낸다. 




개인 공부 정리용으로 작성한 글입니다. 틀린 부분이 있을 수 있으니 참고용으로만 사용해주세요. 틀린 부분은 댓글로 알려주세요.♥


반응형

댓글