프로세스와 스레드

임찬형·2022년 7월 1일

CS 공부

목록 보기
9/19

프로세스와 스레드

프로세스

컴퓨터에서 실행되고 있는 프로그램.
CPU 스케줄링의 대상이 되는 Task를 의미.

스레드

프로세스 내 작업의 흐름

프로세스와 컴파일 과정

프로그램 - 컴파일러가 컴파일 과정을 거쳐 기계어로 번역되어 실행될 수 있는 파일

소스 코드 파일 - 전처리 - 컴파일러 - 어셈블리어 - 어셈블러 - 링커

  1. 전처리
    소스 코드의 주석을 제거하고 #include 등 헤더 파일을 병합.

  2. 컴파일러
    오류 처리, 코드 최적화 작업 후 코드를 어셈블리어로 변환

  3. 어셈블러
    어셈블리어로 변환한 코드를 object code로 변환.

  4. 링커
    프로그램 내 라이브러리 또는 다른 object code와 결합하여 실행 파일 제작

+) 정적 라이브러리와 동적 라이브러리
정적: 프로그램 빌드 시 라이브러리 모든 코드를 실행 파일에 넣음 (외부 의존도, 메모리 효율성 낮음)
동적: 프로그램 실행 시 필요할 때만 함수를 참조(외부 의존도 높고 메모리 효율성 좋음)

프로세스의 상태

  • 생성 상태
    프로세스가 생성된 상태
    fork(): 부모 프로세스 주소 공간 복사해 자식 프로세스 생성
    exec(): 새로운 프로세스 생성

  • 대기 상태
    메모리 공간이 충분하면 할당받고 아니면 대기하는 상태(CPU 소유권 기다림)

  • 대기 중단 상태
    메모리 부족으로 일시 중단된 상태

  • 실행 상태
    CPU 소유권과 메모리를 할당받고 작업을 수행 중인 상태.
    CPU burst 일어났다고도 한다.

  • 중단 상태
    어떤 이벤트가 발생한 후 기다리며 프로세스가 차단된 상태.
    I/O 디바이스 인터럽트에 의해 주로 발생함

  • 일시 중단 상태
    대기 중단과 유사하나, 중단된 상태에서 재실행하려 했으나 메모리가 부족한 상태

  • 종료 상태
    메모리와 CPU 소유권을 모두 놓고 가는 상태. 자발적 종료와 비자발적 종료(부모 프로세스가 자식 프로세스 강제로 종료)가 있음.

프로세스의 메모리 구조

  1. 스택
  • 지역변수, 매개변수, 함수 저장.
  • 컴파일 시에 크기가 결정되며 동적 특징을 갖는다.
  • 재귀 호출 등에 의해 크기가 늘어날 수 있으며 힙과 메모리 영역 겹치면 안되기 때문에 사이에 여유공간을 둠.
  • 동적 할당에 사용
  1. 데이터 영역
  • 전역변수, 정적변수 저장
  • 프로그램(정적)이 종료되면 사라지는 변수가 들어있는 영역
  • BSS영역(0으로 초기화)과 Data영역(0 아닌 다른 값 초기화)으로 나뉨
  1. 코드 영역
  • 프로그램에 내장된 소스 코드가 들어가는 영역이며 정적.

PCB

PCB(Process Control Block): 프로세스에 대한 메타데이터를 저장한 데이터.
프로그램 실행되면 프로세스 생성 - 메모리 할당 - PCB 생성해 관리 (커널)

PCB의 구조

  • 프로세스 스케줄링 상태 - 준비, 일시중단 등 스케줄링 정보
  • 프로세스 ID - 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
  • 프로세스 권한 - 컴퓨터 자원, I/O 디바이스 권한 등
  • 프로그램 카운터 - 다음 명령어의 주소에 대한 포인터
  • CPU 레지스터 - 프로세스 실행에 필요한 레지스터 정보
  • CPU 스케줄링 정보
  • 계정 정보
  • I/O 상태 정보

컨텍스트 스위칭
PCB를 교환하는 과정으로 프로세스 할당된 시간 끝나거나 인터럽트에 의해 발생

