[운영체제] 프로세스, 프로그램, 스레드

지니🧸·2023년 4월 7일
0

CS 저장소

목록 보기
3/48
post-custom-banner

🐚 프로세스

프로세스: 실행중에 있는 프로그램 의미

  • 스케쥴링의 대상이 되는 작업/task과 같은 의미
  • 운영체제가 자원을 할당하는 단위이기도 함
  • 최소 하나의 스레드 가짐: 스레드 단위로 스케쥴링
  • 하드디스크에 있는 프로그램을 실행하면 실행을 위해 메모리 할당이 이루어짐 > 할당된 메모리 공간으로 바이너리 코드가 올라감 > 이 순간부터 프로세스라 불림
  • 영역:
    • Code 영역: 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라감
      • 소스코드 전부
    • Data 영역: 전역변수, static 변수의 할당
    • Heap 영역: 동적 할당을 위한 메모리 영역
      • Java의 new
    • Stack 영역: 지역변수, 함수 호출시 전달되는 인자 (파라미터)를 위한 메모리 영역
  • 상태:
    • new > ready: new 상태에서 프로세스가 생성되면 OS 커널에 존재하는 Ready queue에 올라감
    • ready > running: ready queue에 있는 프로세스들을 운영체제가 프로세스 스케쥴링 알고리즘에 의해 running 상태로 가야할 프로세스를 CPU로 할당 > 프로세스가 running 상태로
    • running > ready: 현재 running 상태에 있는 프로세스A보다 ready queue에서 대기하고 있는 프로세스 B가 우선순위가 높을 때, preemptive schedule(선점형)인 경우 프로세스A는 ready상태로 오게됨 & 프로세스 B는 running 상태로 가서 CPU 할당 받음
    • running > blocked: 현재 running 상태에 있는 프로세스A에서 입출력 이벤트가 발생했을 때 프로세스A가 blocked 상태로
    • blocked > ready: 입출력 이벤트가 종료된 프로세스는 다시 ready상태로
    • running > terminate: 프로세스 종료
    • ready/blocked 상태에는 여러 프로세스 존재 가능
    • 싱글코어 CPU에서 running 상태의 프로세스는 단 하나만 존재
  • 사용하는 시스템 자원:
    • CPU 자원: 명령을 수행하기 위해 일정한 시간이 프로세스마다 할당되어 CPU가 실행
    • 메모리 자원: 명령어와 데이터 등을 실행하려면 프로세스가 실행되는 부분을 물리 메모리에 로드
    • 디스크 자원: 파일 시스템의 파일들을 열고 사용
    • 디바이스 드라이버: 네트워크/키보드 장치와 같은 물리적인 장치를 직접/간접적으로 사용

🐚 프로그램, 프로세스, 스레드

프로그램: 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 정적인 상태의 파일

  • 사용자가 원하는 일을 처리할 수 있도록 프로그래밍 언어를 사용해 올바른 수행절차를 표현해 놓은 명령어들의 집합
  • 메모리에 적재되기 전 상태인 파일
  • (예) Windows의 exe 파일

프로세스:

  • 정의
    • 운영체제가 메모리 등의 필요한 자원을 할당해준 실행 중인 프로그램
      • 프로그램을 실행하면 운영체제로부터 실행에 필요한 자원을 할당받아 프로세스가 되는 것
        • 자원: CPU 시간, 운영되기 위해 필요한 주소 공간, code/data/stack/heap의 구조로 되어있는 독립된 메모리 영역
    • 프로그램이 실행되서 돌아가고 있는 상태
    • 컴퓨터에서 연속적으로 실행되고 있는 동적인 상태의 컴퓨터 프로그램
  • 특징
    • 프로세스는 code, data, stack, heap의 구조로 되어있는 독립된 메모리 영역을 할당 받음
    • 각 프로세스는 별도의 주소 공간에서 실행됨 > 서로 독자적인 메모리 공간 가짐 > 메모리 공간 공유 불가
      • 다른 프로세스의 변수/자료구조에 접근 불가
        • 다른 프로세스의 자원에 접근하려면 프로세스간의 통신 (IPC)를 사용해야 함
    • 프로세스는 최소 하나 이상의 스레드 포함
      • main thread: main 메소드의 코드흐름

스레드:

  • 정의
    • 프로세스가 할당받은 자원을 이용하는 실행 단위
    • 작업을 수행하는 단위
    • 프로세스의 특정한 수행 경로
    • 프로세스 내에서 실행되는 여러 흐름의 단위
  • 특징
    • 각 스레드는 독자적인 스택 메모리를 가짐
    • 각 스레드는 메모리를 공유함
    • 스레드는 프로세스 내에서 각각 스택만 할당받고 Code, Data, Heap 영역, 자원/주소공간은 공유
    • 각 스레드는 별도의 레지스터와 & stack을 갖지만 heap/memory는 서로 읽고 쓸 수 있음
    • 한 스레드가 프로세스 자원을 변경하면 이웃 스레드 (sibling thread)도 그 변경결과를 즉시 볼 수 있음
    • 스레드는 메모리를 공유하기 대문에 동기화/데드락 등의 문제가 발생할 수 있음

프로세스 & 스레드

  • 프로세스는 스레드의 컨테이너: 스레드의 정보를 담고 있음
  • 차이:
    • 프로세스는 각 작업마다 운영체제로부터 자원을 할당받기 위해 시스템 콜을 하는 부담이 생김
      • 멀티 스레드 사용 > 시스템 콜 한 번으로 해결
    • IPC 방식보다는 스레드 간 통신이 덜 복잡함 & 시스템 자원 사용이 적음 > 통신 부담 줄임

🐚 Process Control Block (PCB)

