본 글의 일부분은 서적 'Operating Systems: Three Easy Pieces by Remzi H.Arpaci-Dusseau, Andrea C.Arpaci-Dusseau' 내의 이미지와 내용을 포함하고 있습니다 :)
이번 시간에는 thread에 대한 개념에 대해서 배워보고자 합니다.
여러 개발 환경에서 자주 등장하고, 또 중요한 개념이기 때문에 처음부터 차근차근 다뤄보겠습니다.
Thread의 필요성
시스템의 자원은 정해져있기 때문에, 모든 프로세스가 시스템의 자원에 동시에 접근할 수는 없습니다.
따라서 스케쥴링 정책에 따라 프로세스에게 순번을 부여해서 어떤 프로세스가 먼저 자원을 사용할 것인지 정하고, 줄을 서고 기다리는 과정을 거쳐야할 뿐만 아니라,
다른 프로세스의 일을 처리하기 위해서 context switching에 대한 오버헤드도 생기게 됩니다.
만약 CPU가 여러개라면, 한 번에 여러 프로세스를 CPU의 개수만큼 처리 할 수 있겠지만, 현실은 그렇지 못합니다.
이번엔 웹 서버를 동작시키는 측면에서 설명해보겠습니다.
Web client 측에서 html 파일을 요구하면, Web Server가 디스크에서 html을 가져와 다시 client에게 뿌려주는 서비스를 한다고 가정하겠습니다.
그러면 Web Server 측에서, "disk에서 html을 가져오는 도중", 즉 I/O를 하는 동안에는 프로세스가 blocked 상태가 됩니다.
즉, 해당 프로세스는 disk에서 html 파일을 가져오는 동안 정지된 상태로 멈춰있는 것이죠.
만약 이렇게 blocked된 상태에서 다른 사용자가 사이트에 접속해서 html 파일을 달라고 요청하게 된다면..?
이미 block 상태인 Web Server는 이 요청을 해결할 수 없으니 후에 접속한 사용자도 기다려야 하는 상황이 생기게 됩니다.
물론 fork()를 이용해서 프로세스를 하나 더 만들어 사용자의 요청을 처리해도 되겠지만,
100명, 1000명의 사용자마다 프로세스를 하나씩 주는 것은 굉장히 부담스러운 일일 것입니다.
특히 똑같은 역할을 하는 프로세스를 굳이 또 복제해서 하나 더 만드는 것 보다는, 같은 코드를 사용할 것이라면 그냥 공유하는 것이 더 효율적이겠죠.
이런 상황으로 인해서 우리는 Thread를 사용하게 됩니다.
Thread란
그러면 Thread란 과연 무엇일까요?
thread는 프로세스의 code, data, resource들은 공유하고, register value나 stack은 각자의 것을 갖는 작업 단위로, 프로세스에 의해서 탄생됩니다.
동작은 프로세스와 비슷한 것 같아 보이지만, 한 번에 여러 쓰레드를 동작시킬 수 있다는 점에 차이가 있습니다.
즉, A라는 프로세스가 B, C, D 라는 쓰레드를 만들게 되면,
이전에는 A 프로세스만 동작할 수 있었던 시간동안 B, C, D가 한꺼번에 돌아가는 것입니다.
이러한 CPU 효율성 측면 뿐만 아니라, 자원을 공유한다는 측면에 있어서도 효율적임을 알 수 있습니다.
아래는 Thread와 Process의 차이점을 쉽게 나타내주는 그림입니다.
Thread의 장점
위의 그림을 보면 알 수 있듯이 register와 stack 은 쓰레드마다 갖고, code, data, file 등의 자원은 프로세스
와 공유하기 때문에 시간과 메모리 측면에서 가볍다고 할 수 있습니다.
또한 기존의 fork() 를 이용해서 프로세스의 코드와 자원, stack 등을 몽땅 복사해 갈 필요도 없기 때문에 생성 비용도 낮습니다.
앞서 들었던 예시처럼 웹서버에서도 사용자들이 다른 client 요청의 처리가 끝날 때 까지 기다리지 않아도 되기 때문에 응답성이 좋습니다.
또한 멀티 프로세서, 즉 여러개의 프로세서가 일을 처리할 때에 병렬적으로 더 많은 일을 처리할 수 있기 때문에 효율성이 높아집니다.
이번 시간에는 Thread의 개념과 사용했을 때의 장점에 대해서 배워보았습니다 :)
'운영체제' 카테고리의 다른 글
[운영체제] System Call (0) | 2021.01.14 |
---|---|
[운영체제] Direct Execution과 Limited Direct Execution (0) | 2021.01.14 |
[운영체제] 프로세스 API (0) | 2021.01.11 |
[운영체제] 프로세스(Process)란 무엇일까? (0) | 2021.01.10 |
[운영체제] CPU 가상화의 기본 개념 (0) | 2021.01.10 |