1. Thread?
한마디로 ‘프로세스 내에서 실행되는 흐름’이라고 말할 수 있다.
스레드들은 해당 프로세스의 상태와 리소스를 공유하며, 동일한 주소 공간에 있다. 이들은 각각의 stack만 따로 할당 받고 code, data, heap은 공유한다.
(stack은 지역변수가 저장되는 곳이다.
이를 생각해보면 지역변수는 각자 Thread가 할당된다는 것을 알 수 있다. 또한 독립적인 함수 호출을 가능하게 한다.)
헷갈린다면, 파이썬 스크립트 파일을 생각하면 쉽다.
파이썬의 파일을 실행시키면 한줄 파일이 실행되는데, 이렇게 실행되는 일련의 흐름이 곧 스레드이다.
일반적으로 하나의 프로세스는 하나의 스레드로 시작되며, 이를 메인 스레드라고 한다.
스레드를 추가로 생성하지 않는 한 모든 프로그램은 메인 스레드에서 실행된다.
또한 기본적으로 스레드를 지원하는 os에서 디스패치의 단위는 스레드이며, 하나의 프로세스는 하나 이상의 스레드를 가진다.
2. Thread를 사용하는 이유
스레드하면 멀티 스레딩을 빼놓을 수 없는데, 이는 말그대로 동시에 여러 개의 실행 흐름을 만들어 내는 것이다.
여러 프로세스로 할 수 있는 작업들을 굳이 하나의 프로세스에서 스레드로 나눠가면서 하는지 의문을 가질 수 있다.
제일 중요한 키워드는 '자원의 공유'이다. 이 이유때문에 다음과 같은 이점이 발생한다.
1) 프로세스 간 통신에 비해 스레드 간 통신이 훨씬 간단
: 보안상으로 신경써야하는 프로세스는 커널 호출이 필요하고, 까다롭게 관리된다.
하지만 스레드는 자원을 공유하기에 통신이 간편하다.
2) 시스템 자원 소모가 줄어든다.
: 기존 프로세스의 자원을 다른 스레드와 공유하기 때문에 자원을 새로 할당하지 않아도 된다.
3) 전체 응답 시간이 단축된다.
: 만약 작업들이 연결되어 있고, 이 작업들을 순차적으로 진행해야한다고 생각해보자.
그렇다면 앞의 작업이 오래 걸리면 전체 프로그램이 지연되는 병목현상이 생길 수 밖에 없다.
하지만 한 프로세스 내에서 서로 순서상 의존하지 않는 작업이 다른 작업의 종료를 기다릴 이유는 없다.
이 때, 실행되는 흐름인 스레드를 여러 개 두면 병목현상에 걸리지 않고 전체 작업시간을 줄일 수 있다.
하지만 스레드에도 단점은 있는데,
여러 스레드를 이용하는 프로그램을 작성하는 경우에는 설계를 신경써야 한다.
Race Condition, 동기화문제, Dead-lock 같은 경우가 있는데, 얘들은 다음에...
3. Process vs Thread
프로세스와 스레드의 근본적인 차이는
프로세스는 운영체제로부터 독립된 시간, 공간 자원을 할당 받아 실행되지만,
스레드는 한 프로세스 내에서 많은 자원을 공유하면서 병렬적으로 실행된다.
그 외의 다양한 프로세스와 스레드의 차이는 아래의 표를 통해 설명할 수 있다.
기존 프로세스의 자원을 다른 스레드와 공유하기 때문에 자원을 새로 할당하지 않아도 된다.
따라서 자원 소모가 줄어든다.
또한, 커널의 호출이 필요하고 위험성 때문에 까다롭게 관리되는 프로세스 간의 통신과 다르게, 스레드의 통신은 자원을 서로 공유하기에 매우 간편하다.
4. Multi Thread 실습
스레드를 이용하여 전역변수와 지역변수를 출력하여 단일vs멀티 스레드를 비교해 보았다.
(코드와 실습 내용은 학교 과제의 코드)
단일 스레드를 사용하는 코드를 작성해보았다.
위 코드에서 메인함수의 부분을 변경하여, 멀티 스레드를 사용하는 코드를 새롭게 만들었다.
결과는 아래와 같다.
pid = process id | tid = thread id
cnd = 반복문 카운트 | glob = 전역변수 | var = 지역변수
왼쪽은 기본이며, 오른쪽은 멀티 스레드를 생성하여 실행시킨 화면이다.
단일을 먼저 보자면,
1) 하나의 프로세스 안에서 실행되고 있기 때문에 pid는 -와 +가 같다.
2) 또한 thread를 만들지 않고, 함수를 호출하여 실행했기 때문에, 2였던 glob은 -일때는 차례대로 하나씩 줄어 -8이 되고, +일때는 11번의 반복문을 거쳐 3이 된다.
3) 지역변수인 var는 각자의 함수에서 10으로 초기화 되었었고, 독립적으로 1씩 증가하거나 1씩 감소한다.
멀티를 보면,
왼쪽과 다르게 각 thread는 동시에 실행되므로, 한 함수가 끝나는 것을 기다리지 않고,
minus thread가 실행될 때, plus thread도 같이 실행된다.
그러므로 반복문의 출력문도 순서없이 출력되어,
-와 +가 교차되어 출력되거나 -끼리 이어 출력되거나 하는 패턴을 보인다.
1) 단일과 같이 하나의 프로세스 안에서 실행되고 있으므로 pid는 -와 +가 같다.
2) 단일과 다르게 -와 +의 thread를 각각 생성하여 만들었으므로,
thread를 구분하는 thread id도 각자 할당받게 된다. -는 4152989440, +는 4144596736으로 할당받아 구분된다.
3) 또한 thread는 프로세스 내에서 각각의 스택 공간을 제외한 나머지 공간을 공유한다.
그러므로 스택 공간에 존재하지 않아 공유되는 전역변수는 thread에서 연산이 실행되는 순으로 계속 변화한다. -에서 연산된 glob를 +에서 그대로 가져가 연산하고 출력한다.
4) 스택 공간에 존재하는 지역변수는 var는 분리되기 때문에, 각 연산대로 출력된다. +에서는 +가 가지는 지역변수대로 연산이 되고, -에서는 -가 가지는 지역변수대로 연산이 진행된다.
정리해보자면 단일과 멀티가 보이는 차이는,
실행의 순서, tid, 그리고 전역변수의 사용이다.
-실행의 순서는,
단일은 먼저 호출된 -가 모두 끝난 뒤에서야 +가 호출되고, 실행된다.
멀티는 호출의 순서와 상관없이, 각 thread가 동시에 실행된다.
-tid의 경우,
하나의 스레드를 사용하는 단일은 -와 +가 같은 tid를 가지지만,
두개의 스레드를 사용하는 멀티는 다른 tid를 가진다.
-전역변수의 경우,
단일은 순차적으로 실행되기 때문에 전역변수가 10번의 -연산을 끝낸 뒤에, +연산을 진행하여 값이 순서대로 바뀌지만,
멀티는 각 thread가 동시에 실행되기에 연산된 순서대로 전역변수가 바뀐다. 즉, -thread의 반복문 한번을 수행한 다음 +thread의 반복문 한번이 수행된다면, +이 가지고 연산하는 glob는 -의 연산이 수행된 다음의 glob이다.
Reference
https://brunch.co.kr/@kd4/3
https://shoark7.github.io/programming/knowledge/difference-between-process-and-thread
'System > OS' 카테고리의 다른 글
운영체제 2-1 ~ 2-2] 운영체제의 개요 (0) | 2021.09.19 |
---|---|
운영체제 1-2] 운영체제의 개요 (0) | 2021.09.12 |
운영체제 1-1] 운영체제의 개요 (0) | 2021.09.12 |
메모리 매핑(mapping) - mmap()함수 (0) | 2020.05.19 |
Process와 Process Control Block (0) | 2020.04.22 |