전체 글
-
git 복구하기Git 2024. 5. 29. 18:44
git reset --hard 를 잘못 사용해서 작업한 파일을 다 날렸을 때 당황하지 말자. commit 을 한 경우1. git reflog로 내가 입력 했던 명령어 확인 2. git reset --hard {돌아가고자 하는 해시}ex) git reset --hard e4ebfa6 commit을 하지 못 한 경우git add 를 하고 실수로 git reset --hard를 해버린 경우에도 당황하지 말자. 1. git fsck --lost-found 2. git show {id}ex) git show 02f88792a956f20cef80a9639e60520814a13af4 하나 하나씩 확인해서 최대한 복구하자
-
goroutine 스케줄링Programming Language/golang 2024. 5. 1. 15:56
goroutine 스케줄링이 어떻게 동작하는지 정리한다.0. OS 스레드의 단점 - 생성/소거 비용이 비싸다.기본적으로 약 1MB 의 메모리 크기다. - 스레드의 숫자가 많으면 많을수록 컨텍스트 스위칭 비용이 비싸다.코어는 한정되어 있기 때문에 여러 스레드가 돌아가면서 사용할 때마다 컨텍스트 스위칭 발생.1. goroutine 특징- Goruntime이 관리하는 goroutine(고루틴)이라는 자체 동시성 모델을 구성하여 사용한다.OS 스레드가 1MB의 스택을 갖는 반면 고루틴은 이보다 훨씬 작은 약 2KB의 스택을 가짐.레지스터도 스택포인터(SP), 프로그램 카운터(PC), 리턴 포인터 정도가 전부이다.type g struct { stack stack // 스택 stackgua..
-
CALL, RET, 함수 호출Computer Science/컴퓨터 구조 2024. 4. 25. 13:13
어셈블리어 명령어 중 CALL, RET 정리하고 함수 호출 과정 정리.CALL 하나의 명령어지만 아래 작업을 내부적으로 수행현재 명령어 포인터(IP) 또는 프로그램 카운터(PC)의 다음 명령어 주소를 스택에 저장 (스택에 해당하는 메모리 주소에 값을 STORE)실행하려는 명령어 포인터(IP) 또는 프로그램 카운터(PC)로 점프 CALL 은 1바이트(opcode) + 명령어 주소 4바이트 (operand)로 구성. 명령어 주소는 오프셋을 의미한다. 즉 CALL로 실행하고자 하는 함수의 주소가 현재 명령어의 주소 + 오프셋으로 계산되어 점프한다. 점프하기 전에 현재 명령어의 다음 명령어의 주소를 스택에 PUSH 하는데, 이 다음 명령어의 주소는 현재 명령어의 주소 + CALL 명령어의 크기(보통 5바이..
-
Netty 정리Programming Language/java 2024. 4. 23. 16:45
Netty 관련 내가 이해하고 있는 내용을 정리해본다.Netty가 뭔가요?Netty를 왜 쓰나요?Netty가 어떻게 동작하나요?위 3가지 관점에서 주요한 내용을 정리해보겠습니다. 1. Netty가 뭔가요?Netty는 NIO기반 네트워크 애플리케이션 프레임워크입니다. (NIO는 New Input Output 입니다.)다양한 프레임워크에서 Netty를 사용하고 있고 Spring WebFlux에서도 Netty를 디폴트 코어로 사용하고 있습니다. 2. Netty를 왜 쓰나요?Netty는 고성능 서버를 구현하기 위해 사용됩니다. 고성능이라는 말은 같은 자원을 효율적으로 사용한다는 말과 같습니다.그렇다면 무엇에 비해 효율이 좋다는 것일까요? 이를 이해하기 위해 기존의 멀티스레드 기반 애플..
-
Z 알고리즘Problem Solving 2024. 2. 10. 20:21
Z[i] : s의 i 부터의 substring == s의 prefix 가 되는 최대 길이 Z 배열 :문자열 s의 Z배열 z[i]는 s[i]에서 시작하는 부분 문자열이면서 s의 prefix이기도 한 가장 긴 문자열의 길이를 담는 배열이다.이전에 구한 정보들을 최대한 활용해서 O(n)에 Z배열을 구할 수 있다. 문자열 ABCABCABAB인 경우 Z 배열ABCABCABABx005002020 vector z_function(const string &s) { int n = s.size(); vector z(n); z[0] = n; int L = 0, R = 0; for (int i = 1; i prefix과 일치하는 substring 중 가장 긴 substring의 인덱스 l,r..
-
TCP Keepalive 와 HTTP KeepaliveComputer Science/Network 2024. 2. 10. 01:01
TCP 사용되는 Keepalive 개념과 HTTP/1.1에서 사용되는 Keepalive의 개념이 어떤 차이가 있을까 TCP의 Keepalive와 HTTP의 Keepalive는 둘 다 하나의 커넥션으로 데이터를 주고 받는 점에서는 같다고 볼 수는 있다. 하지만 목적과 특성이 다르다. TCP Keepalive는 서버와 클라이언트 간의 연결을 유지하기 위한 목적이 있다. 반면 HTTP Keepalive는 불필요한 새로운 연결을 줄이고 기존 연결을 재사용함으로써 성능을 높이는 데에 목적이 있다. 또한 TCP Keepalive는 일정 시간 간격으로 payload가 없는 (0 or 1byte) 데이터를 전송하여 커넥션이 살아있나 확인하고 미리 설정된 일정 시간만큼 커넥션을 연장한다. 이는 좀비소켓을 방지하는 데에도..
-
LCA 구현 (Lowest Common Ancestor)Problem Solving 2023. 10. 7. 21:07
LCA 구현하는 과정을 최대한 간단하게 정리해본다. LCA 는 가장 가까운 공통 조상을 찾는 알고리즘인데, 두 노드에서 한 칸씩 이동하며 찾을 수도 있지만 2의 n제곱 칸씩 이동하며 찾는 방법도 가능하여 시간을 많이 단축할 수 있다. 먼저 필요한 자료구조는 다음과 같다. - depth[node] : node의 루트 노드로부터의 깊이, lca에서 두 노드의 깊이 차이를 구할 때 필요 - parent[node][k] : node의 2^k 번째 부모의 노드 번호, lca에서 두 노드의 공통 조상을 찾을 때 필요 과정은 다음과 같다. 1. dfs() 로 depth[node] 와 parent[node][0] (직계 부모)를 구한다. 2. build() 로 parent[node][1..maxlog] 를 구한다. k..
-
[디자인 패턴] 싱글톤 패턴Programming Language/java 2023. 9. 1. 23:13
싱글톤 패턴 인스턴스를 반드시 1개만 제공하는 패턴으로 유명하여 간단하게 정리해본다. 1. 생성자를 private으로 막는다. 2. static Factory Method 방식의 일환으로 getInstance 메소드를 제공한다. public class Singleton { private static Singleton instance; private Singleton() { // 에러 } public static Singleton getInstance() { // 인스턴스가 생성되지 않았을 경우에만 인스턴스를 생성합니다. if (instance == null) { instance = new Singleton(); } return instance; } } 정적 변수에 private static Singlet..