- [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-1] Thread의 구성요소가 아닌, 동료 Thread와 공유하는 부분 :
- [2-2] Thread의 구성요소인, 동료 Thread와 공유하지 않는 부분 :
<보기>
- Code
- Register
- PC
- Stack
- OS Resource(file, signal)
- Data
- 대화형 어플리케이션에서 응용프로그램의
일부분이 준비상태(ready)가 되거나, 응용프로그램이 김장 작업을 수행하더라도
프로그램의 수행이 계속되는 것을 허용하여 사용자에 대한 응답성을 높인다. - 답지 :
코드와 데이터를 공유함으로써 인접한 주소공간 내에
여러 개의 다른 작업을 하는 스레드를 가질 수 있다.- 답지 :
프로세스 생성은 스레드 생성보다 시간과 메모리를 덜 소비하며,
문맥 교환은 일반적으로 프로세스 사이보다 스레드 사이에서 약 5배 더 빠르다.- 답지 :
싱글프로세서 구조를 전제로 했을 때,
단일스레드 프로세스라면 오직 하나의 프로세서에서만 실행될 수밖에 없지만, 다중스레드 프로세스라면각각의 스레드가 다른 CPU에서 병행으로 처리할 수 있기 때문에 병행성을 크게 높일 수 있다.
- 답지 :
- (면접 빈출 문제)
📄 답지
- [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-1] Thread의 구성요소가 아닌, 동료 Thread와 공유하는 부분 :
Code
,Data
,Resource
- [2-2] Thread의 구성요소인, 동료 Thread와 공유하지 않는 부분 :
Register
,PC
,Stack
- 대화형 어플리케이션에서 응용프로그램의 일부분이
봉쇄(blocked)
되거나, 응용프로그램이긴
작업을 수행하더라도 프로그램의 수행이 계속되는 것을 허용하여 사용자에 대한 응답성을 높인다.
- 코드와 데이터를 공유함으로써
같은
주소공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다.
스레드
생성은프로세스
생성보다 시간과 메모리를 덜 소비하며, 문맥 교환은 일반적으로 프로세스 사이보다 스레드 사이에서 약 5배 더 빠르다.
멀티프로세서
구조를 전제로 했을 때, 단일스레드 프로세스라면 오직 하나의 프로세서에서만 실행될 수밖에 없지만, 다중스레드 프로세스라면 각각의 스레드가 다른 CPU에서병렬
로 처리할 수 있기 때문에병렬성
을 크게 높일 수 있다.
- 병행성(Concurrency)
- 두 개 이상의 작업이 겹치는 기간에 실행되는 것
- 같은 기간동안 진행(progress)되면 되는 것일 뿐, 반드시 같은 시각에 동시에 실행되어야 한다는 의미는 아님
- Time-sharing으로 CPU를 나눠 사용함으로써 사용자가 Concurrency를 느낄 수 있도록 함
- 병렬성(Parallelism)
- 실제로 동시에 작업이 처리가 되는 것
- 오직 Multi Core에서만 가능함
- 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위입니다. 프로세스는 운영체제로부터 메모리, 주소공간등을 할당받고 쓰레드는 할당받은 자원들을 내부 스레드끼리 공유하면서 실행됩니다.
- 쓰레드를 사용하는 이유는 운영체제에서 더 효율적으로 시스템 자원을 관리하기 위해 사용된다고 할 수 있습니다.멀티 프로세스로 진행되는 작업을 멀티 쓰레드로 수행하게 되면 시스템 콜이 줄어들기 때문에 자원을 효율적으로 관리 할 수 있고 프로세스의 통신비용보다 쓰레드간의 통신 비용이 적다는 이점도 있습니다.
- 단 쓰레드간의 자원공유는 전역변수를 이용하므로 동기화 문제에 신경을 써야하며 멀티스레드 프로그래밍은 프로그래머의 주의를 요구합니다.
- 답변 출처^0^
-
더 좋은 컴퓨팅 성능에 대한 요구에 부응하여, 컴퓨터 시스템은
싱글/멀티 + 프로세서/코어
->싱글/멀티 + 프로세서/코어
->싱글/멀티 + 프로세서/코어
순으로 발전했다. -
싱글코어에서 병렬로 태스크를 수행할 수 있다. (O/X)
-
병행성과 병렬성의 차이를 이해하는 것이 중요하다. 아래 그림에서 (a), (b) 각각 어느 것이 병행성, 병렬성을 설명한 예시로 알맞을까?
운영체제 프로그래머뿐만 아니라, 응용 프로그래머또한 기존 프로그램을 멀티 스레드를 사용하도록 수정하고 병렬 수행될 수 있도록 여러 코어를 활용하는 스케줄링 알고리즘을 개발해야한다.
멀티코어 시스템 프로그래밍을 위한 5개의 도전과제는 다음과 같다. 보기를 참고해 설명에 알맞은 과제를 넣으시오.
보기 : 균형(balance), 데이터 종속성(data dependency), 시험 및 디버깅(testing and debugging), 태스크 인식(identifying tasks), 데이터 분리(data spilting)
____
: 응용프로그램을 분석해 독립된 병행가능 태스크로 나누는 영역을 찾는 작업____
: 병렬로 나눈 부분들이 전체 작업에 균등한 기여도를 가지도록 하는 작업.____
: 태스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용될 수 있도록 나누는 작업.____
: 태스크가 접근하는 데이터가 여러 태스크 사이에 종속성이 없는지 검토하는 작업. (아웃풋에 영향 X)____
멀티 쓰레드를 사용하거나 멀티 프로세스를 사용하는 방식으로 파이썬에서 병렬처리를 구현할 수 있다. 다만 멀티쓰레딩의 경우 CPU 자원의 낭비를 막기 위한 파이썬의 GIL(Global Interpreter Lock) 정책으로 인해 무조건 하나의 스레드만 사용하게해서 무의미. GIL은 CPU 동작에만 적용되기 때문에 cpu 작업이 적고 I/O 작업이 많은 프로그램에서는 멀티쓰레딩으로 병렬처리 효과를 볼 수 있다.
따라서 계산을 병렬로 처리하고 싶으면 무조건 멀티 프로세싱을 해야한다.
- https://repl.it/@hidaehyunlee/Python#main.py
- 확인을 위해 시간지연을 만드는
sleep()
함수를 사용한다.
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%만 사용한다.
파이썬에서는 멀티프로세싱을 위한 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초.
병렬 실행 유형에는 데이터 병렬(Data Parallelism) 태스크 병렬(Task Parallelism)이 있다. 아래 그림 중 위/아래 각각 어느 것이 데이터 병렬/태스크 병렬 실행을 나타내는 그림일까?
📄 답지
-
더 좋은 컴퓨팅 성능에 대한 요구에 부응하여, 컴퓨터 시스템은
싱글/멀티 + 프로세서/코어
->싱글/멀티 + 프로세서/코어
->싱글/멀티 + 프로세서/코어
순으로 발전했다.정답 : 싱글 프로세서 -> 멀티 프로세서 -> 싱글 프로세서 멀티 코어(멀티 쓰레딩)
최근에는 비동기를 이용해 싱클코어로 높은 효율을 만드는 방식이 일반적으로 사용되고 있다고 한다. (Node같이)
-
싱글코어에서 병렬로 태스크를 수행할 수 있다. (O/X)
정답 : X
단일CPU만 있었던 시절에 CPU 스케줄러는 프로세스 간의 처리를 빠르게 전환해 마치 병렬로 일이 처리되는 것처럼 느껴지게 했다. 물론 이런 프로세스는 병행하게 실행되었지만, 실제로 병렬로 실행되지는 않았다.
-
병행성과 병렬성의 차이를 이해하는 것이 중요하다. 아래 그림에서 (a), (b) 각각 어느 것이 병행성, 병렬성을 설명한 예시로 알맞을까?
정답 :
- Logical Level(개념)에 속한다.
- Single Core
- 순차적으로 동작.
- 실제로는
Time-sharing
으로 CPU를 나눠 사용함으로써 사용자가 Concurrency를 느낄 수 있도록 한다.
- Multi Core
- 물리적으로 병렬로 동작.
- Physical(Machine) Level(개념)에 속한다.
- 오직 Multi Core에서만 가능하다.
운영체제 프로그래머뿐만 아니라, 응용 프로그래머또한 기존 프로그램을 멀티 스레드를 사용하도록 수정하고 병렬 수행될 수 있도록 여러 코어를 활용하는 스케줄링 알고리즘을 개발해야한다.
멀티코어 시스템 프로그래밍을 위한 5개의 도전과제는 다음과 같다. 보기를 참고해 설명에 알맞은 과제를 넣으시오.
보기 : 균형(balance), 데이터 종속성(data dependency), 시험 및 디버깅(testing and debugging), 태스크 인식(identifying tasks), 데이터 분리(data spilting)
____
: 응용프로그램을 분석해 독립된 병행가능 태스크로 나누는 영역을 찾는 작업____
: 병렬로 나눈 부분들이 전체 작업에 균등한 기여도를 가지도록 하는 작업.____
: 태스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용될 수 있도록 나누는 작업.____
: 태스크가 접근하는 데이터가 여러 태스크 사이에 종속성이 없는지 검토하는 작업. (아웃풋에 영향 X)____
정답 :
- 태스크 인식(identifying tasks) : 응용프로그램을 분석해 독립된 병행가능 테스크로 나누는 영역을 찾는 작업
- 균형(balance) : 병렬로 나눈 부분들이 전체 작업에 균등한 기여도를 가지도록 하는 작업.
- 데이터 분리(data spilting) : 테스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용될 수 있도록 나누는 작업.
- 데이터 종속성(data dependency) : 테스크가 접근하는 데이터가 여러 테스크 사이에 종속성이 없는지 검토하는 작업.
- 시험 및 디버깅(testing and debugging)
내용 없음
병렬 실행 유형에는 데이터 병렬(Data Parallelism) 태스크 병렬(Task Parallelism)이 있다. 아래 그림 중 위/아래 각각 어느 것이 데이터 병렬/태스크 병렬 실행을 나타내는 그림일까?
정답 : 위-태스크병렬, 아래-데이터병렬
- 태스크 병렬(Task Parallelism) : 태스크를 서로다른 코어에 분배해 서로 다른 일을 나누어 실행.
- 데이터 병렬(Data Parallelism) : 같은 일(동일한 연산)을 나누어 실행.
1번.
쓰레드의 종류 2가지에는 뭐가 있을까요?
2번
특정 기계나 응용프로그램에 따라 할당되는 수가 달라지는 __
스레드와 import, #include 를 이용해 사용하는 ___
쓰레드간의 연관관계를 표현한 모델의 종류에는 ___
, ___
, ___
모델이 있다. 이 중에 ___
모델은 ___
모델이라고도 불리우며 ___
모델과 ___
모델의 변형이다. 대부분 운영체제는 ___
모델을 사용하고 있다
📄 답지
1번.
쓰레드의 종류 2가지에는 뭐가 있을까요?
- 사용자쓰레드, 커널 쓰레드
2번
특정 기계나 응용프로그램에 따라 할당되는 수가 달라지는 커널
스레드와 import, #include 를 이용해 사용하는 사용자
쓰레드간의 연관관계를 표현한 모델의 종류에는 다대다
, 다대일
, 일대일
모델이 있다. 이 중에 다대다
모델은 two-level
모델이라고도 불리우며 다대일
모델과 일대일
모델의 변형이다. 대부분 운영체제는 일대일
모델을 사용하고 있다