Skip to content

Latest commit

 

History

History
331 lines (228 loc) · 17.2 KB

보충1__스레드와 병행성.md

File metadata and controls

331 lines (228 loc) · 17.2 KB

보충1__스레드와 병행성


보충1.1 🍂 개요 mihykim

문제1 🏃‍ 스레드에 대한 설명입니다. 맞으면 O, 틀리면 X를 골라주세요

  • [1-1] A thread is a basic unit of CPU utilization (O / X)
  • [1-2] 거의 모든 현대 운영체제는 한 프로세스가 다중 스레드를 포함하는 특성을 제공한다 (O / X)
  • [1-3] 단일스레드 프로세스(Single Threaded Process)에서는 요청이 들어오면, 프로세스는 그 요청을 수행하기위해 별도의 프로세스를 생성함으로써 멀티스레드 프로세스(Multi Threaded Process)에 비해 약 30배에 달하는 오버헤드를 감수하게 된다 (O / X)

문제2 🏃‍문제의 설명을 읽고 빈 칸에 들어갈 적절한 요소를 보기에서 골라주세요

  • [2-1] Thread의 구성요소가 아닌, 동료 Thread와 공유하는 부분 :     ,     ,     
  • [2-2] Thread의 구성요소인, 동료 Thread와 공유하지 않는 부분 :     ,     ,     
<보기> 
- Code
- Register
- PC
- Stack
- OS Resource(file, signal)
- Data

문제3 🏃‍다음은 다중스레드 프로그래밍의 장점 4가지입니다. 틀린 부분이 있다면 적절하게 고쳐주세요 (주관식)

[3-1] Responsiveness (응답성)
  • 대화형 어플리케이션에서 응용프로그램의 일부분이 준비상태(ready)가 되거나, 응용프로그램이 김장 작업을 수행하더라도 프로그램의 수행이 계속되는 것을 허용하여 사용자에 대한 응답성을 높인다.
  • 답지 :
[3-2] Resource Sharing (자원공유)
  • 코드와 데이터를 공유함으로써 인접한 주소공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다.
  • 답지 :
[3-3] Economy (경제성)
  • 프로세스 생성은 스레드 생성보다 시간과 메모리를 덜 소비하며, 문맥 교환은 일반적으로 프로세스 사이보다 스레드 사이에서 약 5배 더 빠르다.
  • 답지 :
[3-4] Scalablity (규모적응성)
  • 싱글프로세서 구조를 전제로 했을 때, 단일스레드 프로세스라면 오직 하나의 프로세서에서만 실행될 수밖에 없지만, 다중스레드 프로세스라면 각각의 스레드가 다른 CPU에서 병행으로 처리할 수 있기 때문에 병행성을 크게 높일 수 있다.
  • 답지 :

문제4 🏃‍프로세스와 스레드의 차이점을 설명해보세요 (주관식)

  • (면접 빈출 문제)
📄 답지

문제1 🏃‍스레드에 대한 설명입니다. 맞으면 O, 틀리면 X를 골라주세요

  • [1-1] A thread is a basic unit of CPU utilization (O)
  • [1-2] 거의 모든 현대 운영체제는 한 프로세스가 다중 스레드를 포함하는 특성을 제공한다 (O)
  • [1-3] 단일스레드 프로세스(Single Threaded Process)에서는 요청이 들어오면, 프로세스는 그 요청을 수행하기위해 별도의 프로세스를 생성함으로써 멀티스레드 프로세스(Multi Threaded Process)에 비해 약 30배에 달하는 오버헤드를 감수하게 된다 (O)

문제2 🏃‍문제의 설명을 읽고 빈 칸에 들어갈 적절한 요소를 보기에서 골라주세요

  • [2-1] Thread의 구성요소가 아닌, 동료 Thread와 공유하는 부분 : Code, Data, Resource
  • [2-2] Thread의 구성요소인, 동료 Thread와 공유하지 않는 부분 : Register, PC, Stack

문제3 🏃‍다음은 다중스레드 프로그래밍의 장점 4가지입니다. 틀린 부분이 있다면 적절하게 고쳐주세요 (주관식)

[3-1] Responsiveness (응답성)
  • 대화형 어플리케이션에서 응용프로그램의 일부분이 봉쇄(blocked)되거나, 응용프로그램이 작업을 수행하더라도 프로그램의 수행이 계속되는 것을 허용하여 사용자에 대한 응답성을 높인다.
