프로세스

김우진·2023년 11월 15일
0

CS

목록 보기
2/4

프로세스(Process)

컴퓨터의 메모리에 올라와 CPU를 할당받아 실행되고 있는 프로그램

  • 포그라운드 프로세스(foreground process)
    • 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스(background process)
    • 사용자가 볼 수 없는 공간에서 실행되는 프로세스
      • 사용자와 직접 상호작용이 가능한 백그라운드 프로세스
      • 사용자가 직접 상호작용 불가능한 백그라운드 프로세스(= 데몬, 서비스)

프로세스의 메모리 영역

[동적할당 영역]

  • 스택(stack)
  • 힙(heap)

[정적할당 영역]

  • 데이터 영역(BSS segment, Data segment)
  • 코드 영역(code segment)

동적 영역

  • 런타임시 변동이 가능한 영역

스택

  1. 위(높은 주소 -> 낮은 주소)에서부터 쌓인다.
  2. 지역변수, 매개변수, 함수 등이 저장되고 컴파일 시 크기가 결정됨
  3. 함수가 함수를 호출하는 등에 따라 런타임 시에도 크기가 변경된다(동적)

  1. 아래(낮은 주소 -> 높은 주소)에서부터 쌓인다.
  2. 프로그래머가 직접 할당할 수 있는 저장공간
  3. 동적할당할 때 사용되며 런타임 시 크기가 결정된다.
  4. 동적으로 할당되는 변수 및 자료구조 등을 담는다.
  5. 최근에는 프로그래밍 언어가 사용 후 자체적으로 반환(garbage collection) 해주기도 하지만 동적으로 할당해주고 반환하지 않으면 메모리 누수(Memory leak)가 발생한다.

정적 영역

  • 컴파일 단계에서 메모리 할당 완료

데이터영역(BSS(Block Started by Symbol) segment/Data segment)

  1. BSS 영역과 Data 영역으로 나뉘고 정적할당에 관한 부분을 담당한다.

BSS Segment : 초기화되지 않은 데이터 세그먼트

  • 프로그램 실행과 함께 커널에 의해 0으로 초기화된다.
  • 초기화 되지 않은 static, 전역 변수 등이 해당

Data Segment : 초기화 된 데이터 세그먼트

  • 초기화된 Static, Const(.rodata 영역), 전역 변수

데이터 영역이 BSS와 Data Segment로 구분되는 이유?

BSS 세그먼트는 '초기값을 가지고 있지 않는' 데이터이므로 0의 값으로 초기화 될 변수들이므로 굳이 ROM에 저장하지 않고 프로그램을 수행하면서 0으로 초기화하여 RAM 메모리로 불러와 사용한다.

그에반해 Data 세그먼트는 '초기값을 가지고 있는' 데이터이므로 ROM 메모리에 저장해두되, '변수'로서 사용하기 위해서 프로그램 실행과 함께 RAM메모리로 불러와 사용하는 것이 효율적이다.

코드영역(Code/Text Segment)

  1. 소스코드가 들어간다.
  2. 실행할 수 있는 코드, 기계어로 이루어진 명령어가 저장되어있다.
  3. 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된(read-only) 영역

프로세스 상태

생성 상태 (NEW)

  • 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
  • 준비가 완료되었다면 준비 상태로 돌입

준비 상태 (READY)

  • 당장이라도 CPU를 할당 받아 실행할 수 있어 차례를 기다리는 상태
  • 준비 상태에서 자신의 차례가 되어 실행 상태로 변하는 것 (= 디스패치)

실행 상태 (RUNNING)

  • CPU를 할당 받아 실행 중인 상태
  • 할당된 시간 모두 사용 시(타이머 인터럽트 발생 시) 준비상태로 돌아감
  • 실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때 까지 대기 상태로 돌입

대기 상태 (WAITING)

  • 프로세스가 실행 도중 입출력작업을 하여 대기하는 상태
  • 입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 돌입
  • 입출력 작업이 끝나면(입출력 완료 인터럽트를 받으면) 준비 상태로 돌입

종료 상태 (TERMINATED)

  • 프로세스가 종료된 상태
  • PCB, 프로세스의 메모리 영역 정리

프로세스의 자원 공유

  • IPC 사용
  • LPC 사용
  • 별도의 공유 메모리 생성

프로세스 계층 구조

프로세스 실행 도중(시스템 호출을 통해) 다른 프로세스 생성 가능

  • 부모 프로세스 : 새 프로세스를 생성한 프로세스
  • 자식 프로세스 : 부모 프로세스에 의해 생성된 프로세스

부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID를 가짐
일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID(PPID)를 명시하기도 한다.

프로세스 생성 기법

그러면 부모 프로세스는 자식 프로세스를 어떻게 만들고 자식 프로세스는 어떻게 자신만의 코드를 메모리에 적재하고 실행할 수 있을까?
복제(fork)와 옷 갈아입기(exec)

부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성하고, 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

fork() 시스템 호출

  • 복사본(=자식 프로세스) 생성
  • 부모 프로세스의 자원 상속 받음

exec() 시스템 호출

  • 메모리 공간을 새로운 프로그램으로 덮어쓰기
  • 코드/데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화

프로세스와 스레드의 차이

  1. 프로세스는 코드, 데이터, 스택, 힙 메모리 영역을 기반으로 작업하는 반면 쓰레드는 프로세스 내의 스택 메모리를 제외한 다른 메모리 영역을 프로세스 내의 다른 쓰레드들과 공유하기 때문에 메모리적 이점 존재

  2. 프로세스는 다른 프로세스와 격리되어 있어 서로 통신을 하기 위해서는 IPC를 사용해야 하지만, 쓰레드는 다른 스레드와 서로 격리되어 있지 않아 그냥 통신할 수 있어 프로세스보다 빠르다.

  3. 프로세스는 한 프로세스에 문제가 생겨도 다른 프로세스에 영향을 끼치지 않지만 쓰레드는 격리가 되어있지 않아 한 스레드에 문제가 생기면 다른 쓰레드에도 영향을 끼쳐 쓰레드로 이루어져 있는 프로세스에 영향을 줄 수 있다.(stack 외의 공간을 공유 하여 그런 거 같은데 그럼 스택 메모리 상에서 문제 발생할 경우는 해당 안되나??)

  4. 프로세스는 생성과 종료에 쓰레드보다 더 많은 시간이 든다.

0개의 댓글