프로세스(Process)란?
운영체제에게 할당받은 작업 단위이다. 쉽게 말해, 메모리 위에서 현재 실행되고 있는 프로그램을 말한다. 프로그램은 정적인 코드 뭉치이다. 사용자가 실행하지 않으면 영원히 가만히 있는다. 사용자가 프로그램을 사용하겠다고 운영체제에게 알리면, 운영체제는 메모리에 프로그램을 구동할 수 있을 만한 메모리를 할당하고, 메모리는 디스크에서 프로그램을 읽어온다. 실행 준비를 마친 프로그램은 메모리 위에서 실행된다. 이것이 하나의 작업 단위이다.
Code/Data/Stack/Heap의 형식으로 할당해 준다. 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로레스의 변수나 자료에 접근 할 수 없다.
다른 프로세스의 정보에는 접근할 수 없을까?
접근이 가능하다. 프로세스 간 정보를 공유하는 방법에는 다음과 같은 방법들이 있다. 다만 이 경우에는 단순히 CPU
레지스터 교체뿐만이 아니라 RAM과 CPU 사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다.
1. IPC(Inter-Process Communication)을 사용한다.
2. LPC(Local inter-Process Communication)을 사용한다.
3. 별도로 공유 메모리를 만들어서 정보를 주고받도록 설정해주면 된다.
스레드(Thread)란?
프로세스 내에서 실행되는 흐름의 단위이다. 모든 프로그램은 자신을 실행하기 위한 하나 이상의 스레드를 가지고 있다. 스레드가 두 개 이상일 때 멀티 스레드라고 한다. 하나의 프로세스 안에 멀티스레드가 작동한다면, 병렬적으로 작업을 처리할 수 있다는 장점이 있다. 이 장점에 따르는 단점도 있다. 하나의 작업을 나누어서 처리한다는 것은 자원을 공유한다는 것과 같다. 따라서 동기화 문제가 발생할 수 있다.
프로세스와 스레드 차이
차이라고 한다면, 각 프로세스는 독립적이다. 다른 프로세스와 작업을 공유하지 않는다. 하지만 스레드는 하나의 프로세스가 처리해야 하는 일을 메모리를 공유하여 나눠서 할 수 있다. 만약 한 프로세스를 실행하다가 오류가 발생해서 프로세스가 강제로 종류 된다면, 공유하고 있는 파일을 손상시키는 경우가 아니라면 아무런 영향을 주지 않는다.
하지만 스레드의 경우는 다르다. 스레드는 Code/Data/Heap 메모리 영역의 내용을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료 된다.
멀티프로세스와 멀티 스레드
멀티 프로세스 : 하나의 운영체제 안에서 여러 프로세스가 실행되는 것을 의미한다. 멀티태스킹은 자칫하면 여러 프로세스가 동시에 실행되는 것처럼 보이지만 자세한 원리를 알면 그렇지 않다. Context-Switching 때문에 하나가 실행하면 하나가 중단되고 다른 하나가 실행하면 그 전 실행하던 게 중단되는 것이다.
멀티 스레드 : 멀티 스레드를 사용하면 각각의 스레드 중 어떤 것이 어떤 순서로 실행될지 그 순서를 알 수 없다.
만약 A 스레드가 어떤 자원을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A 스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.
이처럼 여러 스레드가 함께 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 한다.
멀티 프로세스와 멀티 스레드 차이점
멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지하는 단점이 있다.
멀티 프로세스로 할 수 있는 작업들을 굳이 하나의 프로세스에서 멀티 스레드를 사용할까?
운영체제가 시스템 자원을 효율적으로 관리하기 위해 스레드를 사용한다.
멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
스레드 예제
public class SingleThreadEx extends Thread{
private int[] temp;
public SingleThreadEx(String threadname){
super(threadname);
temp = new int[10];
for(int start=0;start<temp.length;start++){
temp[start]=start;
}
}
public void run(){
for(int start:temp){
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
// TODO: handle exception
}
System.out.println("스레드이름:"+currentThread().getName());
System.out.println("temp value :"+start);
}
}
public static void main(String[] args) {
SingleThreadEx st = new SingleThreadEx("첫번째");
st.start();
}
}
멀티 스레드 예제
public class Main {
public static void main(String[] args) {
ThreadEX threadex = new ThreadEX();
ThreadEX threadex2 = new ThreadEX();
Thread thread1 = new Thread(threadex,"A");
Thread thread2 = new Thread(threadex2,"B");
thread1.start();
thread2.start();
Thread.currentThread().getName();
}
}
class ThreadEX implements Runnable{
int TestNum=0;
@Override
public void run() {
for(int i=0;i<10;i++){
if(Thread.currentThread().getName().equals("A")){
System.out.println("=======================");
TestNum++;
}
System.out.println("ThreadName ="+Thread.currentThread().getName()+"TestNum ="+TestNum);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
결론
프로세스와 스레드는 개념의 범위부터 다르다. 스레드는 프로세스 안에 포함되어 있기 때문이다.
프로세스는 Code/Data/Stack/Heap 메모리 영역을 할당해 주고 최소 작업 단위로 삼는 반면, 스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.
프로세스는 다른 프로세스와 정보를 공유하려면 IPC를 사용하는 등의 번거로운 과정을 거쳐야 하지만, 스레드는 기본 구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽다. 때문에 멀티태스킹보다 멀티스레드가 자원을 아낄 수 있게 된다. 다만 동기화 문제가 있어 사용하기 까다롭다.
'Language > Java' 카테고리의 다른 글
extends vs implements (0) | 2021.07.12 |
---|---|
GC 가비지 컬렉션 이란? (0) | 2021.07.05 |
Statement와 PreparedStatement 차이 (0) | 2021.06.30 |
Eclipse spring 설치 (0) | 2021.06.02 |
Big-O 표기법 (0) | 2021.05.30 |