[3-2] Resource Sharing (자원공유)
  • 코드와 데이터를 공유함으로써 같은 주소공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다.
[3-3] Economy (경제성)
  • 스레드 생성은 프로세스 생성보다 시간과 메모리를 덜 소비하며, 문맥 교환은 일반적으로 프로세스 사이보다 스레드 사이에서 약 5배 더 빠르다.
[3-4] Scalablity (규모적응성)
  • 멀티프로세서 구조를 전제로 했을 때, 단일스레드 프로세스라면 오직 하나의 프로세서에서만 실행될 수밖에 없지만, 다중스레드 프로세스라면 각각의 스레드가 다른 CPU에서 병렬로 처리할 수 있기 때문에 병렬성을 크게 높일 수 있다.
※ 병행성 vs 병렬성
  • 병행성(Concurrency)
    • 두 개 이상의 작업이 겹치는 기간에 실행되는 것
    • 같은 기간동안 진행(progress)되면 되는 것일 뿐, 반드시 같은 시각에 동시에 실행되어야 한다는 의미는 아님
    • Time-sharing으로 CPU를 나눠 사용함으로써 사용자가 Concurrency를 느낄 수 있도록 함
  • 병렬성(Parallelism)
    • 실제로 동시에 작업이 처리가 되는 것
    • 오직 Multi Core에서만 가능함

문제4 🏃‍프로세스와 스레드의 차이점을 설명해보세요

  • 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위입니다. 프로세스는 운영체제로부터 메모리, 주소공간등을 할당받고 쓰레드는 할당받은 자원들을 내부 스레드끼리 공유하면서 실행됩니다.
  • 쓰레드를 사용하는 이유는 운영체제에서 더 효율적으로 시스템 자원을 관리하기 위해 사용된다고 할 수 있습니다.멀티 프로세스로 진행되는 작업을 멀티 쓰레드로 수행하게 되면 시스템 콜이 줄어들기 때문에 자원을 효율적으로 관리 할 수 있고 프로세스의 통신비용보다 쓰레드간의 통신 비용이 적다는 이점도 있습니다.
  • 단 쓰레드간의 자원공유는 전역변수를 이용하므로 동기화 문제에 신경을 써야하며 멀티스레드 프로그래밍은 프로그래머의 주의를 요구합니다.
  • 답변 출처^0^



보충1.2 🍂 다중 코어 프로그래밍 daelee

1. 병행성과 병렬성

  • 더 좋은 컴퓨팅 성능에 대한 요구에 부응하여, 컴퓨터 시스템은 싱글/멀티 + 프로세서/코어 -> 싱글/멀티 + 프로세서/코어 -> 싱글/멀티 + 프로세서/코어 순으로 발전했다.

  • 싱글코어에서 병렬로 태스크를 수행할 수 있다. (O/X)

  • 병행성과 병렬성의 차이를 이해하는 것이 중요하다. 아래 그림에서 (a), (b) 각각 어느 것이 병행성, 병렬성을 설명한 예시로 알맞을까?

    Group 2


2. 프로그래밍 도전과제

운영체제 프로그래머뿐만 아니라, 응용 프로그래머또한 기존 프로그램을 멀티 스레드를 사용하도록 수정하고 병렬 수행될 수 있도록 여러 코어를 활용하는 스케줄링 알고리즘을 개발해야한다.

멀티코어 시스템 프로그래밍을 위한 5개의 도전과제는 다음과 같다. 보기를 참고해 설명에 알맞은 과제를 넣으시오.

보기 : 균형(balance), 데이터 종속성(data dependency), 시험 및 디버깅(testing and debugging), 태스크 인식(identifying tasks), 데이터 분리(data spilting)
  1. ____ : 응용프로그램을 분석해 독립된 병행가능 태스크로 나누는 영역을 찾는 작업
  2. ____ : 병렬로 나눈 부분들이 전체 작업에 균등한 기여도를 가지도록 하는 작업.
  3. ____ : 태스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용될 수 있도록 나누는 작업.
  4. ____ : 태스크가 접근하는 데이터가 여러 태스크 사이에 종속성이 없는지 검토하는 작업. (아웃풋에 영향 X)
  5. ____

