Concurrency: An Introduction

yalpalyappap·2021년 2월 8일
0

thread라는 것에 대해서 알아볼 것이다.
thread는 개별적으로 동작하는 프로세스와 많이 닮아 있다. 하지만 같은 address space를 공유해서 같은 data에 접근한다는 점에서 프로세스와 차이가 있다. 이 공유되는 data를 critical section이라고 부른다.

단일 thread는 프로세스와 매우 유사하다. program counter에 instructions를 저장해두고 활용한다. 하지만 single processor에 2개의 thread가 있는 경우 반드시 context switch가 발생해야만 한다. 프로세스의 context switch시에 PCB에 register를 저장하듯이, thread의 context switch에도 thread control block이 활용된다.

single thread와 multi thread에서 찾아볼 수 있는 차이점은 stack영역의 차이이다.

multi thread환경에서는 thread마다 stack영역이 하나 더 존재한다.

Why Use Threads?

parelleism (병렬성)

예를들어 2개의 배열의 값을 증가시키는 경우가 있을 때 multi processor환경에서는 각 processor마다 작업을 할당하여 말그대로 동시에 작업을 수행하여 속도를 높일 수 있다.
1개의 thread에서는 a 배열의 값을 증가시키고, 또 다른 thread에서는 b 배열의 값을 증가시켜서 동시에 병렬적으로 작업을 처리할 수가 있다.

또 다른 이유는 I/O가 느리기 때문에 프로그램이 block되는 것을 막기 위해서이다.
상대적으로 느린작업인 I/O를 기다리는 동안 다른 thread에서는 좀 더 유용한 작업을 하여 프로그램을 overlap시킬 수 있다.

Why It Gets Worse: Shared Data


우리가 2개의 thread를 활용하여 전역변수를 각각 100000씩 증가시킨다고 하자.
원하는 것은 각각의 thread에서 100000씩, 총 200000을 얻는 것인데 실제 결과는 이와 다르다(determinate).

The Heart Of The Problem: Uncontrolled Scheduling

위의 예제에서 thread 1이 counter의 값을 50에서 51로 1 증가시킬 때 context switch가 발생하여 thread 2가 실행되었다고 가정하자 (race condition).
이때 thread 2도 역시 thread 1과 마찬가지로 같은 counter를 공유하고 있으므로 thread 2 입장에서 counter는 50이므로 1이 증가되어 51이 된다. 그 후 다시 thread 1이 이어서 동작을 할 때 역시 thread 1이 TCB에 저장해둔 내용은 counter가 50이므로 1을 증가시켜 51이 된다.

이처럼 multi thread program에서는 한 thread가 공유되는 데이터를 사용중일 때 다른 thread가 이 데이터를 활용하지 못하도록하는 mutual exclusion이 필요하다.

Atomic Operation

atomic이란 더이상 쪼개지지 않는다라는 의미이다. 따라서 실행되거나, 전혀 실행하지 않거나 둘중의 하나의 상태만 가능하다. 예를들어 atomic한 실행이 시작되면 하드웨어에 의해서 중간에 interrupt가 발생하지 않도록 한다.
그래서 이처럼 mutual exclusion과 같은 atomic한 방법이 필요하다.

profile
안녕하세요! 개발 공부를 하고있습니다~

0개의 댓글