Linux의 스레드 프로세스

Linux의 스레드 프로세스

새로운 스레드를 생성할 때 발생하는 "페널티"에 대해 알고 싶습니다.

clone(2), NPTL(New POSIX Threading Library), CFS(Completely Fair Scheduler)에 대해 제가 이해한 바에 따르면, NPTL은 1:1 스레딩 모델을 사용하기 때문에 새로운 스레드가 생성되면 새로운 프로세스로 처리됩니다.

내가 얻은 것에서읽다스케줄러와 관련하여 새 프로세스가 실행 대기열에 추가되면 fair_clock변수는 벽시계의 일부만큼 증가합니다.

pthread_create(3) 탐색 의식을 사용하면, 최종적으로는 fork(2)에서와 마찬가지로 복제본이 호출됩니다.

이제 프로세스에는 1:1 모델이 있고 스레드에는 1:1 모델이 있습니다. 그렇다면 스레드도 이로 인해 어려움을 겪나요?같은 운명게다가? 분명히 스레드는 어떤 형태로든 불이익을 받아야 합니다. 그렇지 않으면 멀티 스레드 프로세스가 CFS에서 사용하는 RR(라운드 로빈) 시스템을 채워 CPU 시간의 대부분을 차지할 수 있습니다.

이 경우예, 그렇다면 포크보다 스레드를 사용하면 어떤 이점이 있습니까? shm_open(2)을 사용하는 대신 자동으로 힙 공간을 공유합니까?

답변1

Completely Fair Scheduler에 대해 제가 제공한 링크에서 커널 2.6.24에 소위 그룹 스케줄링이 있다는 것을 알 수 있습니다.

Chandandeep Singh Pabla의 말을 인용하자면:

예를 들어, 시스템에 총 25개의 실행 가능한 프로세스가 있다고 가정합니다. CFS는 CPU의 4%를 모든 사람에게 공평하게 할당하려고 합니다. 그러나 이 25개의 프로세스 중 20개는 사용자 A에 속하고 5개는 사용자 B에 속한다고 가정합니다. 사용자 B는 A가 B보다 더 많은 CPU 성능을 갖기 때문에 본질적으로 불리한 입장에 있습니다. 그룹 예약은 이 문제를 해결하려고 시도합니다. 먼저 그룹에 공평하게 시도한 다음 해당 그룹 내의 개별 작업에 공평하게 시도합니다. 따라서 그룹 스케줄링이 활성화된 CFS는 각 사용자 A와 B에게 CPU의 50%를 할당합니다. A의 50% 할당량은 A의 20개 작업에 할당되고 나머지 50%의 CPU 시간은 B의 5개 작업 중 하나에 공평하게 할당됩니다.

이제 이는 프로세스가 새 스레드를 생성할 때 해당 프로세스 예약 그룹에 속하게 되므로 위의 질문에 적용됩니다. 이렇게 하면 1000개의 스레드를 생성하는 프로그램이 모든 CPU 시간을 차지하는 것을 방지할 수 있습니다. 왜냐하면 해당 특정 프로세스 그룹의 실행 시간(1000개 스레드 + 원래 프로그램)의 1/1001만 가져오기 때문입니다.

따라서 이는 전체 시스템에 비해 스레드 타이밍을 느리게 하여 스레드 응용 프로그램에 적절하게 불이익을 줍니다.

관련 정보