https://gall.dcinside.com/mgallery/board/view/?id=backend&no=7185&page=1
위 글 댓글중에 이런 댓글이 있었음
멀티프로세싱의 경우 데이터를 공유하기 위해 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.comhttps://www.opensourceforu.com/2011/08/light-weight-processes-dissecting-linux-threads/
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를 독립적인 작업단위로 인식하고 어느 한 쓰레드에서 블록킹 시스템 콜을 넣어도 다른 쓰레드들이 중지되지 않는다고 하네
어쨌든 리눅스에서 쓰레드가 마치 프로세스 생성하듯 만들어 진다는것과 실제로 경량 프로세스라고 불리는것도 알게됐는데
얘네들이 다른 프로세스처럼 독립적인 메모리 세그먼트를 갖는지는 잘 안나오네 그게 제일 궁금했던건데
유닉스 API보면 차일드 프로세스만들때 메모리, 코드 공유 가능하게 하는 flag들이 있음 사실은 그걸 껏다켯다 하면서 만드는거임 그래서 OS 레벨에서는 사실상 구분없는 개념임 쓰레드라는 컨셉에 맞게 프로세스를 생성하는거지 ㅇㅇ 그래서 언어마다 POSIX처럼 1대1매핑 시키는것도 있고, 쓰레드풀로 다대일 매핑시키는 자바 버추얼스레드 같은것도 잇는거임
좋은 지식 얻어감
하수라 읽어도 모르겟다 전공도 들엇는데 - dc App
나도 최근에 읽었는데 os에따라 다르다고 들음.