본문 바로가기
Linux/리눅스 자원관리 개선(사용자 영역)

[ghOSt-userspace] ghost namespace 분석 - lib/bash.h

by dingwoon 2024. 9. 12.

ghost userspace의 include 구조

graph TD;
    lib/base.h --> lib/topology.h;
    lib/base.h --> lib/ghost.h;
    lib/base.h --> lib/agent.h;


    lib/trivial_status.h --> lib/agent.h;

    lib/agent.h --> lib/channel.h;
    lib/agent.h --> lib/enclave.h;
    lib/agent.h --> lib/scheduler.h;

    lib/topology.h --> lib/agent.h;
    lib/topology.h --> lib/ghost.h;

    lib/channel.h --> lib/scheduler.h;
    lib/channel.h --> lib/enclave.h;

    lib/ghost.h --> lib/agent.h;
    lib/ghost.h --> lib/channel.h;
    lib/ghost.h --> lib/enclave.h;

    lib/enclave.h --> lib/scheduler.h;

1 lib/base.h

1.1 메서드 목록

  • GetProc

    std::string GetProc(const std::string& procfs_path)

    매개변수로 들어온 procfs_path을 사용해 proc 파일 시스템에 있는 파일에 접근할 수 있는 전체 경로를 생성하는 함수입니다.

  • GetTID

    inline pid_t GetTID()

    이 함수를 호출한 쓰레드의 TID를 반환합니다.

  • Exit

    void Exit(int code)

    매개변수 code가 0인 경우 프로세스를 종료합니다.

  • GetFileSize

    size_t GetFileSize(int fd)

    fd(파일 디스크립터)를 사용해 해당 파일의 크기(바이트 단위)를 반환합니다.

  • SpinFor

    void SpinFor(absl::Duration remaining)

    이 함수는 주어진 remaining 시간 동안 바쁜 대기를 수행하는데, CPU가 선점된 시간을 남은 시간에서 제외하고 실제로 CPU가 사용된 시간만큼만 남은 시간을 줄이는 방식입니다.

  • PrintBacktrace

    void PrintBacktrace(FILE* f, void* uctx)

    이 함수는 백트레이스(backtrace)를 출력하는 함수입니다. 백트레이스는 프로그램이 실행되는 동안 호출된 함수들의 호출 스택을 추적하는 방법으로, 주로 디버깅이나 오류 분석에 사용됩니다. (사용 예시: Exit 함수에서 code가 0이 아닌경우 사용됩니다.)

  • CapHas

    bool CapHas(cap_value_t cap)

    이 함수는 리눅스 시스템의 프로세스에 특정 권한(capability)이 있는지를 확인하는 함수입니다.

  • READ_ONCE와 WRITE_ONCE
    READ_ONCEWRITE_ONCE멀티스레드 환경에서 비원자적(non-atomic) 변수에 대한 읽기와 쓰기 작업을 안전하게 수행하기 위한 함수입니다. 이 함수들은 컴파일러의 최적화와 메모리 접근 방식을 제어하여, 변수가 여러 스레드에서 동시에 읽히거나 쓰일 때 발생할 수 있는 문제를 방지합니다.

    • 사용 이유

      1. 컴파일러 최적화 방지
        READ_ONCEWRITE_ONCE는 변수를 읽거나 쓸 때 컴파일러가 캐시된 값이 아니라 실제 메모리에서 값을 읽고 쓰도록 강제합니다.
      2. 비원자적 접근으로 인한 데이터 손상 방지
        READ_ONCEWRITE_ONCE를 사용하면 원자적 읽기와 쓰기를 보장하여 이러한 문제를 방지합니다.
    • READ_ONCE

      template <typename T>
      inline T READ_ONCE(const T& x,
                       std::memory_order order = std::memory_order_relaxed)

      비원자적(non-atomic) 변수를 원자적으로 읽습니다.READ_ONCE를 사용하면 변수를 안전하게 한 번만 읽도록 보장하며, 여러 스레드에서 공유된 변수를 읽을 때 올바른 값을 읽도록 합니다.

    • WRITE_ONCE

      template <typename T>
      inline void WRITE_ONCE(T& x, T val,
                           std::memory_order order = std::memory_order_relaxed)

      주어진 변수를 원자적으로 쓰는 역할을 합니다. 즉, 변수를 여러 스레드에서 쓰는 경우, 한 번에 한 스레드만 변수를 안전하게 업데이트할 수 있도록 보장합니다.

  • IGNORE_RETURN_VALUE

    template <typename T>
    inline void IGNORE_RETURN_VALUE(const T& x)

    이 함수 템플릿은 함수의 반환값을 명시적으로 무시하기 위해 사용됩니다. 반환값을 무시해도 경고가 발생하지 않도록 도와줍니다.

  • MonotonicNow

    inline absl::Time MonotonicNow()

    현재 시각을 단조 시계(monotonic clock) 기준으로 반환하는 함수입니다.

  • ghost_tid_seqnum_bits

    int ghost_tid_seqnum_bits(void)

    64비트의 GTID(Global Thread ID) 값에서 시퀀스 넘버(Sequence Number)를 표현하는 데 필요한 비트 수를 계산하는 함수입니다.

  • GetGtid

    absl::StatusOr<int64_t> GetGtid()

    현재 스레드의 GTID(ghOSt Thread Identifier)를 반환하는 함수입니다. GTID는 64비트 식별자로, 일반적인 리눅스 TID(Thread ID)보다 더 많은 정보를 담고 있으며, 스레드 재사용에 대한 식별을 가능하게 합니다.

  • Pause

    inline void Pause()

    스핀락(spinlock) 루프 내에서 사용하는 함수로, CPU의 특정 명령어를 호출하여 전력 소비와 캐시 경쟁(cache contention)을 줄이기 위해 사용됩니다. 이 함수는 타겟 아키텍처에 따라 적절한 어셈블리 명령어를 실행합니다.
    즉, 최적화를 위해 각 아키텍처에 따라 CPU가 대기 중일 때 자원을 효율적으로 사용하도록 돕는 어셈블리 명령어를 실행합니다.

  • roundup2

    template <typename T1, typename T2>
    static inline T1 roundup2(T1 x, T2 y)

    주어진 숫자 xy의 배수로 올림하는 함수입니다. 즉, x보다 크거나 같은 가장 가까운 y의 배수로 값을 올립니다. 이 함수는 주로 메모리 정렬이나 배치 작업에서 사용됩니다.

1.2 클래스 목록

  • Gtid

    class Gtid

    GtidGTID (ghOSt Thread Identifier)를 캡슐화하여 다루기 위한 클래스입니다. GTID는 ghOSt 스케줄링 시스템에서 스레드 또는 작업을 고유하게 식별하는 64비트 식별자로, 스레드나 프로세스의 TID(Thread ID)와 연관되어 사용됩니다. 이 클래스는 GTID와 관련된 다양한 작업을 수행할 수 있도록 메서드들을 제공합니다.

  • Futex

  • Notification

  • ForkedProcess