[cs] 프로세스와 스레드

문돌이 개발자·2023년 10월 18일
0
post-thumbnail

프로세스

  • 실행 중인 프로그램을 프로세스라고 한다.

포그라운드 프로세스

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

백그라운드 프로세스

  • 사용자와 직접 상호작용이 가능한 백그라운드 프로세스
  • 사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스 (데몬, 서비스)

프로세스 제어 블록

  • 모든 프로세스는 실행을 위해 CPU가 필요하지만 CPU 자원은 한정되어 있다.
  • 프로세스들은 돌아가며 한정된 시간 만큼만 CPU 이용
    • 자신의 차례에 정해진 시간만큼 CPU 이용
    • 타이머 인터럽트가 발생하면 차례 양보
  • 빠르게 번갈아 수행되는 프로세스를 관리하기 위해 사용하는 자료구조를 프로세스 제어 블록이라 부른다.(PCB)
  • PCB에는 프로세스와 관련된 정보가 적혀있고 이 PCB는 프로세스 생성 시 커널영역에 생성된다.

프로세스 제어 블록에 담기는 정보

  • 프로세스 ID
    • 특정 프로세스를 식별하기 위해 부여하는 고유번호
  • 레지스터 값
    • 자신의 실행 차례가 돌아오면 이전에 하던 작업을 이어서 하기 위해 이전까지 사용했던 레지스터의 중간값들을 모두 복원한다.
    • 이를 위해서 프로그램 카운터와 스택 포인터와 같은 레지스터 값을 담고 있는다.
  • 프로세스 상태
    • 프로세스가 어떤 상태정보
    • 입출력 대기, CPU 사용대기, CPU 사용중 등..
  • CPU 스케줄링 정보
    • 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
  • 메모리 정보
    • 프로세스가 어느 주소에 저장되어 있는지에 대한 정보
    • 페이지 테이블 정보(메모리 주소를 알 수 있는 정보)
  • 사용한 파일과 입출력장치 정보
    • 할당된 입출력장치, 사용 중인(열린) 파일 정보

Context Switch (문맥 교환)

  • A 프로세스에서 B 프로세스로 실행순서가 넘어간다면
  • 기존에 실행되던 프로세스 A는 지금까지의 중간 정보를 백업하고 B 프로세스의 문맥을 복구한다.

Scheduler

  • CPU가 항상 놀지 않고 일을 할 수 있도록 프로세스를 선택하는 역할

Dispatcher

  • 선택된 프로세스가 CPU에서 실행될 수 있도록 하는 역할
  • Context Switching 담당
    • Context Switching은 CPU 관련된 대단히 민감한 작업
    • 민감한 작업이기 때문에 OS는 Context Switching을 커널모드에서 진행함
    • Context Switching 이후 선택된 프로세스를 실행하기 위해 다시 User Mode로 전환하는 역할도 담당
    • 새롭게 선택된 프로세스가 어디서부터 작업을 진행해야 할지 적절한 위치로 이동시키는 역할도 담당

프로세스의 메모리 영역

  • 프로세스가 생성되면 커널 영역에 PCB가 생성되고 사용자 영역에는 영역을 나누어 저장된다.
  • 코드영역, 데이터 영역, 힙 영역, 스택 영역

코드영역

  • 텍스트 영역으로도 불림
  • 실행할 수 있는 코드, 기계어로 이루어진 명령어가 저장됨
  • 데이터가 아닌 CPU가 실행할 명령어가 담겨있어 쓰기가 금지되어 있다. 읽기전용
  • 정적 할당 영역

데이터 영역

  • 프로그램이 실행되는 동안 유지할 데이터 저장
  • 전역 변수와 같은 데이터가 저장됨
  • 정적 할당 영역

힙 영역

  • 프로그램을 만드는 사용자, 프로그래머가 직접 할당할 수 있는 저장 공간
  • 힙 영역에 메모리 공간을 할당한 후 반환하지 않으면 메모리 누수가 발생할 수 있다.
  • 동적 할당 영역
  • 일반적으로 낮은 주소 → 높은 주소로 할당

스택 영역

  • 데이터가 일시적으로 저장되는 공간
  • 잠시 사용하는 값들, 매개변수와 지역변수와 대표적
  • 동적 할당 영역
  • 일반적으로 높은 주소 → 낮은 주소로 할당

프로세스 상태와 계층 구조

  • 운영체제는 프로세스의 상태를 PCB에 저장하고 관리

프로세스 상태

  • 운영체제마다 조금씩 차이가 있다.

생성 상태

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

준비 상태

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

실행 상태

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

대기 상태

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

종료 상태

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

프로세스 상태 다이어그램

프로세스 계층 구조

  • 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스 생성 가능
  • 새 프로세스를 생성한 프로세스: 부모 프로세스
  • 부모 프로세스에 의해 생성된 프로세스: 자식 프로세스
  • 부모 프로세스와 자식 프로세스는 다른 프로세스 ID를 가진다.
  • 자식 프로세스에 부모 프로세스 PID인 PPID를 기록하기도 한다.
  • 부모-자식관계를 통해 프로세스는 계층을 형성할 수 있다.

프로세스 생성 기법

복제와 옷 갈아입기

  • 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로서 생성한다.
    • 복사본이지만 엄연히 다른 프로세스로 PID와 메모리 주소 등이 다르다.
  • 자식 프로세스는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

스레드

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

스레드의 구성요소

  • 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택 등
  • 실행에 필요한 최소한의 정보
  • 프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행됨

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

  • 프로세스 간에는 자원을 공유하지 않지만 스레드 간에는 프로세스 내에서 자원을 공유한다.
    • 프로세스 간 통신(IPC)을 통해서 프로세스 간에도 데이터를 주고받을 수 있다.

참고자료

이미지

혼자 공부하는 컴퓨터 구조 + 운영체제 - 강민철

profile
까먹고 다시 보려고 남기는 기록

0개의 댓글