리눅스 에서 프로세스와 쓰레드
글쓴이: skycloud / 작성시간: 월, 2020/05/25 - 12:42오후
operating system concepts 8th에서
리눅스는 프로세스와 스레드를 구별하지 않는다라고 되어 있는데
이해가 잘 안갑니다.
하나의 c파일(혹은 c++)을 실행하면은 프로세스 넘버가 붙는 것은 ps 명령어를 통해 확인가능하고
파일 안에서 여러개의 pthread 호출로 multi thread를 만들면 htop 명령어를 통해 여러 thread가 동시 진행되는 것을 볼 수 있는데 왜 프로세스와 스레드르 구별하지 않는다라고 되어있나요?
Forums:
아...
이렇게 예제를 드리면 어떨까요?
struct task {
...
void *memory;
void *opend_file;
...
}
void *memory_space_a;
void *memory_space_b;
void *memory_space_c;
void *opend_files_a;
void *opend_files_b;
void *opend_files_c;
struct task process_a;
struct task thread_1;
struct task thread_2;
struct task thread_3;
struct task process_b;
struct task process_c;
process_a.memory = memory_space_a;
thread_1.memory = memory_space_a;
thread_2.memory = memory_space_a;
thread_3.memory = memory_space_a;
process_a.opend_file = opend_files_a;
thread_1.opend_file = opend_files_a;
thread_2.opend_file = opend_files_a;
thread_3.opend_file = opend_files_a;
process_b.memory = memory_space_b;
process_b.opend_file = opend_files_b;
process_c.memory = memory_space_c;
process_c.opend_file = opend_files_c;
모두 struct task 로 표현되므로
kernel space 에서는 구별하지 않는다라고 표현해도 무방하지 않을까요?
해외 질문들을 보니깐 process를 thread의
해외 질문들을 보니깐 process를 thread의 group으로도 보던데 이와 비슷한가요?
보여주신 것은 a라는 메모리 안에 프로세스a와 thread 1,2,3이 존재하는데 이것은
한 메모리안에 총 4개의 실행 단위가 있는 걸로 보이는데 그냥 task가 4개 존재한다는 것인가요 ?
process와 thread라는 이름은 그렇게 쓰이는게 보편적이여서 리눅스에서 편의상 그렇게 나타낸다는 것인가요?
넵
- 네 그룹이란 이란 느낌으로 pid 로 tgid 볼 수 도 있을 것 같습니다(구글 검색 ㄱㄱ)
- 이해하신 것에 앞뒤를 바꿔서 [4개의 task 가 동일한 가상 메모리를 사용한다 정도로?]
- process 와 thread 이름... kernel space 와 user space의 차이라 보여집니다.
저의 과거 경험을 이야기 드리면 면접에서 process 와 thread 의 차이가 뭐냐 라고 하길레
kernel 에서는 동일합니다. task 로 다 사용하거든요.. 라고 답했습니다.
상대편은 메모리가 공유되고... open 된 파일도 공유되고... 이런 대답을 원했고요..
그래서 위와 같은 형편없는(?) 예제를 드렸습니다.
그 부분이 기억 안 나긴 하지만
스케쥴링을 할 때 구분하지 않는다는 얘기겠죠. 그것도 가장 최신의 스케쥴러 얘기인지는 모르겠습니다.
clone()
고전적인 관점에서.
linux에는 thread라는게 없어요. 그래서, clone()같은 놈들을 써서 pthread를 생성하죠.
clone()은 parent와 resource(뭐 메모리 등등)를 공유하는 child process를 생성합니다.
그래서, 말씀하신대로의 그런 얘기가 나온게일겁니다.
그러면 부모프로세스가 자식 프로세스를 기다리는 것과
그러면 부모프로세스가 자식 프로세스를 기다리는 것과 한 프로세스안에서 여러 thread를 병렬 실행하는 것을 리눅스에서는 어떻게 봐야되나요?
제가 질문을 잘 이해못하겠습니다만,
제가 질문을 잘 이해못하겠습니다만,
user mode에서 pthread 사용할때는
구냥 thread려니 하고 사용하시면 됩니다.
음 ..
user level 에서는 thread 와 process 가 구별되지만..
kernel 에서는 그러한 구분없이 모두 process 로 관리하고 스케쥴링 합니다.
user level 에서 thread 라 불리지만, kernel 에서는 LWP (light-weight process) 라고 부르죠.
흔히 말하는 process 와는 flag 가 조금 다를 뿐, 구조는 같습니다.
https://www.thegeekstuff.com/2013/11/linux-process-and-threads/
위 링크를 찬찬히 살펴 보시면, 도움이 될 것 같습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기