[OS] Ch4. 연습문제
1. 다중 스레드 기법을 사용 했을 때 단일 스레드 기법을 사용했을 때보다 성능이 좋지 않은 프로그래밍 사례 2가지를 제시하시오.
- 순차적으로 실행하는 프로그램은 다중 스레드 기법에 적합하지 않다.
- shell 프로그램은 항상 환경변수, 작업 디렉토리 등의 정보를 감시해야 하기 때문에 다중 스레드 기법이 필요하지 않다. (자기 자신을 감독하는 것이기 때문에 굳이 스레드 필요 없음)
그렇다면 다중 스레드 기법이 더 효율적인 경우는 어떤 경우인가?
- 리퀘스트를 다른 스레드에서 처리하는 웹 서버
- 디버거. 한 스레드는 user input을 모니터링하고, 다른 스레드는 디버거 gui를 제공하고, 또 다른 스레드는 디버깅을 모니터링한다.
2. 단일 처리기 시스템에서의 프로그래밍을 고려하자. 다중 커널 스레드를 사용하여 다중 스레드 프로그램을 만들었을 때 이 프로그램의 성능이 단일 스레드만 사용하는 프로그램에 비해 더 나은 성능을 보이는 경우는 언제인가?
- 단일 처리기이기 때문에 연산 속도는 늘릴 수 없지만, 사용자 인터렉션 면에서는 더 나은 성능을 보일 수 있다. 여러 스레드가 시스템에 적재되어 있고, 각각의 스레드가 사용자의 요청에 반응하도록 구현한다면 사용자의 다양한 반응에 대응할 수 있을 것이다.
- 한 커널 스레드가 page fault의 문제를 가지고 있을 때, 다른 커널 스레드로 교체됨으로서 효율적인 방식을 구현할 수 있다. 하지만 싱글 스레드에서는 page fault가 발생할 때 멀티스레드처럼 효율적이게 대처할 수 없다. 따라서 page fault가 빈번하게 일어날 때 멀티스레드가 더 효율적이게 작동할 수 있다.
3. 다음 중 다중 스레드 프로세스의 스레드 사이에 공유되는 프로그램 상태는 무엇인가?
- b. 힙 메모리, c. 전역 변수들
- a. 레지스터 값들, d. 스택 메모리는 스레드 별로 별도로 가지고 있다.
4. 다수의 사용자 수준 스레드를 사용하는 다중 스레드 해결책이 단일 처리기 시스템보다 다중 처리기 시스템에서 더 나은 성능을 보일 수 있는가?
- 아니다. 커널은 사용자 수준 스레드가 생성이 될 때 알지 못한다. 따라서 사용자 수준 스레드를 다른 프로세스에서 사용할 수 없다.
What are two differences between user-level threads and kernel-level threads? Under what circumstances is one type better than the other?
유저 레벨 스레드와 커널 레벨 스레드의 차이점은 무엇인가? 어떤 상황에서 어떤 스레드가 더 나은 성능을 보이는가?
유저 레벨 스레드 | 커널 레벨 스레드 |
---|---|
유저 레벨 스레드는 커널에서 존재를 알 수 없다. | 커널 레벨 스레드는 커널에서 존재를 알 수 있다. |
유저 레벨 스레드는 커널의 도움 없이 사용된다. | 커널 레벨 스레드는 OS의 관리 하에 사용된다. |
유저 레벨 스레드는 커널 레벨 스레드보다 생성하는게 빠르다. | 커널 레벨 스레드는 유저 레벨 스레드보다 생성하는 것이 느리다. |
유저 레벨 스레드는 스레드 라이브러리를 통해 스케쥴링 된다. | 커널 레벨 스레드는 커널에 의해 스케쥴링 된다. |
- 유저 레벨 스레드가 더 효율적인 경우
- 시분할 시스템이라면 문맥 교환이 빈번하게 일어나기 때문에 유저 레벨 스레드가 더 효율적이다.
- 커널 스레드 레벨에서의 문맥 교환은 오버헤드가 크기 때문이다.
- 커널 레벨 스레드가 더 효율적인 경우
- 커널이 싱글코어라면 커널 레벨 스레드가 더 효율적이다.
- 유저 레벨 시스템이 시스템 콜을 blocking 하게 되면 다른 스레드가 어플리케이션을 실행 할 수 있음에도 프로세스 전체가 블록 당할 수 있다.
- 예를 들어 P1 프로세스는 2개의 커널 레벨 스레드를 가지고 있고, P2 프로세스는 2개의 유저 레벨 스레드를 가지고 있다고 하자. P1 프로세스는 첫번째 스레드가 블록 당해도, 다른 스레드에 영향을 끼치지 않지만 P2 프로세스는 첫 번째 스레드가 블록 당하면 P2 프로세스 전체가 블록 당하게 된다.
- 멀티프로세서 환경에서 커널 레벨 스레드가 더 효율적이다. 커널 레벨 스레드는 다른 프로세스에서 동시에 실행 가능하지만 유저 레벨 프로세스는 여러개의 프로세스를 실행 시킬 수 있어도 하나의 프로세스에만 작동한다.
3장에서 Google의 Chrome 브라우저에 대해서 논의할 때 새로운 웹사이트마다 개별 프로세스에서 연다는 것을 알았다. 만일 새로운 웹사이트를 프로세스 대신에 개별 스레드에서 열었다면 같은 이득을 얻을 수 있었을까?
- 개별 스레드에서 열었다면 한 스레드에서 오류 발생 시 다른 스레드도 영향을 받을 수 있다. 같은 이득을 얻을 수 없다.
6. 병렬성은 아니지만 동시 수행성을 가지는 것이 가능한가?
- 가능하다.
- 동시 수행성
- 여러 개의 서로 다른 프로세스 또는 스레드가 겹치는 기간에 함께 작동하기 시작하는 것을 의미하지만 동일한 순간에 실행되는 것은 아님.
- 병렬성
- 둘 이상의 다른 작업이 동시에 실행을 시작. 즉, 두 작업 또는 스레드가 동시에 작동하기 시작.
- 따라서 문맥 교환을 매우 빠르게 실행하면 동시 실행성을 갖출 수 있다.