2 분 소요

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. 병렬성은 아니지만 동시 수행성을 가지는 것이 가능한가?

  • 가능하다.
  • 동시 수행성
    • 여러 개의 서로 다른 프로세스 또는 스레드가 겹치는 기간에 함께 작동하기 시작하는 것을 의미하지만 동일한 순간에 실행되는 것은 아님.
  • 병렬성
    • 둘 이상의 다른 작업이 동시에 실행을 시작. 즉, 두 작업 또는 스레드가 동시에 작동하기 시작.
  • 따라서 문맥 교환을 매우 빠르게 실행하면 동시 실행성을 갖출 수 있다.

카테고리:

업데이트: