Process
프로세스는 특정 OS에서 태스크라고도 불린다. 과거에는 job이라고 불렸다고 한다.
일반적으로 프로세스는 OS에 의해 관리된다.
프로그램이 메인 메모리에 로딩되어 실행된다면 프로세스다.
(실행중인 프로그램을 프로세스라 한다.)
프로그램은 디스크에 저장되어 있는 수동적인 실행가능 파일이다. 프로그램이 메모리에 로드(마우스 클릭, CLI등을 통해 실행)되면 프로세스가 된다.
프로그램 측면에서 프로세스를 본다면, 프로세스는 프로그램의 인스턴스이다.
프로세스는 업무 수행을 위해 자원(CPU, 저장장치, 입출력장치, 파일 초기화 자료 ,,, )이 필요하다. 이 자원은 OS가 할당해준다.
종합해보면 하드디스크에 저장되어 있는 프로그램이 메인메모리에 로드되고, 운영체제에서 할당받은 자원을 사용하여 동작하는 것을 프로세스라고할 수 있다.
자바에서 객체와 인스턴스의 관계와 매우 비슷한 거 같다. 자바에서도 한 객체에 의해 생성된 독립적인 여러 인스턴스가 존재할 수 있듯이 프로그램과 프로세스도 동일하다.
한 프로그램의 프로세스는 동시에 독립적으로 여러개가 존재할 수 있다. (이는 멀티프로세스 환경이기 때문에 가능하다)
Process Control Block (PCB)
프로세스에 대한 정보는 PCB
(Process Control Block)에 저장된다.
아래는 학부생 시절 조사했던 FreeRTOS
의 TCB
이다.
PCB는 각 프로세스마다 존재하며 프로세스의 상태, PID, PC(Program counter), CPU 스케줄링 정보, 메모리 할당 정보 등을 포함한다.
프로세스 상태(Process State)
- new: 운영체제에 의해 생성된 상태
- running: 실행 중인 상태 (CPU에 할당되기를 기다리는 상태)
- waiting: 일시 중지 상태
- ready: 승인 후 실행을 기다리는 상태
- terminated: 종료
위도우(Window 10) 기준 명령 프롬프트에서
tasklist 명령어를 통해 프로세스 정보를 확인할 수 있다.
일반적으로, 프로세스는 PID
(Process ID)를 가지며, 이를 통해 프로세스를 식별하고 관리한다.
Thread
스레드는 프로세스 내에서 실행되는 작업의 단위이다. (CPU이용의 기본 단위)
스레드는 스레드ID, PC, 레지스터 집합, 스택으로 구성되어 있다.
각 프로세스는 최소한 하나의 스레드를 가지고 있으며, 여러 스레드를 가진 프로세스는 한 순간에 하나 이상의 일을 할 수 있다. 요즘의 OS는 PCB가 확장되어 스레드에 관한 정보를 포함한다.
스레드는 프로세스 내에서 메모리 공간을 공유하기 때문에, 스레드 간의 데이터 공유와 통신이 용이하다. 하지만 이러한 멀티 스레드 환경을 구축할 때에는 신중하여야 한다.
대부분의 현대 애플리케이션은 멀티스레드로 동작한다.
화면 갱신, 키보드 입력 데이터 가져오기, 절차 확인, 네트워크 요청에 응답하기 등등,, 여러 작업이 동시에 실행될 수 있는 이유가 멀티 스레드 애플리케이션이기 때문이다.
이건 멀티 프로세스 환경에서도 가능하지 않나? 왜 굳이 멀티 스레드 환경이 필요할까
프로세스의 생산은 heavy-weight
, 스레드의 생산은 light-weight
라고 한다.
프로세스보다 스레드의 생성이 비용, 노력이 적게 드는 것이다.
프로세스 vs 스레드
공통점
- 프로세스와 스레드 모두 실행 중인 작업 단위이다.
- 운영체제에서 관리되며 자원을 할당받는다.
- 각 프로세스to프로세스, 스레드to스레드 간 통신이 가능하다.
차이점
프로세스
는 실행 중인 프로그램을 의미한다. 프로세스는 각각의 독립된 메모리 공간과 자원을 할당받아 실행된다. 각각의 프로세스는 다른 프로세스와 독립적으로 실행되며, 프로세스 간 통신이 필요한 경우 IPC 기능을 사용한다.스레드
는 프로세스 내에서 실행되는 작은 작업 흐름(단위)이다. 스레드는 동일한 프로세스 내에서 다른 스레드와 메모리를 공유한다.
멀티 프로세스 vs 멀티 스레드
멀티프로세스
각 프로세스는 독립적인 메모리 공간을 가지고 있기에 아래와 같은 장,단점을 가진다.
장점
- 안정성: 하나의 프로세스가 비정상적으로 종료되더라도 전체 시스템에 영향을 미치지 않는다.
- 보안: 한 프로세스에서 다른 프로세스의 메모리에 접근할 수 없다.
병렬처리
: 여러 개의 작업을 병렬 처리할 수 있다.
단점
- 메모리와 CPU 자원의 낭비: 같은 작업을 수행하는 데에도 불필요한 메모리와 CPU 자원이 중복해서 사용된다.
- 프로세스 간 통신이 어려움:
IPC
기법을 사용해야 하기 때문에 구현이 어렵고 복잡하다.
멀티 스레드
스레드는 프로세스의 메모리 공간을 공유하기 때문에 프로세스와 반대되는 장점과 단점이 존재한다.
장점
- 메모리와 CPU 자원의 효율적인 사용
- 프로세스 간 통신이 쉬움: 전역 변수 등을 이용하여 쉽게 데이터를 공유할 수 있음.
단점
- 안정성: 하나의 스레드가 비정상적으로 종료되면 전체 프로세스가 영향을 받는다.
- 보안: 메모리 공간을 공유하기 때문에 보안에 취약
- 병렬처리의 한계: 멀티 스레드는 동시에 실행될 수 있지만, CPU코어의 개수보다 많은 스레드가 실행될 때는 병렬 처리의 효과를 기대하기 어렵다.