티스토리 뷰

<Process 관련 이전 글 보기 >

1. 프로세스(Process)란 무엇일까?

2. 프로세스(Process)의 Lifetime과 Process State



  이번엔 Process Address Space(프로세스 주소 공간)에 대해서 알아보겠습니다. 앞서 프로세스 상태(Process State)까지 알아보았는데요. 프로세스는 CPU에 의해서 실행이 되고 memory에 저장이 된다고 알아보았었습니다. 그럼 이 부분에 대해서 좀 더 자세히 알아보겠습니다. 우선 그림을 보겠습니다.



  프로그램(Program)이 실행되면 프로세스 주소 공간(Process Address Space)이 Memory에 할당(생성) 되는것을 보실 수 있습니다. 할당 된 process를 실행시키는것은 CPU가 되게 되죠. 그럼 Process Address Space에 무엇이 있는지 들어가 보겠습니다.


 Process Address Space

Code Segment (코드 부분)

 프로그램의 코드가 저장되어있다.

읽기만 가능하다.

 Data Segment (데이터 부분)

 전역 변수(global variables) 같은 데이터가 저장되어 있다.

 읽고 쓰기가 가능하다.

 Stack Segment (스택 부분)

 함수(function) 나 지역 변수(local variables)가 저장되어 있다.

 읽고 쓰기가 가능하다.



1) Code Segment

  표에서 보실 수 있듯이 코드가 저장되어 있는 부분입니다. 프로그램의 코드는 바뀌어서는 안되므로 읽기만 가능한 부분입니다.


2) Data Segment

  전역 변수 같은 데이터를 관리하는 부분입니다. 함수의 바깥에 있는 데이터(전역 변수)를 저장해 놓는다고 보시면 됩니다. 변수는 변할 수 있으므로 읽고 쓰기가 가능합니다


3) Stack Segment

  함수나 함수 안에 있는 지역 변수를 저장해 놓는다고 보시면 됩니다. 변수는 변할 수 있으므로 읽고 쓰기가 가능합니다.


  Process Address Space안은 이렇게 이루어져 있습니다. 그림을 통해 봐보겠습니다.



  그림을 보면서 다시 간략히 정리하면 Program이 실행되면 Process가 생성이 되고 Memory에 그 process의 Address Space가 할당되게 됩니다. 그리고 그 Address Space안은 위 그림과 같이 Code, Data, Stack 부분으로 이루어져 있습니다.


그럼 3가지로 나뉘어진 부분에 대해서 조금만 더 살펴보겠습니다. 질문은 드레그를 하시면 읽으실 수 있습니다. 스스로 답변을 내려보시고 확인해 주세요.(모바일의 경우 꾹 누르셔서 드래그 하시면 됩니다)


Q1. 왜 Code 부분을 따로 두었나? (Why OS separates code segment?)

A1. Program의 Code는 Program이 만들어지고(컴파일되고) 나서는 바뀔 일이 전혀 없습니다. 따라서 읽기만 가능한 Read Only 부분입니다. 그렇기 때문에 같은 프로그램을 실행시켜 몇 개의 Prcess가 실행되더라도 같은 프로그램이라면 Code 부분은 다 똑같은 내용을 가지고 있게 됩니다. 따라서 같은 Program의 Process일 경우 Code 부분을 공유(Share)하여 메모리 사용량을 줄이는 목적입니다.


Q2. 왜 Stack 부분과 Data 부분을 나누었나? (Why Os separates stack from data segment?)

A2. 일단 Stack이란 구조해 대해서 알아야 합니다. Stack 구조는 아래의 사진과 같이 이루어져 있습니다. 하단 부가 막혀있고 상단 부가 뚫려있는 구조라고 생각하시면 됩니다. 따라서 한 쪽으로만 데이터를 집어 넣을 수 있고 꺼낼 때는 최근에 집어넣었던 것 부터 꺼낼 수 밖에 없는 구조입니다. C언어를 예로 들면 함수의 호출이 stack 구조로 되어있다고 보시면 됩니다.


2번째 질문의 내용을 적다보니 Stack이 와닿지 않을 수도 있어 추가로 설명을 하겠습니다. 다음과 같은 C언어 코드가 있습니다.



main 함수부터 실행이 되며 처음 printf를 수행한뒤 함수 func1을 실행하게 됩니다. 함수 func1이 실행되고 나서 main에서 다시 printf를 실행하고 함수 func2를 실행합니다. 그리고 func2에서는 printf를 수행하고 func3를 실행하게 됩니다. Stack구조로 함수가 실행되고 있는게 글로 적어서 느낌이 안들 수도 있지만 그림으로 살펴보면 바로 오실겁니다.


  코드와 글 설명을 읽고 그림을 보시면 Stack구조가 어떠한 느낌인지 알 수 있으실 겁니다. 이러한 함수의 Stack 구조로 인해 Data 부분과 Stack 부분을 따로 나누어두게 된것입니다. 전역 변수(global variables)는 어떤 함수에서도 접근 할 수 있기 때문에 Data로 따로 관리를 해주는 것입니다. 따라서 함수 외부(Outside function)와 함수(Inside function, 지역 변수 포함)에 따라서 Stack구조 활용을 위해 나누어 두었다고 생각하시면 됩니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday