프로세스 종료와 시그널
·
Server
[ 프로세스 종료가 중요한 이유 ]프로세스가 우아하게 종료되는 일은 서비스 품질과 시스템 안정성 두 가지 측면에서 매우 중요합니다.먼저, 운영체제 관점에서 보면 애플리케이션이 열어 둔 파일 디스크립터나 네트워크 소켓, 메모리 맵과 같은 커널 자원을 스스로 해제하지 않으면 커널이 이를 회수할 때까지 자원이 묶여 있어 FD 고갈이나 메모리 누수로 이어질 수 있습니다. 이는 장시간 실행되는 서버라면 특히 치명적이며, 자원 부족 때문에 신규 프로세스가 기동 되지 못하거나 예기치 않은 OOM(Out Of Memory) 오류로 서비스 전체가 중단될 위험을 높입니다. 또한 데이터 무결성 측면에서도 올바른 종료 절차가 필수적입니다. 프로세스가 트랜잭션을 진행 중이거나 버퍼에 기록을 쌓아 두고 있을 때 강제 종료가 발생..
kotlin coroutine 에 대하여
·
Server
[ 코루틴 이란? ] 코루틴(coroutine)은 co-(함께)와 routine(루틴, 일상적인 함수 실행)의 합성어입니다.즉, "함께 실행되는 루틴"이라는 의미로, 서로 협력하며 실행 흐름을 주고받는 함수(또는 실행 단위)를 뜻합니다.일반 함수는 호출되면 실행을 마칠 때까지 제어권을 갖고 있다가 끝나면 호출자에게 제어권을 반환합니다.반면 코루틴은 실행 도중에도 중단(suspend)하고, 다시 재개(resume)할 수 있는 함수입니다. [ 탄생 배경 ]‘코루틴’이라는 개념 자체는 현대적인 async/await, Kotlin 코루틴보다 훨씬 오래된 개념입니다코루틴은 1960년대에 처음 등장한 개념으로, 당시에는 스택프레임을 공유하며 함수 간 제어권을 명시적으로 전환할 수 있는 구조로 설계되었습니다.현대에..
Java의 BLOCKED 상태와 I/O 대기로 인한 일시정지 상태
·
Server
[ 대상 독자 ] 자바에는 Thread 객체가 있으며, 각 스레드는 고유의 상태(state)를 가집니다.그중 하나가 바로 BLOCKED 상태입니다.그렇다면 자바 서버 애플리케이션에서 A 스레드가 Socket을 통해 클라이언트와 통신 중이고, 현재 socket.read()를 호출한 채 클라이언트의 응답을 기다리고 있다면, 이때 A 스레드의 상태는 무엇일까요?"네트워크 I/O 작업이 진행되지 않고, 클라이언트 응답을 기다리며 block 된 상태이니 자바 스레드 상태도 BLOCKED가 아닐까?"라고 생각하신다면, 이 글이 도움이 될 수 있습니다. [ Java 스레드의 주요 상태 ] Java에서는 Thread.State 열거형으로 여섯 가지 스레드 상태를 정의합니다. 1. NEW : 스레드 객체를 생성했지만 ..
java 다이렉트 버퍼에 대하여
·
Server
[ Direct Buffer 탄생 배경 ]기존 io 에서 불편했던 것 초기 버전 Java에서는 전통적인 I/O 에서 소켓에 바이트를 write 하는 방식을 보자유저레벨의 자바 애플리케이션 힙 영역에 전달할 데이터 생성 한다.유저레벨의 네이티비 메모리(물리 메모리) 공간에 고정된 버퍼를 하나 만들어서 여기다 전달할 데이터를 복사한다. 즉 유저레벨 → 유저레벨로의 복사다.위에서 만든 물리 메모리 버퍼의 참조를 시스템 콜로 넘긴다. 시스템콜은 이 버퍼의 데이터를 커널레벨의 소켓 버퍼로 옮긴다. 이건 유저레벨 → 커널레벨로의 복사다. 왜 힙영역에서 물리메모리 영역으로 복사하나?힙 메모리에서 바로 커널 메모리로 복사하면 되는거 아닌가!?Java의 가비지 컬렉터는 힙 메모리를 자유롭게 이동 및 압축시키기 때문에,..
Multi Plexing 에 대하여
·
Server
[ 멀티플렉싱(multiplexing)은 왜 등장했을까? ]서버를 개발하다 보면 여러 클라이언트가 동시에 접속해 서비스를 제공받도록 하는 '다중 접속 서버'를 만들 필요가 생깁니다. 이러한 다중 접속 서버를 구현하는 방법은 크게 세 가지로 나눌 수 있습니다.멀티프로세싱(multiprocessing): 각각의 클라이언트 요청을 처리할 때마다 '새로운 프로세스를 생성'해서 대응하는 방식입니다. 프로세스 생성과 유지 비용이 커서 자원을 많이 소모합니다.멀티스레딩(multithreading): 한 프로세스 내에서 여러 개의 '스레드를 생성'해서 동시에 요청을 처리하는 방식입니다. 프로세스보다는 가볍지만, 스레드 간의 자원 경쟁과 컨텍스트 스위칭으로 인해 성능에 한계가 있습니다.멀티플렉싱(multiplexing)..
카카오 4년차 백엔드 개발자 이직 회고
·
회고
이 글은 국내 IT 기업 이직에 대한 팁과, 4년 차 개발자로서 개인적인 생각들이 있습니다.1. 이직에 대하여1) 동기이직을 하려면 강한 동기가 필요합니다. 에너지가 없으면 준비 자체가 쉽지 않습니다.스스로 왜 이직하려는지, 그 이유를 확실히 정리하고 천천히 준비해 보는 게 좋습니다. 저는 회사 내에서 만족할 만한 평가를 받지 못하고 있다고 느꼈습니다.'내가 진짜 개발을 못 하는 건가?' 싶은 생각에 자존감이 흔들리기도 했지만, 냉정하게 보면 실력 차이가 그렇게 크다고는 생각하지 않았습니다.그래서 이직을 통해 다른 회사 면접을 보면서 제 실력을 시험해보고 싶었습니다. 2) 서류이력서는 노션으로 준비했습니다.간단한 자기소개, 기술 스택, 프로젝트 경험 위주로 정리했습니다.프로젝트 경험은 디테일한 문제 해..
2023 회고
·
회고
23년이 끝나가고 있어 싱숭생숭하여 회고를 적어보려고 한다. 참고로 지금 나는 경력이 2년 반이 된 개발자이다. 좋은 개발자 사람마다 잘하는 개발자의 기준은 다르다는 걸 느꼈다. 나는 잘하는 개발자가 되고 싶다. 그래서 나는 누구를 잘한다고 느끼는지 생각했다. 마침 동료 중에 지향할만한 사람이 있어서 저 사람처럼 하면 되겠다 생각했다. 나는 저 사람을 왜 잘한다고 느낄까 생각해 보니 아래와 같은 특징이 있었다. 일단 아는 것이 많다. 기본기가 탄탄하다. 개발을 재밌어한다. 공유를 잘한다. 설명을 잘 한다. (문서, 발표, 질문 대답) 부드러운 커뮤니케이션을 할 줄 안다. 아는 것이 많다는 건 우리 비지니스에 대한 이해도가 높고, 이미 나와있는 기술, 새롭게 나오는 기술에 대해 알고 있는 게 많다는 거다...
비전공자의 2021 카카오 인턴 개발자 최종 합격 회고
·
회고
주의 : 이 글은 개발자로 취준 하는 분들을 위한 진심 어린 팁이 담겨있습니다. 대상 이 글은 비전공자가 개발자가 되고 싶어 열심히는 하고 싶은데 무엇을 해야 하는지 모르는 사람이 읽으면 좋습니다. 이 글은 '네카라쿠배'에 신입으로 가고 싶은 개발자 취준생이 읽으면 좋습니다. 이 글은 심심한 사람이 읽으면 좋습니다. 전체 스토리 (노베이스에서 카카오 개발자가 되기까지... 생략하실 분들은 생략) 1. 나 뭐하고 살지..? (2020년 2월) 저는 인천소재 자연대(수학과 x, 통계학과 x)를 재학 중인, 코딩과 관련 없는 쌩 비전공자였습니다. 때는 2020년 2월, 저는 막 학기를 남겨두고 있었습니다. 하고 싶은 일이 딱히 없어 대학원을 생각했었고, 학부 연구생도 했었습니다. 하지만 학부 연구생을 하는 동..
[백준 12851] 숨바꼭질 2 파이썬
·
알고리즘 문제풀이
https://www.acmicpc.net/problem/12851 12851번: 숨바꼭질 2 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 www.acmicpc.net from collections import deque N,K = map(int,input().split()) MAX = 100000+1 def bfs(N,K): visited = [0]*(MAX) visited[N] = 1 time = 0 min_time = MAX cnt= 0 q = deque([[N,time]]) while q: x,t = q.popleft..
[백준 18405] 경쟁적 전염
·
알고리즘 문제풀이
www.acmicpc.net/problem/18405 18405번: 경쟁적 전염 첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치 www.acmicpc.net from collections import deque N,K = map(int,input().split()) mat = [list(map(int,input().split())) for i in range(N)] S,X,Y = map(int,input().split()) dx=[0,0,1,-1] dy=[1,-1,0,0] start = [] # 바이러스 종류, x,y좌표 for i i..
[백준 1034] 램프
·
알고리즘 문제풀이
www.acmicpc.net/problem/1034 1034번: 램프 첫째 줄에 N과 M이 주어진다. N은 행의 개수이고, M은 열의 개수이다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 램프의 상태가 주어진다. 1이 켜져있는 상태이고, 0이 꺼져 www.acmicpc.net from collections import defaultdict N,M = map(int,input().split()) lamp = [] for _ in range(N): lamp.append(input()) K = int(input()) d = {} for i in lamp: if d.get(i): d[i][0]+=1 else: #존재 안하면 "01" : [총 개수, 0의 수 ] cnt = i.coun..
[백준 1027] 고층 건물
·
알고리즘 문제풀이
www.acmicpc.net/problem/1027 1027번: 고층 건물 세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작) www.acmicpc.net N = int(input()) bd= list(map(int,input().split())) def left_view(i): line = 10000000000 view = 0 cur_idx = i-1 while cur_idx >= 0: dx = i-cur_idx dy = bd[i] - bd[cur_idx] dydx = dy/dx if dydx < line: view+=1 line = dydx cur_idx-=1..