Process Control Block, PCB:

  • 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓은 곳
  • 프로세스의 상태 정보를 저장하는 구조체
  • 프로세스 상태 관리와 문맥교환(Context switching)을 위해 필요
  • PCB는 프로세스 생성시 만들어짐 & 주기억장치에 유지

목적: 싱글코어에서 concurrency를 모방하기 위해 기존 수행 작업을 기록하기 위한 수단

PCB가 저장하는 정보

  • Process ID (PID): 프로세스의 고유 번호
  • Process state (상태): 준비/대기/실행 등의 상태
  • Program counter (포인터): 다음 실행될 프로세스의 포인터
  • Register information (Register save area): 레지스터 관련 정보
  • Scheduling information (Priority): 스케쥴링 및 프로세스 우선순위
  • Memory related information: 할당된 자원 정보
  • Account: CPU 사용시간, 실제 사용된 시간
  • 입출력 상태 정보

🐚 Thread Control Block (TCB)

Thread Control Block (TCB)

  • 하나의 스레드의 정보 저장
  • 저장 정보:
    • 스레드 id
    • 실행 상태: 프로세스 레지스터, 프로그램 카운터(PC), 스택 포인터
      • 스레드가 바뀌면 스레드의 상태를 보존해야 하기 때문
      • 스택 포인터: 스레드가 함수 호출할 때 저장하는 곳이 스택이라서 실행흐름을 저장하는데 필요
    • 스케쥴링 정보: 상태 (실행/준비/대기), 운선순위, 프로세서 시간
      • 스케쥴링 큐를 위한 다양한 포인터
    • PCB에 대한 포인터: 해당 스레드를 포함하는 프로세스

하나의 스레드는 한개의 TCB만 가질 수 있음

🐚 리눅스에서 프로세스/스레드 생성하기

프로세스 생성

  • 리눅스는 부팅될 때 부트로더에서 커널을 작동시킴
    • 커널: CPU를 위한 디바이스 드라이버
  • 커널은 init 프로세스를 실행함
    • init 프로세스: 모든 프로세스의 부모 프로세스
      • 데몬 프로세스: 서비스의 요청에 대해 응답하기 위해 오랫동안 실행중인 백그라운드 프로세스
      • 시스템이 종료될때까지 계속 running 상태
      • 부모가 죽은 모든 프로세스를 입양함
      • 이 프로세스로부터 모든 시스템/사용자 프로세스가 파생됨
  • 부모 프로세스에서 자식 프로세스를 만들때: fork()exec() 실행
    • fork(): 부모 프로세스와 동일한 정보 (PCB)를 갖는 자식 프로세스를 만드는 시스템 콜
    • exec(): 새로운 정보로 exec()를 호출한 부모 프로세스를 덮어버리는 시스템 콜
    • 대부분 fork()exec() 사용

스레드 생성
같은 프로그램 내에서 작은 작업을 처리하는데 fork()를 통해 부모와 동일한 자식 프로세스를 만드는 것은 오버헤드가 큼 > 스레드 필요

  • 스레드:
    • 부모 프로세스의 PCB 정보를 모두 가짐 (대부분이 포인터로 이루어짐)
    • 부모 프로세스와 같은 정보에 접근할 수 있지만 굉장히 가볍고 해당 정보로 필요한 작업만 처리 가능
  • 생성:
    • pthread_create() 시스템 호출 함수 사용

🐚 좀비 프로세스, 고아 프로세스

좀비 프로세스:

  • 자식 프로세스가 부모 프로세스보다 먼저 죽어서 부모 프로세스가 종료 상태를 회수할 경우를 위해 커널이 자식 프로세스의 최소한의 정보 (PID, 종료 상태)를 남겨둠
  • 부모 프로세스는 wait 함수를 호출하여 이 상태를 회수 > 모든 정보 제거 > 자식 프로세스는 완전히 소멸
  • 부모 프로세스가 wait 함수를 호출하지 않아 정보가 메모리에 남아있는 경우
  • 좀비 프로세스가 쌓이면 리소스의 유출을 야기할 수도 있음 > 처리 필요

고아 프로세스

  • 부모 프로세스가 자식 프로세스보다 먼저 종료되어 부모 프로세스가 없는 자식 프로세스
  • 운영체제는 고아 프로세스를 허용하지 않음 > 부모 프로세스가 먼저 종료되면 자식 프로세스의 새로운 부모 프로세스로 init이 설정됨
  • init 프로세스는 자식 프로세스가 종료될때까지 기다린 후 wait 함수 호출 > 고아 프로세스의 종료 상태를 회수하여 좀비 프로세스가 되는 것을 방지
  • 성능 저하의 원인
    • 고아 프로세스는 프로세스 자신이 시스템의 자원을 낭비할 수 있음
    • 시스템이 프로세스가 종료될때까지 추적해야 함

🐚 데몬프로세스

데몬프로세스: 서비스의 요청에 대해 응답하기 위해 오랫동안 실행중인 백그라운드 프로세스

  • 부팅시 자동으로 켜짐
  • 백그라운드 프로세스: 입력장치에 대해 터미널과의 관계를 끊은 모드 프로세스 (사용자에게 키보드를 통해 입력받지 않고 스스로 동작하는 프로세스)
    • vs. 포그라운드 프로세스: 표준입출력장치 (터미널/키보드)를 통해 대화
  • 백그라운드 프로세스 중 부모프로세스(PPID)가 1 혹인 다른 데몬프로세스인 프로세스
  • 대표적인 데몬 프로세스: 웹서버
    • 웹서버 데몬 프로세스는 서버에서 터미널을 통해 실행될 수 있지만 tty/pts 등 터미널을 통해 사용자와 대화할 필요 없음 > 백그라운드 프로세스로 만들어짐

참고:

profile
우당탕탕
post-custom-banner

0개의 댓글