스레드의 역사

먼저 이 글은 본인의 글이 아니라, FAQs 사이트의 스레드에 대한 글을 번역한 것임을 밝힌다.


순차적인 제어의 흐름을 의미하는 스레드라는 표현은 1965년 버클리 시분할 시스템에서 처음 쓰였다. 다만, 이 때에는 스레드라는 이름 대신에 프로세스라고 불렀다. 이 프로세스는 공유 변수나 세마포 혹은 그와 유사한 방법들을 통해 서로 상호작용했다. 그리고, 맥스 스미스(Max Smith)가 1970년대에 멀틱스(Multics)에 최초로 스레드를 구현했다. 이 스레드는 한 개의 무거운 프로세스 안에서 멀티 스택을 이용해 백그라운드 컴파일을 돕는 기능을 했다.

스레드에 있어 가장 중요한 시작은 아마도 1965년에  나온 PL/I라는 프로그래밍 언어부터 일 것이다. IBM에서 자사 프레임워크에 사용하기 위해 만든 PL/I에는 ‘CALL XXX (A, B) TASK;’ 같은 명령을 통해 XXX를 위해 작업할 스레드를 만들 수 있었다. 모든 IBM의 컴파일러가 위 기능을 구현했는지는 분명치 않으나, 멀틱스가 만들어지고 있을 때 쯤, IBM은 이 기능을  적용할지 말지 결정하기 위해 테스트 하였다. 그리고 TASK란 프로세스에 맵핑되지 않고, TASK들 사이의 제어를 보호하지 않는 형태의 것으로 정의했다.
그러나 벨 연구소는 쓸모 없는 흰 코끼리처럼 비대해져가는 징후를 보이는 멀틱스에서 손을 떼 버렸고 스레드는 다른 형태로 이 기능을 만들게 되었다. IBM은 TASK의 이상한 특성과 수많은 이상한 것들 때문에 PL/I에서 TASK 기능을 빼버렸다.

그리고 1970년 대 유닉스가 등장했다. 유닉스에서 말하는 프로세스란 순차적인 제어의 흐름에 덧붙여 가상주소 공간이 추가되었다.   (참고로, 유닉스의 프로세스는 멀틱스의 프로세스 디자인에서 왔다.) 즉 유닉스에서 프로세스란, 꽤 무거운 기계였다. 왜냐하면, 프로세스들은 메모리를 공유하지 않았고(각 프로세스마다 고유의 주소 공간을 가지고 있었다), 파이프나 시그널(signal)같은 것을 통해 상효 작용 했기 때문이다. 공유 메모리라는 개념은 나중에나 꽤 나중에 추가되었다.

시간이 지나, 유닉스 사용자들은 메모리를 공유할 수 있는 예전 방식의 프로세스를 그리워하기 시작했다. 이게 스레드의 발명을 이끌었다. (참고로, 예전 방식의 프로세스란 한개의 유닉스 프로세스에서 주소 공간을 공유하는 것을 말한다.) 예전 방식의 스레드는 기존 방식의 스레드가 무겁다(heavyweight)며 이에 반대되는 의미로 ‘라이트웨이트(lightweight)’라고 불렸다.  이런 구분은 70년대 말에서 80년대 초에 마이크로커널(microkernels)이 나올 때까지 쓰였다.

추가로 덧붙이면, 스레드는 전기 통신 어플리케이션에서는 꽤 오래전부터 사용되어 온 개념이다.


처음에 스레드와 프로세스에 대한 설명을 들으면 매우 헷갈린다. 어떻게 보면 당연한데, 두 개가 비슷하거나 같은 것을 가리키는 이름이었다가 조금 씩 필요에 의해 변화 해 왔기 때문이다. 현재는 프로세스와 스레드라는 단어에 대한 정리가 명확한 편이다. 참조에 있는 메모리 관점에서 본 프로세스메모리 관점에서 본 스레드, 두 글을 본다면 도움이 될 것이다.

참조

“스레드의 역사”에 대한 2개의 생각

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.