코미
100
2022-05-14 15:24:12 작성 2022-05-14 20:25:37 수정됨
2
125

프로세스와 스레드에 대해서


안녕하세요 코딩 초보입니다.


프로세스와 스레드에 대해서 알아 보고 있는데


하드웨어적으로..? 조금 작동 원리가 잘 이해가 안 돼서 글을 올리게 되었습니다.



현재 cpu를 보면 대게 한 개의 코어에 두 개의 스레드를 가지고 있는 경우가 많은데

(제 cpu는 16개 코어 8코어는 2스레드 나머지 8코어는 1스레드 이네요)


프로그래밍에서 스레드를 많이 만들어도 결국은 하드웨어의 스레드 개수 만큼만 실행이 되고

실행 중이지 않은 내용들에 대해서는 유휴상태(?)에 들어간다고 알고 있습니다.


100개의 스레드를 만들어도 최대 cpu내의 스레드 개수 만큼만  동시에 실행될 수 있는 느낌인 것 같은데.



이 때 궁금한 게.


이 프로그램이 하나의 코어를 이용해 돌아가는 프로그램이라고 하면

한 개의 코어에는 2개의 스레드가 있으니 최대 2개까지만 동시에 스레드가 사용될 수 있는 건가요?

그리고 두 개의 코어를 사용하는 프로그램이면 4개의 스레드가 사용될 수 있고

이런 식으로 작동하는 것인 지 

아니면 스레드는 코어와 상관 없이 cpu에 있는 만큼 마음대로 쓸 수 있는 것인 지 궁금합니다.



아직 개념도 제대로 잡히지가 않네요..ㅠㅠ 

이런 컴퓨터 과학?적인 지식은 어디서 공부하는 게 좋을까요. 책이 가장 좋은가요?

혹시 좋은 책이 있다면 추천 부탁드려요ㅎㅎ

0
  • 답변 2

  • esrse
    1k
    2022-05-15 00:36:49 작성 2022-05-15 00:38:00 수정됨

    질문자분은 운영체제 기초 개념들이 정리가 안 되어서 혼란스러운 상태인 거

    같습니다. 지금 헷갈리고 있는 개념들은 대부분 운영체제 입문서 초반부인

    프로세스와 스케줄러 챕터 내에서 소개됩니다.




    프로세스, 쓰레드는 둘이 비슷한 개념인데 쓰레드는 메모리공간을 공유한다는

    차이점이 가장 큽니다. 프로세스나 쓰레드는 운영체제에서 가장 핵심적이지만, 또

    굉장히 종합적인 일들을 처리하는 단위라서 한문장으로 설명하긴 어렵습니다.


    리눅스를 기준으로 가장 단순하게 설명하자면, 디스크에 ELF 포맷으로 파일형태로

    저장돼 있는 것을 프로그램이라고 칭하고 이것을 실행시키면 프로세스가

    됩니다. 그러고 나서 프로세스는 clone 시스템콜을 호출하여 자신과 메모리를 공유할

    수 있는 다른 쓰레드들을 새로 생성할 수도 있고, fork 시스템콜을 호출하여 자신과

    닮은 자식 프로세스를 생성할 수도 있습니다. 전자를 멀티쓰레드

    프로그램, 후자를 멀티프로세스 프로그램이라고 합니다. 효율성으로 따지면

    멀티쓰레드 프로그램이 압도적으로 낫습니다. 그러나 개발의 어려움, 사람의

    두뇌로는 예방할 수 없는 수많은 버그 가능성 등이 크기 때문에 양날의

    검입니다. 반면에 멀티프로세스 프로그램은 독립적인 메모리 공간을 가지기 때문에

    멀티쓰레드 프로그램보다는 안정적이면서도 처리량을 어느정도는 늘릴 수 있다는

    장점이 있습니다.



    예를 들어 cpu의 하이퍼쓰레딩 기능까지 고려해서 토탈 10개의 코어를 가지고

    있다면, 이 컴퓨터에서 동시에 실행될 수 있는 프로세스의 개수는 10개가 최대치

    입니다.


    운영체제는 한 프로세스가 코어를 점유할 수 있는 시간을 제한합니다. 그리고 그

    시간제한이 다되면 코어에서 내쫓고 대기큐로 보내버리죠. 그리고 다른 프로세스가

    코어를 점유할 수 있도록 해줍니다.


    비유하자면, 놀이동산에 있는 범버카 같은 거죠. 범버카 10대가 있고, 관람객은

    1,000명입니다. 범버카는 2분씩 탈 수 있고, 2분이 지나면 관람객은 내려야

    합니다. 만약 부족해서 더 타고 싶으면 줄을 다시 섭니다.


    여기서 범버카는 코어고 관람객이 프로세스입니다. 운영체제는 범버카

    관리자죠. 관람객은 범버카를 너무 좋아한 나머지, 대기줄 기다리고 범퍼카를 타는

    것을 10회를 반복했습니다. 그러고 나선 더 탈 필요를 못느껴서 그만두게

    됩니다. 이것은 프로세스가 대기큐에 있다가 온-코어 상태로 실행되다가, 다시

    대기큐로 보내지는 과정을 10회 반복한 뒤에, 더 실행될 코드가 없어서 프로세스가

    종료한다는 것과 같죠.


  • 코미
    100
    2022-05-15 13:57:10 작성 2022-05-15 13:57:40 수정됨

    글을 엄청 열심히 써주셔서 이해하는데 도움이 많이 됐습니다!


    아직 완벽하게 이해는 못 해서 궁금한 부분이 있는데 몇 가지만 더 질문 드려 보겠습니다.


    1. 스레드는 결국은 부모 프로세스의 메모리를 공유하는 '프로세스'의 일종이라고 볼 수도 있는 걸까요?

    스레드와 프로세스 모두 실행되는 동안 cpu의 코어(물리 스레드)를 필요로  하니 스레드는 부모 프로세스의 메모리를 공유 받는 하나의 프로세스로도 볼 수 있지 않을까 생각이 들었습니다. 


    2. 이건 제 글에서 쓴 질문과 같은데 하나의 프로세스에서 10개의 스레드 또는 프로세스를 만들어 냈다고 하면 이 때에는 컴퓨터 내에 코어(물리 스레드)를 전부 사용해 병렬 및 병행처리 하는 것인지 프로그램이 실행될 때 배정된 코어의 수 만큼만 사용하는 지 궁금합니다.


  • 로그인을 하시면 답변을 등록할 수 있습니다.