프로세스를 구성하는 실행의 흐름 단위 이다. 그렇기 때문에 하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 스레드를 이용하게 되면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있게 된다.
전통적인 관점에서 보면 하나의 프로세스는 한번에 하나의 작업만을 처리하였다. 만약 현재 메모리에 웹 브라우저, 게임, 워드 프로세서와 같은 프로세스들이 적재되었다고 가정을 하면, 모든 프로세스들은 한번에 하나의 실행흐름을 가지며 한번에 하나의 부문만 실행이 된다 생각을 했을것이다.(고전적으로 생각하게 된다면😋) 이러한 프로세스를 단일 스레드 프로세스라고 칭한다.
하지만 스레드라는 개념이 도입이 되면서 하나의 프로세스가 한 번에 여러일을 동시에 처리 할수 있게 되었다. 즉 프로세스를 구성하는 여러 명령어들을 동시에 실행할 수 있게 된것이다.!!😀
이러한 특징들을 볼 때 스레드는 '프로세스를 구성하는 실행 단위'라고 볼 수 있다. 스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성이 되며 각자들이 PC 값을 비롯한 레지스터 값, 스택들을 가지고 있기 때문에 스레드 마다 각기 다른 코드를 실행할 수 있다.
프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채, 프로세스의 자원들을 서로 공유하며 실행이 된다. 프로세스의 자원을 공유한다는 것이 스레드의 가장 큰 특징이라 말할 수 있다.
위 그림을 보며 알 수 있듯이 스레드 마다의 코드/데이터/힙 영역이 존재하는 것이 아니라 각각의 스레드들이 하나의 프로세스에게 할당된 자원들을 모두 공유하고 있다는 것을 볼 수 있다.
정리, 요약..?
스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지고 있는 자원을 공유 한다.
즉 같은 프로세스에 존재하고 있는 스레드들은 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고 열린 파일과 같은 프로세스 자원들을 공유한다. 이런 특징으로 여러 프로세스를 병렬로 싱행하는 것 보다 메모리를 더욱 효율적으로 사용할 수 있게 된다. 추가로 프로세스들은 기본적으로 자원들을 공유하지 않기 때문에, 서로가 남남처럼 독립적으로 실행되는 반면에, 스레드는 프로세스의 자원을 공유하기 때문에 서로의 협력과 통신에 유리하다.
하지만 교수님이 말하셨던.. "세상에는 공짜는 없다😥" 라는 말이 있듯이 멀티 스레드 환경에서도 단점이 존재한다. 멀티프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에는 지장이 적거나 없지만.(기본적으로 자원을 공유하지 않기 때문에.) 하지만 멀티 스레드 환경에서는 모든 스레드가 자원을 공유하기 때문에 하나의 스레드에 문제가 생기면, 다른 스레드에 문제가 생기면 다른 스레드도 영향을 받게된다.
글을 마치며
아.. OS과목을 들은적이 벌써 2년이나 지났구나... 그때 교수님 참.. 어려워서 수업 안 듣고 맨날 카톡하면서 시간 때웠던거 같다. 그때 공부 열심히 할 껄,..ㅋㅋㅋ 진짜 운영체제만 기억이 하나도 안나는 것 같다. 뭐.. 열심히 해야지. 화이팅하자.!!