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_ONCE
와WRITE_ONCE
는 멀티스레드 환경에서 비원자적(non-atomic) 변수에 대한 읽기와 쓰기 작업을 안전하게 수행하기 위한 함수입니다. 이 함수들은 컴파일러의 최적화와 메모리 접근 방식을 제어하여, 변수가 여러 스레드에서 동시에 읽히거나 쓰일 때 발생할 수 있는 문제를 방지합니다.사용 이유
- 컴파일러 최적화 방지
READ_ONCE
와WRITE_ONCE
는 변수를 읽거나 쓸 때 컴파일러가 캐시된 값이 아니라 실제 메모리에서 값을 읽고 쓰도록 강제합니다. - 비원자적 접근으로 인한 데이터 손상 방지
READ_ONCE
와WRITE_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)
주어진 숫자
x
를y
의 배수로 올림하는 함수입니다. 즉,x
보다 크거나 같은 가장 가까운y
의 배수로 값을 올립니다. 이 함수는 주로 메모리 정렬이나 배치 작업에서 사용됩니다.
1.2 클래스 목록
Gtid
class Gtid
Gtid
는 GTID (ghOSt Thread Identifier)를 캡슐화하여 다루기 위한 클래스입니다. GTID는 ghOSt 스케줄링 시스템에서 스레드 또는 작업을 고유하게 식별하는 64비트 식별자로, 스레드나 프로세스의 TID(Thread ID)와 연관되어 사용됩니다. 이 클래스는 GTID와 관련된 다양한 작업을 수행할 수 있도록 메서드들을 제공합니다.Futex
Notification
ForkedProcess
'Linux > 리눅스 자원관리 개선(사용자 영역)' 카테고리의 다른 글
[RocksDB] 리눅스에 RocksDB 설치하고 성능 테스트하기 (2) | 2024.09.11 |
---|