본문 바로가기

CS

[OS]프로세스와 스레드의 차이

프로그램


  • 실행할 수 있는 파일(파일이 디스크에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태), 코드 파일 자체

프로세스


  • 실행된 프로그램(메모리에 적재되어 실행되고 있는 프로그램의 인스턴스), 하드디스크 -> 메모리(코드, 데이터, 힙, 스택), 해당 프로세스를 관리하는 PCB(process control block)가 같이 만들어짐
  • 커널에 의해 관리됨, 프로세스마다 커널 메모리에 PCB라는 자료구조로 관리됨
  • 운영체제로부터 독립된 시간, 공간 자원을 할당 받아 실행된다
  • 프로세서 : 프로세스가 동작될 수 있도록 하는 하드웨어(CPU)

스레드


  • 실행되고 있는 프로그램의 실행 단위
  • 한 프로세스 내에서 자원을 공유하면서 동시에 실행된다.
  • 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성

이해를 위한 설명


  • 프로그램은 메모리에 올라와 있지 않은 코드의 덩어리 개념, 실행하면 메모리에 올라오고 이 상태를 프로세스라 부름, 프로세스를 쪼갠, 더 작은 개념의 단위가 스레드.
  • 스레드는 코드에 정의된 함수 개념으로 볼 수 있으며 프로세스의 자원(메모리)를 공유하며 작동한다.
  • 각각의 프로세스는 독립된 메모리 영역을 Code/Data/Stack/Heap 나누어 할당 받는다
  • 각 스레드는 stack 형식으로 할당 된 메모리는 따로 할당받고, 나머지 영역은 공유하게 된다.

멀티프로세스, 멀티태스킹, 멀티프로그래밍 개념 차이


  • 멀티프로세스는 여러 대의 CPU가 프로세스를 동시에 처리하는 것(CPU는 한 번에 하나의 프로세스만 처리 가능)
  • 멀티코어 : 동시성(싱글코어로 시분할처리), 병렬처리(여러대의 CPU로 여러 프로세스를 동시에 처리)
  • 멀티 코어 멀티 스레딩의 경우 L2 cache로 공유하게 됨
  • 멀티태스킹은 다수의 Task(작업의 최소 단위, 경우에 따라 프로세스 혹은 스레드 개념)를 운영체제의 스케줄링에 의해 번갈아 가면서 처리하는 것
  • 멀티프로그래밍은 CPU가 작업을 처리할때 낭비되는 시간동안(입출력 이벤트 등) 다른 프로세스를 처리하는 것
  • IPC(프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로)를 사용해 통신해야함
  • IPC의 종류는 메시지 큐, 파이프, 이름 붙은 파이프 등이 있음
  • 공유 메모리 : 여러 개의 프로세스에서 공통으로 사용할 수 있는 메모리 영역, 시스템 콜에 의해 작성, 접속을 어태치, 끊는 것을 디태치라 함
  • Context Switching 과정에서 캐쉬 메모리 초기화 등 비용 소모가 크다.
  • 반면 하나의 프로세스에 문제가 생겨도 다른 프로세스에 영향을 주지 않는다.(안정성이 높음)

멀티스레드


  • 멀티스레드는 프로세스가 스레드를 동시에 처리하는 것
  • 스레드의 경우 메모리를 공유하고 있어 Context-Switching 비용에 대한 부담이 적음(heap 영역으로 데이터 공유 가능)
  • 반대로 공유자원에 동시에 접근할 수 있기 때문에 동기화 문제(전역변수 사용과 같은)가 발생할 수 있다.
  • 따라서 동기화 작업(작업 순서 및 접근 컨트롤)이 필요하지만 과할 경우 병목현상이 발생할 수 있음
  • 멀티프로세스 컨텍스트-스위칭과는 달리 캐시 메모리 초기화 등 무거운 작업이 없다.
  • 스레드 스케줄링은 운영체제가 처리하지 않아 프로그래머가 처리해주어야 함

멀티 프로세스 대비 멀티 스레드의 장점

  • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있다.

Race Condition(레이스 컨디션, 경쟁 조건, Data race)

  • 임계구역(여러 스레드에 의해 실행되는 코드 지역)에서 스레드의 실행 순서에 따라 결과가 달라지면 임계구역은 경쟁조건을 가진다고 말한다.
  • 메모리(변수, 배열, 객체), 시스템(데이터 베이스, 웹 서비드 등), 파일 등에 동시에 접근해 하나 이상의 스레드가 쓰기를 수행할 때
  • 여러 스레드가 동시에 호출할 수 있는 코드를 tread-safe 하다고 표현

예방

하드웨어적 기법(Lock)
  • 동시에 공유 자원에 접근하는 것을 막기 위해 Critical Section 에 진입하는 프로세스는 Lock 을 획득하고 Critical Section 을 빠져나올 때, Lock 을 방출함으로써 동시에 접근이 되지 않도록 함
  • 다중처리기 환경에서는 시간적인 효율성이 떨어짐
소프트웨어적 기법(세마포어)
  • 뮤텍스(Mutex) : Locking 메카니즘, 오직 하나의 스레드, 프로세스가 뮤텍스를 얻어(key를 얻어) 공유자원(임계 영역, Critical Section)에 접근할 수 있다.
  • 카운팅 세마포어(Semaphore) : Signaling 메카니즘, 현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성
  • 단점 : 교착상태, busy wating(임계영역에 진입해야 하는 프로세스는 진입코드를 반복적으로 실행함)

