Threads
쓰레드도 process이다. 그런데 좀 가벼운. 그래서 light-weighted process라 한다.
process이기 때문에 자기만의 memory 영역이 있고 역시 CPU를 할당 받아서 수행되는 과정을 거친다.
process는 single thread of execution이라 할 수 있다. 일반적으로 하나의 thread를 가지고 작업을 수행한다.
process 당 multiple program counter를 가지는 것을 생각해보자.
- Multiple location이 한 번에 실행될 수 있다.
프로세스와 차이
process는 컴퓨터에서 실행중인 프로그램을 말하고 고유한 공간과 자원을 할당 받아 사용한다.
반면 thread는 process 안에서 실행되는 여러 흐름의 단위로 process 내의 자원을 공유하고 고유한 stack만을 각자 할당 받는다.
multi thread vs multi process
multi thread
multi thread는 multi process보다 적은 memory 공간을 차지하고 context switch가 빠르다는 장점이 있다.
하나의 process 내에서 둘 이상의 thread가 동시에 작업을 수행하는 것을 의미한다.
예를 들어 하나의 응용 프로그램이 여러 개의 비슷한 작업을 수행할 필요가 있는 상황들이 있을 수 있다. 웹 서버는 클라이언트로부터 웹 페이지나 이미지, 소리 등에 대한 요청을 받는다. 하나의 웹 서버는 여러 개의 클라이언트들이 병행하게 접근할 수 있다. 만약 웹 서버가 전통적인 단일 thread process로 작동한다면, 자신의 단일 process로 한 번에 하나의 클라이언트만 서비스할 수 있게 되어 클라이언트는 자신의 요구가 서비스되기까지 매우 긴 시간을 기다려야 할 것이다.
해결책은 서버가 요청을 받아들이는 하나의 process로 동작하게 하는 것이다. 서버에게 서비스 요청이 들어오면, process는 그 요청을 수행할 별도의 process를 생성하는 것. 이는 thread가 대중화되기 전에는 보편적 해결책이었다. 그러나 process 생성 작업은 thread 생성에 비해 매우 많은 시간을 소비하고 많은 자원을 필요로 하는 일이다. 하지만 새 process가 해야 할 일이 기존 process와 하는 일이 동일하다면 이 많은 overhead를 감당할 필요가 없다. 대부분은 그렇게 하는 것보다 process 안에서 여러 thread를 만들어 나가는 서이 더 효율적이다. 웹 서버가 multi thread화 되면, 서버는 클라이언트의 요청을 listen 하는 별도의 thread를 생성한다. 요청이 들어오면 다른 process를 생성하는 것이 아니라, 요청을 서비스할 새로운 thread를 생성하고 추가적인 요청을 listen 하기 위한 작업을 재개한다.
그러나 오류로 인해 하나의 thread가 종료되면 전체 thread가 종료될 수 있다는 점과 동기화의 문제를 가지고 있다.
multi thread를 사용하면
- 프로그램을 여러 개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이 더욱 효율적이다.
- process를 생성하여 resource를 할당하는 system call이 줄어들게 되어 resource를 효율적으로 관리할 수 있다.
- context switching시, cache memory를 비울 필요가 없기 때문에 비용이 적고 더 빠르다.
- thread는 Stack 영역만 초기화하면 된다.
- thread는 자신이 속한 process 내의 memory를 공유하기 때문에 데이터 전달이 간단하므로 *IPC에 비해 비용이 적고 더 빠르다.
- thread는 process의 Stack 영역을 제외한 모든 memory를 공유한다.
- thread는 CPU의 코어에게 정해진 시간 동안 여러 작업을 수행한다. 이 때 각 thread가 서로 교체된다면 thread 간 context switching이 발생한다.
- 이러한 *context switch는 overhead이므로 시간이 커질수록 multi threading의 효율이 저하된다.
- 그래서 많은 양의 단순한 계산은 single-thread 방식으로 동작할 때 더 효율적일 수 있다.
- 많은 수의 thread를 실행하는 것이 항상 좋은 성능을 보이는 것은 아니다.
multi process
multi process는 여러 개의 CPU를 사용하여 여러 process를 동시에 수행하는 것을 의미한다.
multi processing은 하나의 process가 죽더라도 다른 process에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있다. multi thread보다 많은 memory 공간과 CPU time을 차지한다는 단점이 존재한다.
이 두 가지는 동시에 여러 작업을 수행한다는 점에서 같지만, 적용해야 하는 시스템에 따라 적합/부적합이 구분된다. 따라서 대상 시스템의 특징에 따라 적합한 동작 방식을 선택하고 적용해야 한다.
*IPC
*context switch
Thread group(스레드 그룹)
thread group이란 서로 관련 있는 thread를 하나의 그룹으로 묶어 다루기 위한 장치이다.
java에서는 thread group을 다루기 위한 ThreadGroup이라는 class가 제공된다.
thread group은 다른 thread group을 포함할 수 있으며, 이렇게 포함된 thread group은 트리 형태로 연결된다. 이 때 thread는 자신이 포함된 thread group이나 그 하위 group에는 접근할 수 있고 다른 group에는 접근할 수 없도록 되어있다.
thread의 접근 범위를 제한하는 것은 보안상으로도 중요한 역할을 한다.
class ThreadWithRunnable implements Runnable {
public void run() {
try {
Thread.sleep(10); // 0.01초간 스레드를 멈춤.
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Thread03 {
public static void main(String[] args){
Thread thread0 = new Thread(new ThreadWithRunnable());
thread0.start(); // Thread-0 실행
System.out.println(thread0.getThreadGroup());
ThreadGroup group = new ThreadGroup("myThread"); // myThread라는 스레드 그룹 생성함.
group.setMaxPriority(7); // 해당 스레드 그룹의 최대 우선순위를 7로 설정함.
// 스레드를 생성할 때 포함될 스레드 그룹을 전달할 수 있음.
Thread thread1 = new Thread(group, new ThreadWithRunnable());
thread1.start(); // Thread-1 실행
System.out.println(thread1.getThreadGroup());
}
}
실행 결과
java.lang.ThreadGroup[name=main,maxpri=10]
java.lang.ThreadGroup[name=myThread,maxpri=7]
20220812 업데이트
'운영체제' 카테고리의 다른 글
| 인터럽트(interrupt) (0) | 2022.07.21 |
|---|---|
| Deadlocks (0) | 2022.07.21 |
| CPU Switch From Process to Process (0) | 2022.07.15 |
| Process Control Block(PCB) (0) | 2022.07.15 |