프로세스와 스레드

U_Uracil·2024년 4월 30일
1

CS

목록 보기
9/9

프로세스와 스레드의 정의


  • 프로세스 : CPU로부터 자원을 할당받은 작업의 단위(실행 중인 프로그램)
  • 스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위

프로세스(Process)


프로그램과 프로세스

프로그램

  • *.exe , *.dmg 파일과 같은 컴퓨터에서 실행할 수 있는 파일
  • 파일을 실행하지 않은 상태이기 때문에 정적 프로그램(Static Program), 줄여서 프로그램이라고 함
  • 실행하고 있지 않은 코드 뭉치

프로세스

  • 프로그램을 실행시켜 정적 → 동적으로 상태가 변해 프로그램이 동작하고 있는 상태
  • 컴퓨터에서 연속적으로 실행되고 있는 프로그램
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  • 할당 받는 시스템 자원의 예
    • CPU 시간
    • 운영을 위한 주소 공간
    • Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역

프로세스의 구조

  • 프로세스는 각각 독립된 메모리 영역을 할당받음
  • Code(Text), Data, Heap, Stack의 구조를 가짐

코드(Code/Text) 영역

  • 작성한 프로그램 코드가 저장된 영역
  • 기계어로 변환되어 저장됨
  • 컴파일 타임에 크기가 결정되고, 중간에 코드를 바꿀 수 없게 Read-Only로 되어 있음

데이터(Data) 영역

  • 코드가 실행되면서 사용하는 전역 변수각종 데이터가 저장된 영역
  • 컴파일 타임에 크기가 결정됨
  • 데이터 영역은 크게 .DATA , .RODATA, .BSS 세 부분으로 나뉨
    • .DATA
      • 선언하고 초기화 된 전역 변수, 정적(static) 변수가 저장됨
      • Read-Write 가능
    • .RODATA (Read-Only Data)
      • 상수, 문자열이 저장됨
      • 이름처럼 Read-Only
    • .BSS (Block Started by Symbol)
      • 초기화되지 않은 전역 변수, 정적 변수가 저장됨
      • 컴파일 타임에 크기가 결정되지만, 초기화되지 않은 변수들은 프로그램 시작 시 메모리에 할당됨
  • BSS 영역을 사용하는 이유
    • 변수의 선언과 초기화가 되었다면 해당 변수의 크기만큼 메모리를 할당해야 함
    • 하지만 선언만 되어 있는 경우, 해당 변수가 할당 받을 메모리 크기만 알고 있다면 미리 할당할 필요가 없음 ⇒ 메모리의 절약
    • BSS 영역에 아무리 많은 변수를 저장하더라도 크기가 거의 변하지 않음

힙(Heap) 영역

  • 생성자, 인스턴스와 같은 동적으로 할당되는 데이터가 저장됨
  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨
  • 런타임에 메모리 할당됨
  • 메모리 주소 아래 → 위 순으로 저장

스택(Stack) 영역

  • 지역 변수, 매개변수, 리턴 값 또는 함수 호출 데이터가 저장됨
  • 잠시 사용되었다가 사라지는 데이터를 저장하는 영역
  • 보통 최대 스택 사이즈는 고정해놓음, 하지만 메모리의 할당은 런타임에 동적으로 됨
  • 메모리 주소 위 → 아래 순으로 저장

프로세스의 상태

프로세스는 실행되면서 상태가 변함

  • 새로운(new) : 프로세스가 생성 중인 상태
  • 실행(running) : 명령어들이 실행되는 상태
  • 대기(waiting) : 프로세스가 어떤 이벤트(입출력 완료, 신호 수신 등)가 일어나기를 기다리는 상태
  • 준비(ready) : 프로세스가 처리기에 할당되기를 기다리는 상태
  • 종료(terminated) : 프로세스 실행 종료 상태

PCB(Process Control Block)

  • 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터
  • 운영체제는 PCB를 통해 프로세스를 관리함
  • 프로세스의 생성 시에 PCB도 생성되고, 프로세스가 종료되면 사라짐
  • PCB의 구조 (OS마다 조금씩 다름)
    • 포인터(Pointer) : 프로세스의 현재 위치를 저장하는 정보
    • 프로세스 상태(Stage) : 프로세스의 각 상태(New, Ready, Running, Waiting, Terminated)
    • 프로세스 번호(PID) : 프로세스 식별자 번호
    • 프로그램 카운터(Program Counter) : 프로세스 다음 명령어 주소
    • 레지스터(Register) : 누산기, 베이스, 레지스터 및 범용 레지스터 포함하는 CPU 레지스터 정보
    • 입출력 상태(I/O Permissions) : 해당 프로세스에 할당된 입출력 장치들과 열린 파일 목록 등
    • 회계 정보(Accounting Info) : CPU 사용 시간, 경과 시간, 시간 제한 등

문맥 교환(Context Switching)

  • 하나의 CPU를 여러 프로세스가 이용하기 위해 PCB를 사용하여 프로세스의 상태 정보를 교환하는 작업
  • 문맥 교환을 통해 멀티태스킹(=멀티프로세싱)이 가능함

    💡 멀티태스킹 : 다수의 프로세스가 하나의 CPU 자원을 나누어 사용하는 것

  • 문맥 교환 중에는 작업을 할 수 없음(그림에서 Idle, 유휴 시간)
  • 문맥 교환이 일어나는 시점
    • 멀티 태스킹
    • 인터럽트 처리
    • 사용자 및 커널 모드 전환

