MessageQueue를 써야하는 이유 (+카프카 사용후기)
·
Develop
데이터 통신은 왜 안전하지 않을 수 있는가?전통적인 데이터 통신방식은 동기적이다. 요청 - 응답 프로세스만 봐도 동기적인 것을 알 수 있다.다만 이 방식에는 위험이 따른다.왜? 수신부에서 서버가 트래픽을 대응하지 못하면 송신중이던 송신을 마저하는 데이터들은 유실될 수밖에 없다.그럼 이것을 어떻게 해결할 수 있지?Message Queue (MQ) 시스템을 이용하는 것이다.MQ 시스템은 이러한 문제를 중간완충지대 개념으로 해결한다.메시지를 서버간 바로 하지않고 중간지대를 통해 주고받는다.이는 시스템의 결합성을 낮추고 통신을 비동기적으로 할 수 있게 한다.동작원리대표적으로"생산자" -> "큐시스템" -> "소비자" 방식으로 동작한다.이때 큐시스템이 위에 설명한 중간완충지대 라고 생각하면 된다.핵심메커니즘Que..
node.js는 어떤식으로 동작할까?
·
Develop
Node.js 란??V8 javascript엔진 위에서 동작하는 서버 사이드 런타임 환경.1.1 V8 자바스크립트 엔진이 뭔데??google이 개발한 Javascript 엔진Javascript 코드를 -> 기계어로 직접 컴파일하여 실행하는 고성능 엔진c++로 작성됨Node.js에서는 런타임의 핵심 모듈로 포함됨.1.1.1 V8 엔진의 동작 구조JavaScript 코드 ↓[ Parser ] → AST(Abstract Syntax Tree) 생성 ↓[ Ignition (Interpreter) ] → 바이트코드(Bytecode)로 변환 ↓[ TurboFan (JIT Compiler) ] → 자주 실행되는 코드 → 최적화된 기계어로 컴파일 ↓CPU에서 직접 실행1.1.2 예..
Pintos_project2 - argument passing
·
Develop
Userprogram사용자메모리접근커널은 사용자가 제공한 포인터로 메모리 접근할 필요가 있다.사용자가 NULL포인터, 매핑되지 않은 가상메모리, 커널영역메모리에 대한 포인터를 제공하면 이를 오류로 판단하고자원을 해제한다음프로세스를 종료 해야한다.유저프로그램의 모든영역에 해당하므로 포인터를 넘기는시스템콜에는 적용해주도록 하자코드간단한 버전(통과는 함)// pintos/userprogram/systemcall.cstatic void check_address(const void *addr){ if (addr == NULL || !is_user_vaddr(addr) || pml4_get_page(thread_current()->pml4, addr) == NULL) { exi..
Pintos_project1 - Priority
·
Develop
핀토스 프로젝트1 - 우선순위 구현1. Priority 구현가이드라인struct thread에 우선순위 관련 멤버 추가thread_create() - 새 스레드가 현재 스레드보다 높은 우선순위면 즉시 양보thread_unblock() - unblock된 스레드가 현재 스레드보다 높은 우선순위면 즉시 양보thread_set_priority() - 우선순위 변경 시 필요하면 양보thread_get_priority() - 현재 우선순위 반환Priority의 의미[!NOTE] 우선순위로직ready_list를 우선순위순으로 정렬현재스레드보다 높은 스레드에게 cpu양보위 가이드라인에서 보면 thread 구조체에는 priority 멤버만 추가해주면 된다.그리고 create, unblock 에서 우선순위 처리를 해주면..
Pintos_project1 - Alarm Clock
·
Develop
핀토스프로젝트1 - Alarm Clock 구현Alarm clock이 뭐지?호출한 스레드를 잠시 정지(block) 시키고 일정시간(ticks) 후에다시 스레드를 준비상태로 만드는 과정을 이야기한다.현재 문제점스레드는 sleep 상태에 들어가면 바쁜대기 상태가 된다.void timer_sleep (int64_t ticks) { int64_t start = timer_ticks (); ASSERT (intr_get_level () == INTR_ON); while (timer_elapsed (start) 코드를 보면 현재시간을 이용하여 ticks랑 비교후 양보를 한다.이 때너무 자주 시간을 확인하고,컨텍스트 스위칭이 너무 빈번해지는 문제가 생긴다. 즉 CPU낭비 이므로이 코드를 tick 마다 ..
malloc lab-implicit list에 관하여 + 구현
·
Develop
묵시적 할당리스트malloc을 구현함에 있어가장 중요한 부분은 할당가능부분 을 찾는 것이다.해서 효율적인 할당리스트들은 자유블록안에 포인터가 구성되어있고, 이를 위한 자료구조가 필요하다고 한다.그럼 묵시적 할당리스트는 무엇이냐 하면 블록내의 포인터는 존재하지 않고헤더로만 할당할수 있는 블록인지 아닌지를 판별하는 할당리스트이다.(이름 이해하기가 까다로웠다..)그 원리가 무엇이냐면블록크기는 워드크기(32비트의 경우 4바이트, 64비트면 8바이트)의 두배로 잡았다고 가정하면, 항상 8의 배수의 블록크기만 갖는다고 할 수 있다.이 점에서 8의 배수라면 마지막 3비트는 사용하지않는다. 이점을 활용하여가장 끝 3비트를 활용할 기회가 생기고 자유영역을 확인하는 비트로 사용한다.그래서 처음 4바이트, 끝 4바이트는 항..
Red-Black Tree 개념
·
Develop
RB-Tree 조건모든 노드는 red/black루트노드는 black모든 NIL 노드는 black노드가 RED면 자식은 BLACK (연속 red x)임의의 노드에서 경로 NIL까지 BLACK 개수 동일삽입규칙기본규칙자식 노드의 색이 같을 경우, 부모와 색을 교환할 수 있다.루트노드가 레드라면 블랙으로 바꿀 수 있다.Case3. RED가 연속되었고, 한쪽으로 몰려있을때가정.삽입된 노드의 부모가 RED부모의 형제는 BLACK조부모 -> 부모 -> 삽입노드가 같은 방향반례.이 경우 조부모는 레드일 수 없다.해결.조부모와 부모의 색을 바꿈반대방향으로 회전Case2. RED가 연속되었고, 꺾인 방향일 때가정.삽입된 노드의 부모가 RED부모의 형제는 BLACK조부모 -> 부모, 부모 -> 삽입노드가 다른 방향..
[C언어] 포인터, 주소, malloc.. 등등
·
Develop
크래프톤 정글 5~8주차 탐험준비c는 참 멋있는 언어다. 정글에선 c언어를 f1 레이싱카로 비유한다."C언어는 F1 레이스 카와 비슷하다. 그 무엇보다도 빠르고 성능 좋지만, 아무나 운전할 수 없고, 아무나 운전하도록 두어서도 안된다."지금까지 배워왔던 알고리즘을 C로 구현하는 한주가 되고, malloc, RB-tree, 웹서버 구현등을 해야한다불편하고 빠르게 달려보자1. 포인터란?*를 사용해 해당 주소의 값을 읽는 c언어의 연산자이다.포인터를 왜 사용하는가에 대해서는여러가지가 존재하지만 이해하기 쉬운 예를 하나 들자면c언어에서는 값에 의한 참조와 주소에 의한 참조가 존재한다.#include void increment(int num) { num++; printf("함수 내 num: %d\n",..