code로 보는 thread data structure

kyungminLim·2024년 5월 20일
0

thread, qdepth, jobs, queue_count에 대해 code상에서 확인해보자


struct thread_info_t{
    int tid;

//  struct flist_head queue;
    pthread_mutex_t mutex;
    pthread_cond_t cond_main, cond_sub;
    io_context_t io_ctx;
    struct io_event events[MAX_QDEPTH];


    int queue_depth;
    int queue_count;
    int active_count;
    int fd;
    int fsync_period;

    struct io_job *th_jobs[MAX_QDEPTH];
    void *th_buf[MAX_QDEPTH];
    int buf_cur;

    struct io_stat_t io_stat;

    struct trace_info_t *trace;

    int done;
};

이 코드는 trace replay하는 과정속에 있는 tread_info data structure이다.
thread data structure 를 통해서 qdepth와 jobs에 관련된 지식을 대략적으로 정리해보도록 하겠다.

위 코드는 'thread_info_t' data structure가 thread와 관련된 정보를 관리하는 데 사용된다. 이 구조체에서 특히 중요한 요소는 'queue_depth', 'queue_count', 'th_jobs', 'events' 등이 있다. 이들은 thread와 qdepth, 그리고 job 관리와 관련이 있다. 각 요소와 관련된 역할을 설명하겠다.

  1. Queue Depth ('queue_depth')
  • 'queue_depth'는 queue의 최대 깊이를 나타내며, 동시에 처리할 수 있는 I/O 작업의 최대 수를 의미한다. 예를 들어, 'queue_depth'가 32라면, 동시에 최대 32개의 I/O 작업을 queue에 넣고 처리할 수 있다.
  • 이 값은 system의 성능과 처리량(throughput)에 직접적인 영향을 미친다. queue의 깊이가 크면 많은 작업을 동시에 처리할 수 있지만, 너무 크면 오히려 overhead가 증가할 수 있다.
  1. Queue Count ('queue_count')
  • 'queue_count'는 현재 queue에 있는 작업의 수를 나타낸다. 이는 queue의 깊이와 비교하여 현재 얼마나 많은 작업이 대기 중인지를 나타내는 지표이다.
  • 'queue_count'는 동적으로 변하며, 작업이 queue에 추가되거나 제거될 때 업데이트된다.
  1. job 관리 ('th_jobs')
  • 'th_jobs'는 현재 thread가 처리 중인 I/O 작업을 가리키는 포인터 배열이다. 배열의 크기는 'MAX_QDEPTH'로 정의되어 있으며, 이는 최대 큐 깊이와 일치한다.
  • 각 요소는 특정 I/O 작업을 나타내며, 작업이 완료되면 해당 요소가 업데이트된다.
  1. Events ('events')
  • 'events' 배열은 I/O 작업의 완료 상태를 저장한다. 'io_event' 구조체는 각 I/O 작업의 결과를 나타내며, 'MAX_QDEPTH' 만큼의 크기를 가지므로 queue의 깊이와 관련이 있다.
  • 이 배열은 'io_context_t'와 함께 사용되어 asynchronous I/O 작업의 완료를 추적한다.

추가로 Mutex와 Condition Variables는 ('mutex', 'cond_main', 'cond_sub')

  • 'mutex'는 thread 간의 동기화를 위해 사용된다. 여러 thread가 동시에 작업 queue에 접근할 때, 상호 배제를 보장한다.
  • 'cond_main'과 'cond_sub'는 조건 변수로, thread가 특정 조건을 기다리도록 한다. 예를 들면, 작업이 완료되기를 기다리거나 새로운 작업이 추가되기를 기다릴 수 있다.

다시 한번 thread와 queue_depth, jobs의 관련성을 요약하자면,
thread는 각 thread는 독립적으로 작업을 처리한다. 여러 thread가 동시에 실행될 때, system의 전체 throughput이 증가한다.
queue_depth는 각 thread에서 처리할 수 있는 최대 작업 수를 의미한다. thread는 queue_depth 내에서 작업을 관리하고, 이 범위를 넘어서지 않도록 한다.
jobs는 각 thread는 'queue_depth' 범위 내에서 작업을 처리한다. 현재 처리중인 jobs는 'queue_count'로 추적되며, 'queue_depth'와 비교하여 현재 queue가 얼마나 차 있는지를 나타낸다.

따라서 thread_info_t 구조체는 각 thread가 처리하는 작업의 수와 queue 깊이를 효율적으로 관리해서 system의 성능을 최적화하는 데 중요한 역할을 한다. 각 thread는 독립적으로 I/O 작업을 처리하고, queue depth와 jobs를 기반으로 동작을 조정하여 최적의 성능을 달성하는 것을 목표로 한다.

0개의 댓글