Process: 두 판 사이의 차이

youngwiki
44번째 줄: 44번째 줄:
==Private Address Space / User and Kernel Modes==
==Private Address Space / User and Kernel Modes==
[[파일:Process_Address_Space.png|테두리|프레임없음|316x316픽셀]][[파일:StackStructure.jpg|테두리|프레임없음|366x366픽셀]]
[[파일:Process_Address_Space.png|테두리|프레임없음|316x316픽셀]][[파일:StackStructure.jpg|테두리|프레임없음|366x366픽셀]]
프로세스는 각 프로그램이 시스템의 주소 공간을 독점적으로 사용하는 것처럼 보이도록 한다. 주소가 n개의 비트로 나타내지면 2^n개의 주소값이 존재한다. 이때 프로세스는 각 프로그램에 다른 프로세스가 접근할 수 없는 고유한 주소 공간을 제공한다.  
프로세스는 각 프로그램이 시스템의 주소 공간을 독점적으로 사용하는 것처럼 보이도록 한다. 주소가 n개의 비트로 나타내지면 2^n개의 주소값이 존재한다. 이때 프로세스는 각 프로그램에 다른 프로세스가 접근할 수 없는 고유한 주소 공간을 제공한다.  



2025년 3월 18일 (화) 06:39 판

상위 문서: Exceptions and Processes

개요

Process(프로세스)란 실행하고 있는 프로그램의 객체를 의미한다. 프로세스를 실행하는 프로세서(CPU)나 프로세스가 실행하는 대상인 프로그램과는 구별되는 개념이다. 프로그램을 실행할 경우 프로세스에는 메모리와 CPU를 할당하며 이를 통해 프로세스가 탄생한다. 우리의 관점에서는 프로세스를 실행하면 두가지 마법같은 일이 일어난다.

  • 해당 프로세스가 모든 메모리를 독점적으로 사용하는 것처럼 보임
  • 해당 프로세스가 중단되는 일 없이 하나씩 연속적으로 명령어를 실행하는 것 처럼 보임

컴퓨터의 메모리는 다음과 같이 구성된다.

Multiprocessing

시스템의 각 프로그램은 어떤 프로세스 내의 Context(맥락)[1][2] 내에서 실행된다. 사용자가 프로그램을 실행할 때마다 새로운 프로세스를 생성하고 해당 프로세스의 Context에서 실행 파일 객체를 생성한다. 이때 각각의 프로세스는 모든 메모리를 독점적으로 사용하는 것 처럼 보이며, 해당 프로세스가 중단되는 일 없이 하나씩 연속적으로 명령어를 실행하는 것 처럼 보인다. 이는 프로세스 개념에 의해서 다음과 같이 구현된다.

  • An independent logical control flow: 각 프로그램이 CPU를 독점적으로 사용하는 것처럼 보이게 함
    • context switching이라는 커널의 메커니즘에 의해서 구현됨
  • A private address space: 각 프로그램이 메모리를 독점적으로 사용하는 것처럼 보이게 함
    • virtual memory라는 커널의 메커니즘에 의해서 구현됨

The (Traditional) Reality

하나의 프로세서(CPU)가 concurrently하게 다수의 프로세스를 처리한다.

  1. 현재의 register들을 메모리에 저장함
  2. 실행에 대한 다음 프로세스를 스케쥴링함
  3. 저장된 register를 로드하고 address space를 전환함 (context switch)

The (Modern) reality

  • 하나의 칩에 여러 CPU가 존재함
  • CPU들은 메인 Memory와 몇몇 cashes들을 공유함
  • 각각의 CPU들은 커널에 의해서 스케쥴링 되어 병렬적으로 각각의 프로세스들을 실행함

Logical Control Flow

Logical Flow

