ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로세스는 뭘까?
    Apple🍎/Cocurrency 2025. 1. 27. 00:15

    프로그램은 컴퓨터가 특정 작업을 수행하기 위해 작성된 명령어들의 집합입니다.

    쉽게 말해 우리가 하드디스크에 저장해둔 실행 파일이라고 할 수 있죠.

    예를 들어 워드나 크롬 브라우저 같은 응용프로그램 파일들이 이에 해당합니다.

    프로그램은 실행되기 전까지는 그저 디스크에 저장된 정적인 상태로 존재합니다.

     

    반면 프로세스는 실행 중인 프로그램을 의미합니다. 프로그램이 실행되면 운영체제는 해당 프로그램을 메모리에 로드하고, CPU 시간과 같은 시스템 자원을 할당합니다. 이렇게 실행되어 메모리에서 동작하는 상태가 바로 프로세스입니다. 

     

    초기 컴퓨터 시스템에서는 한번에 하나의 프로그램만 실행할 수 있었습니다.

    프로그램은 CPU, 메모리와 같은 컴퓨터의 모든 자원을 독점적으로 사용했기 때문에 자원 관리는 비교적 단순했습니다.

    하지만 다른 프로그램을 실행하기 위해서는 먼저 실행되고 있는 프로그램이 종료를 기다려야 했습니다. 

     

    또한 프로그램이 입출력 작업(모니터로 데이터 출력이나 디스크에서 데이터 읽기)을 수행할 때 CPU는 해당 작업이 완료되기를 기다려야했습니다. 이렇게 실행되고 있는 프로그램이 CPU를 사용하지 않는 시간 동안은 아무도 이를 이용하지 못한 채 유휴 상태로 남아 있게 되었습니다.

     

     

    입출력 작업을 기다리는 동안 CPU가 아무 일도 하지 못하는 비효율성을 해결하기 위해 시분할 시스템이 개발되었습니다. 

     

    시분할 시스템은 “CPU를 사용할 수 있는 시간을 아주 작은 조각으로 나누어서, 여러 프로그램이 번갈아가며 실행되면 어떨까?”라는 아이디어에서 출발했습니다. 

     

    프로그램이 실행되기 위해서는 CPU의 연산자원이 필요합니다. 

    운영체제는 CPU을 활용할 수 있는 시간을 아주 작게 나눈다음에 이 나눈 시간들을 프로그램들이 번갈아가며 사용할 수 있도록 합니다. 

    이렇게 하면 CPU는 아주 빠른 속도로 프로세스들을 번갈아가며 실행하고, 사용자는 마치 여러 프로그램이 동시에 실행되는 것처럼 느끼게 됩니다. 

     

     

    시분할 시스템이 도입되면서 여러 프로그램이 번갈아가며 실행되는 환경이 만들어졌습니다.

    이런 환경에서는 각 프로그램의 실행 상태를 체계적으로 관리할 필요가 생겼습니다.

     

    이러한 필요성에 의해 '프로세스'라는 개념이 탄생했습니다. 프로세스는 실행 중인 프로그램을 의미하며, 단순한 프로그램 코드 이상의 의미를 가집니다. 프로세스는 실행 중인 프로그램의 코드뿐만 아니라, 현재 실행 상태, 사용 중인 자원 등 모든 정보를 포함하는 개념입니다.

     

    PCB(Process Control Block)의 개념

    PCB는 각 프로세스의 정보를 저장하는 데이터 구조입니다.

    운영체제는 PCB를 통해 프로세스들을 관리하고 제어합니다. 한 프로세스에서 다른 프로세스로 전환될 때(문맥 교환, Context Switch), PCB에 저장된 정보를 사용하여 프로세스의 실행을 정확히 재개할 수 있습니다.

     

    PCB의 주요 구성 요소

    PCB는 프로세스를 관리하는 데 필요한 다양한 정보를 포함합니다

     

    • 프로세스 식별자(Process ID) :  프로세스의 고유한 식별 번호입니다.
    • 프로세스 상태(Process State) : 프로세스가 현재 어떤 상태에 있는지를 나타냅니다
    생성(new) 프로세스가  만들어진 상태
    실행(running) CPU를 사용하여 실행 중인 상태
    대기(waiting)  I/O 작업 등을 기다리는 상태
    준비(ready) CPU를 사용할 준비가 된 상태
    종료(terminated) 실행이 끝난 상태

     

    • 프로그램 카운터(Program Counter) : 다음에 실행할 명령어의 위치를 가리킵니다. 마치 책갈피처럼, 프로세스가 어디까지 실행되었는지를 기억하는 역할을 합니다.
    • CPU 레지스터 : 프로세스가 사용하던 CPU 레지스터들의 값을 저장합니다. 문맥 교환 시 이 값들을 보존해야 프로세스가 정확히 재개될 수 있습니다.
    • CPU 스케줄링 정보 : 프로세스의 우선순위, CPU 사용 시간 등 CPU 스케줄링에 필요한 정보를 포함합니다.
    • 메모리 관리 정보 : 프로세스가 사용하는 메모리의 위치와 크기 등을 저장합니다.
    • 입출력 상태 정보  : 프로세스가 사용 중인 입출력 장치나 파일들에 대한 정보를 포함합니다.

    PCB를 이용하여 운영체제가 각 프로세스를 관리할 수 있게되면서 여러 프로그램을 동시에 메모리에 올려두고 번갈아가며 프로그램을 실행시킬 수 있게 되었습니다. 

     

     

    하지만 여기서 중요한 질문이 생깁니다. 각 프로세스는 메모리에서 실제로 어떻게 존재할까요?

     PCB가 프로세스의 관리 정보를 저장한다면, 프로세스의 실제 내용들(코드, 데이터 등)은 어디에 어떻게 저장될까요?

    이를 이해하기 위해서는 프로세스의 메모리 구조를 자세히 살펴볼 필요가 있습니다. 

     

    프로세스의 메모리는 커널 영역사용자 영역으로 구분되며, 두 영역 사이에는 보호 경계(Protection Boundary)가 있습니다. 이 보호 경계는 사용자 프로그램이 운영체제의 핵심 부분에 직접 접근하는 것을 차단하는 보안 장치로, 사용자 프로그램은 커널의 기능이 필요할 때 반드시 시스템 콜이라는 정해진 인터페이스를 통해 요청해야 합니다.

     

    먼저 커널 영역에는 PCB가 저장됩니다. PCB는 앞서 설명드린 것처럼 프로세스의 관리를 위한 정보를 담고 있는 데이터 구조입니다. 

     

    이제 사용자 영역의 구조를 자세히 살펴보겠습니다.

    사용자 영역은 크게 정적 할당 영역과 동적 할당 영역으로 구분됩니다.

     

    사용자 영역

    정적 할당 영역

    1. 코드 영역 (텍스트 영역)

       - 실행할 프로그램의 명령어(소스 코드)들이 저장되는 공간입니다

       - 읽기 전용(Read Only)으로 설정되어 있어 프로그램이 실행 중에 변경될 수 없습니다

       - 이는 프로그램의 코드가 실수로 수정되는 것을 방지하고 보안을 강화하기 위함입니다

     

    2. 데이터 영역

       - 프로그램이 실행되는 동안 계속 유지되어야 하는 데이터들이 저장됩니다

       - 전역 변수나 static 변수가 이 영역에 저장됩니다

     

    동적 할당 영역

    1. 힙(Heap) 영역

       - 프로그래머가 필요할 때 직접 메모리를 할당하고 해제할 수 있는 영역입니다

       - 동적으로 크기가 결정되는 자료구조(예: 동적 배열, 연결 리스트)를 저장할 때 사용됩니다

       - 메모리 누수(Memory Leak)를 방지하기 위해 할당 후에는 반드시 해제해야 합니다

     

    2. 스택(Stack) 영역

       - 함수 호출과 관련된 정보들이 임시로 저장되는 영역입니다

       - 함수의 매개변수, 지역변수, 리턴 주소 등이 저장됩니다

       - 함수가 호출될 때 생성되고 함수가 종료되면 자동으로 해제됩니다

       - LIFO(Last In First Out) 구조로 동작합니다

       

     

    스택과 힙의 중요한 차이점

      스택
    할당/해제 방식 컴파일러가 자동으로 관리 프로그래머가 직접 / 할당 해제 
    속도  단순한 포인터 이동으로 동작하므로 빠름 할당/해제 시 메모리 관리가 필요하므로 상대적으로 느림
    크기 제한 운영체제가 프로세스마다 제한된 크기를 할당  사용 가능한 메모리 크기까지 확장 가능

     

    정리

    시분할 시스템이 도입되기 전에는 한 번에 하나의 프로그램만 실행할 수 있었습니다. 
    이 방식에서는 한 프로그램이 끝나야만 다음 프로그램을 실행할 수 있었죠.

    시분할 시스템의 도입으로 CPU는 아주 짧은 시간 단위로 여러 프로그램을 번갈아가며 실행할 수 있게 되었습니다. 예를 들어, 문서 작성 프로그램과 음악 재생 프로그램을 동시에 실행하면, CPU는 매우 빠른 속도로 두 프로그램을 번갈아 처리합니다. 이 전환이 너무 빨라서 사용자는 마치 두 프로그램이 동시에 실행되는 것처럼 느끼게 됩니다. 

    이러한 시분할 시스템의 구현을 위해서는 '프로세스'라는 개념이 필수적이었습니다. 프로세스는 실행 중인 프로그램의 인스턴스로, 각각의 프로세스는 자신만의 메모리 공간과 시스템 자원을 할당받아 독립적으로 실행됩니다. 이를 통해 여러 프로그램이 서로 방해하지 않고 안전하게 실행될 수 있게 되었습니다.

    이러한 발전은 오늘날 우리가 당연하게 여기는 멀티태스킹의 토대가 되었습니다.

     

    'Apple🍎 > Cocurrency' 카테고리의 다른 글

    쓰레드는 뭘까?  (0) 2025.01.27
    동시성 이해를 위한 컴퓨터 기본 구조  (0) 2025.01.26

    댓글

Designed by Tistory.