Studying/Roadmap

스레드와 동시성

aoaa 2022. 3. 14. 20:35

1. Thread

Thread(스레드)는 어떤 프로세스 내에서 실행되는 흐름을 말합니다.

 int main(void)
{
  int n = 0;
  int m = 10;
  printf("%d\n", n * m);
  while(n < m)
    n++;
  printf("END\n");
}

 위와 같은 코드는 하나의 흐름을 가지며 이를 스레드라합니다. 일반적으로 하나의 프로그램은 하나의 스레드를 갖습니다. 그런데 하나의 프로그램에 스레드가 2개 이상 존재하는 경우가 있습니다. 이를 다중 스레드라고 합니다.

한 프로그램(프로세스)에 여러 개의 스레드가 있을 수 있는 이유는 스레드가 빠른 시간 간격으로 스위칭(교체)되기 때문입니다.

 이러한 동작으로 사용자는 스레드가 동시에 실행되는 것처럼 보는 것입니다. 

 

이처럼 CPU가 하나인 환경에서 여러 스레드가 스위칭에 의해 동시에 수행되는 효과를 concurrent라고 하며, 여러 CPU환경에서 여러 스레드가 실제로 동시에 수행되는 것은 simultaneuous 라고 합니다.

 

다중 스레드를 사용하는 대표적인 예는 우리가 사용하는 Web browser입니다. 화면을 출력하는 스레드와 데이터를 읽어오는 스레드가 기본적으로 따로 수행하고 있습니다. 그 외 워드 프로세서, 동영상 플레어어 등 대부분의 프로그램이 다중 스레드로 동작합니다. 즉 현대 OS의 context switching 단위는 프로세스가 아닌 스레드 단위입니다.

 

 일반적으로 하나의 프로그램은 기본적으로 하나의 스레드가 존재한다고 했습니다. 프로세스는 code, data 메모리 공간이 존재하는데 이는 여러 스레드가 공유합니다. 그 외에도 프로세스의 자원인 file, I/O 등은 여러 스레드가 공유하지만, 각 스레드가 고유하게 가지고 있는 것은 PC(Program Counter), SP(Stack Pointer), registers, stack 등이 있습니다.

 

2. Concurrency

 동시성(Concurrency)은 스레드를 설명하면서 싱글코어(CPU 1개)에서 멀티 스레드를 동작시키는 방식이라고 했습니다. 이를 병렬성(Parallelism)이라는 특성과 비교하여 정리해보겠습니다.

 

 먼저, 동시성은 동시에 실행되는 것처럼 보이는 것, 논리적인 개념, 싱글*멀티코어에서 가능한 것이며, 병렬성은 실제로 동시에 실행되는 것, 물리적인 개념이며 멀티코어에서만 가능한 것입니다.

 병렬성은 여러 코어에서 여러 작업을 동시에 수행하는 것이라고 했는데, 코어가 하나밖에 없다면 병렬적으로 프로그램을 실행할 수 없습니다. CPU는 싱글 코어의 성능을 올리는 데 한계를 느끼고, 멀티 코어 체제로 넘어갔습니다. 여러 코어에서 여러 작업을 동시에 수행하면서 성능을 올리려 한 것이죠.

 

 싱글 코어에서 하던 작업을 2개, 3개 코어에서 나눠서 하게 되면 이론적으로는 성능이 3배까지 좋아질 수 있습니다. 모든 작업을 병렬적으로 수행하기는 어려우니 3배의 성능 향상을 기대하긴 어렵지만 기존보다는 성능이 향상될 것입니다. 하지만 여러 작업을 동시에 수행하여 race condition(두 개 이상의 프로세스가 공통 자원을 동시에 읽거나 쓸 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 달라지는 상황) 혹은 동기화 문제가 발생할 수 있습니다.

 

 

동시성은 빠르게 전환하며 여러 작업을 수행하여 동시에 여러 작업이 실행되는 것처럼 보이는 것입니다. 싱글 코어에서도 여러 작업을 동시에 실행할 수 있고, 작업 간 context switch가 일어납니다.

 Concurrent하게 실행되는 task들은 OS의 스케줄링 정책에 의해 실행되며 서로 복잡하게 엉켜있습니다. 그래서 동기화 문제가 발생할 수 있습니다.

 

3. 동기화

동기화는 여러 작업이 동시에 공유된 자원에 접근하려 할 때 발생합니다. 

 한 코어에서 실행되는 Task 1과 Task 2가 동시에 공유자원인 Data에 접근하려고 합니다.

원래대로라면 data에 1을 더하고 다시 1을 뺐으니 작업이 끝난 뒤에는 data에 100이 들어가 있어야 합니다.

하지만 동기화 문제가 발생하면 data에 99 혹은 101이 들어있을 수 있습니다.

 

 Task 1이 data에 100을 읽어 1을 전하고 있는 사이 1) Task 2에서도 data를 읽어 갑니다.1'

이 때는 아직 Task1이 data를 101로 업데이트 하기 전이라 Task 2도 100이라는 값을 읽게 됩니다. Task1은 data+=1을 실행하고 2) data를 101로 업데이트 합니다. 3)

 Task 2는 data를 100으로 읽었으므로 100에서 1을 뺀 99로 data값을 업데이트 합니다.( 2', 3')

Concurrent Task 사이에는 이와 같은 동기화 문제가 발생할 수 있어 이를 막기위한 동기화 기법을 사용해주어야 합니다.

 

 

 

 

출처

https://spacebike.tistory.com/22

 

[운영체제] Concurrency(동시성)과 Parallelism(병렬성) 이해하기

Concurrency와 Parallelism은 헷갈리기 쉬운 개념입니다. 이름도 Concurrency(동시성)과 Parallelism(병렬성)으로 이름만 들었을 때는 이 둘의 차이를 구분하기 어렵습니다. Concurrency와 Parallelism의 특징을..

spacebike.tistory.com

 

 

https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-7.-%EC%93%B0%EB%A0%88%EB%93%9CThread

 

[운영체제(OS)] 7. 쓰레드(Thread)

1. 프로세스와 생성과 종료 프로세스는 프로세스에 의해 만들어진다. 컴퓨터가 부팅이 되면 운영체제가 메모리에 올라오는데 운영체제가 처음으로 수행하는 일 중에 하나는 최초의 프로세스를

velog.io

 

https://drehzr.tistory.com/87

 

잡학지식) 레이스 컨디션 (Race Condition)

레이스 컨디션 (Race Condition) 일반적으로 레이스 컨디션 이란 두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓸 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는

drehzr.tistory.com

 

 

'Studying > Roadmap' 카테고리의 다른 글

프로세스 간 통신  (0) 2022.03.21
메모리 관리  (0) 2022.03.17
프로세스 관리  (0) 2022.03.13
운영체제의 구조와 원리  (0) 2022.03.11
운영체제란?  (0) 2022.03.10