Programming
프로세스 맛보기
프로세스 맛보기
2025.03.20PCB와 Context SwitchingProcess Control Block (PCB)PCB는 OS에서 특정 프로세스에 관한 정보를 담고 있는 자료구조이다. OS 프로세스는 PCB로 표현되고 OS는 PCB를 사용해서 이러한 프로세스를 추적하고 관리한다.PCB로 표현된 프로세스에 관한 정보를 우리 Context라고 부른다.구성 요소- 프로세스 상태: 프로세스의 현재 상태(예: 실행 중, 대기 중, 준비 완료 등)- 프로세스 Number(PID): 각 프로세스를 고유하게 식별하는 ID- 프로그램 Counter: 프로세스가 실행할 다음 명령어의 주소- CPU 레지스터: 누산기, 인덱스 레지스터, 스택 포인터 등 다양한 CPU 레지스터를 포함하며, 프로세스 실행 중 임시 데이터 및 중간 결과를 저장하는 곳- ..
시스템 콜
시스템 콜
2025.03.20System call왜 필요할까?가장 단순하게 어떤 프로세스든지 I/O나 다른 장치에 관한 여러 작업을 원하는 대로 두면 어떨끼?모든 프로그램은 디스크 전체를 덮어쓰거나 파일에 접근할 수 있게 된다. 파일 권한 확인하는 코드도 높은 가능성으로 무용지물이 되어버릴 가능성이 크다. 그래서 우리는 제한된 모드인 User mode와 kernal 모드로 프로세서의 모드를 나눠서 사용한다!User modeUser mode는 실행되느 코드가 할 수 있는 것이 제한된 모드이다. 예를 들어, I/O 요청을 할 수 없다. 만약 User mode에 있는데 I/O 요청을 날리면 프로세서가 예외를 발생시키고 OS가 프로세스를 종료시킬 가능성이 높다.Kernal mode커널 모드는 OS(Kernal)이 실행되는 모드이다. 여기서..
꼬리 재귀
꼬리 재귀
2025.03.20면접을 준비하며 남긴 노트를 발행해보고 있습니당꼬리 재귀에 관해 알아봅시당.Tail call optimization (TCO)def foo(): return bar() def bar(): pass 꼬리 재귀(tail recursion)꼬리 재귀 함수의 마지막 단계에서 자기 자신을 호출할 때 추가 연산 없이 바로 호출하는 경우를 의미한다. 꼬리 재귀는 일부 컴파일러에서 최적화를 통해 반복문처럼 처리되어 스택 오버플로우의 위험을 줄일 수 있다. 일반 재귀 함수public class FactorialExample { // Normal recursive function to calculate factorial public static int factorial(int n)..
캐시
캐시
2025.03.20취준하며 남긴 노트를 글로 발행해봅니당.캐시의 계층 구조메모리는 빠를수록 제조 비용이 높아진다. 하지만 우리의 돈은 한정되어 있지만 더 좋은 성능을 원하기 때문에 컴퓨터는 보통 계층적인 캐시 구조를 가진다.가장 비싸고 빠른 캐시 메모리인 L1을 CPU에 가까이 두고 그 다음으로 빠른 메모리를 배치한다. 자주 사용하는 데이터는 가장 빠른 L1에 저장되어 매우 빠르게 접근 된다. 이렇게 배치하면, 성능을 타협하며 전체적인 비용을 매우 낮출 수 있다.성능적으로 보면 어떨까? 계층 구조를 사용하면 여러 단계에서 캐싱을 할 수 있어서 CPU가 캐시에서 데이터를 찾을 확률이 높아진다. L1에서 못찾더라도 L2에서 발견할 가능성이 높다.출처: https://ocw.mit.edu/courses/6-004-computa..
폰 노이만 구조의 특징
폰 노이만 구조의 특징
2025.03.20취준하면 남긴 노트를 글로 발행해봅니당 :)폰 노이만 구조의 특징1. 프로그램이 내장되어 있다instruction이 linear하게 메모리에 저장된다저장된 데이터는 Control Signal에 따라 다르게 해석할 수 있다2. 순차적으로 instruction 처리한다한번에 한 Instruction이 처리된다Program Counter(PC)가 현재 명령어를 가리킨다PC는 순차적으로 증가한다.Control Transfer Instruction들은 예외이다.Micro-Architecture 수준에서 바라본 Execution model의 구현착각하지 말자. 실제 MicroArchitecture 레벨로 내려가서 보면 구현된 실행 모델의 대부분이 매우 다르다.예를 들어서, 실제 마이크로 수준의 구현을 보면 동시에 ..
Container화 한 Spring Boot 3의 baseUrl을 Nginx header로 알맞게 바꿔주자!
Container화 한 Spring Boot 3의 baseUrl을 Nginx header로 알맞게 바꿔주자!
2025.03.04OAuth2 Redirect URI 관련 문제 발생이번 프로젝트는 Nginx로 도커 환경으로 서버를 분리된 서버에 전달되도록 구성했습니다. 그래서 application의 {baseUrl}이 자동으로 서버 Url로 설정이 될 줄 알았는데 Nginx가 앞에 있어서 실제 유저가 접속할 때 쓰는 Url과 다른 Url이 되는 것을 알게 되었습니다. {baseUrl}이 이상하니 이 주소 기반으로 된 OAuth2 redirect-uri 설정도 문제가 생겼습니다. 배포 파이프라인을 수정할까 했는데 생각보다 깔끔하게 해결할 수 있었습니다. 이걸 해결하며 발견한 것들을 공유해보고자 합니다.현재 서버 구성현재 개발용과 프로덕션용으로 Spring Boot 애플리케이션 2개를 하나의 서버에 컨테이너화하여 도커로 배포하고 있습니..
HTTP 1.1 - 같은 서버(도메인)에 관한 동시 연결 제한
HTTP 1.1 - 같은 서버(도메인)에 관한 동시 연결 제한
2024.09.12HTTP 1.1의 동시성예전에 HTTP 1.1은 같은 도메인에 관해서는 만들 수 있는 연결의 제한이 있어서 Domain Sharding을 해야 한다고 들은적이 있다.연결 제한으로 인해 느려질 수 있는 경우쉽게 이해하기 위해 다음과 같은 상황을 생각해보자. 내가 웹 페이지에 접속하며 매우 큰 리소스인 이미지 파일 A, B, C를 example.com 서버로부터 불러와야 한다고 해보자. 이미지는 다음과 같은 경로에 호스팅되어 있다.A.png: example.com/img/A.pngB.png: example.com/img/B.pngC.png: example.com/img/C.png이렇게 생긴 웹사이트일 것이다. Coding Groot의 Head-of-Line Blocking 실험! example.com으로부터..
최단 경로 문제 - 다익스트라 알고리즘
최단 경로 문제 - 다익스트라 알고리즘
2024.04.09최단 경로 문제 최단 경로 문제는 그래프 내의 두 정점(노드) 간의 가장 짧은 경로, 즉, 각 간선들의 가중치의 합이 최소가 되는 경로를 찾는 문제이다. 그래프의 형태에 따라 다양한 최단 경로 알고리즘이 존재한다. 이러한 알고리즘은 그래프의 크기, 가중치의 존재 유무 또는 음수 사이클의 존재 여부 등에 따라 다르게 사용한다. 대표적인 알고리즘 복습할 겸 대표적인 최단 경로 알고리즘을 찾아봤다. 다익스트라 알고리즘: 가중치가 음수가 아닐 때 사용될 수 있다. 다익스트라가 대학원생이던 시절 여자 친구와 함께 커피숍에 갔다가 20분 만에 고안한 알고리즘으로도 유명하다. 벨만-포드 알고리즘: 음수인 가중치를 처리할 수 있는 알고리즘이다. 음수 사이클을 탐지할 수 있는 것이 특징이다. 플로이드-워셜 알고리즘: 가..
CertBot 인증서가 만료가 되었다
CertBot 인증서가 만료가 되었다
2024.01.21문제의 상황 모도코라는 사이트의 API Server를 운영하고 있고 CertBot으로 무료 인증서를 Let's Encrypt로부터 받아와서 사용하고 있다. 무료 인증서는 갱신 기간이 90일밖에 되지 않기 때문에 CertBot으로 자동으로 renew되도록 cronjob을 등록해놓았다. 실제로 거의 1년 동안 신경 안 쓰고 잘 사용해왔다. 그런데 인증서가 만료되면서 사이트 로그인이 되지 않는다고 갑자기 문의가 들어왔다. 일단 API 서버가 사용중인 인증서를 보니 이전에 만료된 Let's Encrypt 인증서를 사용하고 있었다. 운영 환경 API Server를 관리하기 위해 PM2라는 Process Manager를 사용하고 있다. GitHub에 Code를 업데이트하면 GitHub Action으로 자동으로 AW..
Error installing cocoapods 해결 후, CocoaPods 업그레이드하는 법
Error installing cocoapods 해결 후, CocoaPods 업그레이드하는 법
2023.11.17최신 코코아팟(CocoaPods)으로 업그레이드하기 맥을 Sonama(14.1.1)로 업그레이드를 하고 XCode17에 대응하기 위해 코코아팟을 업그레이드하려 했습니다. 그런데 sudo gem install cocoapods을 했더니 다음과 같은 오류가 발생했습니다. Fetching cocoapods-downloader-2.0.gem Fetching cocoapods-core-1.14.2.gem Fetching cocoapods-1.14.2.gem ERROR: Error installing cocoapods: There are no versions of cocoapods-downloader (>= 2.0) compatible with your Ruby & RubyGems 원인 루비(Ruby) & 패키지 ..
Flutter3.0 Firebase 연동하기
Flutter3.0 Firebase 연동하기
2023.10.051. Firebase CLI를 설치한다다음의 페이지에서 설치할 수 있다. CLI 설치 가이드: https://firebase.google.com/docs/cli?hl=ko#setup_update_cli 설치한 다음 로그인까지 해주자.firebase login2. Firebase Project를 하나 생성한다firebase projects:create groot-fcm-test나는 groot-fcm-test라는 이름으로 프로젝트를 만들었다. 전세계에서 유일한 명칭이어야 해서 특이하게 설정해야 한다. 이제 Firebase Console에 접속해보면 방금 생성한 프로젝트가 보일 것이다. 콘솔 링크: https://console.firebase.google.com/ 3. 작업할 Flutter 프로젝트를 생성하자..
NestJS v8에서 v9으로 업그레이드 하는 법
NestJS v8에서 v9으로 업그레이드 하는 법
2022.10.05최근에 NestJS v9의 Major Update가 있었다. REPL 기능이라든지 Swagger 업그레이드라든지 필요한 기능들이 있어서 업그레이드를 진행해보고자 했다. v9 업데이트에 관해서는 아래의 글에서 간단하게 참고할 수 있다. https://trilon.io/blog/nestjs-9-is-now-available NestJS v9 is now available Today I am excited to announce the official release of Nest 9: A progressive Node.js framework for building efficient and enterprise-grade, server-side applications. trilon.io v9.0.0 PR은 http..