=> 동시성 문제는 비교착상태, 교착상태 이 두 가지로 나뉜다.1. 비교착 상태 문제1-1. 원자성 위반 오류=> 원자성 위반 오류는 문맥 교환이 발생하지 않을 것이라 생각하여 발생한다.=> 단순 +1 연산이라도, OS 단에서는 3가지의 명령으로 또 나뉠 수 있다.=> 이러한 과정을 생각하지 못했을 때 발생하는 오류가 원자성 위반 오류이다.Thread 1=> if 문으로 NULL이 아님을 확인한다.=> fputs 함수는 proc_info를 참조한다.Thread 2=> proc_info를 NULL로 한다. => 이제 이 과정을 섞어보자.=> 실제로 문맥 교환은 언제 어디서 일어날 줄 모른다.Thread 1=> if 문으로 NULL이 아님을 확인한다.Thread 2=> proc_info를 NULL로 한다...
https://www.acmicpc.net/problem/16235이 문제는 개극혐이다.그냥 구현이다. 클래스를 나누고 메서드를 나누면 쉽게 풀린다.다만, 시간이 엄청 오래걸린다.import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.*;public class Main { /** * 봄 => 나이만큼 양분먹음, 나이 1증가, 여러개의 나무 가능, 양분못먹으면 죽음 * => 나이대로 정렬이 필요 특정 시점부터 여름 적용 필요 * 여름=> 죽은 나무 양분됨. 죽은나무 나이/2가 양분으로 추가됨 * => 봄에서 한 번에 처리 * 가을=..
=> CPU 사용량이 많은 서비스나 로직 등을 실행할 때, 스핀을 통한 락 프리 알고리즘을 사용하게 되면, CPU 사용량이 증가하고, 스핀 시간동안 시간을 낭비하게 된다.=> 어차피 오랜 시간 CPU를 하나의 쓰레드가 잡고 사용할 때는, 그 연산에 집중할 수 있게, 다른 쓰레드를 블록함으로 정합성도 챙 기고, 스핀으로 인한 시간 낭비를 제거함으로 더 효율적으로 연산을 처리할 수 있다.=> 이때, I/O와 같은 CPU 처리가 아닌 처리가 있다면, 블록을 통해 CPU 처리를 멈추고, 디스크 드라이버 처리로 전환한다.=> 이어서, 다른 쓰레드가 락을 획득 후 CPU 처리를 한다.=> 락은 임계 영역의 동시성을 책임진다.1. 뮤텍스와 컨디션 변수, 모니터 락=> 위에서 언급한 것처럼 뮤..
https://www.acmicpc.net/problem/17609이번 문제는 유연한 사고가 필요한 문제였다.건너뜀을 재귀로 처리하면 아주 쉽게 풀리는 문제였다.문제 분류를 보고 투포인터로만 풀어보려고 하는 오류를 범하고 말아따~ import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { static int T; static String[] str; static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); public static void ..
1. 이 개념으로 어떻게 최적화를 할 수 있을까?=> 트랜잭션을 적용=> 비즈니스 로직 특성을 고려하여, 발생할 수 있는 이상현상 체크=> 락이나, Lock-Free 등의 정합성을 해결할 수 있는 방법을 고안=> 적용 2. JPA에서의 트랜잭션 격리 수준 적용 과정=> Spring Boot + JPA에서는 커넥션 생성 비용을 줄이기 위해 Connection Pool에 Connection들을 생성해 저장해둠=> @Transactional(isolation = Isolation.{사용할 격리 수준}) 으로 격리 수준 선언=> Connection을 ConnectionPool에서 가져온 후 Connection.setTransactionIsalation() 메서드로 격리 수준 설정=> 비즈니스 로직 수행=> 커밋..
AtomicIntegerint 값을 원자적으로 다룸AtomicLonglong 값을 원자적으로 다룸AtomicBooleanboolean 값을 원자적으로 다룸AtomicReference객체 참조를 CAS로 변경AtomicStampedReference참조 + 버전(stamp) 을 같이 CASAtomicMarkableReference참조 + boolean 마크를 같이 CASAtomicIntegerArrayint[] 배열의 원소를 CAS로 다룸AtomicLongArraylong[] 배열의 원소를 CAS로 다룸AtomicReferenceArrayT[] 배열의 원소를 CAS로 다룸AtomicIntegerFieldUpdater객체 내 int 필드 업데이트용AtomicLongFieldUpdater객체 내 long 필드 ..
우선 순위대로 차례로 정리해본다.각 번호(대 분류)마다, 순서대로 고려. 번호-n(소 분류)마다, 상황에 따라 고려. 1. DB 최적화, 자료구조(운영체제 공부, DB 공부 선행할 것)=> 기본적인 속도를 높여 최적화한다.=> 데이터 구조 자체를 효율적으로 해야 한다.1-1. 인덱싱1-2. 파티셔닝1-3. 정규화 vs 반정규화1-4. 조회/갱신 쿼리 튜닝1-4-1. JOINhttps://icanchangeworld.tistory.com/167 인덱스를 탈 수 있는 쿼리에서는 옵티마이저는 무조건 NLJ 방식을 사용한다.=> NLJ는 Nested Loop Join으로 그냥 루프를 돌려 조인을 수행한다고 보면 된다.1-1. NLJ는 " data-og-host="icanchangeworld.tistory.co..
추상화란?복잡한 자료, 시스템에 대해 핵심적인 기능만 드러내고, 세부적인 사항들은 감추는 것을 말한다. 우리 사회에서는 여러가지로 추상화된 것들을 볼 수 있다.버스를 탈 때, 그저 '카드를 찍음'이라는 행동으로 승차 권한을 얻을 수 있다.사진을 찍을 때, '터치 함'이라는 행동으로 사진을 저장할 수 있다. 우리는 모든 것에 대한 전문가가 아니기 때문에, 추상화된 것들을 보고 사용하며 살아간다.추상화라는 개념은 이처럼 전문가가 아닌 사람에게도, 많은 경험을 선사할 수 있게 한다. 하지만, 추상화를 함으로 많은 오류를 범하게 된다.이러한 것들을 '일반화의 오류'라고 부른다.일반화의 오류란 특정 사례를 근거로 전체를 단정짓거나 일반화를 하는 것을 말한다. 세상의 사건들은 다양하고, 기적적인 요소들의 협력에서 ..