• 카테고리

    질문 & 답변
  • 세부 분야

    기타 (개발 · 프로그래밍)

  • 해결 여부

    해결됨

멀티스레딩

24.01.12 12:41 작성 24.01.12 14:07 수정 조회수 175

0

안녕하세요, 선생님.

(참고로 저는 C++언어를 모릅니다..)

"멀티스레딩과 동기화 기본"강의에서

main 함수가 부모 프로세스이고 차일드 프로세스로 별개의 프로세스고

threadFuncton01,02,03은 하나의 _beginthread로 인해 멀티 스레딩이 되고 하나의 프로세스안에 threadFunction01,02,03이 있는 걸로 이해했습니다.
맞을까요 ?

Q1) Sleep()함수가 없을 때, threadFunction01,02,03이 실행되기도 전에 main함수가 종료되었는데, 그래서 threadFunction01,02,03이 실행이 되지 못해서 end가 안찍혔는데,
main함수가 종료되었는데 threadFunction01이 나중에 종료될 수 있는지도 ... 설명 부탁드립니다..

Q2) 저는 큐가 한 개인 걸로 이해했는데요, 큐에 main함수 스레드를 m-1, threadFunction함수 스데드를 t-1, t-2, t-3로 한다면, [m-1, t-1, t-2, t-3] 순으로 큐에 있다가 sleep 때문에 m-1이 큐에서 빠졌다가 100ms 지나서 되돌아 올 때, 코어가 8개니까.. t-1, t-2, t-3가 임의의 코어가 나눠가졌는데.. 그 코어의 스케쥴링에 따라서 운이 좋게 t-3가 먼저 실행되어서 순서가 threandFunction01,03,02로 출력된 거라고 이해하면 될까요 ?

Q3) 큐에 스레드가 쌓일 때, 함수의 실행 순서랑은 상관 없이 쌓이는 건가요...?

 

Q4) 스레드의 실행 순서는 알 수 있다면.. 프로세스는 순서대로 실행되나요..?

답변 2

·

답변을 작성해보세요.

0

threadFunction01~03은 개별 스레드로 실행되며 한 프로세스 안에 속합니다. 그렇게 이해하시면 되겠습니다.

A1) 아니오. 메인 스레드가 종료되면 프로세스가 종료됩니다. 이 때, 아직 종료되지 않은 스레드들은 모두 강제 소멸하게 됩니다. 메인 함수가 속한 메인 스레드의 마지막 문자열 출력 이후 스레드 함수에서 출력한 문자열이 화면에 나온 것은 아직 메인 스레드가 완전히 종료되지 않은 상태이기 때문입니다.

A2) OS 수준에서 특정 프로세스에 속한 스레드들을 관리하기 위해 Queue를 사용하는 것으로 생각 할 수 있습니다. 다만 그 개수는 1개가 아닐 가능성이 높습니다. 러닝 상태 스레드들을 관리하는 큐와 휴면 상태 스레드들을 별도로 관리하는 과정에서 개별 Queue가 사용되는 것이라 보는 것이 맞겠습니다. 아무튼 러닝 상태 스레드들을 Queue에서 하나씩 꺼내 각 코어별로 동시에 연산하는 것은 맞습니다. 이 상황에서는 먼저 꺼내진 스레드를 먼저 연산할 가능성이 높지만 나중에 꺼낸 스레드를 먼저 연산하게 되는 경우도 많습니다. 즉, 순서를 장담하기가 어렵습니다.

A3) 스레드를 생성하는 일은 생각보다 시간이 좀 걸리는 일입니다. 그리고 연산으로 이어지는 과정에서 멀티 코어 중 어떤 것을 배정 받아 실행 될지 또한 각 코어의 상태나 처리할 명령이 일부 밀려있을 수 있는 등 다양한 변수가 있습니다. 이 때문에 순서를 확실하게 말 할 수 없습니다. 만일 꼭 그래야 한다면 반드시 동기화 코드를 넣어야 합니다. 결과적으로 실행 순서대로 Queue에 추가 하려 하겠지만 순서를 장담 할 수 없는 것으로 이해하면 되겠습니다.

A4) 윈도우 운영체제에서 프로세스는 관리 단위 일 뿐 실제 실행의 단위는 프로세스에 속한 스레드들입니다. 다만 프로세스 단위로 자원이 배정됩니다. 코어가 8개인 시스템이라 하더라도 특정 프로세스에 대해 1개 코어로만 연산하도록 조절 할 수 있습니다. 이는 프로세스가 순서대로 실행되는 것과는 무관하겠습니다. 참고하시기 바랍니다.

 

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.12

안녕하세요, 인프런 AI 인턴입니다.

은경님, 선생님이 이야기하는 멀티스레딩과 관련하여 Sleep 함수의 역할과 스레드의 실행 순서에 대해 질문해주셨네요. 제가 찾은 기존 답변들이 은경님의 질문을 해결하는 데 도움이 될 것 같습니다.

  1. Sleep 함수와 스레드 종료에 관한 질문에 대해서는 “멀티태스킹, 멀티쓰레드에서 질문이 있습니다.” 라는 게시물이 도움이 될 수 있습니다. 이 게시물에서는 마치 동시에 여러 작업이 진행되는 것처럼 느껴지는 멀티태스킹과 멀티스레딩 개념에 대해 설명되어 있습니다. 질문자의 이해를 돕기 위해 해당 답변에서는 CPU가 어떤 식으로 클록 사이클 단위로 스레드를 전환하며 실행하는지 설명하고 있습니다.

  2. 스레드 실행 순서와 큐에 관한 질문은 “강의 내용이랑은 큰 상관없는 질문입니다” 라는 게시물에서 조금 더 세부적으로 토론됩니다. 여기서는 메인 스레드가 다른 작업자 스레드들이 종료될 수 있도록 Sleep을 호출하며 기다려주는 것과 관련된 내용입니다. 스레드에 대한 타이밍과 큐에 대해 논의되어 있어서 참고하시면 좋을 것 같습니다.

이러한 스레드 실행과 관련된 내용 외에도, 메인 함수와 child thread가 별도의 프로세스인지, 그리고 thread 함수와 메인 함수의 종료 순서에 관한 질문이 있습니다. 이는 C++ 멀티스레딩의 기본적인 개념에 관련된 질문으로, 메인 함수(main thread)와 child thread는 동일한 프로세스 안에서 실행되며, 메인 함수가 종료되더라도 별도로 생성된 스레드(threadFunction01, 02, 03)들은 각자의 실행을 계속하게 됩니다. 다만, 메인 함수가 종료된 후 프로그램이 완전히 종료되기 전에 모든 스레드들이 완료되도록 신경써야 할 때는 Sleep을 활용합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.