TLB-Hit Model
·
DevSec
TLB-Hit ModelTLB-Hit Model: 자주 사용되는 변환 결과나 정책 판단 결과를 빠른 경로에 저장해두고, 같은 요청이 다시 들어왔을 때 복잡한 판단 과정을 생략하는 성능 모델TLB 는 Translation Lookaside Buffer 의 약자로, CPU 가 가상 주소를 물리 주소로 변환할 때 최근에 사용한 주소 변환 결과를 캐싱하는 구조이다.CPU 가 메모리에 접근할 때 매번 Page Table 을 순차적으로 탐색하면 비용이 크다. 그래서 최근에 사용한 주소 변환 결과를 TLB 에 저장해두고, 같은 주소 영역에 다시 접근하면 TLB 에서 바로 변환 결과를 가져온다.TLB-Hit Model 은 이러한 TLB 의 동작 방식을 일반적인 시스템 성능 최적화 모델로 확장한 것이다.즉, 반복적으로 ..
eBPF for Windows
·
DevSec
eBPF for WindowseBPF for Windows: Linux 환경에서 사용되던 eBPF 생태계의 Toolchain 과 API 를 Windows 위에서 사용할 수 있도록 만든 프로젝트기존 eBPF 는 주로 Linux Kernel 에서 사용되었지만, eBPF for Windows 는 Windows Kernel 에서도 eBPF Program 을 로드하고 실행할 수 있도록 중간 계층을 제공한다.즉, 개발자는 기존처럼 C 로 eBPF Program 을 작성하고 Clang 으로 eBPF Bytecode 를 생성할 수 있다.그 후 Windows 환경에서는 해당 Bytecode 를 검증하고, Windows Kernel 에서 실행 가능한 형태로 변환하거나 로드해서 사용한다.eBPF for Windows 는 W..
eBPF
·
DevSec
eBPFeBPF(extended Berkeley Packet Filter): Linux Kernel 내부에서 안전하게 실행되는 작은 프로그램을 이용해서 커널의 동작을 확장하는 기술eBPF 는 커널 소스코드를 직접 수정하거나 Kernel Module 을 새로 로드하지 않고도 Kernel 내부의 특정 지점에 프로그램을 붙여서 실행할 수 있게 해준다.예를 들어 시스템 콜, 네트워크 패킷 처리 지점, 파일 접근 지점, 프로세스 실행 지점, 커널 함수 호출 지점 등에 eBPF Program 을 연결하면 해당 이벤트가 발생했을 때 eBPF Program 이 실행된다.eBPF 는 단순히 패킷 필터링만을 위한 기술이 아니라, 현대 Linux 환경에서 Observability, Networking, Security, T..
BPF
·
DevSec
BPFBPF(Berkeley Packet Filter): Kernel space 에서 packet 을 효율적으로 필터링하기 위한사한 뒤 필터링하면 성능적으로 비효율적이다.패킷은 매우 빠른 속도로 들어오고, 대부분의 경우 사용자가 보고 싶은 패킷은 전체 패킷 중 일부이다.그래서 BPF 는 User space 로 패킷을 넘기기 전에 Kernel space 에서 먼저 필터링을 수행한다.BPF 는 작은 필터 프로그램을 커널 안에서 실행하고, 그 결과에 따라 해당 패킷을 User space 로 전달할지 결정한다.현재는 기존 BPF 를 eBPF 와 구분하기 위해 Classic BPF 또는 cBPF 라고 부르기도 한다.BPF 가 필요한 이유패킷 캡쳐 도구는 네트워크 인터페이스로 들어오는 패킷을 확인해야 한다.예를 들..
Mutual Exclusion
·
DevSec
Mutual Exclusion상호 배제(Mutual Exclusion): 여러 프로세스나 스레드가 공유 자원에 동시에 접근하지 못하도록 제한하는 동기화 기법.Mutual Exclusion 기법Mutual Exclusion은 여러 실행 흐름이 같은 공유 자원에 접근할 때 한번에 하나의 실행 흐름만 해당 자원을 사용할 수 있도록 보장해주는 기법이다.여러 스레드가 동시에 같은 변수, 파일, 메모리 영역, 커널 객체 등에 접근하면 실행 순서에 따라 결과가 달라질 수 있다.이러한 문제를 Race Condition이라고 한다.Mutual Exclusion은 Race Condition을 막기 위해 공유 자원에 접근하는 코드 영역을 보호한다.이때 공유 자원에 접근하는 코드 영역을 Critical Section이라고 한..
Critical Section
·
DevSec
Critical Section임계 구역(Critical Section): 여러 프로세스 또는 스레드가 공유 자원에 접근하는 코드 구간 중에 동시에 실행되면 데이터 불일치가 발생할 수 있는 영역.Critical Section 보호여러 실행 흐름이 같은 변수, 파일, 자료구조, 장치 상태 등에 동시에 접근하면 Race Condition이 발생할 수 있다.이때 Critical Section 앞뒤에 Lock, Mutex, Semaphore, Spinlock 같은 동기화 기법을 배치해서 한 번에 하나의 실행 흐름만 공유 자원에 접근하도록 만들어야한다.int counter = 0;counter++;위의 C언어 코드는 단순히 counter 값을 1 증가시키는 코드처럼 보이는데 실제로는 메모리에서 값을 읽고, 레지스터..
Busy Waiting
·
DevSec
Busy Waiting?바쁜 대기(Busy Waiting)는 말그대로 CPU를 바쁘게 쓰면서 기다린다는 뜻이다.어떤 스레드에서 공유 자원을 쓰려할때 다른 스레드가 이미 락(Lock)을 쥐고 있을 때 Sleep 하는 대신 무한 루프를 돌면서 락이 풀렸는지 계속 확인하는 방식이다.예시 코드volatile int lock = 0;void critical_section(){ while (lock == 1) { } lock = 1; lock = 0;}이런식으로 구현된다.왜 씀?굳이 Sleep 시키지 않고 무한 루프를 돌면서 CPU를 낭비해가면서 이걸 쓰는 이유가 있다.속도가 빠르다: 조건이 만족되었을 때는 속도가 빠르다. 뮤텍스(Mutex)같은 방식은 락을 못 얻으면 Sleep시키고 락이 풀..
Context Switching
·
DevSec
Context Switching?CPU는 한번에 하나의 작업만 처리할 수 있다. 근데 난 노래를 들으면서 게임을 하면서 강의를 들으면서 친구와 디스코드로 대화를 한다.이게 어떻게 가능할까?이게 가능한 이유는 컴퓨터가 여러 프로세스나 스레드를 아주 매우 많이 빠르게 전환해 번갈아가면서 실행하기 때문이다.이때 작업중이던 작업에서 다른 작업으로 넘어가는 것을 Context Switching이라고 한다.저장과 복원현재 하던 작업 A의 상태, 예를 들어서 어디까지 계산했는지나, 레지스터 값 등을 프로세스 제어 블록(PCB)등에 저장하고 넘어갈 작업 B의 이전 상태를 복원해서 이어서 할 수 있다.오버헤드(Overhead)이 전환 과정은 CPU가 실제로 무슨 유용한 프로그램을 실행하는게 아니라 운영체제가 내부 시스템..
Spinlock and Mutex
·
DevSec
스핀락과 뮤텍스 (Spinlock & Mutex)동기화(Synchronization)의 필요성멀티프로세스 및 멀티스레드 환경에서는 여러 작업이 동시에 실행되면서 공유 데이터를 다루게 된다. 이 과정에서 동기화 기법이 필요한 이유는 다음 현상들을 방지하기 위해서다.경쟁 상태 (Race Condition): 두 개 이상의 프로세스나 스레드가 공유 자원에 동시에 접근해서 실행 순서에 따라 결과값이 의도치 않게 달라질 수 있는 것.임계 구역 (Critical Section): 여러 프로세스 혹은 스레드가 공유 자원에 접근하는 코드 영역, 레이스 컨디션이 발생할 수 있는 구역이다.이러한 Critical Section 문제를 해결하고 데이터의 일관성을 보장하기 위해서는 한 프로세스가 임계 구역에 들어가 있을 때 다..
Calling Convention
·
DevSec
함수 호출 규약함수 호출 규약(Calling Convention): 함수의 호출 및 반환에 대한 약속어느 함수에서 다른 함수를 호출(Calling)할 때 프로그램의 실행 흐름이 다른 함수로 이동한다. 그 후 호출한 함수가 반환되면 다시 원래 함수로 돌아와서 기존 실행 흐름을 이어간다.그렇기 때문에 함수를 호출할 때는 반환된 이후의 실행 흐름을 이어나가기 위해 Caller 의 Stack frame 와 Return Address 를 저장해야한다. 그리고 Caller 는 Callee 가 요구하는 인자는 전달해줘야 하고 Callee 의 실행이 종료될 때는 반환값을 전달받아야 한다.함수 호출 규약이 적용되는 것은 보통 개발자가 고수준 언어로 코드를 짜면 컴파일러에 의해서 함수들이 Calling Convention..