어떠한 시점에서 실행되고 있는 프로세스는 하나이며 (싱글코어 기준) 빠른 속도로 컨텍스트 스위칭이 발생함

멀티프로세싱

여러 개의 프로세스, 즉 동시에 두 가지 이상의 일을 수행할 수 있는 것.
하나 이상의 일을 병렬로 처리할 수 있으며 프로세스 중 일부에 문제가 생겨도 다른 프로세스로 처리 가능해 신뢰성 높음

ex) 웹 브라우저

  • 브라우저 프로세스 (상단 UI 및 네트워크, 파일 접근)
  • 렌더러 프로세스 (View 제어)
  • 플러그인 프로세스 (플러그인)
  • GPU 프로세스 (GPU로 그리는 부분)

IPC - 프로세스끼리 데이터 주고받고 공유 데이터 관리하는 매커니즘

ex) 공유 메모리, 메시지 큐, 소켓, 익명 파이프, 명명 파이프 등

  • 공유 메모리 - 여러 프로세스에 동일한 메모리 접근 권한. 빠르지만 동기화 필요
  • 메시지 큐 - 메시지를 큐 형태로 관리.
  • 소켓 - 네트워크 인터페이스를 통해 전송 (TCP, UDP)
  • 익명 파이프 - 단방향 공간인 파이프(FIFO기반)를 통해 작동. 부모 자식 프로세스 간에만 사용 가능.
  • 명명 파이프 - 파이프 서버와 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 양방향 파이프.

스레드와 멀티스레딩

스레드 - 프로세스의 실행 가능한 가장 작은 단위. 코드, 데이터, 스택, 힙 영역을 각각 생성하는 프로세스와 달리 스레드를 서로 공유함.

멀티 스레딩 - 프로세스 내 작업을 여러 개의 스레드로 처리하는 기법.
장점: 자원 효율성 높고 한 스레드 중단되어도 다른 스레드로 처리 가능
단점: 한 스레드에 문제 생기면 다른 스레드에도 영향 - 프로세스에 영향

공유 자원과 임계 영역

공유 자원 - 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수

경쟁 상태 - 공유 자원을 두 개 이상의 프로세스가 동시에 읽고 쓰는 상황

임계 영역 - 접근 순서 등의 이유로 결과가 달라질 수 있는 영역
해결 방법: 뮤텍스, 세마포어, 모니터.
조건

  • 상호 배제: 한 프로세스가 임계 영역 들어가면 다른 프로세스는 불가
  • 한정 대기: 특정 프로세스가 영원히 임계 영역 못들어가선 안됨
  • 융통성: 한 프로세스가 다른 프로세스 방해해선 안됨
  1. 뮤텍스
    공유 자원 사용 전에 설정하고 사용 후에 해제하는 잠금장치 역할.
    하나의 잠금 상태만을 가짐

  2. 세마포어
    일반화된 뮤텍스.
    wait() - 자신의 차례까지 기다림.
    signal() - 다음 프로세스로 순서 넘김.

    • 바이너리 세마포어: 뮤텍스와 같이 0과 1 두 가지 값만 가지는 세마포어
    • 카운팅 세마포어: 여러 값으로 여러 자원에 대한 값에 대한 접근을 제어.
  3. 모니터
    공유 자원을 숨기고 해당 접근에 대한 인터페이스만 제공
    상호 배제가 자동으로 됨(모니터 내부 큐에 작업 추가 방식)

교착 상태

교착 상태 - 두 개 이상의 프로세스들이 서로의 자원을 기다리며 중단된 상태

원인

  • 상호 배제: 한 프로세스가 자원 독점한 상태
  • 점유 대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청
  • 비선점: 다른 프로세스 자원 강제로 가져올 수 없음
  • 환형 대기: A가 B의 자원을 요구하고 B는 A의 자원을 요구하는 등 Circular하게 자원을 요구하는 상황

해결 방법

  • 교착 상태 가능성 없을 때만 자원 할당 + 은행원 알고리즘(프로세스당 요청 자원 최대치로 할당 가능 여부 판단)
  • 교착 상태 발생 시 사이클 찾아보고 프로세스 한 개씩 지움
  • 사용자가 작업 종료(처리 비용이 더 듦)

0개의 댓글