스레드(Thread)


  • 프로세스 내에서 실행되는 여러 흐름의 단위
  • 프로세스의 특정한 수행 경로
  • 프로세스가 할당 받은 자원을 이용하는 실행의 단위
  • 프로세스는 하나 이상의 스레드를 가지고 있음

스레드의 구조

  • 스레드는 프로세스 내에서 Code, Data, Heap을 공유하고 Stack 영역만 따로 할당받음

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


멀티프로세스

  • 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(Task)을 처리하도록 하는 것

장점

  • 여러 개의 자식 프로세스 중 하나에 문제가 발생해도 다른 프로세스에 영향을 끼치지 않음. (신뢰성이 높음)
  • 각 프로세스가 독립적이므로 새로운 기능이나 모듈 추가, 수정이 용이함. (시스템 확장성이 높음)

단점

  • 문맥 교환(Context Switching) 과정에서 성능 저하가 일어날 수 있음
  • 자원 공유가 어려움(IPC 정리글 참고)

예시

  • 웹 브라우저의 탭

멀티스레드

  • 프로세스 내 작업을 여러 개의 스레드로 처리하는 것

장점

  • 스레드는 프로세스보다 가벼움
  • 하나의 프로세스 내에서 스레드 간 공유 자원이 있으므로 스레드 간 통신이 쉬움
  • 응답 시간이 빠름

단점

  • 하나의 스레드에서 문제가 생기면 다른 스레드에 영향을 끼칠 수 있으므로 안정성이 낮음
  • 공유 자원에 동기화 문제로 인해 성능이 저하됨
  • 데드락 위험 있음
  • 디버깅이 어려움

예시

  • 웹 서버

공유 자원과 임계 구역

공유 자원(Shared Resource)

  • 시스템 안에서 각 프로세스 or 스레드가 함께 접근할 수 있는 자원이나 변수
  • 2개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태(Race Condition)이라고 함

임계 구역(Critical Section)

  • 공유 자원 접근 순서에 따라 실행 결과가 달라지는 코드 영역
  • 이를 해결하기 위한 방법으로 뮤텍스, 세마포어, 모니터가 있음

임계 구역의 해결 조건 3가지

  1. 상호 배제(Mutual Exclusion)
    • 한 프로세스가 임계 구역에 들어가면 다른 프로세스는 들어갈 수 없음
  2. 한정 대기(Bounded Waiting)
    • 상호 배제 때문에 기다리게 되는 프로세스가 무한하게 대기하지 않아야 함
    • 특정 프로세스가 영원히 임계 구역에 들어가지 못하는 상황이 있으면 안 됨
  3. 진행 융통성(Progress Flexibility)
    • 임계 구역에 프로세스가 없다면 아무 프로세스나 들어가서 자원 사용 가능

임계 구역 해결 방법(동기화 기법)

뮤텍스

  • 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에 unlock()을 통해 잠금 해제하는 객체
  • 뮤텍스를 소유한 프로세스만이 뮤텍스 해제 가능
  • 뮤텍스는 잠금/잠금해제 단 두 개의 상태만 가질 수 있음
  • 동시에 한 프로세스/스레드만 뮤텍스 객체를 사용 가능

세마포어

  • 뮤텍스의 단점을 해결하기 위해 나온 알고리즘(다익스트라 개발)
  • 세마포어는 세 가지로 이루어져 있음
    1. Semaphore(n) : 공유 가능한 자원의 수 n개로 초기 설정
    2. P() : 임계 구역에 들어가기 전에 사용중 표시
    3. V() : 임계 구역에서 나올 때 비었다고 표시

모니터

  • 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대한 인터페이스만 제공하는 방법
  • 상호 배타 큐와 조건 동기 큐를 가짐
    • 상호 배타 큐 : 공유 자원에 하나의 프로세스만 진입하도록 하는 큐
    • 조건 동기 큐 : 공유 자원의 Lock이 해제되기를 기다리는 스레드가 대기하는 큐

교착 상태(Deadlock)

2개 이상의 프로세스가 다른 프로세스 작업이 끝나기만 기다리며 작업을 더이상 진행하지 못하는 상태

교착 상태의 원인

  • 상호 배제(mutual exclusion) : 한 프로세스가 자원을 독점하고 있으며 다른 프로세스는 접근 불가능한 상태
  • 비선점(non-preemption) : 한 프로세스가 사용 중인 자원은 중간에 다른 프로세스가 빼앗을 수 없는 비선점 자원이어야 함
  • 점유 대기(hold and wait) : 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 기다리는 상태
  • 원형 대기(circular wait) : 점유 대기를 하는 프로세스 간 관계가 원을 이뤄야 함

위의 4가지 조건을 모두 충족해야 교착 상태가 발생함



References
https://inpa.tistory.com/entry/👩‍💻-프로세스-⚔️-쓰레드-차이
https://fastcampus.co.kr/media_branding_cs
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://velog.io/@redgem92/운영체제-프로세스-구조
https://dev-ahn.tistory.com/15
https://learncom1234.tistory.com/80
https://juntheworld.tistory.com/118
https://velog.io/@wejaan/운영체제-a4pg27h2
https://yoongrammer.tistory.com/52
https://brightstarit.tistory.com/12
https://velog.io/@chappi/OS는-할껀데-핵심만-합니다.-8편-Critical-section-임계-구역2-mutex-semaphore-monitor-condition-variable
https://www.guru99.com/ko/mutex-vs-semaphore.html
https://steady-coding.tistory.com/557

profile
기억은 유한, 기록은 무한

0개의 댓글

관련 채용 정보