※ 전남대학교 박태준 교수님의 운영체제 강의를 듣고, 정리한 내용입니다.
프로세스 생성시 오버헤드가 크다는 단점이 존재하고, 프로세스 간 context switching 하는데도 오버헤드가 크다는 단점이 있습니다.
또 프로세스간 통신을 하려고 하니, 통신을 하기 위한 별도의 방법을 도입해야 한다는 단점이 존재했습니다.
프로세스 문제점
즉 하나의 작업을 처리하려고 하는데, 이를 쪼개서 일할 때 번거롭다는 문제점이 나타나게 되었습니다.
예를 들어, 미디어 플레이어의 경우를 생각해본다면..
영상 처리, 소리 처리, 자막 처리 등등을 동시에 ( = 시분할 ) 작동이 이루어져야 합니다.
만약 각 기능들이 프로세스 기반 멀티태크싱으로 이루어진다면, context switching 하는데도 너무 무거워 결국 시분할 사이의 시간이 길어질 수 밖에 없게 됩니다.
이러한 문제를 해결하고자 쓰레드가 등장하게 되었습니다.
프로세스를 사용할 때 발생하는 문제점을 해결하고자 고안된 방법입니다.
프로세스보다 더 작은 실행단위이고, 현대 운영체제가 작업을 스케줄링하는 단위 입니다.
쓰레드
쓰레드를 도입함으로써 프로세스의 생성 및 소멸에 따른 오버헤드가 감소했고, Context Switching 의 속도가 더 빨라지게 되었습니다.
프로세스는 쓰레드들을 담기 위한 컨테이너라고 볼 수 있습니다.
또, 쓰레드는 곧 함수라고도 볼 수 있습니다.
프로세스가 생성될 때 운영체제에 의해 자동으로 1개의 쓰레드가 생성되는데, 이를 메인 쓰레드 ( main ) 라고 부릅니다.
( 우리가 코딩할 때 쓰는 그 main 함수 )
또 하나의 컨테이너가 여러개의 쓰레드를 가지면, 이를 멀티쓰레드라고 부릅니다.
프로세스는 쓰레드들의 공유 공간 ( 환경 ) 을 제공해줍니다.
모든 쓰레드는 프로세스의 코드, 데이터, 힙 공간을 공유해서 사용하기 때문에, 쓰레드 사이 통신이 용이하다는 장점이 있습니다.
( 단, 스택은 쓰레드별로 별도의 공간을 사용함. 왜냐하면 각 지역 변수들은 따로 각자 관리 )
하지만 서로 다른 쓰레드가 동시에 전역 변수에 접근한다면 ( 데이터 영역 ), 쓰레드간 실행 순서를 알 수 없기 때문에 예상하지 못한 값이 나오게 됩니다.
예시
- 전역변수 s = 0
- thread1 에서 반복문을 돌면서 s 의 값에 1을 더하는 작업을 100번 반복
- thread2 에서 반복문을 돌면서 s 의 값에 1을 빼는 작업을 100번 반복
이 작업을 진행하고 나면 우리가 예상하는 값은 0 이 돼야 하지만..
서로 다른 쓰레드가 동시에 전역 변수에 접근하기 때문에 예상과 다른 값이 나오게 됩니다.
이를 공유자원 문제라고 합니다.
쓰레드도 마찬가지로 생명주기가 존재합니다.
정리해보자면, 다음과 같습니다.
공유자원 ( 전역 변수 ) 의 합이 0 이 되질 않음
하나의 자원을 여럿이 쓰려고 하니.. 문제!
( 이 문제는 후에 다룰 예정입니다. )
장점
단점