더 알아야 할 부분


프로세스의 메모리 할당 방식(Code/Data/Stack/Heap)

  • Code: 프로그램의 실제 코드
  • Data: 프로세스가 실행될 때 정의된 전역 변수, Static 변수 저장(보통 메인함수 전에 선언되어 프로그램이 끝날 때 까지 메모리에 남아있는 변수)
  • Heap: 사용자에 의해 관리되는 동적 할당 영역, 프로세스 런타임 중 동적으로 할당되는 변수들을 저장(함수 내에서 할당되는 변수 등)
  • Stack: 호출된 함수, 매개변수, 지역 변수 등 임시데이터, 함수가 종료되면 해당 함수에 할당된 변수들을 메모리에서 해제
  • Data영역들은 낮은 주소(low address)에 할당되고, Heap, Stack의 경우는 비교적 높은 주소에 할당
프로세스가 메모리를 공유하는 방식(IPC, LPC 등)
  • 독립적인 각 프로세스가 다른 프로세스의 정보를 변경하는 것을 극도로 주의하고 있으며 필요할 경우 최소한의 인터페이스를 제공해 소통할 수 있도록 하고 있으며 이러한 프로세스간 소통을 Inter Process Communication(IPC)라고 함
  • 다른 컴퓨터에 위치한 두 프로세스가 통신할 수도 있으며 이때 운영 시스템 등이 다를 수 있기 때문에 통신을 위해 Protocol 이 필요
Context Switching란?
  • CPU에서 여러 프로세스에 대한 작업을 처리하는 과정으로 동작 중인 프로세스가 대기 상태로 전환되며 작업 중인 프로세스에 대한 정보(Context)를 보관하고, 대기하고 있던 다음 프로세스가 동작하면서 이전의 프로세스 상태를 복구하는 작업 뜻함, Context는 PCB에 저장
  • Interupt or System call -> 1. A프로세스 작업 PCB저장 -> 2. B프로세스 적재 -> 3.B 프로세스 PCB 저장 -> 4. A프로세스 적재
  • 12, 34 사이에 CPU는 아무 일도 못 함 -> 컨텍스트 스위칭(오버헤드)
오버헤드(overhead)란?
  • 프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때 , 추가적으로 시간,메모리,자원이 사용되는 현상
PCB(프로세스 컨트롤 블록, Process Control Block)
  • 프로세스를 제어하기 위한 정보 모음(운영체제의 자료구조
  • 운영체제는 프로세스를 관리하기 위해 프로세스의 생성시 고유한 PCB 를 생성
  • 프로세스는 작업 중 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU 를 반환해야 하는데, 이때 작업의 진행 상황을 PCB 에 저장

PCB 저장 정보

  • 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
  • 프로세스 상태(psw, program status word) : new, ready, running, waiting, terminated 등
  • 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
  • CPU 레지스터 : 이전에 작업하던 내용
  • CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
  • 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
  • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
  • 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등
PC Register는 스레드마다 독립적으로 할당
  • PC (Program Counter) : 다음 인출(Fetch) 될 명령어의 주소를 가지고 있는 레지스터
  • 스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당해 명령어가 연속적으로 수행되지 못함, 어느 부분까지 수행했는지 기억할 필요가 있음

레지스터(Register)란?

  • 레지스터는 CPU(Central Processing Unit)가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치
  • PC (Program Counter) : 다음 인출(Fetch) 될 명령어의 주소를 가지고 있는 레지스터
  • AC (Accumulator) : 연산 결과 데이터를 일시적으로 저장하는 레지스터
  • IR (Instruction Register) : 가장 최근에 인출된 명령어(현재 실행 중인 명령어)가 저장되어 있는 레지스터
  • SR (Status Register) : 현재 CPU 의 상태를 가지고 있는 레지스터
  • MAR (Memory Address Register) : PC 에 저장된 명령어 주소가 사용되기 전에 일시적으로 저장되는 주소 레지스터
  • MBR (Memory Buffer Register) : 기억장치에 저장될 데이터 혹은 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터
32비트/64비트
  • 명령을 한 번에 처리할 수 있는 레지스터의 비트 수(데이터 처리 단위, 비트의 폭)
  • 하나의 레지스터가 저장 가능한 비트의 수, CPU가 한 번에 인식하여 처리할 수 있는 주소 값의 범위,
32비트는 4기가 메모리까지밖에 인식을 못 하는 이유?
  • 메모리 한칸은 1byte의 크기, 32bit 운영체제에서는 32개의 비트, 즉 4바이트 길이의 주소를 갖게됨
  • 즉 크기는 1바이트이지만 이 메모리를 가리키는 주소는 32자리로 표현
  • 즉 4,294,967,296 개의 주소를 가리킬 수 있다는 의미이고, 이는 1바이트 크기의 메모리가 4,294,967,296 개 까지 인식이 가능하다는 것, 즉 메모리의 최대 크기는 4,294,967,296 byte = 4GB
  • 포인터(메모리 공간 주소를 가리키는 변수)의 크기는 32비트 운영체제에서는 4byte, 64비트에서는 8바이트