💜 process in memory ( 해당 메모리 address에 접근할 수 있는 핸들 같은 것을 포인터로 표현하자면 ) code에 대한 포인터 => PC (프로그램 카운터) stack에 대한 포인터 => SP (스택 포인터 = 현재 콜스택(실행 컨텍스트) 어디인지 가리킴) data에 대한 포인터 => 변수명 heap에 대한 포인터 => C의 '포인터' (malloc, linked list) , Java에서 인스턴스 이름 같은 것 (=> 이 heap에 대한 포인터는 stack 영역에 저장됨) *참고로 c의 static 키워드 붙은 것 => data 영역에 저장됨 (전역 변수 효과) java의 static 키워드 붙은 것 => heap 영역에 저장됨 (클래스 멤버 효과) From the memory pe..
쓰레드랑 다르게 서로 다른 프로세스는 기본적으로는 겹치는 address space도 없고 완전히 독자적이다. 서로 다른 프로세스의 함수를 호출할 수 없고, 메모리에 접근할 수 없다. 메모장 프로세스와 크롬 브라우저가 서로 완전 노터치 하듯이 심지어 fork로 생성한 부모-자식 프로세스 사이도 그러하다. 따라서 다른 프로세스가 협업을 하기 위해서는 IPC 구현체를 이용해야 한다. (프로세스들 간에 데이터 및 정보를 주고받기 위한 메커니즘. 커널에서 시스템 콜의 형태로 프로세스에게 제공된다.) * IPC 부분 참고한 강의 IPC 두가지 모델 (1) 메모리 공유 (shared memory) 서로 다른 프로세스가 함께 접근할 수 있는 메모리 영역을 설정해 줌. 공유 메모리 설정 이후에는 커널이 관여하지 않음. ..
일반적으로 웹 애플리케이션의 쓰레드 1개가 요청을 받았을 때 동작 방식은 위와 같다. 요청이 들어온 때부터 응답을 리턴해줄 때까지 하나의 스레드는 해당 요청의 작업만을 전담하여 수행한다. (blocking) 처리 중간에 데이터베이스 응답을 기다리거나, 다른 서버에서 api 응답을 기다리느라 cpu가 idle 한 상태이더라도 그 사이 다른 request를 처리하지 못한다. 1. multi-thread approach ( rails puma 서버 외 다수 ) 대부분의 서버 어플리케이션은 멀티스레드로 동작하기 때문에, 스레드 1개만 놓고 봤을때는 하나의 요청을 blocking 방식으로 처리함에도 불구하고 전체 서버 app(프로세스) 단위에서는 서로 다른 코드 부분 ( 예를 들어 session_controlle..
참고한 글 보니까 저자가 rabbitmq 코어팀에서 일하는 사람인 것 같다. 그래서 카프카보다 rabbitmq 장점을 강조해서 말하는 것 같긴 한데, 글 퀄리티가 좋았다. Event-Driven Architectures - The Queue vs The Log Event-Driven Architectures - Queue vs Log - A case study 다른 읽어보면 좋은 글 RabbitMQ vs Kafka Part1 - Two Different Takes on Messaging rabbitmq vs kafka 😎 Queue based => RabbitMQ, ActiveMQ, MSMQ, AWS SQS, JMQ and many more. Log based => Apache Kakfa, Apache ..
큐와 consumer는 1 대 1! => 그래서 한 consumer가 받아보는 이벤트들은 큐에 시간순으로 정렬되어 있음이 보장된다. mac에 설치해서 실행해보기 # 설치 brew install rabbitmq # 포그라운드 실행 /usr/local/opt/rabbitmq/sbin/rabbitmq-server # 백그라운드 실행 brew services start rabbitmq localhost:15672 접속하고 초기 id/pw인 guest/guest 로 로그인하기. 라우팅 참고하기 : Part 4: RabbitMQ Exchanges, routing keys and bindings (예시 언어는 python!) queue - exchange 바인딩 한개의 큐는 여러개의 exchange에 바인딩 할 수 ..
parrallelism vs concurrency parrallelism => 여러 태스크가 진짜로 동시에 진행됨. concurrency => 시분할로 여러개의 태스크가 동시에 진행되는 것 처럼 보이는 것. 일꾼 parallelism을 가능하게 하는 컴퓨터의 일꾼 늘이기 기법에 대해 알아보자. 일단 가장 간단하게는 cpu에 코어가 여러개 장착되어 있는 것을 생각할 수 있지만 이외에도 다양한 방법으로 parallelism을 지원하는데, 우선 파이프라이닝을 통한 명령어 수준의 병렬성이 있다. - 하이퍼스레딩 (SMT) cpu 사려고 찾아보면 이렇게 4코어 8쓰레드 이런식으로 적혀있는데 이게 뭔지 아시는가? 옛날에는 인텔이 하이퍼스레딩이라는 기법을 통해서 코어가 1개이지만 마치 2개인 것 같은 성능을 낸다라는..
javascript에서 반복문 종류에 따라 비동기 처리의 실행 순서가 달라질 수 있다는 얘기를 듣고 구글링 하는데 아주 친절히 잘 정리 된 이 글을 발견했다. 😗👍 javascript의 비동기 처리는 Event Loop 이라는 것과 연관지어 이해하면 조금 더 처리 결과가 예측가능해 지는 것 같다. 그래서 조금 더 살을 붙여서 내방식 대로 답변을 작성해 보고자 한다. Q. 1초 후 한번에 10개의 "result"가 출력되는 다음의 코드를 1초 마다 10번 출력되도록 바꾸기 function test() { const promiseFunction = () => new Promise((resolve) => setTimeout(() => resolve("result"), 1000)); Array(10) .fill..