먼저 시작하기 전에 다음의 글(Implementing threads)을 배경 지식으로 같이 깔고 가면 좋겠다. yield하면 생산이라는 뜻이 먼저 떠올라서 의미가 잘 안 와닿았는데, 멀티스레딩 관점에서는 양보라는 다른 뜻으로 해석하는게 더 잘 맞는 것 같다. running 스레드가 다른 스레드로 실행을 양보하는 것! In computer science, yield is an action that occurs during multithreading, of forcing a processor to relinquish control of the current running thread, and sending it to the end of the running queue, of the same schedulin..
block 객체가 아니다. 그냥 코드 블럭, 그런데 이제 argument를 넘겨 받고 결과를 리턴할 수 있는 익명 함수 역할 하는. def f result = yield 3 p result end f { |x| x * 7 } #=> 21 syntax do / end 혹은 { } curly bracket yield 메소드 안에서 block을 호출하는데 쓰인다. 한 메소드 안에서 yield를 여러번 호출 할 수도 있고, yield와 함께 block에 n개의 인자를 넘겨줄 수도 있다. 그리고 block의 리턴값이 yield 문 evaluated value가 된다. def one_two_three yield 1 yield 2 yield 3 end one_two_three { |number| puts number..
👾 아래 문서 정리 ⬇️ http://www.it.uu.se/education/course/homepage/os/vt18/module-4/implementing-threads/ 스레드 라이브러리는 개발자가 스레드를 생성하고 관리할 수 있도록 하는 API를 제공한다. 커널 레벨 스레드 os에서 직접 제공하고 관리하는 스레드. 1 PCB/ 1 process 그리고 1 TCB/ 1 thread. 유저 레벨에서 스레드를 생성하고 관리할 수 있도록 시스템 콜을 제공한다. 🧸 장점 => 커널이 모든 스레드에 대한 정보를 알고 있다. 따라서 스케줄러가 더 많은 수의 스레드를 가지고 있는 프로세스에게 더 많은 cpu 타임을 할당하도록 할 수 있다. 자주 block 되는 어플리케이션의 경우에는 이 방식이 더 좋다. ( ..
💜 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..
디자인 패턴 관련한 엄청 좋은 사이트를 발견했다. 이제 여기 게시글을 한개씩 정리하면서 미뤄왔던 디자인 패턴 공부를 해봐야겠다. 💪🤔 👾singleton Singleton Real-World Analogy The government is an excellent example of the Singleton pattern. A country can have only one official government. Regardless of the personal identities of the individuals who form governments, the title, “The Government of X”, is a g refactoring.guru 📝한 줄 정리 어느 코드 영역에서든지 이 클래스에 대해 유..
쓰레드랑 다르게 서로 다른 프로세스는 기본적으로는 겹치는 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..
참고하기 : sidekiq wiki Sidekiq runs on 3 components The Rails Application Sidekiq worker process(es) => sidekiq 프로세스가 멀티쓰레드으로 돌면서 background에서 큐에 들은 worker/job 수행 Redis => 큐 Sidekiq handles concurrency by using multiple threads in its process. This way, it can process multiple jobs at once, each thread processing one job at a time. By default, Sidekiq uses 10 threads per process. You can configure ..