개발/CS

    리눅스 select, poll, epoll

    알아보기 전에 꼭 알야아 할 키워드들이 있다. File Desciptor : 리눅스 혹은 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 개념. 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값. 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스. 리눅스(유닉스) 에서는 모든것을 파일로 취급한다.(파일, 소켓 등) 각각의 프로세스는 File desciptors의 테이블을 가지고 있다. IO multiplexing : 하나의 통신 채널을 통해서 둘 이상의 데이터를 전송하는 기술, 물리적 장치의 효율성을 높이기 위해, 최소한의 물리적 요소만을 이용하여, 최대한의 데이터를 전달하기 위해 사용되는 기술. 멀티플렉싱이 필요한 이유는, 각 파일을 처리할 때 각각의 io통로를 통로를 만들어..

    컨텍스트 스위칭시 일어나는일

    P1이 실행중이고 P2가 준비상태임. 일부 중단이 발생하면 컨텍스트를 저장한 후 프로세스 P1을 실행 중에서 준비 상태로 전환하고 P2를 준비에서 실행중 상태로 전환해야함 언제 발생? 1. 인터럽트 : CPU는 디스크에서 데이터를 읽을 것을 요청하고, 인터럽트가 있는 경우 컨텍스트 스위칭은 인터럽트를 처리하는데 더 적은 시간이 필요 2. 멀티태스킹 : 다른 프로세스가 실행될 수 있도록 프로세스가 CPU에서 전환될 수 있도록 하는 멀티태스킹의 특성 3. 커널 / 사용자 스위치 : PCB : 운영제체에서 모든 데이터와 관련된 정보를 프로세스에 저장하는데 사용되는 데이터 구조, 프로세스가 생성되면 프로세스의 업데이트 정보, 프로세스의 정보 전환, PCB의 프로세스 종료 등이 있음. 1. 실행 상태에 있는 프로..

    C10K부터 Event-Driven까지

    하드웨어 자원이 충분함에도 불구하고 IO 처리방식의 문제 때문에 프로세스가 제대로 처리하지 못하는 문제. BSD 소켓을 처음 설계할 때 10K 클라이언트를 처리할 하드웨어 여력이 되지 않았다. 그래서 이를 고려하지 않고 설계함. 10K가 붙으면 네트워크 대역만 해도 기가비트급이고 당시에 상상도 못할일. 이걸 감당할 하드웨어도 없었다. 처음에 OS 커널을 수정하는 방식으로 해결하려고 했음. 그 이후에는 event-driven 서버(Nginx, Node.js)를 통해 해결하려는 시도들이 등장. 무어의 법칙 : 18개월마다 반도체 직접회로의 성능이 2배로 증가 에 비해 소프트웨어의 한계로 인해 발생한 문제. 스레드는 서버 CPU 코어수에 종속적이다. 하나의 Connection당 하나의 스레드가 처리하는 모델 ..

    부동소수점이란

    고정 소수점 특정 위치에 소수점을 고정하고 정수부와 소수부를 나눠 표현하는 방식 간편하고 계산이 빠르지만, 표현할 수 있는 범위가 굉장히 제한적임. 부동 소수점 IEEE에서 표준으로 제한한 방식 부동(不動) 소수점이 아니라 부동(浮動) 소수점이다. 영어 "floating = 떠 있는" 을 해석한 것 표현할 수 있는 범위가 넓지만 연산속도가 다소 느리다. 부동 소수점의 표현 방식은 "(가수) X(밑수)(지수)" 형태로 표현한다. ex) 12.3 -> 123 x 10-1 IEEE754에 정의된 것들 비트구조 부호비트 sign bit (1비트) : 0이면 양수, 1이면 음수 지수비트 exponent (8비트) : 10000111 127 + 8 = 135, 2 ^ (k - bias) 에서 k값을 나타냄. 가수비..

    상속과 조합

    상속 : 장점 재사용, 중복을 줄 일 수 있음 변화에 대한 유연성 및 확장성이 증가함 개발 시간이 단축됨 단점 : 캡슐화를 깨뜨린다. (상위 클래스와 하위 클래스가 의존하게 된다) 상위 클래스의 변경이 어려움 하위 클래스에 영향을 주기 때문에 최악의 경우 상위 클래스의 변화가 모든 하위 클래스의 영향을 줄 수 있다. 하나의 기능을 추가하기 위해 필요 이상으로 많은 수의 클래스를 추가해야 한다.(이를 클래스 폭발 문제라고 함) 다중상속을 지원하지 않음. protected로 선언할 경우 변수 메소드 까지 노출됨. 이로써 캡슐화가 중단됨 이럴 때 사용하자 확장을 고려하고 설계한 확실한 Is-a 관계일 때 확실한 is-a 관계일 때, 상위 클래스는 거의 변할 일이 없다. 하지만 is-a관계 일지라도 확장이 고려..

    Blocking Queue 블락킹 큐

    특정 상황에 스레드를 대시하도록 하는 큐. 멀티 스레드 환경에서 사용되는 자료구조. 큐의 상태에 따라 자원의 생성과 소비를 제어할 수 있는 큐. 가득차있거나, 비어있을 경우 예외를 방지하기 위해 각각의 상황에서 큐를 블록킹함. 큐에서 원소를 빼려고 시도했는데 큐가 비어있거나, 큐에 원소를 넣으려 했는데 큐에 넣을 수 있는 공간이 없을 때, 디큐/인큐 호출 스레드를 대기하도록 한다. 비어있는 큐에서 원소를 빼려고 시도하는 스레드의 대기 상태는다른 스레드가 이 큐에 원소를 넣을 때까지 지속된다. 꽉 찬 큐에 원소를 넣으려고 시도하는 스레드의 대기 상태는 다른 스레드가 큐에서 우너소를 빼거나 큐를 클리어하거나 큐의 공간이 확보될 때 까지 지속된다.

    스레드풀이란

    스레드풀이란 스레드를 미리 만들어 풀장에 풀어놓는 개념이라고 이해하면 쉬움 사용자로부터 들어온 요청을 작업큐에 넣고 스레드풀은 작업큐에 들어온 Task 일감을 미리 생성해놓은 스레드들에게 일감을 할당한다. 일을 다 처리한 스레드를 다시 어플리케이션에게 결과값을 리턴한다. 자바에서는 스레드풀을 생성하고 사용할 수 있도록 concurrent 패키지에서 ExecutorService인터페이스와 Executors 클래스를 제공하고 있다. Executors의 다양한 정적 메소드를 통해 ExecutorService 구현 객체를 만들어서 사용할 수 있으며, 이것이 바로 스레드 풀이다. 스레드풀의 목적 성능 저하를 방지하기 위해서 매번 발생되는 작업을 병렬처리 하기 위해 스레드를 생성/수거 하는 부담은 전체적인 퍼포먼스..