[혼공학습단 9기] 혼공컴운 4주차 챕터10 : 프로세스와 스레드

낙원·2023년 2월 3일
0
post-thumbnail

⚡프로세스 개요

💻프로세스 직접 확인하기

  • 포그라운드 프로세스
    사용자가 볼 수 있는 공간에서 실행되는 프로세스

  • 백그라운드 프로세스
    사용자가 볼 수 없는 공간에서 실행되는 프로세스

    두 가지로 나눌 수 있다.

    1. 사용자와 상호작용 가능한 프로세스
    2. 사용자와 상호작용하지 않고 정해진 일만 하는 프로세스
      2번을 데몬, 혹은 서비스라고 부른다.

🎮프로세스 제어 블록

  • 모든 프로세스는 실행을 위해 CPU가 필요하지만 CPU 자원은 한정되어 있다.
  • 그렇기에 프로세스들은 돌아가며 한정된 시간만큼 CPU를 이용한다.
  • 타이머 인터럽트가 발생하면 차례를 양보한다.

프로세스 제어 블록 (PCB)

  • 빠르게 번갈아 수행되는 프로세스들을 관리할 때 사용하는 자료구조
  • 프로세스와 관련된 정보를 저장 (상품에 달린 태그와 같은 정보)
  • 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기

PCB에 담기는 정보

  • 운영체제마다 차이가 있다.
  1. 프로세스 ID (PID)
    특정 프로세스를 식별하기 위해 부여하는 고유한 번호

  2. 레지스터 값
    프로세스는 자신의 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 후 이전 작업 이어서 실행한다.
    PC , SP 등의 값들이 담긴다.

  3. 프로세스 상태

  4. CPU 스케줄링 정보
    프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보

  5. 메모리 정보
    프로세스가 어느 주소에 저장되어 있는지에 대한 정보
    페이지 테이블 정보 (메모리 주소 알 수 있는 정보)

  6. 사용한 파일과 입출력장치 정보
    할당된 입출력장치, 사용 중인 파일 정보

📖문맥 교환

  • A 프로세스에서 B 프로세스로 넘어가면 A는 레지스터 값, 열었던 파일, 사용한 입출력장치 등의 중간정보를 백업해야한다.
    이러한 중간정보를 문맥이라고 한다.

문맥

  • 다음 차례가 왔을 때 실행을 재개하기 위한 정보
  • 실행 문맥을 백업해두면 해당 프로세스의 실행을 재개할 수 있다.

문맥 교환

  • 기존 프로세스의 문맥을 PCB에 백업
  • 새로운 프로세스 실행위해 문맥을 복구하는 과정

🔔프로세스의 메모리 영역

  • 프로세스가 생성되면 커널 영역에 PCB가 생성된다.
    그렇다면 사용자 영역에는 프로세스가 어떻게 배치되나?

코드 영역 (텍스트 영역)

  • 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어 저장
  • 데이터가 아닌 CPU가 실행할 명령어가 담겨 쓰기가 금지된 영역

데이터 영역

  • 프로그램이 실행되는 동안 유지할 데이터 저장
  • 전역변수가 대표적이다.

힙 영역

  • 사용자가 직접 할당할 수 있는 저장 공간
  • 힙 영역에 메모리 공간을 할당했다면 해당 공간을 반환해야 한다.
  • 반환하지 않으면 메모리 내에 계속 남아 메모리 낭비를 초래한다.
    → 메모리 누수라고 말한다.

스택 영역

  • 데이터가 일시적으로 저장되는 공간
  • 데이터 영역과 달리 잠깐 쓰다가 말 값들이 저장
  • 매개 변수, 지역 변수가 대표적이다.
  • 코드영역, 데이터 영역은 크키가 변하지 않는다.
    → 정적 할당 영역이라고도 부른다.

  • 힙 영역, 스택 영역은 크기가 변할 수 있다.
    → 동적 할당 영역이라고도 부른다.

  • 힙 영역은 낮은 주소 → 높은 주소로 할당
  • 스택 영역은 높은 주소 → 낮은 주소로 할당
  • 데이터가 쌓여도 새롭게 할당되는 주소가 겹칠 일이 없게 하기 위해서.

🍁프로세스 상태와 계층 구조

🎯프로세스 상태

생성 상태

  • 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
  • 준비가 완료된 프로세스는 바로 실행되지 않고 준비 상태가 된다.

준비 상태

  • 당장 CPU를 할당 받아 실행할 수 있지만
  • 자신의 차례가 아니기에 기다리는 상태
  • 차례가 되면 실행 상태가 된다 (=디스패치)

실행 상태

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

대기 상태

  • 프로세스가 실행 도중 입출력 장치 사용하는 경우
  • 입출력 작업은 CPU에 비해 처리 속도가 느리기에 기다려야 한다.
  • 입출력 작업 완료되면 준비 상태로

종료 상태

  • 프로세스가 종료된 상태
  • PCB, 프로세스가 사용한 메모리 정리

🎹프로세스 계층 구조

  • 프로세스 실행 도중 시스템 호출을 통해 다른 프로세스 생성 가능
  • 부모 프로세스 : 새 프로세스 생성한 프로세스
  • 자식 프로세스 : 생성된 프로세스
  • 부모 프로세스와 자식 프로세스는 다르기 때문에 서로 다른 PID를 가진다.
    일부 운영체제에서는 자식 PCB에 부모의 PID(PPID)가 기록되기도 한다.

🔨프로세스 생성 기법

부모 프로세스는 자식 프로세스를 어떻게 만들고
자식 프로세스는 어떻게 자신만의 코드를 실행하나?

복제와 옷 갈아입기

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

fork 시스템 호출

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

exec 시스템 호출

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

🔎스레드

📊프로세스와 스레드

스레드

  • 프로세스를 구성하는 실행의 흐름 단위
  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.

단일 스레드 프로세스

  • 실행 흐름이 하나인 프로세스

멀티 스레드 프로세스

  • 실행 흐름이 여러 개인 프로세스
  • 프로세스를 이루는 여러 명령어 동시 실행 가능

스레드의 구성 요소

  • 스레드 ID, PC를 비롯한 레지스터 값, 스택 등
  • 실행에 필요한 최소한의 정보만을 유지, 프로세스 자원을 공유하며 실행

📌멀티프로세스와 멀티스레드

  • 멀티프로세스 : 여러 프로세스를 동시에 실행하는 것
  • 멀티스레드 : 여러 스레드로 프로세스를 동시에 실행하는 것

차이점

  • 프로세스는 자원을 공유하지 않지만, 스레드는 자원을 공유한다.

프로세스의 경우

  • 프로세스를 fork하면 코드/데이터/힙 영역 등 모든 자원이 복제되어 저장됨.

  • PID, 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스가 메모리에 적재됨.

  • 같은 프로그램 실행을 위해 동일한 내용들이 중복해 존재하기에 낭비라고 볼 수 있다.

  • 자원을 공유하지 않는다. -> 독립적으로 실행
    +) 프로세스 간에도 자원을 주고받을 수 있다 : 프로세스 간 통신 (IPC)
    파일, 공유 메모리 등을 통해서 가능하다.

    스레드의 경우

  • 프로세스가 가지고 있는 자원을 공유해 메모리를 더 효율적으로 사용 가능.

  • 자원을 공유한다 -> 협력과 통신에 유리하다.
    그러나 하나의 스레드에 문제가 생기면 전체에 문제가 생길 수 있다.

0개의 댓글