컴공이라면 이미 여러번 마주쳤을 두 단어가 있다.
프로세스와 프로그램.
간단히 이 두 개념을 구분하자면, 어떠한 코드가 컴파일되면 프로그램이 되고, 프로그램을 실행하면 그것이 프로세스가 된다. 프로그램은 코드의 집합체라고 생각하면 간단한데, 이걸 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 를 나타낸다.
개인 공부 정리용으로 작성한 글입니다. 틀린 부분이 있을 수 있으니 참고용으로만 사용해주세요. 틀린 부분은 댓글로 알려주세요.♥
'컴퓨터 COMPUTER > Linux 리눅스' 카테고리의 다른 글
7. [Process Switching] : 프로세스 스위칭, 프로세스 순서매기기 (0) | 2019.01.30 |
---|---|
6. [Process State, Scheduling] : 프로세스의 상태와 스케쥴링 (0) | 2019.01.30 |
4. [Virtual Machine(VM)] : 가상머신이란 무엇인가 (0) | 2019.01.29 |
3. [System Call Handling] : 운영체제는 어떻게 시스템콜을 핸들링하는가. + System call vs. API (0) | 2019.01.29 |
2. [OS service, structure and design] : 운영체제의 역할, 구조, 디자인 (0) | 2019.01.29 |