✅ 해당 글은 저의 주관이 가득 섞인 내용입니다. 특히 질문한 이유, 면접관의 의도 등은 개인적인 생각임을 밝힙니다.
(0) 시간이 없어서 죄송해요 전체 글을 못읽겠어요. 빠르게 원하는 것만 가져갈게요!
스레드는 프로세스 내에서 동작하는 하나의 흐름입니다. 하나의 흐름이란 프로세스 내에서 하나의 동작을 책임지고 있다는 뜻입니다. 이를 위해서 스레드는 독립적인 스택 영역을 따로 할당 받습니다.
그리고 문맥교환이 이점을 갖는 이유는 방금 말씀드렸다 싶이 스택영역은 따로 할당 받지만, 다른 영역은 공유를 하기 때문입니다. 그로인해 문맥교환시 커널영역에 접근하지 않고, 메모리에 저장되어있는 데이터의 전달이 필요하지 않기 때문입니다.
스레드는 프로세스 내에서 동작하는 하나의 흐름입니다. 또한, 유일하게 스택영역만 독립적으로 할당 받습니다. 그 이유는 스레드는 하나의 동작을 수행해야하기 때문입니다. 그리고 문맥 교환의 이점을 가져다주는 이유는 자원을 공유하고 프로세스 내에서 문맥교환이 가능하기 때문입니다. 자원을 공유한다는 것은 방금전 말씀드린 스택영역을 제외한 나머지 영역을 의미합니다. 그 영역을 공유하고 있기 때문에 오버헤드의 발생이 적습니다. (아 이건 나중에 다시 깔끔하게 정리할게요)
(1) 질문한 이유가 뭐예요?
스레드(Thread)는 어떻게 프로세스의 문맥교환의 오버헤드를 줄일 수 있을까? 우리는 먼저 스레드란 무엇인지를 알아야합니다. 스레드란 프로세스 내에서 동작하는 하나의 흐름(Flow)라고 생각하면 됩니다. 이렇게 추상적으로 얘기를 하면 당연히 이해를 못하겠죠? 한가지 예시를 들도록 하겠습니다. 자자, 우리는 파일을 다운로드하려고 합니다. 하지만 대부분 파일을 다운로드 시켜놓고 기대감에 빠져 멍때리며 다운로드 되는 과정을 계속해서 쳐다보고만 있지 않겠죠? 왜냐하면, 우리 한국인들은 그런 상황을 좋아하지 않아요. 물론, 스레드가 한국인을 위해서 탄생한 것은 아니지만 성격 급한 우리들에게는 최고의 방법입니다. 다운로드를 시켜놓고 다른 일을 하다가 다운로드가 완성되면 그때 보면 됩니다. 이 일이 가능한 것은 하나의 스레드는 다운로드를 책임지고 다른 스레드는 다른 일을 책임지고 있기 때문입니다. 그러니까 하나의 프로그램 내에서 두가지 일이 가능한 것이죠? 이렇게 이해하시면 될 것 같습니다.
그래서 스레드는 하나의 스택 영역을 할당 받습니다. 이 이유는 왜 그럴까요? 위에서 처럼 스레드는 하나의 동작(함수)를 책임지고 있습니다. 그렇게 하기 위해선 다른 스레드가 동작하는 것을 기다려야 할까요? 그렇지 않습니다. 스레드는 병렬로 수행하기 때문에 자신이 책임지고 있는 부분을 확실하게 수행하고 있습니다. 그래서 독립적인 스택 영역이 필요합니다.
다시 한 번 정리하겠습니다. 스레드는 프로세스 내에서 실행되는 실행 단위, 즉 하나의 흐름(Flow)입니다. 스레드는 병렬로 동작합니다. 그렇기 때문에 스택영역이 독립적으로 존재하게 됩니다. 여기에서 의문이 하나 생기기 시작합니다. 의문보다는 문제가 발생할 수 있습니다.
스레드는 프로세스 내에 존재하는 여러 흐름인데, 스택영역만 따로 할당을 받고 나머지 영역은 공유를 하고 있습니다. 그리고 한 흐름 흐름마다 공유하는 영역이 존재할 것입니다. 그래서 스레드는 병렬로 수행되는 동시에 코드의 동일한 부분이나 다른 부분을 실행할 수 있는 상황이 발생합니다.
이렇게 되면, 여러가지 문제들이 발생할 수 있는데요. 이 부분은 다음 글에서 설명드리면서 파훼법(?)이라고 하기엔 좀 그렇지만 예방하는 방법을 소개해 드리겠습니다. 지금은 왜 문맥교환에서 이점을 가져다 주는지 설명드리는 글이기 때문에 다음에 설명하겠습니다. 그리고, 스레드의 이점도 같이 설명하겠습니다.
아주 빙글빙글 돌아서 여기까지 왔습니다. 글을 이해하지 못하게 작성한 것 같은데, 분명히 나중에 수정이 들어갈 것 같습니다. 그래서 스레드를 사용하는데 이점이 무엇이냐?
📌첫번째, 스레드는 응답성이 좋습니다. 이 말이 무엇이냐면? 스레드는 병렬로 프로그램을 실행합니다. 그렇다는 얘기는 작동시켜야할 부분을 다른 프로그램이 실행되는 동안에 동작시킬 수 있다는 소리입니다. 이전에 말씀드렸던 파일 다운로드중 다른 작업을 할 수 있는 것처럼 말이죠? 그래서 스레드는 응답성이 상당히 좋습니다.
📌두번째는 프로세스의 자원과 메모리 공유가 가능합니다. 아주 기가막힌 컨셉중에 하나입니다. 하나의 자원과 메모리를 할당해주면 자기들끼리 여기 썼다 저기썼다 잘 쓴다는 것입니다. 얼마나 기특합니까? 그래서 응용 프로그램 하나가 동일한 주소 공간에서 스레드를 여러개 실행해 성능을 향상 시킬 수 있습니다.
📌세번째는 문맥교환시에 오버헤드를 줄일 수 있습니다. 프로세스는 일단, 커널 영역에 접근해서 프로세스를 교환해야 했습니다. 이 과정에서 PCB(Process Control Block)에 프로세스의 정보를 저장하고, 교체할 프로세스의 상태를 다시 복사해 문맥교환을 완성합니다. 이 과정에서 커널영역의 개입이 들어갑니다. 하지만 스레드는 커널 영역까지 가지 않고, 프로세스 내에서 문맥교환이 가능합니다. 이유는 무엇이냐면 공유하는 자원과 메모리가 있기 때문입니다. 그래서 굳이 다시 메모리를 할당하고, 회수할 이유가 없습니다.
이러한 이유로 스레드의 문맥교환은 프로세스의 문맥교환보다 이점을 더욱 가져다 줍니다. 사실 지금까지 글을 쓰면서 생각해본 것이지만? 프로세스이 문맥교환과 스레드의 문맥교환은 엄연히 다르다 볼 수 있다고 생각합니다.
하나의 프로세스와 다른 프로세스가 바뀐다는 것은 사실 요즘 시대의 컴퓨터에서 그렇게 큰 오버헤드는 아닐 거라 생각합니다. 하지만, 우리가 배우는 부분은 이런식으로 발전을 해왔다. 스레드의 등장 배경에 대해서 설명하는 것이 더 의의가 크다고 생각됩니다. 그래서 스레드의 등장배경, 스레드가 문맥교환시 좋은 이유에 대해서 설명을 마치겠습니다.
(2) 해당 질문을 한 면접관의 의도는 무엇일까요?
스레드란 무엇인지? 그리고 스레드의 이점에 대해서 물어봤을 가능성이 큽니다. 이에 해당하는 답변은 성실히 공부했다면 무난하게 대답할 수 있을 것입니다. 이제 문제는 여기부터 입니다. 방금 설명드린대로 공유자원이 존재하고 여러 스레드는 하나의 공유자원에 동시에 접근하며 문제가 발생할 수 있습니다. 이러한 문제를 해결하기 위한 내용에 대해서 질문해보겠습니다. 공유자원에 동시에 스레드가 접근하면 어떤 문제가 발생하나요?
다음 씨면기작은 🔜데드락, 경쟁상태 등등(Dead Lock, Race Condition etc) 입니다.
'CS > 운영체제' 카테고리의 다른 글
[씨면기작] 데드락에 대해서 설명해주세요 (0) | 2024.04.22 |
---|---|
[씨면기작] 약간의 배경지식 병렬과 병행 프로세스 (1) | 2024.04.13 |
[씨면기작] 프로세스의 문맥교환(Context Switching)에 대해서 설명해주세요. (0) | 2024.04.08 |
[씨면기작] 프로세스의 상태변화에 대해서 설명해주세요. (2) | 2024.04.07 |
[씨면기작] 프로세스의 메모리 구조에 대해서 설명해주세요. (0) | 2024.04.07 |