[OS] 프로세스 (1) - 의미와 생성 과정

doongidoong·2024년 1월 7일
0

운영체제

목록 보기
2/8

✅ 프로세스란 무엇인가?

  • 실행중인 프로그램
    • 실행이란 말은 CPU 스케줄러 대상이 된다는 것과 동일하다.
  • 디스크에 있는 프로그램이 메모리에 로드되면 프로세스가 된다.
    • 즉, 하나의 프로그램이 여러 프로세스가 될 수 있다

💡 프로세스 vs 프로그램
프로그램은 수동 엔티티이고, 프로세스는 액티브 엔티티이다. 즉, 프로그램은 명령들을 모아놓은 디스크의 파일인 반면, 프로세스는 이러한 명령에 대한 프로그램 카운터를 가진다.


✅ 프로세스 생성 과정

커널은 기억장치(디스크)에서 실행파일(.exe)를 가져오고 이를 메인 메모리에 할당한다. 이것이 프로세스 생성이다.

이때, 독자적인 메모리 주소 공간이 형성(Code, Data, Stack)이 일어난다.

✔️ 생성 과정

  1. PCB가 생성되며 OS가 실행한 프로그램의 코드를 읽어들여 프로세스에 할당된 메모리의 Text segment에 저장한다.

    • PCB는 주로 커널 영역에 생성된다.
  2. Code, Data, Stack 영역을 생성한다.

    • 초기화 된 전역 변수 및 static 변수를 data segment에 할당
    • HEAP과 Stack은 초기 메모리 주소만 초기화된다.
  3. PCB에 여러 정보가 기록되면 CPU를 할당받기까지 대기한다.

    • 준비 상태에서 단기 스케줄러에 의해 실행(Run)상태가 된다.
    • 정해진 시간 할당량에 따라 다시 준비 상태(Ready)가 된다.

💡 프로세스 제어 블록(PCB)
운영체제가 각 프로세스를 관리하기 위해 프로세스 별로 보유하고 있는 자신의 정보 묶음.

💡 커널
운영 체제의 핵심이 되는 프로그램으로, 운영 체제의 기능을 제공하는 중요한 소프트웨어 구성 요소이다.

  • 운영 체제의 하드웨어 추상화와 자원 관리를 담당하며, 시스템의 안정성과 보안을 유지하면서 여러 프로세스가 동시에 실행될 수 있도록 관리한다.

💡 프로세스 문맥(Process Context)

  • 프로세스의 특정 시점의 상태를 표현하는 정보
    하드웨어 문맥으로는 프로그램 카운터(PC), 각종 레지스터가 있으며 이들을 활용하여 해당 프로세스가 어디까지 실행되었는지 알 수 있다
  • 프로세스의 주소 공간도 문맥에 포함되며, 프로세스 관련 커널 자료구조인 PCB(Process Control Block)와 프로세스 커널 스택도 포함된다.


✅ 프로세스 주소 공간



앞서 말했듯이 프로세스는 생성되면서 독립적인 주소 공간을 가지게 된다.

✔️ Stack 영역

함수의 호출과 관계되는 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴값 등)를 임시로 저장하는 영역이다.

  • Stack 영역의 값은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

    💡 Stack Overflow
    재귀 함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 이러한 스택 영역을 초과하면 발생하는 에러이다.

✔️ Heap 영역

런타임에 크기가 결정되는 영역이다. 사용자에 의해 공간이 동적으로 할당 및 해제된다.

  • 주로 참조형 데이터 (ex. 클래스) 등의 데이터가 할당된다.
  • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

✔️ Data 영역

전역 변수나 Static 변수 등 프로그램이 사용할 수 있는 데이터를 저장하는 영역이다.

  • 어떤 프로그램에 전역/static 변수를 참조하는 코드가 존재한다면, 이 프로그램은 컴파일 된 후에 data 영역을 참조하게 된다.
  • 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
    • 단, 초기화 되지 않은 변수가 존재한다면, 이는 그림에는 표현되지는 않았지만 BSS 영역에 저장된다.

BSS(Block Stated Symbol)

  • 초기값 없는 전역변수, 배열, 정적 변수가 저장되는 영역
  • 초기화 된 데이터는 Data 영역에 저장되고 초기화 되지 않은 데이터는 BSS 영역에 저장됨
  • 초기화되지 않은 변수는 프로그램이 실행될 때 영역만 잡아주면 되기 때문

✔️ Text (Code) 영역

프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 영역이다.

  • 프로그램이 수정되면 안 되므로 ReadOnly 상태로 저장


✅ 커널 메모리 구조

앞서 말했듯 프로세스는 실행중인 프로그램이며, 커널은 이를 관리하는 운영체제의 핵심 영역이다. 하지만, 이런 커널 또한 메모리에 상주하는 부분이기 때문에 별도의 메모리 영역(code, data, stack)이 존재한다.

✔️ Code 영역

CPU, 메모리 등의 효율적으로 자원을 관리하기 위한 부분

  • 사용자에게 편리한 인터페이스를 제공하기 위한 부분이다.
  • 시스템 콜 및 인터럽트를 처리하기 위한 부분을 포함한다.

✔️ Data 영역

운영체제가 사용하는 여러 자료구조 정의하는 부분

  • 일반적으로 PCB가 이 영역에 속한다.
    • 일부 운영체제에서는 커널 스택 영역 최상단에 있기도 함. 하지만 공통점은 유저 모드에서 접근하기 어려운 커널 영역에 존재해야 한다는 점이다.

✔️ Stack 영역

각 프로세스의 커널 스택이 존재하는 영역

  • 커널 스택이란 시스템 콜이나 인터럽트 등으로 운영 체제의 코드가 실행되는 중에 함수 호출이 발생할 경우 이에 대한 복귀 주소를 저장하는 영역이다.
    • 일반 프로그램이 자기 자신의 코드 내에서 함수 호출 및 복귀 주소를 유지하기 위해서는 자기 주소 공간 내의 스택을 사용한다.
    • 하지만 프로세스가 특권 명령을 위해 커널에 정의된 시스템 콜을 호출한 뒤 시스템 콜 내부에서 다른 함수를 호출하는 경우에는 복귀 주소가 커널 내의 주소가 되므로 커널의 스택 영역에 저장한다.

💡 특권 명령
커널과 같은 시스템의 핵심 부분에서만 실행될 수 있는 명령으로 메모리 보호 관리, 입출력 처리 등 시스템의 보안과 안전성을 위반할 수 있는 명령이다.

  • 운영체제는 이런 특권 명령을 수행할 수 있는 커널 영역과 일반 프로그램이 실행되는 유저 영역을 나누어 관리한다.

💡 유저모드와 커널 모드

  • 실제 어플리케이션이 실행될 때는 유저모드
  • 커널모드는 보안과 전체 시스템을 해칠 수 있는 특권 명령을 지니고 있으므로 유저가 접근 불가.
    • 커널모드의 기능이 필요할 경우 시스템 콜 사용
  • 커널모드에 더 높은 권한을 줘 유저 어플리케이션이 함부로 운영체제의 치명적인 데이터를 수정하거나 삭제하지 못하게 한다.
    • 시스템 전체의 안전성을 보장
    • 유저 모드에서 실행되는 경우 하드웨어가 운영체제에 오류임을 알리게 됨
profile
안녕하세요! 신입 개발자입니다.

0개의 댓글