[CS] 프로세스와 스레드

팔랑이·2025년 3월 7일
0

CS

목록 보기
19/19

⛳️ 인프런 - cs 지식의 정석 강의를 듣고 학습한 내용입니다.


프로세스와 스레드, 메모리 관리 및 IPC

1. 프로세스와 스레드의 차이

프로세스는 메모리에 올라와 실행되는 프로그램을 의미하며, 스레드는 프로세스 내 작업의 흐름을 뜻한다.

위 그림처럼, 프로세스는 코드, 데이터, 스택, 힙 메모리를 독립적으로 가지며, 스레드는 스택을 제외한 메모리 영역을 공유한다.

이하의 차이들은 주로 위의 차이에 대한 결과이다.

  • 프로세스 간 통신은 IPC를 사용해야 하지만, 스레드는 동일 프로세스 내에서 직접 통신 가능.
  • 프로세스는 한 프로세스의 문제가 다른 프로세스에 영향을 주지 않으나, 스레드는 한 스레드의 문제가 전체 프로세스에 영향을 줄 수 있음.
  • 프로세스 생성과 종료가 스레드보다 시간이 더 오래 걸림.

2. 프로그램의 컴파일 과정

프로그램은 컴파일러를 통해 소스코드를 기계어로 번역하여 실행파일로 변환된다.

컴파일 과정

  • 전처리: 소스코드 주석 제거, 헤더파일 병합 및 매크로 치환 (c++의 경우 .ii 파일)
  • 컴파일러: 오류 처리 및 코드 최적화를 수행하여 어셈블리어로 변환 (.s 파일)
  • 어셈블러: 어셈블리어를 목적코드(.o 파일)로 변환
  • 링커: 목적코드를 라이브러리와 결합하여 실행파일(.exe, .out)을 생성

3. 프로세스의 메모리 구조

프로세스 메모리는 스택, 힙, 데이터영역(BSS/Data), 코드영역으로 구성됨.
다른 게시물에서 하도 많이해서 대충..

스택은 위에서 아래로, 힙은 아래에서 위로 저장된다는 그 그림

  • 스택(stack) - 동적: 지역변수, 매개변수, 함수가 저장되며 컴파일시 크기가 결정된다. 런타임 시 크기가 동적으로 변하기도 함.

  • 힙(heap) - 동적: 동적 메모리 할당 시 사용되며 런타임 시 크기가 결정됨.

  • 데이터 영역 - 정적

    BSS: 전역변수, static, const 변수 중 0 또는 초기화되지 않은 변수 저장
    Data: 0이 아닌 값으로 초기화된 전역변수, static, const 변수 저장

  • 코드 영역 - 정적: 프로그램의 소스코드 저장

4. 정적 할당과 동적 할당

메모리 할당은 정적(컴파일 시)과 동적(런타임 시)으로 구분됨.

정적할당: 컴파일 단계에서 메모리를 할당

  • BSS, Data, 코드 영역으로 나눠서 저장

동적할당: 런타임 단계에서 메모리를 할당

  • Stack(지역변수, 함수호출)과 Heap(malloc, free, 동적 자료구조 관리)으로 나눠짐

5. PCB와 컨텍스트 스위칭

PCB

: 프로세스 관리 메타데이터로, 프로세스 상태, PID, 프로그램 카운터(PC), 레지스터, 메모리 제한, 열린 파일 정보 등으로 이루어진다.

커널 스택에 저장되며, 각 프로세스가 생성될 때마다 고유의 PCB가 생성되고 프로세스 종료시 PCB도 종료된다.

컨텍스트 스위칭

: PCB를 기반으로 프로세스의 상태를 저장하고 복원하는 과정이다. 프로세스의 종료나 인터럽트에 의해 발생된다.

컨텍스트 스위칭의 비용

  • 유휴시간 발생, 캐시 미스, CPU 상태 저장·복원으로 인한 오버헤드 발생
  • 스레드는 스택만 독립적이고 나머지 메모리를 공유하기 때문에 프로세스보다 컨텍스트 스위칭 비용이 적음.

