본문 바로가기

분류 전체보기116

Spring MVC와 Spring WebFlux로 알아보는 Blocking I/O vs Non-blocking I/O Spring WebFlux에 대해 깊이있게 공부하기 보다는 Spring MVC와 Spring WebFlux를 통해 Blocking 방식과 Non-blocking 방식에서 스레드가 어떻게 동작하는지에 대해서 가볍게 알아보려고 합니다. 관련 블로그 blocking I/O vs non-blocking I/O (feat. socket I/O) I/O I/O는 input/output의 약자로, 데이터의 입출력을 의미한다. 이러한 I/O의 종류에는 일반적으로 우리가 알고 있는 file I/O, 프로세스 간의 통신을 할 때 사용되는 pipe I/O이 있다. 그리고 일반적인 디 oneny.tistory.com 위에서 Blocking I/O와 Non-blocking I/O에 대해서 공부했던 글이다. Spring MVC와.. 2023. 9. 5.
[구름톤 챌린지] 연합 풀이 과정 처음에는 입력값도 크고 그래서 잠시 유니온파인드인가? 라는 착각을 했었다.. 근데 그러한 문제는 아닌거 같고 그냥 DFS로 풀어보기로 했다. 여기서 핵심은 임의의 두 섬 a와 b에 대해, a번 섬에서 b번 섬으로 직접 이동할 수 있는 다리와 b번 섬에서 a번 섬으로 직접 이동하 룻 있으면, 두 섬은 연합을 결성하는 것이다. 그리고 주의해야할 점으로 a와 b가 연합을 결성하고 b와 c가 여합을 결성했다면 a와 c 역시 위 조건을 만족하지 않더라도 같은 연합에 속해있다고 보는 것이다. 따라서 예제 2번에서 1이 출력되는 것이다. static int count = 0; static boolean visited[]; static ArrayList[] graph; 먼저, static 필드로는 count.. 2023. 9. 4.
Deadlock 상황 만들어 VisualVM으로 분석하고, 해결하기 데드락(Deadlock) 운영체제 또는 소프트웨어의 잘못된 자원 관리로 인하여 둘 이상의 프로세스 또는 스레드들이 아무것도 진행하지 않는 상태로 서로 영원히 대기하는 상황을 말한다. 주로 한정된 자원을 여러 프로세스 및 스레드에서 동시에 사용하는 환경에서 서로 상대방이 사용 중인 자원을 쓰기 위해 대기하는 상황, 그러니깐 A가 B를 기다리고, B가 A를 기다릴 때 발생한다. 발생조건 상호 배제(Mutual Exclusion): 한 번에 한 스레드만 단독으로 리소스에 액세스할 수 있다. 즉, 리소스 자체를 동시에 쓸 수 없으며 한 번에 하나의 스레드만이 해당 리소스를 사용할 수 있다. 점유 상태로 대기(Hold and wait): 최소 하나의 스레드가 리소스를 점유하면서 다른 리소스에 대기를 해야 한다. .. 2023. 9. 3.
소켓을 활용한 Echo Server 만들기 소켓(Socket) 소켓은 네트워크에서 실행되는 두 프로그램 간의 양방향 통신 링크의 양 끝점을 말한다. 즉, 프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓을 열어서 소켓에 데이터를 써보내거나 소켓으로부터 데이터를 읽어들여야 한다. 다시 말해, 소켓은 떨어져 있는 두 호스트를 연결해주는 도구로써 인터페이스의 역할을 하는데 데이터를 주고 받을 수 있는 구조체로 소켓을 통해 데이터 통로가 만들어진다. 이러한 소켓은 역할에 따라 서버 소켓과 클라이언트 소켓으로 구분되는데 이에 대해서는 뒤에서 자세히 살펴보자. 소켓의 역할 클라이언트-서버 응용 프로그램에서 서버는 사용자가 원하는 정보를 전송하여 보여주는 서비스를 일부 제공한다. 이러한 클라이언트와 서버 간에 발생하는 통신은 신뢰할 수 있어야 한다. 즉.. 2023. 9. 1.
[구름톤 챌린지] 작은 노드 풀이 과정 먼저 노드들의 연결 정보를 담기 위해서 ArrayList[] graph를 선언하였다. 그리고 노드 개수만큼 반복하여 해당 인덱스마다 해당 노드가 연결된 정보를 담을 수 있게 new ArrayList();를 통해 할당하였다. 그리고 visited를 통해서는 해당 노드를 방문했을 경우 다음 노드를 방문할 수 있는 용도로 정의하였다. 그 후에 간선의 개수만큼 순회하며 입력된 간선의 정보를 통해 양 노드가 서로 연결되어 있기 때문에 양 노드 모두 해당 인덱스에 대한 ArrayList에 추가하도록 작성했다. 문제 조건 중에 방문할 수 있으면서 번호가 가장 작은 노드로 이동하기 때문에 해당 노드에 연결된 노드들을 오름차순으로 정렬했다. DFS 방식을 사용하여 시작 노드로부터 연결된 노드들을 순회하면 위에.. 2023. 9. 1.
[구름톤 챌린지] 통증 (2) 풀이 과정 먼저, 이 문제는 Dynamic Programming으로 해결할 수 있다. 예를 들어, 3, 4, 5 힐 아이템이 있다고 가정하고, 9라는 통증을 0으로 만들어야하는 상황을 가정해보자. 그 때, 3원의 동전으로 통증 3을 해결하는 방법은 1가지이고, 통증 6을 해결하는 방법은 통증 (6 - 3)을 해결하는 경우의 수 + 1 즉, 2가 된다. 그리고 마지막 통증 9를 해결하기 위해서는 통증 (9 - 3)을 해결하는 방법 + 1이 된다. 다시 4원과 5원을 봤을때 통증 4를 해결하는 방법, 통증 5를 해결하는 방법은 각각 1가지가 되고, 통증 9를 해결하는 방법은 통증 (9 - 4)를 해결하는 방법 + 1(본인) 즉, 2가지가 필요하다. 따라서 정답은 2가 된다. 이를 순서대로 다시 작성해보자. .. 2023. 8. 31.
Hash란? Java로 HashTable 구현하기 Hash Java의 hashCode 메서드를 공부하던 중 깊이있게 이해하기 위해서는 먼저 Hash에 대해 이해할 필요성을 느끼고 Hash에 대해서 먼저 정리해보기로 한다. 그러면 Hash란 무엇일까? Hash는 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑(mapping)한 값을 말한다. 해시 함수(Hash Function)이란? 해시 함수는 임의의 길이를 갖는 데이터를 고정된 길이의 데이터로 변환시켜주는 함수를 말한다. 해싱 함수의 특징 중 하나로는 결과값이 정해진 길이로 나오는데 1글자를 입력하거나 100글자 이상을 입력하더라도 똑같은 정해진 길이의 결과값을 반환한다. 그렇다보니 입력값이 다른데 같은 출력값이 나오는 해시 충돌이 발생할 가능성이 아주 낮지만 있다. 따라서 해시 충돌을 .. 2023. 8. 31.
타입 안전 이종 컨테이너와 수퍼 타입 토큰 타입 안전 이종 컨테이너 타입 안전 이종 컨테이너는 한 타입의 객체만 담을 수 있는 컨테이너가 아닌 여러 다른 타입(이종)을 담을 수 있는 타입 안전한 컨테이너를 말한다. 이렇게 하면 제네릭 타입 시스템이 값의 타입이 키와 같음을 보장해주는데, 이러한 설계 방식을 타입 안전 이종 컨테이너 패턴이라고 한다. 일반적으로 사용하는 제네릭의 한계 public class Favorites { List value; public static void main(String[] args) { Favorites names = new Favorites(); names.value.add("oneny"); names.value.add("twony"); Favorites numbers = new Favorites(); } } 제.. 2023. 8. 27.
프로세스 스케줄 프로세스 스케줄러 리눅스 커널에는 프로세스 스케줄러(Process Scheduler, 줄여서 스케줄러) 기능이 있는데 이 기능은 여러 개의 프로세스를 동시에 동작시키는 것처럼 보이게 한다. 이러한 스케줄러의 동작 방식은 다음과 같다. 하나의 CPU는 동시에 하나의 프로세스만 처리할 수 있다. 하나의 CPU에 여러 개의 프로세스를 실행해야 할 때는 각 프로세스를 적절한 시간으로 쪼개서(타임 슬라이스) 번갈아 처리한다. 프로세스 스케줄러 확인을 위한 테스트 프로그램 구현 테스트 프로그램 코드 더보기 // 필요한 헤더파일 및 상수 정의 #include #include #include #include #include #include #include #include #define NLOOP_FOR_ESTIMATI.. 2023. 8. 22.