3. 간단한 병렬처리 예제 in Python

멀티 쓰레드를 사용하거나 멀티 프로세스를 사용하는 방식으로 파이썬에서 병렬처리를 구현할 수 있다. 다만 멀티쓰레딩의 경우 CPU 자원의 낭비를 막기 위한 파이썬의 GIL(Global Interpreter Lock) 정책으로 인해 무조건 하나의 스레드만 사용하게해서 무의미. GIL은 CPU 동작에만 적용되기 때문에 cpu 작업이 적고 I/O 작업이 많은 프로그램에서는 멀티쓰레딩으로 병렬처리 효과를 볼 수 있다.

따라서 계산을 병렬로 처리하고 싶으면 무조건 멀티 프로세싱을 해야한다.

3.1. 싱글코어 코드
import time

def basic_func(x):
    if x == 0:
        return 'zero'
    elif x%2 == 0:
        return 'even'
    else:
        return 'odd'
    
starttime = time.time()
for i in range(0,10):
    y = i*i
    time.sleep(2)
    print('{} squared results in a/an {} number'.format(i, basic_func(y)))
    
print('That took {} seconds'.format(time.time() - starttime))

일반적인 for문을 쓰면, 하나의 코어가 리스트를 차례로 거치면서 한 줄씩 태스크 수행한다. print 한번에 2초씩 시간지연을 시켜놨으니 10번, 총 20초가 걸림.

이 모델은 사용가능한 CPU 전원의 30~40%만 사용한다.


3.2. 멀티코어 코드

파이썬에서는 멀티프로세싱을 위한 muliprocessing 모듈을 지원하며 이 모듈에는 멀티코어로 태스크를 처리하도록 해주는 Pool클래스, Process 클래스가 존재한다. 둘 다 멀티프로세싱을 지원하지만, 약간 차이가 있어서 상황에 따라 적절히 사용하면 된다. 두 클래스에 대한 자세한 소개 및 차이는 여기.

import time
import multiprocessing 

def basic_func(x):
    if x == 0:
        return 'zero'
    elif x%2 == 0:
        return 'even'
    else:
        return 'odd'

def multiprocessing_func(x):
    y = x*x
    time.sleep(2)
    print('{} squared results in a/an {} number'.format(x, basic_func(y)))
    
if __name__ == '__main__':
    starttime = time.time()
    processes = []
    for i in range(0,10):
        p = multiprocessing.Process(target=multiprocessing_func, args=(i,))
        processes.append(p)
        p.start()
        
    for process in processes:
        process.join()
        
    print('That took {} seconds'.format(time.time() - starttime))

process 클래스를 사용한 방식. 모든 리스트에 대해 새 프로세스를 생성해 병렬로 한번에 작업수행한다. 코드 실행시간은 2초.


4. 병렬 실행의 유형

병렬 실행 유형에는 데이터 병렬(Data Parallelism) 태스크 병렬(Task Parallelism)이 있다. 아래 그림 중 위/아래 각각 어느 것이 데이터 병렬/태스크 병렬 실행을 나타내는 그림일까?

image

📄 답지

1. 병행성과 병렬성

  • 더 좋은 컴퓨팅 성능에 대한 요구에 부응하여, 컴퓨터 시스템은 싱글/멀티 + 프로세서/코어 -> 싱글/멀티 + 프로세서/코어 -> 싱글/멀티 + 프로세서/코어 순으로 발전했다.

    정답 : 싱글 프로세서 -> 멀티 프로세서 -> 싱글 프로세서 멀티 코어(멀티 쓰레딩)

    최근에는 비동기를 이용해 싱클코어로 높은 효율을 만드는 방식이 일반적으로 사용되고 있다고 한다. (Node같이)

  • 싱글코어에서 병렬로 태스크를 수행할 수 있다. (O/X)

    정답 : X

    단일CPU만 있었던 시절에 CPU 스케줄러는 프로세스 간의 처리를 빠르게 전환해 마치 병렬로 일이 처리되는 것처럼 느껴지게 했다. 물론 이런 프로세스는 병행하게 실행되었지만, 실제로 병렬로 실행되지는 않았다.

  • 병행성과 병렬성의 차이를 이해하는 것이 중요하다. 아래 그림에서 (a), (b) 각각 어느 것이 병행성, 병렬성을 설명한 예시로 알맞을까?

    Group 2

    정답 :

    Group 1

    병행성(Concurrency) : 동시에 실행되는 것처럼 보이는 것.
    • Logical Level(개념)에 속한다.
    • Single Core
      • 순차적으로 동작.
      • 실제로는 Time-sharing으로 CPU를 나눠 사용함으로써 사용자가 Concurrency를 느낄 수 있도록 한다.
    • Multi Core
      • 물리적으로 병렬로 동작.
    병렬성(Parallelism) : 실제로 동시에 작업이 처리가 되는 것.
    • Physical(Machine) Level(개념)에 속한다.
    • 오직 Multi Core에서만 가능하다.

