disk$0, disk$1 등으로 명명된 스레드는 무엇입니까?

disk$0, disk$1 등으로 명명된 스레드는 무엇입니까?

저는 우분투 20.04 LTS를 사용하고 있습니다. 커널 버전은 5.4.0-42입니다.

다음은 샘플 프로그램입니다:

// mre.c
// Compile with: cc -o mre mre.c -lSDL2
#include <stdio.h>
#include <SDL2/SDL.h>
int main(void)
{
    SDL_Init(SDL_INIT_VIDEO); // Doesn't work without SDL_INIT_VIDEO
    getchar();
}

./mre스레드 이름이 open 인 실행 중인 프로그램을 보면 htop다음과 같은 4개의 스레드가 있음을 알 수 있습니다.

  • mre:disk$3
  • mre:disk$2
  • mre:disk$1
  • mre:disk$0

/usr/libexec/ibus-x11비슷한 이름을 가진 스레드 는 다음과 같습니다 .

  • ibus-x1:disk$3
  • ibus-x1:disk$2
  • ibus-x1:disk$1
  • ibus-x1:disk$0

많은 프로그램에는 이러한 기능이 없습니다. (특정 그래픽 인터페이스를 사용하지 않는 것일 수도 있습니다.)

이러한 스레드는 항상 4개(내 컴퓨터에는 4개의 코어가 있음)가 있으며 내림차순으로 나열됩니다. /usr/lib/xorg/Xorg이러한 스레드는 8개이며 각 숫자 0-3에 대해 2개가 있습니다. 그것들은 무엇을 위해 사용됩니까?

답변1

이 스레드는 다음 용도로 사용됩니다.메사 디스크 캐시:

   util_queue_init(&cache->cache_queue, "disk$", 32, 4,
                   UTIL_QUEUE_INIT_RESIZE_IF_FULL |
                   UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY |
                   UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY);

https://sources.debian.org/src/mesa/22.0.3-1/src/util/disk_cache.c/?hl=174#L174

그런 다음 내부 util_queue_init():

   /* Form the thread name from process_name and name, limited to 13
    * characters. Characters 14-15 are reserved for the thread number.
    * Character 16 should be 0. Final form: "process:name12"
    *
    * If name is too long, it's truncated. If any space is left, the process
    * name fills it.
    */

https://sources.debian.org/src/mesa/22.0.3-1/src/util/u_queue.c/?hl=405#L414-L420

