본문 바로가기

CS 과목(CS科目)

원형 큐(Circular Queue)를 사용하는 이유!!! 일반 적으로 큐는 push와 pop을 반복하다보면 점점 큐는 오른쪽으로 이동하게 된다. 그렇다면 결국,큐 배열의 최대 공간 까지 밖에 사용할 수 없다. 이를 보완하기 위해 원형큐를 이용하여 계속해서 공간을 활용 할 수 있다. ​ 최대공간크기의 -1 의 다음 공간은 0으로 하여 연속적으로 저장할 수 있게 한다. ​ ​ 큐가 가득 찬 것을 알기 위해서 front가 위치한 곳은 데이터를 저장할 수 없도록 비워둔다. %와 maxQueueSize를 이용하여 front와 rear값은 증가하지만, 같은 maxQueueSize만큼의 공간 에서만 데이터를 저장하도록 한다. ​ 이때 , front와 rear의 초기값은 0으로 시작한다. ​ ​ front와 rear의 값이 같다면 empty 조건이며, ​ rear+1의 위치.. 더보기
Stack, Queue, List, set 등의 자료구조 사용 시 주의 사항 데이터 구조는 말 그대로, 어떻게 데이터를 효울적으로 저장(insert), 삭제(delete), 탐색(peek)할 것인지에 대한 방법론이 다. 특히 저장(insert)와 삭제(delete)가 주된 동작(Operation)이다. 그러나 저장과 삭제 구현 시 주의해야 할 사항이 있다. 저장(insert)(맨 처음 삽입, 중간 삽입, 끝 삽입마다 동작(구현)이 다를 수 있음에 주의!) ex) Queue가 있다고 하자. 그 Queue에 데이터를 저장(insert)하려고 하는데, 만약 Queue가 이미 사이즈만큼 다 찼다면??? JAVA에서는 이때 OutOfMemory라는 예외(Exception)이 발생한다. 삭제(delete)(처음 삭제, 중간 삭제, 끝 삭제마다 동작(구현)이 다를 수 있음에 주의!!) ex).. 더보기
기술 문서에서 Queue라는 용어를 만났을 때의 주의점 Queue라고 해서 항상 FIFO를 의미하는 것은 아니다. EX) Queue라고 쓰여 있다고, 그 실체가 Prioriy Queue인 경우는 FIFO가 아니게 된다. -> 고로, 기술 문서에서 Queue라는 용어를 만나면, 문맥을 잘 파악을 해서, 1. FIFO를 보장하는 그 Queue인가? 2. 그냥 뭉뚱그려서 Queue라고 한 건지? 를 분별해야 한다. 더보기
Stack vs Queue(dequeue) 사용이 적절할 때 or 관련 에러(in JAVA) Stack : 가장 최근의 데이터가 필요할 떄! Queue(dequeue) : 1.가장 이전의 데이터가 필요할 때! 2.무언가를 대기시키고 싶을 때!(ex. Ready Queue, Waiting Queue) (아래는 JAVA를 기준으로 설명을 하였다.) Stack과 관련된 에러 1. stackoverflow : 할당된 스택 메모리가 다 찼을 떄!! -> 거의 대부분 재귀함수 떄문에 발생 Queue와 관련된 에러 1. OutOfMemory -> JAVA에서 Heap 메모리를 다 썼을 때 발생 -> Queue에 데이터가 쌓이기만 해서, heap 메모리를 다 잡아 먹어 버리면 발생 Solution : Queue의 사이즈를 고정시킨다. Q. 그럼 고정된 사이즈가 다 찼을 때는 어떻게 처리를 해 줘야 할까? A... 더보기
asynchronous(비동기) programming, asynchronous I/O, asynchronous communication 동기와 비동기 개념과 차이 — Koras02코딩웹 (tistory.com) 동기와 비동기 개념과 차이 데이터를 받는 방식인 동기와 비동기. 이 둘의 개념에 대해 알아보고 둘의 차이점을 알아보도록 하겠습니다. 1. 동기(synchronous: 동시에 일어나는) - 동기는 말 그대로 동시에 일어난다는 뜻입니다 koras02.tistory.com 위 사이트도 참조하여 동기, 비동기의 정의를 요약해보았다. 동기의 정의 1. 결과가 반드시 [동시]에 일어나야 한다. 2. 요청(or 호출)을 하면, 실행이 끝날 떄까지 기다려야 한다. 비동기의 정의 1. 결과가 반드시 [동시]에 일어나지x 2. 요청(or 호출)을 하면, 그 실행이 끝나지 않더라도 다른 작업을 수행할 수가 있다. (물론, non-blocking IO.. 더보기
block I/O vs non-block I/O with Socket I/O ( I/O Multiplexing도 설명함) I/O: Input Output의 약자로서 , 데이터의 입출력을 의미. I/0 종류 1. network(socket) I/O -> 네트워크 통신은 Socket을 통해서 데이터가 입출력 된다. 2. file I/O 3. pipe I/O( 프로세스 간의 통신 시 사용되는 개념) 4. device I/O Socket I/0를 가지고 OS Level에서 block I/O와 non block I/O의 동작을 설명하겠다. Block I/O : I/O 작업을 요청한 프로세스/스레드는 요청이 완료될 때까지 BLOCK됨. ( 잘 사용되지 않고, non block이 일반적으로 사용됨) ( 대부분의 프로그래밍 언어는 non blocking I/O를 적극 사용) 일단 각 Socket에는 데이터를 받는 recv_buffer와 .. 더보기
스레드 풀(Thread Pool)은 왜 쓰는 걸까?? 어떻게 쓰는 게 잘 쓰느는 걸까?? 위와 같이 서버의 각 Request마다 1개의 스레드를 만들어서, 응답을 하게 하는 스레드 모델이 있다고 하자. 이때, 한 가지 짚고 넘어 가야 할 issue가 있다. 만약 thread per request 모델의 동작 방식이 서버에 들어 오는 요청마다 스레드를 새로 만들어서 처리하고 처리가 끝난 스 레드는 버리는 식으로 동작한다면 어떻게 될까?? -> 당연히 스레드 생성에 소요되는 시간 때문에 요청 처리가 더 오래 걸릴 것이다. ( 스레드는 OS Kernel level에서 생성이 되는 것이다. user mode는 단순히 프로세스/스레드를 실행하는 mode지만, kernel mode는 우리가 이전 시간에서 살펴 보았듯이 문맥 교환 등의 여러 추가적인 비용이 많이 드는 작업이다.) SOLUTION : Th.. 더보기
온갖 Level에서의 Thread 총정리( 하드웨어 스레드, os 스레드, native 스레드, kernel 스레드, user 스레드, green 스레드), 자바 스레드 모델 우리가 만든 프로그램(user program)은 OS Kernel을 통해서 컴퓨터(Memory, cpu , 그 외의 devices)내에서 실행이 된다. 오늘은 이 각 Level에서 존재하는 thread에 대해 살펴 볼 것이다. Hardware Thread( hyper-threading과 비슷 ) 물리적인 core마다 하드웨어 스레드가 2개 이상일 때, 그 각각의 스레드를 hardware thread라고 불린다. -> cpu/core 입장에서는 고민이 하나 있다. 그것은 메모리로부터 데이터를 read/write할 때, 데이터를 가지고 오는 시간이 상대적으로 길어서 cpu/core가 유휴 상태에 들어 간다는 것이다. 그래서 Intel에서 최초로 hyper threading 기법으로 cpu/core가 메모리를.. 더보기