프로세스와 스레드의 차이
프로세스
- 컴퓨터의 메모리에 올라와 실행되고 있는 프로그램
- task와 같은 의미로 쓰인다.
스레드
프로세스와 스레드의 차이
- 프로세스는 스택, 힙 메모리, 데이터, 코드 영역을 기반으로 독립적으로 작업하는 반면
스레드는 프로세스 내의 스택 메모리를 제외한 다른 메모리 영역을 프로세스 내의 다른 스레드들과 공유하기 때문에 메모리적 이점이 있다.
- 프로세스는 다른 프로세스와 격리되어있기 때문에 서로 통신을 하기 위해서는 IPC를 사용해야 하지만
스레드는 다른 스레드와 서로 격리되어있지 않으므로 그냥 통신할 수 있어서 프로세스보다 더 빠르다.
- IPC (Inter-Process Communication ) : 프로세스들 사이에 서로 데이터를 주고받는 행위, 방법, 경로
- 프로세스는 한 프로세스에 문제가 생겨도 다른 프로세스에 영향을 끼치지 않지만
스레드는 격리가 되어있지 않아 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있다.
- 프로세스는 생성과 종료에 더 많은 시간이 들며
스레드는 더 적은 시간이 든다.
프로그램의 컴파일 과정
- 프로그램은 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 된 것을 의미한다. (PCLA)
- 전처리
- 소스코드의 주석제거, #includ 등 헤더파일을 병합하고 매크로를 치환한다.
- 컴파일러
- 오류처리, 코드최적화 작업을 하여 어셈블리어로 변환한다.
- 어셈블러
- 어셈블리어는 목적코드(object code)로 변환된다.
- 이 때 확장자는 운영체제마다 다른데 리눅스에서는
.o
이다.
- ex)
홍길동.o
이라는 파일을 만들면 홍길동.c
라는 파일이 만들어지게 된다.
- 링커
- 프로그램 내 있는 라이브러리 함수 등과 결합해 실행파일이 만들어진다.
- 이는
.exe
, .out
이라는 확장자를 갖게 된다.
프로세스의 메모리 구조
- 운영체제는 프로세스에 적절한 메모리를 할당하는데 다음 구조를 기반으로 할당한다.
- 위에서부터 스택(stack), 힙(heap), 데이터 영역(Data segment, BSS segment), 코드영역(code segment)로 나눠진다.
- 스택은 위 주소부터 할당되고 힙은 아래 주소부터 할당된다.
- 스택
- 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정된다. 그러나 함수가 함수를 호출 하는 등에 따라 런타임 시에도 크기가 변경된다. (동적인 특징)
- 힙
- 힙은 동적할당을 할 때 사용되며 런타임 시 크기가 결정된다. (동적인 특징)
- 데이터영역
- BSS 영역과 Data 영역으로 나뉘고 정적할당에 관한 부분을 담당한다. (정적인 특징)
- 코드영역
정적 할당
- 컴파일 단계에서 메모리를 할당하는 것을 말한다.
- BSS segment와 Data segment, code / text segment 로 나뉘어서 저장된다.
- BSS segment는 전역변수, static, const로 선언되어있는 변수 중 0으로 초기화 또는 초기화가 어떠한 값으로도 되어있지 않은 변수들이 이 메모리 영역에 할당된다.
- Data segment는 전역변수, static, const로 선언되어있는 변수 중 0이 아닌 값으로 초기화된 변수가 이 메모리 영역에 할당된다.
- code / text segment는 프로그램의 코드가 들어간다.
동적 할당
- 런타임단계에서 메모리를 할당받는 것이며 Stack과 Heap으로 나눠진다.
- Stack
- 지역변수, 매개변수, 실행되는 함수에 의해 늘어나거나 줄어드는 메모리 영역
- 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 stack에 계속해서 저장된다.
- 참고로, 재귀함수가 호출된다고 했을 때 새로운 스택 프레임이 매번 사용되기 때문에 함수 내의 변수 집합이 해당 함수의 다른 인스턴스 변수를 방해하지 않는다.
- Heap
- 동적으로 할당되는 변수들을 담는다.
malloc()
, free()
함수를 통해 관리할 수 있으며 동적으로 관리되는 자료구조의 경우 Heap영역을 사용한다.
- ex) vector는 내부적으로 heap영역을 사용한다.
PCB와 컨텍스트 스위칭
PCB
- Process Control Block
- 운영체제에서 관리하는 프로세스에 대한 메타데이터를 저장한 데이터 블록
- 메타데이터
- 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터 (데이터를 위한 작은 데이터)
- 대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대해 부여되는 데이터
- 커널 스택에 저장 (유저모드가 아닌 커널 모드일 때에만 접근 가능)
- 각 프로세스가 생성될 때마다 고유의 PCB가 생성되고 프로세스가 종료되면 PCB는 제거된다.
PCB의 구조
- 프로세스 상태 : 대기중, 실행중 등 프로세스 의 상태
- 프로세스 번호(PID) : 각 프로세스의 고유 식별 번호(프로세스 ID)
- 프로그램 카운터(PC) : 이 프로세스에 대해 실행될 다음 명령의 주소에 대한 포인터
- 레지스터 : 레지스터 관련 정보
- 메모리 제한 : 프로세스의 메모리 관련정보
- 열린 파일 정보 : 프로세스를 위해 열린 파일 목록들
컨텍스트 스위칭
- PCB를 기반으로 프로세스의 상태를 저장하고 다시 복원시키는 과정 (스레드 또한 가능)
- 프로세스가 종료 or 인터럽트에 의해 발생된다.
비용
- 유후시간의 발생
- 컨텍스트 스위칭을 할 때마다 유후시간이 생겨서 CPU의 가용성이 떨어지는 비용이 발생한다.
- 캐시미스
- 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 생기므로 캐시 클리어 과정이 무조건 일어나게 되고 이 때문에 캐시미스가 발생한다.
스레드에서의 컨텍스트 스위칭
- 스택메모리를 제외한 모든 메모리를 공유하기 때문에 비요잉 더 적고 시간도 더 적게 걸린다는 장점이 있다.
프로세스의 상태
생성 상태
- create or new
- 프로세스가 생성된 상태를 의미하며
fork()
또는 exec()
함수를 통해 프로세스가 생성된 상태
- 이때 PCB가 할당된다.
fork()
- 부모 프로세스의 주소 공간을 그대로 복사하며, 새로운 자식 프로세스를 생성하는 함수
- 주소 공간만 복사할 뿐이지 부모 프로세스의 비동기 작업 등을 상속하지는 않는다.
exec( )
대기 상태
- ready
- 처음 프로세스가 생성된 이후 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 준비 큐 (준비 순서열)에 들어가서 대기중인 상태를 말한다.
- 이는 CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태이다.
대기 중단 상태
- ready suspended
- 준비큐가 꽉찬 상태 즉, 메모리 부족으로 일시 중단된 상태
실행 상태
- running
- CPU 소유권과 메모리를 할당받고 인스트럭션을 수행 중인 상태 (CPU burst)
중단 상태
- blocked
- 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
- ex) 프린트 인쇄 버튼을 눌렀을 때 실행하고 있던 프로세스가 잠깐 멈춘 듯할 때
- 프린트 인쇄에 관한 I/O요청으로 인해 인터럽트가 발생되어 현재 실행하고 있던 프로세스가 중단 상태로 잠시 변경된 것
일시 중단 상태
- blocked suspended
- 대기 중단과 유사하다.
- 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
종료상태
- terminated or exit
- 프로세스 실행이 완료되어 해당 프로세스에 대한 자원을 반납하며 PCB가 삭제되는 상태
- 종료는 자연스럽게 종료되는 것도 있지만 부모 프로세스가 자식 프로세스를 강제적으로 종료시켜 비자발적 종료(abort)로 종료되는 것도 있다.
- 자식 프로세스에 할당된 자원의 한계치를 넘어서거나 부모 프로세스가 종료되거나 사용자가
process.kill
등 여러 명령어로 프로세스를 종료시킬 때 발생한다.
멀티 프로세싱과 멀티 스레딩
- 여러 개의 스레드 또는 프로세스를 만든 상태를 멀티 스레드, 멀티 프로세스라고 한다.
- 이를 기반으로 작업을 하는 것을 멀티 스레딩, 멀티 프로세싱이라고 한다.
멀티 프로세싱
- 여러 개의 프로세스, 즉 멀티 프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것
- 특정 프로세스 중 일부에 문제가 발생되더라도 다른 프로세스에 영향을 미치지 않으며 격리성과 신뢰성이 높은 강점이 있다.
멀티 스레딩
- 스레드의 경우에는 프로세스와 달리, 스택을 제외한 메모리(힙, 데이터, 코드)를 공유한다.
- 프로세스 내 작업을 멀티 스레드로 처리하는 기법이며 스레드끼리 서로 자원을 공유하고 프로세스보다는 가볍기 때문에 효율성이 높은 장점이 있다.
- 그러나 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있는 단점이 있다.
IPC
- Inter-Process Communication
- 프로세스끼리 데이터를 주고받고 공유데이터를 관리하는 메커니즘
- 종류 : 공유메모리, 파일, 소켓, 파이프, 메세지 큐
공유메모리
- 여러 프로세스가 서로 통신할 수 있도록 메모리를 공유하는 것
- IPC 방식 중 어떠한 매개체를 통해 데이터를 주고 받는게 아니라 메모리 자체를 공유
- 불필요한 데이터 복사의 오버헤드가 발생하지 않아 가장 빠르다.
- 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화가 필요하다.
- IPC 중에서 가장 빠른 통신 방법이다.
파일
- 디스크에 저장된 데이터를 기반으로 통신하는 것을 의미한다.
- 요즘 IPC로는 잘 사용하지 않는 방식 중 하나
소켓
- 네트워크 인터페이스(TCP, UDP, HTTP 등)를 기반으로 통신하는 것
- ex) 네이버
파이프
- 익명 파이프
- anonymous pipe, unnamed pipe
- 프로세스 사이에 FIFO 기반의 통신채널을 만들어 통신하는 것
- 파이프 하나 당 단방향 통신이기 때문에 만약 양방향 통신을 하려면 2개의 익명 파이프를 만들어야 한다.
- 부모, 자식 프로세스 간에만 사용할 수 있으므로 다른 네트워크 상에서는 사용이 불가능하다.
- 파이프의 데이터 용량은 제한되어 있으며 쓰기, 읽기 프로세스보다 더 빠르게 데이터를 쓸 수 없다.
- 들어오는 양(읽기)과 나가는 양(쓰기)이 같다.
- 명명 파이프
- named pipe
- 익명 파이프의 확장된 개념이며 부모, 자식 뿐만 아니라 다른 네트워크 상에서도 통신할 수 있는 파이프
- 보통 서버, 클라이언트용 파이프를 구분해서 동작한다.
메세지 큐
- 메세지를 큐(queue) 자료구조 형태로 관리하는 버퍼를 만들어 통신하는 것
- 프로세스가 메세지를 보내거나 받기 전에 큐를 초기화한다.
- 보내는 프로세스(sender)의 메세지는 큐에 복사되어 받는 프로세스(receiver)에 전달된다.