전체 글 118

Lighting

Lighting - 빛과 Object간의 상호 작용 Direction Light Source - 아주 멀리서 오는 Sun(해)라고 생각하면 됨. - 이제부터 설명하는 모든 Light의 종류는 Direction Light Source라고 가정하고 설명할 것임 - 아주 멀리서 오는 빛이기 때문에 오브젝트의 모든 점에 들어오는 빛은 같은 방향과 입사각으로 들어온다고 가정 Phong Light Model - 대표적 Lighting Model - Phong Model은 4가지 Term으로 이루어짐 1. Diffuse(난반사, = Lambert) - 온갖 방향으로 동일한 양의 빛을 반사. - 온갖 방향으로 동일한 양으로 반사된다는 것은 우리가 카메라를 어디 두던간에 같은 색으로 보인다는 의미. - 우리가 "어떤 물..

객체 지향 프로그래밍(OOP)

객체 지향 프로그래밍이란? 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호 작용을 통해 프로그램을 만드는 것 객체란? 클래스라는 틀(template)에서 생겨난 실체(Instance) 객체 지향 프로그래밍을 사용해야 하는 이유는? 실세계에 대한 쉬운 모델링 응용 소프트웨어를 하나의 절차로 모델링 하기는 어렵다. 대부분의 응용 소프트웨어 특성상 절차보다는 관련된 여려 객체들간의 상호작용으로 모델링하는 것이 더 쉽고 적합하다 생산성 상속과 다형성으로 이미 만들어진 클래스를 기반으로 재정의해서 사용할 수 있고, 캡슐화로 만든 클래스를 실체화 시킨 객체를 계속해서 만들어낼 수 있다 보안성 캡슐화로 구현된 클래스에서 특정 부분을 은닉할 수 있다 SOLID (객체 지향 설계 원칙) 1. 단일 책임 원칙..

공부/그 외 2022.09.11

Instruction Pipeline, Hazard 그리고 Branch Prediction

Instruction Pipeline - 명령어 파이프라인(Instruction Pipeline)은 순차적으로 명령어를 읽어 실행하는 프로세서에 적용되는 기술로, 한번에 하나의 명령어만 실행하는 것이 아닌, 하나의 명령어가 실행되는 도중에 다른 명령어 실행을 시작하는 식으로 동시에 여러개의 명령어를 실행하도록 해서 CPU가 프로그램 처리하는 성능을 높혀줄 수 있도록 하드웨어적으로 구현되어 있는 기능 명령어 처리에는 기본적으로 5단계로 이루어져 있다(단, 모든 명령어들이 위 과정을 모두 거치는 것은 아니다) 1. IF: 메모리로부터 Instruction Fetch (메모리로부터 명령어 불러옴) 2. ID: Instruction Decode & register read (명령어 해석, 레지스터 read) 3..

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