6. 프로세스의 상태

프로세스는 다음과 같은 상태를 가진다.

  • 생성(create/new): 프로세스 생성 상태, PCB 할당

    프로세스 생성 함수: 프로세스를 생성하여 PCB 할당

    • fork(): 부모 프로세스의 주소공간을 그대로 복사하여 자식 프로세스를 생성. 주소 공간만 복사할뿐, 부모 프로세스의 비동기 작업 등을 상속하지는 않는다.
    • exec(): 새롭게 프로세스를 생성
  • 대기(ready): 준비에서 CPU 할당 대기.

  • 대기 중단(ready suspended): 준비 큐가 꽉찬 상태, 즉 메모리 부족으로 일시 중단된 상태이다.

  • 실행(running): CPU 소유권과 메모리 할당받고 수행중

  • 중단(blocked): 특정 이벤트(IO 등)를 기다리며 프로세스 중단/차단

  • 일시 중단(blocked suspended): 중단 상태에서 메모리 부족으로 일시 중단

  • 종료(terminated/exit): 프로세스 종료, 자원 반납 및 PCB 제거됨. 자연스럽게 종료되는 경우도 있지만 부모 프로세스에 의해 강제로 종료되는 경우도 있음, 또는 그냥 사용자가 강제종료

+ ready suspended, blocked suspended를 묶어서 waiting 상태라고 하기도 한다.

7. 멀티프로세싱과 멀티스레딩

멀티프로세싱과 멀티스레딩은 동시 작업 처리를 위한 구조이다.
웹 브라우저는 멀티프로세싱과 멀티스레딩을 모두 사용함.

멀티프로세싱

  • 여러 프로세스를 통해 동시에 여러 작업 처리
  • 프로세스 간 격리성이 강하여 문제가 다른 프로세스에 영향 주지 않음

멀티스레딩

  • 스레드끼리 자원을 공유하고 프로세스보다 가볍기에 효율성이 높다.
  • 하나의 스레드 문제가 다른 스레드로 이어져 스레드로 이루어져 있는 프로세스 전체에 영향을 줄 수 있음

8. IPC (Inter-Process Communication)

: 프로세스 간 데이터 통신을 의미하며 종류로는 공유 메모리, 파일, 소켓, 파이프, 메시지 큐 등이 있다.

  • 공유 메모리: 데이터를 주고받는 게 아니라 프로세스 간 메모리 직접 공유 (가장 빠름, 동기화 필요). 데이터 복사의 오버헤드가 발생하지 않아 가장 빠르고, 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화 필요.
  • 파일: 디스크 파일을 이용한 통신
  • 소켓: TCP, UDP, HTTP 등 네트워크 기반 통신
  • 파이프
    • 익명 파이프: 부모-자식 프로세스 간에만 사용 가능한 FIFO 기반 단방향 통신채널, 다른 네트워크상 사용 불가
    • 명명 파이프(named pipe): 부모-자식뿐 아니라 외부 네트워크를 통해서도 통신할 수 있는 파이프이다.
  • 메시지 큐: 큐 자료구조 기반 메시지 버퍼를 통한 통신

9. 공유자원과 경쟁상태 및 임계영역

  • 공유 자원: 여러 프로세스·스레드가 접근 가능한 자원
  • 경쟁상태(race condition): 공유 자원 접근 시 순서에 따라 결과가 달라지는 상황
  • 임계영역(critical section): 동시에 접근하면 결과가 달라질 수 있는 코드 영역 (한 번에 하나의 프로세스만 접근 가능하도록 관리 필요)

경쟁 상태 관리의 중요성

  • 데이터 정합성: 예상 값과 다른 데이터 방지
  • 데이터 무결성: 규칙을 위반하는 데이터 방지

10. 뮤텍스, 세마포어, 모니터

