https://gall.dcinside.com/mgallery/board/view/?id=backend&no=7185&page=1

???: 질문수준 ㅉㅉ(개소리 했다고 개털리기) (훈수를 두며)gall.dcinside.com


위 글 댓글중에 이런 댓글이 있었음


멀티프로세싱의 경우 데이터를 공유하기 위해 IPC를 통해야 하고, CPU 스케줄링 과정에서 컨텍스트 스위칭으로 인해 병렬처리에서 오버헤드가 발생하기 때문에 하나의 프로세스에 쓰레드라는 작업단위를 나누고 코드, 데이터, 힙 세그먼트는 공유하되 스택 세그먼트만 쓰레드가 별도로 갖는 병렬처리 기술로 알고 있었는데

쓰레드마다 코드, 데이터, 힙, 스택 세그먼트를 독립적으로 가진다고 해서 의문스러웠음 마치 쓰레드를 프로세스처럼 설명하고 있어서


그래서 구글링을 좀 해봤음

https://www.thegeekstuff.com/2013/11/linux-process-and-threads/

What are Linux Processes, Threads, Light Weight Processes, and Process StateWhat are Linux Processes, Threads, Light Weight Processes, and Process Statewww.thegeekstuff.com


https://www.opensourceforu.com/2011/08/light-weight-processes-dissecting-linux-threads/

Light-Weight Processes: Dissecting Linux Threads - Open Source For YouThis article explores the fundamentals of threads and their implementation in Linux with Light-Weight Processes, aiding understanding with a code implementation.www.opensourceforu.com

https://stackoverflow.com/questions/10484355/what-is-the-difference-between-lightweight-process-and-thread


초기 리눅스 멀티쓰레딩은 유저 레벨 에서만 구분되어 있고, 커널 레벨에서는 뭉뚱그려 하나의 프로세스로 취급했었는데

이때 한 쓰레드에서 파일, 네트워크 I/O 같은 리턴이 올때까지 대기해야 하는 블로킹 시스템 콜을 호출 할 경우 다른 쓰레드의 작업마저 블록킹 되는 문제점이 있었대

상식적으로 멀티쓰레딩이라고 하는건 다른 쓰레드는 알빠아니고 내 할일은 막힘없이 계속 해야하는게 맞는거잖음


그래서 나중에 커널 레벨에서도 똑같이 쓰레드를 구현했고 커널 레벨 쓰레드 또는 Light-weight Process(LWP)라고 하고 유저 레벨 쓰레드와 매핑됨

LWP는 clone()을 호출하여 자식 프로세스를 생성하듯 만드는데, fork()와는 달리 부모 프로세스의 리소스, 메모리 영역등을 공유함

그리고 OS에서 LWP를 독립적인 작업단위로 인식하고 어느 한 쓰레드에서 블록킹 시스템 콜을 넣어도 다른 쓰레드들이 중지되지 않는다고 하네


어쨌든 리눅스에서 쓰레드가 마치 프로세스 생성하듯 만들어 진다는것과 실제로 경량 프로세스라고 불리는것도 알게됐는데

얘네들이 다른 프로세스처럼 독립적인 메모리 세그먼트를 갖는지는 잘 안나오네 그게 제일 궁금했던건데