프로세스는 여러 프로그램이 동시에 실행되고 있음에도 각 프로그램이 CPU를 독점적으로 사용하고 있는 것처럼 보이도록 한다. 이런 프로그램의 진행을 디버거를 이용하여 추적할 경우에 program counter를 관찰할 수 있는데 이러한 PC의 흐름을 logical control flow(Logical flow)라고 한다. 이때 Logical flow는 예외 처리기, 프로세스, 쓰레드 등의 여러가지 형태로 존재한다. 오른쪽 그림에서처럼 세개의 프로세스가 실행될 경우 세개의 Logical flow로 진행되며, 이는 프로세스들이 번갈아 가면서 CPU를 이용한다는 것을 의미한다. 이때 각 프로세스들은 자신의 흐름의 일부를 실행한 후에 타 프로세스의 차례가 되면 해당 실행을 중지한다.

Concurrent Flow

Concurrent Flow란 한 Logical flow의 실행이 다른 flow와 시간적으로 겹치는 경우를 의미한다. 흐름 X가 흐름 Y가 시작된 이후, 종료되기 이전에 시작되거나, Y가 X가 시작된 이후, 종료되기 이전에 시작되면, X와 Y는 서로에 대해 동시적(concurrent)이다. 예를 들어서 A,B 그리고 A, C는 Concurrently하게 실햄됨. 하지만 B와 C는 그렇지 않다.

  • A의 프로세스가 종료되기 전에 B(C)의 프로세스가 시작되었기 때문

프로세스가 다른 프로세스들과 번갈아서 실행하는 것을(concurrently하게) multitasking이라고 한다. time slice란 자신의 flow 일부를 실행하는 단위를 의미한다.[3]

Private Address Space / User and Kernel Modes

프로세스는 각 프로그램이 시스템의 주소 공간을 독점적으로 사용하는 것처럼 보이도록 한다. 주소가 n개의 비트로 나타내지면 2^n개의 주소값이 존재한다. 이때 프로세스는 각 프로그램에 다른 프로세스가 접근할 수 없는 고유한 주소 공간을 제공한다.

또한 각 주소 공간에 저장된 내용은 다를지라도 공간 자체는 공통 구조를 가진다. 주소 공간은 Code, Data, Heap, Stack으로 구분된다. 하단은 Code공간으로 0x000000~0x400000에 해당하며 프로그램의 코드를 저장하는 부분이다. 상단은 커널을 위해서 예약되며 프로세스를 대신해 커널이 명령어를 실행할 때 사용된다.

Context Switches

Scheduduling은 프로세스가 실행하는 도중 커널이 현재의 프로세스를 preempt하고 이전에 preempt된 프로세스를 재시작하기로 결정하는 것이다. 이때 커널이 새로운 프로세스를 선택하는 경우 해당 프로세스를 스케쥴링 했다고 한다. 이러한 scheduling에 사용되는 메커니즘을 Context Switches이라고 한다. 이때 Context란 커널이 preempt된 프로세스를 재시작하기 위해 필요로하는 상태이다. 이는 다음의 메커니즘을 따른다.

  1. 현재 프로세스의 컨텍스트를 저장
  2. 이전에 선점된 프로세스의 컨텍스트를 로드
  3. 로드된 컨텍스트에 해당하는 프로세스에 CPU를 할당함

System Call[4] 혹은 Interpret[5]이 발생하였을 때 해당 메커니즘이 동작한다.

Process Control

자세한 내용은 Process Control을 참조하십시오.

각주

  1. 메모리에 저장된 프로그램의 코드와 데이터와 스택, 범용 레지스터의 내용, 프로그램 카운터, 환경 변수, 열린 파일 디스크립터 집합 등
  2. 프로그램 카운터란 현재 실행중인 명령어의 메모리 주소를 저장하는 레지스터이다. 환경 변수란 OS가 프로세스에 전달하는 문자열 기반의 값이며, OS 및 사용자의 설정 정보를 제공한다. 열린 파일 디스크립터 집합이란 현재 프로세스에서 열어둔 파일을 관리하는 정수 값 목록을 의미한다.
  3. (위 예시에서 A는 두개의 time slice로 구성됨)
  4. 예를 들어서 read에 의한 System call이 있다. 이때는 disk의 데이터 로드를 기다리는 동안 다른 프로세스 실행이 요구된다.
  5. 모든 시스템은 timer interrupt가 발생했을 때 해당 메커니즘이 동작한다.