2. 프로그래밍 도전과제

운영체제 프로그래머뿐만 아니라, 응용 프로그래머또한 기존 프로그램을 멀티 스레드를 사용하도록 수정하고 병렬 수행될 수 있도록 여러 코어를 활용하는 스케줄링 알고리즘을 개발해야한다.

멀티코어 시스템 프로그래밍을 위한 5개의 도전과제는 다음과 같다. 보기를 참고해 설명에 알맞은 과제를 넣으시오.

보기 : 균형(balance), 데이터 종속성(data dependency), 시험 및 디버깅(testing and debugging), 태스크 인식(identifying tasks), 데이터 분리(data spilting)
  1. ____ : 응용프로그램을 분석해 독립된 병행가능 태스크로 나누는 영역을 찾는 작업
  2. ____ : 병렬로 나눈 부분들이 전체 작업에 균등한 기여도를 가지도록 하는 작업.
  3. ____ : 태스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용될 수 있도록 나누는 작업.
  4. ____ : 태스크가 접근하는 데이터가 여러 태스크 사이에 종속성이 없는지 검토하는 작업. (아웃풋에 영향 X)
  5. ____

정답 :

  1. 태스크 인식(identifying tasks) : 응용프로그램을 분석해 독립된 병행가능 테스크로 나누는 영역을 찾는 작업
  2. 균형(balance) : 병렬로 나눈 부분들이 전체 작업에 균등한 기여도를 가지도록 하는 작업.
  3. 데이터 분리(data spilting) : 테스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용될 수 있도록 나누는 작업.
  4. 데이터 종속성(data dependency) : 테스크가 접근하는 데이터가 여러 테스크 사이에 종속성이 없는지 검토하는 작업.
  5. 시험 및 디버깅(testing and debugging)

3. 간단한 병렬처리 예제 in Python

내용 없음

4. 병렬 실행의 유형

병렬 실행 유형에는 데이터 병렬(Data Parallelism) 태스크 병렬(Task Parallelism)이 있다. 아래 그림 중 위/아래 각각 어느 것이 데이터 병렬/태스크 병렬 실행을 나타내는 그림일까?

image

정답 : 위-태스크병렬, 아래-데이터병렬

  • 태스크 병렬(Task Parallelism) : 태스크를 서로다른 코어에 분배해 서로 다른 일을 나누어 실행.
  • 데이터 병렬(Data Parallelism) : 같은 일(동일한 연산)을 나누어 실행.



보충1.3 🍂 다중 스레드 모델 secho

1번.

쓰레드의 종류 2가지에는 뭐가 있을까요?


2번

특정 기계나 응용프로그램에 따라 할당되는 수가 달라지는 __스레드와 import, #include 를 이용해 사용하는 ___쓰레드간의 연관관계를 표현한 모델의 종류에는 ___, ___, ___모델이 있다. 이 중에 ___모델은 ___모델이라고도 불리우며 ___모델과 ___모델의 변형이다. 대부분 운영체제는 ___모델을 사용하고 있다

📄 답지

1번.

쓰레드의 종류 2가지에는 뭐가 있을까요?

  • 사용자쓰레드, 커널 쓰레드

2번

특정 기계나 응용프로그램에 따라 할당되는 수가 달라지는 커널스레드와 import, #include 를 이용해 사용하는 사용자쓰레드간의 연관관계를 표현한 모델의 종류에는 다대다, 다대일, 일대일모델이 있다. 이 중에 다대다모델은 two-level모델이라고도 불리우며 다대일모델과 일대일모델의 변형이다. 대부분 운영체제는 일대일모델을 사용하고 있다