전체 글 125

Call Stack, Callee/Callee-saved register

Call Stack 이란? - 실행중인 함수에 관한 정보를 담아 놓은 스택구조의 데이터 구조이다 예시 예를 들어 call_incr() 함수 내부에서 incr() 함수를 호출하는 상황에 대한 assembly과 call stack을 보자 먼저 용어에 대한 정리가 필요하다. A 함수 내부에서 B 함수를 호출할 때, A 함수를 Caller, B 함수를 Callee라고 부른다. 아래 예시에선 call_incr() 함수가 Caller, incr() 함수가 Callee 이다 그냥 단순한 incr 함수 내부 어셈블리다. 아래에서 call stack을 살펴보자 1. 먼저 call_incr() 함수 내부의 지역변수를 v1을 스택에 저장하는 모습이다 2. incr() 함수 호출에 필요한 인자를 레지스터로 넘겨주고 있다. 사..

시스템 콜(System Call)

시스템 콜(System Call)이란 - 운영 체제의 커널이 제공하는 서비스. 응용 프로그램의 요청에 따라 커널에 접근하는 인터페이스이다. 시스템 콜이 필요한 이유 - 우리가 사용하는 응용 프로그램은 보통 유저 모드(User Mode)에서 실행되므로 유저 프로세스인데, 이 유저 모드에서 가능한 기능만으로는 많은 기능들을 구현하기 힘들다. 따라서 시스템 콜을 이용해서 유저 모드에서 커널 모드로 전환한 후에 커널이 제공하는 기능들을 사용해야 한다. 시스템 콜 유형 1. 프로세스 제어(Process Control) - fork(), exit(), kill(), malloc(), free() 등 2. 파일 조작(File Manipulation) - open(), close(), read() 등 3. 장치 관리(..

공부/운영체제 2022.09.06

C++ std::move

C++ 11에서 Rvalue reference를 공부하다보니 처음보는 개념들이 너무 많이 쏟아져 나온다. 그중 하나가 std::move이다. 기능은 쉽게 이야기해서 lvalue를 rvalue로 전환해주는 것이 전부이다. 다만 B = std::move(A)를 한다면, A는 아무런 값도 갖지 않은 객체가 된다는 것을 인지해야한다. 이름이 move라고 해서 값을 옮겨준다거나 그렇게 하진 않는다. std::move는 주로 move 생성자에 많이 쓰인다. 아래 코드를 보면 왜 move 생성자에서 자주 쓰이는지 알 수 있다. (코드 출처 : https://openmynotepad.tistory.com/10) class Item { public: Item(const int _n) : m_nx(_n) { cout

공부/C || C++ 2022.09.05

데드락(Deadlock)

데드락(Deadlock)이란? - 프로세스나 쓰레드가 얻고자 하는 자원을 얻지 못해, 교착 상태에 빠진 것 데드락 발생 조건 아래 4개의 조건 모두를 만족한다면 잠재적으로 데드락이 발생할 가능성이 있다. 1. 상호 배제(Mutual Exclusion) - 자원은 한번에 하나의 프로세스나 쓰레드만 사용할 수 있다 2. 점유 대기 - 프로세스가 최소 하나의 할당된 자원을 갖고 있으면서 다른 자원을 기다린다 3. 비선점 - 다른 프로세스가 갖고 있는 자원을 강제로 빼앗을 수 없다 4. 순환 대기 - 각 프로세스는 다음 프로세스가 점유중인 자원을 순환적으로 대기중이다. 예를 들어서 P1, P2, P3 프로세스가 있고, P1은 R1, P2은 R2, P3는 R3 이렇게 각각 리소스를 점유중일 때, P1는 R2을 기..

공부/운영체제 2022.09.02

Spin Lock, Semaphore, Mutex

상호 배제(Mutual Exclusion)를 위한 OS에서 제공하는 동기화 기법으로는 Spin Lock, Mutex, Semaphore가 있다 단순히 Race Condition을 피하기 위한 상호 배제만 달성할 뿐이지, 데드락(Deadlock)이나 기아(Starvation)을 발생시킬 수도 있다 Spin Lock - lock을 얻고자 하는 쓰레드가 CPU점유를 다른 쓰레드에 내주지 않고, 계속해서 lock을 얻을 수 있는지 무의미한 루프를 돌면서(busy wait) 체크하는 방법이다. 다른 쓰레드에게 CPU점유를 내주지 않으니 Context Switching을 함으로써 생기는 오버헤드가 없다는 장점이 있지만, lock을 얻기전까지 쓸데 없는 루프를 돌면서 CPU를 점유하는데, 그 점유를 다른 쓰레드에게 ..

공부/운영체제 2022.09.02

쓰레드(Thread), 프로세스(Process)란?

쓰레드(Thread) - 프로세스 내에서 실제로 실행중인 주체. 프로세스 내에 여러개가 있을 수 있다. 쓰레드는 프로세스로부터 독립적인 스택 공간과 레지스터(ex. Stack Point Register, Program Counter Register, Frame Pointer Register)를 갖고 있으면서, 동시에 Code, Heap, Data 영역은 쓰레드끼리 공유한다. -> 왜 쓰레드는 스택과 PC, SP, FP Register를 공유하지 않는지 생각해보면 당연하다. 쓰레드는 독립적인 실행 흐름을 갖고 있다고 했다. 독립적인 실행 흐름을 갖는다는 말은 쓰레드마다 실행중인 라인이 다를 수 있다는 것이고, 독립적으로 함수 호출이 가능하다는 것이므로 호출 스택과 관련된 SP, FP를 따로 갖는게 당연하다..

공부/운영체제 2022.09.01

ID3D11DeviceContext::Map 상황별 사용

GPU에서 쓴 정보를 CPU로 가져와서 읽을 때 Map // (GPU에서 써준)구조화 버퍼에 있는 본 정보 m_BoneBuffer를 m_BoneDataBuffer로 복사한다. CDevice::GetInst()->GetContext()->CopyResource(m_BoneDataBuffer, m_BoneBuffer->GetBuffer()); D3D11_MAPPED_SUBRESOURCEMap = {}; // D3D11_MAP타입의 3번째 인자는 D3D11_MAP_READ로 CDevice::GetInst()->GetContext()->Map(m_BoneDataBuffer->GetBuffer(), 0, D3D11_MAP_READ, 0, &Map); // m_vecBoneMatrix로 복사 memcpy(&m_ve..

디퍼드 렌더링(Deferred Rendering)에서 반투명한 물체를 위한 블렌딩처리가 안되는 이유

디퍼드 렌더링은 각 물체별로의 최종 색상(= 고유의 Diffuse Color에 Light를 적용한 색상)을 구하지 않고, 화면에 그려질 픽셀에 대해서만 최종 색상을 구한다. 블렌드는 결국 최종 색상끼리 블렌딩처리를 해야 하는데, 디퍼드 렌더링은 겹쳐지는 물체들의 픽셀에 그려지는 모든 최종 색상을 알 수 있는게 아니라 렌더 타겟에 존재하는 픽셀들의 최종 색상만 아는 것이다(디퍼드 렌더링은 화면 해상도 크기의 버퍼에 픽셀 별 최종 깊이 판정을 모두 거친, 빛을 받기 전 물체 고유한 색깔(=Diffuse Color)을 GBuffer에, Light들을 LightDiffuse, Light 모아둔다. 반투명 A 물체와 불투명 B 물체가 겹쳐지는 픽셀이 있는데 블렌딩 처리가 되려면 당연히 A물체의 최종 색상과 B물체..