실행 중인 프로그램을 의미하며, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행중인 것을 이야기합니다. 이 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원, 그리고 스레드로 구성되어 있습니다.
프로세스내에서 실제로 작업을 수행하는 주체를 의미합니다. 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다. 또한, 두개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 합니다.
스레드의 생성과 실행
자바에서 스레드를 생성하는 방법에는 다음과 같이 두 가지 방법이 있습니다.
lass ThreadWithClass extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName()); // 현재 실행 중인 스레드의 이름을 반환함.
try {
Thread.sleep(10); // 0.01초간 스레드를 멈춤.
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class ThreadWithRunnable implements Runnable {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()); // 현재 실행 중인 스레드의 이름을 반환함.
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
두 방법 모두 스레드를 통해 작업하고 싶은 내용을 run() 메소드에 작성하면 됩니다.
스레드는 우선순위에 관한 자신만의 필드가 있으며, 이런 우선순위에 따라서 특정 스레드가 더 많은 시간동안 작업을 할 수 있도록 설정할 수 있습니다.
getPriority()와 setPriority()를 이용해서 스레드의 우선순위를 반환하거나 변경할 수 있습니다.(1~10까지의 숫자를 가질 수 있음)
다만 스레드의 우선순위는 비례값이 아닌 상대적인 값을 나타냅니다.
두 개 이상의 스레드가 공유 데이터에 동시에 접근하게 되면 예상과 벗어난 결과가 나타날 수 있기 때문에 이런 문제를 해결하기 위한 것이 스레드의 동기화입니다.
스레드의 동기화를 막기 위해서는 메서드 전체를 임계 영역으로 설정하거나 특정 영역을 임계영역으로 설정해야합니다.
스레드의 제어는 아래의 메서드를 이용해서 상태를 정리할 수 있습니다.
다른점 | 프로세스 | 스레드 |
---|---|---|
정의 | 메모리를 할당 받아 실행되는 컴퓨터 프로그램의 작업 단위 | 프로세스가 할당 받은 자원을 이용하는 실행 단위 (즉, 1개의 프로세스는 1개 이상의 스레드를 가짐) |
시스템 자원 | 운영체제로부터 고유한 메모리 영역을 할당 받음 | 스레드는 각각 stack만 따로 할당 받고, 프로세스 내의 주소 공간과 자원을 공유함 |
통신 | 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야함으로 덜 효율적임 | - 같은 프로세스 안에 있는 스레드들은 자원을 공유하기 때문에 한 스레드가 자원을 변경하면 다른 스레드(sibling thread)도 그 변경 결과를 즉시 알 수 있기 때문에 더 효율적임 |
처리 시간 | context switching 시간, 생성/종료하는데 시간이 더 걸림. | context switching 시간과, 생성/종료하는데 시간이 덜 걸림. |
콜 | System Call(process 변환은 OS의 인터페이스 사용) | Library Call(thread 전환 시 OS 호출 없이 커널에 interrupt 발생) |
중단 시 | 다른 프로세스와는 독립적이기 때문에 중단 돼도 다른 프로세스 수행에 영향 미치지 않음 eg) Chrome | user-level thread가 중단되면 모든 다른 user-level thread가 중단됨 eg) Internet Explorer |
하나의 응용 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것을 의미합니다. ex) 크롬, 사파리
하나의 응용 프로그램을 여러개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리하는 것을 의미합니다. ex) 아파치 톰캣
프로그램을 여러 개 실행시키는 것 보다는 하나의 프로그램 안에서 여러 작업을 해결하는 것이 더 낫기 때문입니다.
멀티 스레드를 사용할 때의 장점
1. 운영체제가 시스템 자원을 효율적으로 관리를 할 수 있다.
그렇다면 멀티 스레드가 무조건 좋을까?
프로세스에게 CPU를 할당해 작업을 수행하는 과정을 의미합니다. 한번에 하나의 프로세스만 처리할 수 있는 CPU에게 여러 프로세스가 순차적으로 처리될 수 있도록 현재 진행중인 작업을 저장하고 다음에 진행될 작업의 상태값을 PCB로부터 읽고 CPU를 적재하는 과정을 이야기합니다.
특정 프로세스에 대한 정보를 저장하고 있는 커널 내의 자료구조를 의미합니다.