운영체제 리뷰 2 - 프로세스와 쓰레드

LeemHyungJun·2024년 5월 30일
0

Operating System

목록 보기
16/20

참고 자료 : 혼자 공부하는 컴퓨터구조 + 운영체제
사진 출처 : Operating System Concepts 10E

1. 프로세스 개요

<실행 중인 프로그램, 프로세스>

1. 프로세스 확인하기

  • foreground process: 사용자가 볼 수 있는 공간에서 실행
  • background process: 사용자가 볼 수 없는 공간에서 실행
    • 사용자와 상호작용 o
    • 사용자와 상호작용 x - daemon, service

<프로세스 제어 블록>

1. 개요

  • 모든 프로세스는 실행을 위해 CPU가 필요하다. but CPU 자원은 한정되어있음
  • 그 결과 한정된 시간만큼만 CPU 사용해야함
    • 자신의 차례에 정해진 시간만큼 CPU 이용
    • 타이머 인터럽트 발생하면 다음 프로세스 실행

2. 프로세스 제어 블록 (PCB)

  • 빠르게 번갈아 수행되는 프로세스 관리를 위해 사용하는 자료구조
    • 프로세스 관련 정보 저장 (상품에 달린 태그와 같은 역할)
    • 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기
  • PCB에 담기는 정보
    • 프로세스 ID (PID)
      • 특정 프로세스 식별하기 위한 번호
    • 레지스터 값
      • 존재 이유: 마지막으로 어디까지 연산 수행했는지 기억하려고
      • 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 (프로그램 카운터, 스택 포인터)
    • 프로세스 상태
      • 입출력 장치를 사용하기 위해 기다리는 상태
      • CPU를 사용하기 위해 기다리는 상태
      • CPU 이용중인 상태 등
    • CPU 스케줄링 정보
      • 프로세스가 언제, 어떤 순서로 CPU 할당 받을 것인지
    • 메모리 정보
      • 프로세스가 어느 주소에 저장되어 있는지
      • 페이지 테이블 정보
    • 사용한 파일과 입출력 장치 정보
      • 할당된 입출력 장치, 열린 파일 정보 등

<문맥 교환(context switch)>

1. Context Switch 과정

  • 프로세스 A에서 프로세스 B로 실행 순서가 넘어가면?
    • 기존에 실행되던 프로세스 A의 중간 정보(context)를 백업
    • 프로세스 B의 context 복구
    • 다시 프로세스 A 차례가 오면 중간 정보를 기반으로 다시 복구

2. Context Switch

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

<프로세스의 메모리 영역>

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

  • 실행할 수 있는 코드 (기계어로 이루어진 명령어 저장)
  • 데이터가 아닌 CPU가 실행할 명령어가 담겨있음 (read-only)
  • 크기 고정 (정적 할당 영역)

2. 데이터 영역

  • 잠깐 썻다가 없어지는 데이터가 아니라 프로그램이 실행되는 동안 유지할 데이터 저장
  • 크기 고정 (정적 할당 영역)
  • ex) 전역변수

3. 힙 영역

  • 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간
    • 할당하면, 언젠가는 반환(해제)를 해주어야 함
    • cf) garbage collection
  • 동적 할당 영역
    • 일반적으로 낮은 주소에서 높은 주소로 할당

4. 스택 영역

  • 데이터가 일시적으로 저장되는 공간
    • 잠깐 쓰다가 말 값들이 저장되는 공간
  • ex) 매개변수, 지역변수
  • 동적 할당 영역
    • 일반적으로 높은 주소에서 낮은 주소로 할당

2. 프로세스 상태와 계층 구조

<프로세스 상태>

1. 생성 상태

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

2. 준비 상태

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

3. 실행 상태

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

4. 대기 상태

  • 프로세스가 실행 도중 입출력 장치를 사용하는 경우
  • 입출력 작업은 CPU에 비해 느리기 때문에 대기 상태로 접어둠
  • 입출력 작업이 끝나면 (입출력 완료 인터럽트 발생하면) 준비 상태로 이동

5. 종료 상태

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

<프로세스 계층 구조>

  • 프로세스 실행 도중 (시스템 호출을 통해) 다른 프로세스 생성 가능
    • cf) 윈도우는 계층 구조 아님
  • 새 프로세스를 생성한 프로세스: 부모 프로세스
  • 부모 프로세스에 의해 생성된 프로세스: 자식 프로세스
    • 부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 PID가 다르다.
    • 일부 OS는 자식 프로세스 PCB에 부모 프로세스 PID (PPID)를 명시하기도 함
  • 부모 -> 자식 -> 자식 -> ... : 계층 구조 형성

<프로세스 생성 기법>

1. 개요

  • cf) 윈도우 운영체제와 관련은 없음
  • 질문
    • 부모 프로세스는 자식 프로세스를 어떻게 만들어내는가
    • 자식 프로세스는 어떻게 자신만의 코드를 실행하는가
    • 복제와 옷 갈아입기
    • 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성 (복제)
    • 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체 (옷 갈아입기)

2. 프로세스 생성 기법

  • fork 시스템 호출
    • 복사본(자식 프로세스) 생성, 부모와 같은 복사본
      • but PID와 저장된 메모리 공간은 다르다
    • 부모 프로세스의 자원 상속
      • 부모 프로세스의 메모리 영역을 복사해서 가져온다.
  • exec 시스템 호출
    • 메모리 공간을 새로운 프로그램으로 덮어쓰기
    • 코드/데이터 영역은 실행할 프로그램 내용으로 바뀜
    • 나머지 영역은 초기화

3. 스레드

<스레드란>

1. 스레드란

  • 프로세스를 구성하는 실행 흐름의 단위
    • 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.
  • 단일 스레드 프로세스
    • 실행 흐름이 하나인 프로세스
  • 멀티 스레드 프로세스
    • 프로세스를 이루는 여러 명령어 동시 실행 가능

2. 스레드의 구성 요소

  • 스레드 ID
  • 레지스터 값 (프로그램 카운터)
  • 스택 값
  • 실행에 필요한 최소한의 정보
    • 코드, 데이터 영역, 자원을 공유함 (위 사진 참고)

<멀티 프로세스와 멀티 스레드>

1. 멀티 프로세스

  • 동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행 (a)
  • 프로세스 끼리는 자원 공유 x
    • 프로세스 fork하면, 모든 자원이 복제된다.
    • 저장된 메모리 주소를 제외하고 모든 것이 동일한 프로세스가 메모리에 적재된다. (중복!)
    • cf) 실제로는 "copy on write" 해서 중복 저장을 없애주긴 함!
  • 독립적으로 실행된다.
  • IPC : 프로세스 간 통신
    • 프로세스간에 자원을 주고 받을 수 있기는 하다.
    • 스레드 간 통신 보다는 어려움
    • 파일, 공유 메모리를 통해서 IPC 수행

2. 멀티 스레드

  • 하나의 프로세스를 여러 스레드로 실행 (b)
  • 스레드 끼리는 같은 프로세스 내 자원 공유 o
    • 레지스터 값, 스택 값 만 가지고,
    • 코드, 데이터, 힙, 파일 영역은 공유한다.
  • 협력과 통신에 유리하다.
    • 하나의 스레드가 문제 생기면, 전체 프로세스에 문제가 생길 가능성이 있다. (단점)

0개의 댓글