📑 본 글은 <혼공컴운>을 읽고 정리한 글입니다.

1. 프로세스 개요

1-1. 프로세스 직접 확인하기

포그라운드 프로세스

  • 사용자가 보는 앞에서 실행되는 프로세스

백그라운드 프로세스

  • 보이지 않는 공간에서 실행되는 프로세스
  • 데몬(daemon)

1-2. 프로세스 제어 블록

운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고,
프로세스에 CPU를 비롯한 자원을 배분한다.

프로세스 제어 블록(PCB: process control block)

  • 해당 프로세스를 식별하기 위해 꼭 필요한 정보들을 저장
  • 커널 영역에 생성된다.
  • 프로세스 생성시 만들어지고, 실행이 끝나면 폐기됨
  • PCB에 담기는 정보들
    • 프로세스 ID(PID)
      • 특정 프로세스를 식별하기 위해 부여하는 고유 번호
    • 레지스터 값
      • 해당 프로세스가 실행하며 사용했던 PC 등의 레지스터 값들 저장
    • 프로세스 상태
    • CPU 스케줄링 정보
      • 프로세스가 언제 어떤 순서로 CPU 할당받는지
    • 메모리 관리 정보
      • 프로세스가 메모리 어디에 저장되어 있는지 <페이지 테이블 정보>
    • 사용한 파일과 입출력장치 목록
      • 놀랍네요..

1-3. 문맥 교환(Context Switching)

문맥 교환(Context Switching)

  • 프로세스 A → 프로세스 B 갈아끼우기
  • 문맥이란 PCB 정보
  • Switching 과정
    • 기존 프로세스의 문맥을 PCB에 백업한다.
    • 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구한다.
  • BUT!! 문맥 교환을 너무 자주 하면 오버헤드 발생 가능

1-4. 프로세스의 메모리 영역

프로세스가 생성되면 커널 영역에 PCB 생성된다. 사용자 영역에는 무슨 일이 일어나는가?

코드 영역

  • 기계어로 이루어진 명령어 저장
  • read-only
  • = 텍스트 영역

데이터 영역

  • 프로그램이 실행되는 동안 유지되며, 프로그램 전체에서 접근할 수 있는 변수
  • like 전역 변수

힙 영역

  • 프로그래머가 직접 할당할 수 있는 저장 공간
  • 힙 영역은 무조건 반환해야 함
    • 아니면 메모리 누수(memory leak)

스택 영역

  • 데이터를 일시적으로 저장하는 공간
  • like 매개 변수, 지역 변수

정적 할당 영역

  • 데이터 영역, 코드 영역

동적 할당 영역 : 실시간으로 크기 변경

  • 힙 영역
    • 낮은 주소 → 높은 주소
  • 스택 영역
    • 높은 주소 → 낮은 주소

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

2-1. 프로세스 상태

운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.

생성 상태(New)

  • 프로세스를 생성 중
  • 메모리에 적재되어 PCB 할당 받음

준비 상태(Ready)

  • 내 차례 기다리는 중

실행 상태(Running)

  • CPU 할당받아 실행 중

대기 상태(Blocked)

  • 입출력장치의 작업을 기다리는 상태

종료 상태(Terminated)

  • 프로세스 종료
  • 운체가 PCB와 메모리 정리함


    [프로세스 상태 다이어그램]

2-2. 프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.

부모 프로세스

  • 새 프로세스를 생성한 프로세스

자식 프로세스

  • 부모 프로세스에 의해 생성된 프로세스
  • PPID(Parent PID) : 부모 프로세스의 PID

프로세스 계층 구조

최초의 프로세스로부터 자식을 계속 낳음 → 트리 구조

  • 컴퓨터가 부팅될 때 실행되는 1번 PID 프로세스

2-3. 프로세스 생성 기법

  1. 복제
    • 부모 프로세스는 fork 를 통해 자신의 복사본을 자식 프로세스로 생성한다.
  2. 옷 갈아입기
    • 만들어진 복사본은 exec 을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

fork

  • 자신의 복사본을 만드는 시스템 호출
  • PID 값과 저장된 메모리 위치를 제외하고 모두 복사된다.

exec

  • 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
  • 코드와 데이터 영역의 내용이 실행할 프로그램 내용으로 바뀐다. 나머지는 초기화.

3. 스레드

스레드

  • 프로세스를 구성하는 실행의 흐름 단위
  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
  • 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.

프로세스

  • 실행되는 프로그램

3-1. 프로세스와 스레드

단일 스레드 프로세스

  • 실행의 흐름 단위가 하나

스레드 등장..!

→ 같은 프로그램 내에서 각기 다른 코드를 실행할 수 있다.

프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행된다.

⇒ CPU가 처리할 작업을 전달할 때 스레드 단위로 전달함.

멀티 스레드 프로세스

  • 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있다.
  • 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있다.

스레드 간 공유하는 것

  • 코드 영역 / 데이터 영역 / 힙 영역
  • 열린 파일
  • PCB

스레드 간 따로 쓰는 것

  • 스레드 ID
  • PC 등 레지스터
  • 스택 영역

프로세스 간 따로 쓰는 것

  • PCB
  • 코드 영역 / 데이터 영역 / 힙 영역 / 스택 영역

3-2. 멀티 프로세스와 멀티 스레드

멀티 프로세스

  • 여러 프로세스를 동시에 실행하는 것. core관점

멀티 스레드

  • 여러 스레드로 프로세스를 동시에 실행하는 것. thread관점

멀티 스레드 vs 멀티 프로세스

→ 멀티 스레드 win

여러 프로세스를 병행 실행하는 것보다 메모리를 더 효율적으로 사용할 수 있다.

  • 스레드들은
    • 프로세스 자원을 공유함
    • 협력과 통신에 유리함
  • 프로세스들은
    • 똑같은 것을 메모리에 턱턱 적재함
    • 독립적으로 실행됨

프로세스 간 통신(IPC : Inter-process Communication)

프로세스는 유저공간 내에서 독립적으로 실행된다.

이처럼 독립적인 공간을 가진 프로세스 간 통신에 사용되는 기법이 IPC 통신이다.

프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스 간의 통신을 할 수 있게 된다.

  • 메시지 전달(Message Passing)
    • 커널을 통해 메시지를 전달하는 방식으로 자원이나 데이터를 주고 받음
    • 커널을 이용하기 때문에 구현이 비교적 쉬움
    • 시스템 콜이 필요하며 이로 인해 오버헤드 발생
    • Pipe, Signal, Message Queueing, Socket 등
  • 공유 메모리(shared memory)
    • 프로세스들이 공유할 수 있는 메모리 영역을 두고 데이터를 주고 받을 수 있게 함
    • 커널 의존도가 낮기 때문에 속도가 빠르고 통신이 자유로움
    • 자원과 데이터를 공유하기 때문에 동기화 이슈 발생
    • Shared Memory, Semaphore 등

0개의 댓글

Powered by GraphCDN, the GraphQL CDN