프로세스
프로세스는 실행 중인 프로그램을 의미한다. 하나의 프로세스는 프로그램의 인스턴스이며, 독립된 메모리 공간(가상 메모리)을 가지고 있다. 각 프로세스는 자체 메모리 공간에서 실행되며, 다른 프로세스와 메모리 공간을 공유하지 않는다. 따라서 프로세스 간에는 서로의 메모리에 직접 접근할 수 없고, 서로 데이터를 주고받기 위해서는 특정 통신 방법(예:파이프, 파일, 소켓)을 사용해야 한다.
프로세스의 메모리 구성
- 코드 섹션: 실행할 프로그램의 코드가 저장되는 부분
- 데이터 섹션: 전역 변수 및 정적 변수가 저장되는 부분(그림에서 기타에 포함)
- 힙 (Heap): 동적으로 할당되는 메모리 영역
- 스택 (Stack): 메서드(함수) 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역(스레드에 포함)
스레드
프로세스 내에서 실행되는 작업의 단위이다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이 스레드들은 프로세스 내의 메모리 공간을 공유한다. 즉, 스레드들은 동일한 데이터, 파일 등에 접근할 수 있다. 스레드를 사용하는 이유는, 여러 작업을 병렬로 처리하여 프로그램의 성능을 향상시키기 위해서 이다.
메모리 구성
- 공유 메모리 : 같은 프로세스의 코드 섹션, 데이터 섹션, 힙(메모리)은 프로세스 안의 모든 스레드가 공유한다.
- 개별 스택 : 각 스레드는 자신의 스택을 갖고 있다.
프로그램이 실행된다는 것은 어떤 의미일까?
프로그램을 실행하면 운영체제는 먼저 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러오면서 프로세스를 만든 다. 그럼 만들어진 프로세스를 어떻게 실행할까?
프로그램이 실행된다는 것은 사실 프로세스 안에 있는 코드가 한 줄씩 실행되는 것이다. 코드는 보통 main() 부터 시 작해서 하나씩 순서대로 내려가면서 실행된다.
public class Operator {
public static void main(String[] args) {
int sum1 = 1;
int sum2 = sum1 + 1;
System.out.println("sum1 = " + sum1);
System.out.println("sum2 = " + sum2);
}
}
코드를 하나씩 순서대로 실행하기 떄문에 프로그램이 작동하고 계산도 하고, 출력도 할 수 있다. 스레드는 프로세스 내에서 실행되는 작업의 단위이다. 한 프로세스 내에 하나의 스레드가 존재할 수 있고, 한 프로세스내에 여러 스레드가 존재할 수 있다. 그리고 스레드는 프로세스가 제공하는 동일한 메모리 공간을 공유한다.
- 단일 스레드 : 한 프로세스 내에 하나의 스레드만 존재
- 멀티 스레드 : 한 프로세스 내에 여러 스레드가 존재
하나의 프로세스 안에는 최소 하나의 스레드가 존재한다. 참고로 우리가 작성하는 자바 코드들은 모두 한 프로세스 내에서 하나의 스레드만 사용하는 단일 스레드 이다. 정리하면 프로세스는 실행 환경과 자원을 제공하는 컨테이너 역할을 하고, 스레드는 CPU를 사용해서 코드를 하나하나 실행한다.
멀티스레드가 필요한 이유
하나의 프로그램도 그 안에서 동시에 여러 작업이 필요하다.
- 워드 프로그램으로 문서를 편집하면서, 문서가 자동으로 저장되고, 맞춤법 검사도 함께 수행된다.
- 유튜브는 영상을 보는 동안, 댓글도 달 수 있다.
스케줄링
2개의 프로세스와 3개의 스레드가 있다고 하면 CPU 코어에 어떤거 부터 동작해야할지 정리를 해줘야하는데 이때 스케줄링 큐라는 곳에다 스레드1, 2, 3 을 넣어두고 한개씩 CPU 코어에 돌아가면서 동작하는 방식이다. 만약 CPU 코어가 2개 이상이면 한번에 더 많은스레드를 물리적으로 진짜 동시에 실행할 수 있게 된다.
Script
프로세스
- 독립적인 실행 단위
- 서로 메모리를 공유하지 않는다.
스레드
- 같은 프로세스 내에서 실행되는 작업 단위
- 메모리와 자원을 공유한다.
- 생성 및 관리가 비교적 간단하며, 메모리 자원을 적게 사용
스케줄링
CPU 코어에 스레드들을 하나씩 넣어 동작하게 하는 방식이다. 만약 CPU가 2개이면 여러개의 스레드를 동시에 실행 시킬수가 있다.