본문 바로가기

분류 전체보기

(51)
[NIO] FileChannel 과 FileInput/Output Stream 과의 차이 FileChannel 은 Java의 java.nio.channels 패키지에 속하는 클래스로, 파일에서 데이터를 읽고, 쓰고, 매핑하는 기능을 제공한다. FileChannel은 입출력(I/O) 작업에 대해 더 높은 성능과 유연성을 제공하는 NIO (New Input/Output)의 핵심 요소 중 하나이다. 이 클래스는 버퍼와 채널을 사용하여 파일의 데이터를 직접 조작할 수 있는 메커니즘을 제공하여, 기존의 FileInputStream, FileOutputStream, RandomAccessFile 등을 통한 데이터 처리 방식보다 더 효율적인 작업이 가능하다. FileChannel의 주요 역할 읽기 및 쓰기 작업: FileChannel을 통해 파일의 특정 위치에서 데이터를 읽거나 쓸 수 있다. 이를 통해 ..
LSM Tree Compaction (Leveled Compaction) LSM tree 는 주기적인 compaction 을 통해 꾸준히 증가하는 disk 의 table 수를 줄이며, 중복된 키에 대한 조정 작업을 수행한다. compaction 은 병합과 조정 알고리즘을 사용해 전체 record 를 순회하고 결과를 새로 생성한 테이블에 저장한다. LSM tree 의 구조상 disk 에 쓰여져 있는 SSTable 의 record 는 정렬되어 있고, merge sort algorithm 의 특성상 iterator 의 head 만 memory 에 저장하기 때문에 memory 사용량 상한이 존재한다. 이러한 compaction 과정을 최적화 하기 위해 널리 알려진 방법중에 하나가 leveled compaction 이다. Merge - Interation Leveled Compacti..
Mutex vs Semaphore Mutex Mutex 라는 이름은 Mutual Exclustion (상호배제) 를 의미하며 critical section 의 shared data 를 보호하기 위해 사용된다. Mutex 는 한 번에 오직 한개의 thread 가 resource 에 접근하는 것을 허용하며 Java 에서 Mutex 의 전형적인 예시는 Synchronized block 이다. Semaphore Semaphore 는 mutex 와는 다르게 resource 에 제한된 접근을 하기 위해 사용된다. Semaphore 는 제한된 숫자의 허가증을 가지고 있다고 생각하자. 만약 Semaphore 가 가지고 있는 허가증을 모두 사용했을 경우, 허가증을 사용한 이전 thread 가 허가증을 return 할 때까지 신규 thread 의 허가 요..
Critical Section & Race Condition Critical Section Critical Section 은 여러개의 thread 에 의해 data 나 resource 가 공유되는 부분을 일컫는다. Race Condition Race Condition 은 thread 가 동기화 되어 있지 않은 상태에서 critical section 영역을 여러 thread 들이 실행할때 발생한다. thread 들은 shared section 을 통해 shared resource 를 읽거나 쓰는 “race” 를 수행하며 각 thread 들이 race 를 끝내는 순서대로 출력을 하게 된다. Race Condition 상황에서는 thread 가 다른 thread 가 접근하고 있는 공유된 자원이나 변수에 접근을 하게 되므로, data 의 일관성이 깨지게 된다.
Deadlock, liveness, Live lock, Starvation Critical Section 을 지키고 Race Condition 을 피하려고 애쓰는동안, Multithread code 의 미묘한 "논리적인 오류" 가 생길수도 있다. 그 논리적인 오류들의 패턴은 다음과 같다. Deadlock deadlock 은 두개 이상의 thread 가 진행을 할 수 없을 경우에 발생한다. 첫번째 스레드가 필요로 하는 resource 를 두번째 스레드가 보유하고 있고, 두번째 스레드가 필요로 하는 resource 를 첫번째 스레드가 보유하고 있을 경우 발생한다. 예를 들어, 아래와 같은 코드에서 increment 의 mutex A 획득과 decrement 의 mutex B 획득이 동시에 이루어졌을때, 그 다음 mutex 를 획득하기 위해 두개의 thread 는 무한히 대기할 것이..
Birthday Problem (생일 문제) 생일 문제는 확률 이론의 유명한 예제 중 하나로, 특정 집단 내에서 적어도 두 명의 사람이 같은 생일을 가질 확률을 계산하는 문제이다. 이 문제는 직관적으로 생각했을 때 예상치 못하게 높은 확률을 보여주기 때문에 The birthday paradox 라고도 불린다. 생일 문제의 기본 생일 문제에서는 일반적으로 365 일이 있는 한 해를 가정하며, 윤년은 고려하지 않는다. 문제의 기본적인 질문은 “어떤 방에 사람들이 있을 때, 적어도 두 사람이 같은 생일일 확률은 얼마인가?” 이다. 계산방법 이 확률을 계산하는 가장 쉬운 방법은 충돌이 발생하지 않을 확률을 계산한 다음 그 값에서 1을 빼는 것이다. 예를 들어, 한 방에 사람이 n 명 있을 경우, 첫 번째 사람의 생일은 어느 날이든 될 수 있고, 두 번째 ..
[데이터 중심 애플리케이션 설계] 1. 데이터 시스템에 대한 생각 오늘날 많은 애플리케이션은 계산 중심(compute-intensive) 과는 다르게 데이터 중심(data-intensive) 적이다. 이러한 애플리케이션의 경우 CPU 성능은 애플리케이션을 제한하는 요소가 아니며, 더 큰 문제는 보통 데이터의 양, 데이터의 복잡도, 데이터의 변화 속도이다. 일반적으로 데이터 중심 애플리케이션은 공통으로 필요로 하는 기능을 제공하는 표준 구성 요소 (standard building block) 로 만든다. 예를 들어, 많은 어플리케이션은 다음을 필요로 한다. 구동 애플리케이션이나 다른 애플리케이션에서 나중에 다시 데이터를 찾을 수 있게 데이터를 저장 (데이터베이스) 읽기 속도 향상을 위해 값비싼 수행 결과를 기억(캐시) 사용자가 키워드로 데이터를 검색하거나 다양한 방법으로..
[NIO] Selection 네트워크 프로그래밍을 위한 새 I/O API 의 두 번째 부분은 준비된 것을 선택하는 것이다. 준비된 채널을 선택함으로써 읽고 쓸때 블록하지 않아도 된다. 이 내용은 주로 서버의 관심사이지만, 여러 개의 창을 띄워서 동시에 여러 연결을 시도하는 웹 스파이더나 브라우저 같은 클라이언트 프로그램에서도 활용할 수 있다. 준비된 것을 선택하기 위해서는 서로 다른 채널들이 Selector 객체에 등록되어야 하며, 이때 각 채널에 할당되는 SelectionKey 가 사용된다. 그리고 나서 프로그램은 Selector 객체에게 작업을 수행할 준비가 된 채널 키의 세트를 요청한다. Selector class 셀렉터에 있는 유일한 생성자는 protected 로 선언되어 있다. 일반적으로 새로운 셀렉터는 정적 팩토리 메소드..
[NIO] Socket Channel 채널은 파일, 소켓, 데이터그램 등과 같은 다양한 I/O 소스로부터 데이터 블록을 버퍼로 쓰거나 읽어온다. 네트워크 프로그래밍을 위해서는 SocketChannel, ServerSocketChannel, DatagramChannel 세개가 가장 중요하다. 그리고 TCP 연결을 위해서는 이 중에서도 앞의 두 개의 채널만 필요하다. 1. SocketChannel class SocketChannel 클래스는 TCP 소켓에 대해 읽고 쓴다. 읽고 쓸 데이터는 ByteBuffer 객체로 먼저 인코딩 되어야 한다. 각각의 SocketChannel 은 Socket 객체와 연결되어 있다. 연결하기 SocketChannel 클래스는 public 으로 선언된 생성자를 제공하지 않는다. 대신에 다음 두 정적 open() 메소..
[leetcode][hard] Maximum Profit in Job Scheduling We have n jobs, where every job is scheduled to be done from startTime[i] to endTime[i], obtaining a profit of profit[i]. You're given the startTime, endTime and profit arrays, return the maximum profit you can take such that there are no two jobs in the subset with overlapping time range. If you choose a job that ends at time X you will be able to start another job that starts at time X. Exampl..