공유 자원 접근 시 경쟁 상태 해결 방법으로, 상호배제, 한정대기, 진행의 융통성을 만족시키며 경쟁상태 해결

  • 상호 배제: 한 프로세스가 임계영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
  • 한정 대기: 특정 프로세스가 임계영역 진입후 해당요청이 승인 전까지 다른 프로세스가 임계영역 진입하는 것을 제한
  • 진행의 융통성: 어떤 프로세스도 임계영역 사용하지 않는다면, 임계영역의 어떤 프로세스도 들어갈 수 있으며 이 때 프로세스끼리 서로 방해하지 않는 것.

경쟁 상태 해결 방법

  • 뮤텍스(mutex): 잠금 메커니즘, 한 번에 하나의 프로세스만 접근

  • 세마포어(semaphore): 일반화된 뮤텍스로, 상수 S와 두 가지 함수, wait()signal()로 공유자원에 대한 접근을 처리한다. 여러 프로세스가 동시 접근 가능.

    S: 현재 쓸 수 있는 공유자원의 수로, 음수가 되면 프로세스가 차단되며 대기열에 프로세스를 집어넣는다.
    wait() 또는 P() : S를 1씩 감소시킨다.
    signal() 또는 V() : S를 1씩 증가시킨다. 만약 s.value가 -5 라면 5개의 프로세스가 자원을 기다리며 대기중인 것으로, s가 증가한다면 이 중 하나를 깨워 작업을 하게 한다.

  • 바이너리 세마포어: 값이 0과 1로 제한. 뮤텍스와 유사하다고 할 수 있으나, 뮤텍스는 잠금을 기반으로 상호 배제가 일어나는 '잠금 메커니즘' 이고, 세마포어는 신호를 기반으로 일어나는 '신호 메커니즘' 이다.
  • 카운팅 세마포어: 여러 값을 가질 수 있음
  • 모니터(monitor): 둘 이상의 스레드나 프로세스가 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 공유자원에 대한 접근 인터페이스 제공한다. 이를 통해 한 번에 하나의 프로세스가 접근 가능하다. (상호배제 자동 처리)

11. 교착상태(deadlock)

: 둘 이상의 프로세스가 각자의 자원을 유지한 채 서로의 자원을 기다리며 중단된 상태.

교착상태 발생 조건

  • 상호배제: 주어진 시간 안에 하나의 프로세스만 자원 독점 가능
  • 점유대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하여 대기하는 상태
  • 비선점: 다른 프로세스의 자원을 강제로 가져올 수 없음
  • 환형대기: 서로가 서로의 자원을 요구하는 상황

-> 위의 4가지 조건은 교착상태에 대한 필요조건은 맞지만 충분조건은 아니다.

교착상태 해결 방법

  • 애초에 교착상태 발생조건 성립 방지하도록 설계
  • 교착상태 가능성이 없을때만 자원을 할당하는 은행원 알고리즘으로 교착상태 회피
  • 교착상태 발생시 사이클 탐지하여 프로세스 제거
  • 교착 상태는매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 커서, 교착 상태가 발생하면 사용자가 작업을 종료한다. 현대 운영체제는 이 방법을 채택.

은행원 알고리즘(banker’s algorithm)
자원의 안정적 할당을 통해 교착상태를 예방하는 알고리즘이며, 프로세스 자원요구량과 사용 가능 자원을 기준으로 안정상태를 유지함.

  • 프로세스 최대 요구량, 현재 할당량, 추가 요구량 등을 기반으로 자원을 할당하여 교착상태 방지
  • 최대 요구 자원 예측이 어렵고, 자원 소모량 증가로 사용이 어려운 단점 있음

12. CPU 스케줄링 알고리즘 (페이지교체 알고리즘)

정처기 할때 계산하면서 다뤄서 패스...
종류만 적어놓고 가자.

  • 비선점형(FCFS, SJF, 우선순위)
  • 선점형(라운드로빈, SRF, 다단계큐)
profile
정체되지 않는 성장

0개의 댓글