[작성 중] 프로세스 및 스레드에 대한 이해 정리




목표

본 포스팅에서는 한국 및 일본 정보처리 산업기사 및 기사(Industrial Engineer & Engineer)에도 포함 되는 프로세스에 대한 기초적인 이해를 목표로 하고 있습니다. 더 나아가 컨텍스트 스위칭 및 웹 어플리케이션에서의 적용에 대해 설명합니다.




목차

  1. 프로세스 이해의 필요성
  2. 프로세스
    1) 프로세스 상태
    2) [작성 중] 구조에 대해서
    3) [작성 중] 스케쥴링에 대해서
    4) [작성 중] fork, cgi, mod_xxx
  3. [작성 예정] 스레드
    1) 멀티 스레딩
  4. [작성 예정] 컨텍스트 스위칭
  5. [작성 예정] 간단한 코드 예시
  6. [작성 예정] 정리



1. 프로세스 이해의 필요성



클라이언트의 요구 사항들이 꾸준히 늘어가면서, 웹 상에서 처리해야 하는 로직이 점점 복잡해지고 있습니다. 특정 규모의 서비스를 꾸준히 제공하기 위해서는, 아키텍처의 개선에 대한 요구를 동반하기도 합니다.

뿐만 아니라, 서비스가 안정적으로 자리를 잡으면 처리해야 할 클라이언트의 수도 증가하는데, 이를 위한 아키텍처 개선을 위해 기본적인 프로세스 및 스레드의 이해를 필요로 합니다.





과거의 운영체제(MS-DOS 등)는 윈도우, 리눅스, 유닉스와 같은 운영체제와 대조적으로 한 번에 하나의 작업만이 가능했습니다. 요즘의 운영체제에서 흔히 여러 개의 프로세스를 동시에 실행하여 작업하는 것을 멀티 태스킹multi-tasking이라고 하며, 특정 작업을 하나 이상의 프로세스에서 병렬로 처리하는 것을 멀티 프로세싱multi-processing이라고 합니다.

여기서, 우리가 하드디스크에 설치하여 사용하는 여러 게임들 및 인터넷과 같은 응용 프로그램을, 메모리 위에 올려 실행 중인 작업task이 프로세스process가 됩니다.




2. 프로세스

프로세스는 활성 프로그램, 즉 실행되고 있는 프로그램의 인스턴스 입니다. 유저로부터 받은 이벤트 처리와 같이 사소한 백그라운드 이벤트부터 Internet Explorer와 같은 응용 프로그램의 실행 등을 담당합니다. 운영체제에는 많은 백그라운드 작업이 실행되고 있으므로, 시스템에서는 항상 실제 프로그램보다 더 많은 프로세스가 실행되고 있습니다.

프로그램 실행 시 OSoperating system는 프로세스에 아래와 같은 구조의 독립된 메모리 영역을 할당합니다.

  • Code
  • Data
  • Stack
  • Heap

메모리 영역은 프로그램의 소스 코드(텍스트), 데이터, 프로그램의 활동들을 포함합니다. 실행 파일을 클릭했을 때, 운영체제에서 메모리의 할당이 이루어집니다. 이 메모리 공간으로 명령어를 담은 이진binary 코드가 올라가는데, 이 순간부터 프로그램이 프로세스가 됩니다.


1) 상태에 대해서

프로세스는 메모리에 올라감과 동시에 아래와 같은 5가지 상태를 가지게 됩니다.

  • 생성(New): 프로세스가 생성되었다는 상태
  • 준비(Ready): 메모리 할당 허가를 기다리는 상태
  • 대기(Waiting): 프로세스가 스케쥴 이벤트를 기다리고 있는 상태
  • 실행(Running): 프로세스가 프로세서를 차지하고 명령어들이 실행되고 있는 상태
  • 종료(Terminated): 프로세스의 실행이 종료된 상태


2) 구조에 대해서

  1. 코드(Code)

텍스트의 형태로 코드가 올라가는 영역으로, 프로그램의 명령어가 올라가는 곳 입니다. 컴파일 시, Read-Only의 영역으로 지정되기 때문에 중간 수정을 할 수 없습니다.

2.데이터(Data)

컴파일 시 할당되어 프로그램이 종료될 때까지 값이 반환 되지 않는 영역으로, 전역변수, 정적 변수(static), 배열 등이 할당되는 곳입니다. 초기화의 여부에 따라 Data와 Bss로 나뉘누는데, 초기화 된 데이터는 Data 영역, 초기화되지 않은 데이터는 BSS(Block Stated Symbol) 영역에 저장됩니다. 함수 내부에 선언된 Static 변수의 경우, 초기에 공간만 할당된 후 실제 함수가 실행될 때 초기화됩니다.

3.스택(Stack)

프로세스 실행의 가장 기본 구조는 스택 구조로, 스택의 영역과 사이즈는 그림과 같이 각 프로세스마다 할당됩니다. 컴파일 시, 프로세스가 메모리에 로드 되면서 스택의 사이즈를 지정하기 때문에 런타임 시에는 사이즈를 바꿀 수 없습니다.

스택 구조는 가장 최근에 들어간 값이 가장 먼저 나오는 후입선출Last In First Out입니다. 스택 영역은 지역변수와 매개변수의 할당에 쓰이는데, 이와 같은 역할을 수행하기 위해서 함수의 호출과 리턴에 따라 push 명령어로 값을 추가하고 pop 명령어를 통해 값을 제거합니다. push, pop 명령 호출 시 스택 포인터가 각각 위 아래로 이동하며 위치를 표시합니다.

스택과 함수 호출에 대해서는 아래를 인용합니다.

… 그런데 현대 프로그램의 실행에서 이에 못지 않게 중요한 것이 함수여서 함수의 시작부로 이동했다가 리턴하면 호출한 다음 문장으로 돌아오는 제어의 이동이 많이 사용된다. 프로그램의 실행이란 이러한 제어의 흐름이나 함수 호출 관계가 어떻게 바뀌느냐에 따라 다양한 경로와 계산을 수행하고 다른 결과가 나오게 된다.

이러한 함수의 호출에 따라 지역변수와 매개변수의 메모리 영역이 할당되어야 한다. 한 함수에 대해 할당되는 영역을 스택프레임이라고 하고 이들은 그 함수가 동작하는 동안에만 유지되고 함수의 반환 시에 사라진다. 또한 함수 안에서 다른 함수를 호출할 수 있고 그 경우 제일 마지막에 호출된 함수가 가장 먼저 반환하므로 프레임들은 스택 형태로 쌓이게 된다.

출처 [프로그래밍노리터]

4. [작성중]힙(Heap)

런타임 시 할당되는 영역으로, 개발자가 인위적으로 할당한 후 반환할 수 있습니다. new 생성자를 예로 들 수 있습니다.

*Stack Overflow?
Stack은 메모리를 사용할 때, 로컬 변수를 사용하고 반환하는 식으로 주소 값, 즉 스택 포인터를 아래에서 윗 방향으로 움직입니다. 반대로 Heap은 위에서 아래 방향으로 채워나갑니다. 서로 주소 값을 채우다 Stack에서 Heap 방향으로 영역을 침범하는 경우를 Stack Overflow라고 합니다. Heap에서 Stack 방향으로 영역을 침범하는 경우에는 Heap Overflow입니다. 각각의 오버플로우는 시스템의 손상을 야기하여 취약점이 되며, 이를 악용하는 사례가 많습니다.

3) 프로세스 스케쥴링에 대해서

프로세스 스케쥴링이 필요한 이유

4) fork, cgi, mod_xxx