따라서 어떤 방식으로든 이 데스크탑 코드를 호출하는 모든 GUI 프로세스는 예를 들어 내 f33 데스크탑 시스템에서 이러한 추가 스레드를 생성합니다.

    pid     tid            comm cls
   1942    1989  gnome-s:disk$0 BAT 
   1942    1990  gnome-s:disk$1 BAT 
   1942    1991  gnome-s:disk$2 BAT 
   1942    1992  gnome-s:disk$3 BAT 
   2041    2237  Xwaylan:disk$0 BAT 
   2041    2238  Xwaylan:disk$1 BAT 
   2041    2239  Xwaylan:disk$2 BAT 
   2041    2240  Xwaylan:disk$3 BAT 
   2041    2259  Xwaylan:disk$0 BAT 
   2041    2260  Xwaylan:disk$1 BAT 
   2041    2261  Xwaylan:disk$2 BAT 
   2041    2262  Xwaylan:disk$3 BAT 
   2292    2325  gsd-xse:disk$0 BAT 
   2292    2326  gsd-xse:disk$1 BAT 
   2292    2327  gsd-xse:disk$2 BAT 
   2292    2328  gsd-xse:disk$3 BAT 
   2307    2344  ibus-x1:disk$0 BAT 
   2307    2345  ibus-x1:disk$1 BAT 
   2307    2346  ibus-x1:disk$2 BAT 
   2307    2347  ibus-x1:disk$3 BAT 
   2464    2578  firefox:disk$0 BAT 
   2464    2579  firefox:disk$1 BAT 
   2464    2580  firefox:disk$2 BAT 
   2464    2581  firefox:disk$3 BAT 
   2756    2785  firefox:disk$0 BAT 
   2756    2786  firefox:disk$1 BAT 
   2756    2787  firefox:disk$2 BAT 
   2756    2788  firefox:disk$3 BAT 
   2806    2841  firefox:disk$0 BAT 
   2806    2842  firefox:disk$1 BAT 
   2806    2843  firefox:disk$2 BAT 
   2806    2844  firefox:disk$3 BAT 
   2919    3078  firefox:disk$0 BAT 
   2919    3079  firefox:disk$1 BAT 
   2919    3080  firefox:disk$2 BAT 
   2919    3081  firefox:disk$3 BAT 
   3346    3367  firefox:disk$0 BAT 
   3346    3368  firefox:disk$1 BAT 
   3346    3369  firefox:disk$2 BAT 
   3346    3370  firefox:disk$3 BAT 
   3408    3426  firefox:disk$0 BAT 
   3408    3427  firefox:disk$1 BAT 
   3408    3428  firefox:disk$2 BAT 
   3408    3429  firefox:disk$3 BAT 
   5794    5825  firefox:disk$0 BAT 
   5794    5826  firefox:disk$1 BAT 
   5794    5827  firefox:disk$2 BAT 
   5794    5828  firefox:disk$3 BAT 
   6345    6364  firefox:disk$0 BAT 
   6345    6365  firefox:disk$1 BAT 
   6345    6366  firefox:disk$2 BAT 
   6345    6367  firefox:disk$3 BAT 
   9502    9525  firefox:disk$0 BAT 
   9502    9526  firefox:disk$1 BAT 
   9502    9527  firefox:disk$2 BAT 
   9502    9528  firefox:disk$3 BAT 
  22548   22565  firefox:disk$0 BAT 
  22548   22566  firefox:disk$1 BAT 
  22548   22567  firefox:disk$2 BAT 
  22548   22568  firefox:disk$3 BAT 
  33788   33807      vlc:disk$0 BAT 
  33788   33808      vlc:disk$1 BAT 
  33788   33809      vlc:disk$2 BAT 
  33788   33810      vlc:disk$3 BAT 
  48178   74574  kwallet:disk$0 BAT 
  48178   74575  kwallet:disk$1 BAT 
  48178   74576  kwallet:disk$2 BAT 
  48178   74577  kwallet:disk$3 BAT 
  60824   60830  chromiu:disk$0 BAT 
  60824   60831  chromiu:disk$1 BAT 
  60824   60832  chromiu:disk$2 BAT 
  60824   60833  chromiu:disk$3 BAT 
  69502   69519  firefox:disk$0 BAT 
  69502   69520  firefox:disk$1 BAT 
  69502   69521  firefox:disk$2 BAT 
  69502   69522  firefox:disk$3 BAT

답변2

Linux에서는 C 또는 C++ 프로그램에서 다음을 사용할 수 있습니다.pthread_setname_np(3)-사용prctl(2)시스템 호출 - 스레드 이름을 변경합니다.

바이너리(또는 프로그램에서 사용하는 라이브러리)라이브러리 SDL) 일반적으로 성공하는 함수를 호출하기로 결정합니다.

당신은 사용할 수 있습니다데이터베이스(1),트랙(1),트랙(1)더 많은 연구를 해보세요. 아니면 소스코드를 공부해보세요라이브러리 SDL

당신이 사용하는 경우걸프 협력 협의회컴파일러, C++ 코드를 컴파일합니다.그리고 g++ -Wall -Wextra -g(어쩌면 다시 컴파일라이브러리 SDL소스 코드에서 가져오고, 오픈 소스이므로 최소한 소스 코드를 연구하세요.)

관련 정보