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 GtidGtid는 GTID (ghOSt Thread Identifier)를 캡슐화하여 다루기 위한 클래스입니다. GTID는 ghOSt 스케줄링 시스템에서 스레드 또는 작업을 고유하게 식별하는 64비트 식별자로, 스레드나 프로세스의 TID(Thread ID)와 연관되어 사용됩니다. 이 클래스는 GTID와 관련된 다양한 작업을 수행할 수 있도록 메서드들을 제공합니다.Futex
Notification
ForkedProcess
'Linux > 리눅스 자원관리 개선(사용자 영역)' 카테고리의 다른 글
| [RocksDB] 리눅스에 RocksDB 설치하고 성능 테스트하기 (2) | 2024.09.11 |
|---|