목록

    임계 구역과 경쟁 상태

    임계 구역 (Critical Section) 임계 구역이란 한 번에 하나의 프로세스 혹은 스레드만 접근 가능한 코드 영역으로 공유 데이터에 접근하는데 있어서 문제가 발생하지 않도록 하나의 접근만 허용함을 보장한다. 일반적으로 4가지의 코드 영역으로 나눠 볼 수 있는데 그 특징은 아래와 같다. entry section critical section에 진입하기 위해 진입 허가를 요청하는 영역으로 접근을 제어(lock)한다. critical section 하나의 프로세스 혹은 스레드만 접근 할 수 있는 영역 exit section 제어(lock)을 해제하는 등, 더 이상 임계 구역에 존재하지 않을 때 알리는 역할을 하는 영역 remainder section 입력, 중요, 종료 세션을 제외한 나머지 코드 부분의..

    [Kotlin] Coroutine 동기화 처리

    멀티 스레드 처리는 애플리케이션의 퍼포먼스에 큰 이점을 주지만 경쟁 상태(race condition)를 적절히 조절해 주지 않는다면 데이터의 손실을 야기할 수 있다. - 경쟁 상태란 여러 개의 스레드가 하나의 공유/변경 가능한 자원에 접근하는 것을 말한다. 자세히 보기 데이터 손실을 막기 위해서는 동기화(synchronization)를 통해 race condition을 제어하여 올바른 멀티 스레드 환경을 구축해야 한다. 그러기 위한 여러 방법 중 하나로 Mutex를 고를 수 있다. Mutex Mutex는 공유자원에 변경이 일어나는 순간 적절한 block을 통해 race condition을 제어하는 동기화 제어 기법이다. 코드가 임계 구역에 있는 경우 절대로 동시성이 발생하지 않게 하고 오직 하나의 루틴만..

    [Android] RecyclerView DiffUtil

    정의 RecyclerView에 현재 보이고 있는 Item에 변경이 일어날 경우 notifyItemChanged()를 통해 변경을 알려 새로고침을 해야 한다. 하지만 이 메소드를 통한 변경 알림은 adapter가 새로운 item 인스턴스를 생성하기 때문에 비용이 많이 들게 된다. 이러한 비효율적인 작업을 줄이고 합리적인 Item 변경을 위해 DiffUtil이 개발되었다. 이 클래스는 이전 목록과 새로운 목록 간의 차이점을 찾고 업데이트가 필요한 목록을 찾아 반환하여 RecyclerView의 adapter에 업데이트를 알린다. 위 동작의 기반은 Eugene W.Myers의 차이 알고리즘을 적용하여 최소한의 업데이트 수를 계산한다. 사용법 DiffUtil.Callback은 추상 클래스로 위에서 언급한 두 목록..

    [Kotlin] inline 함수

    코틀린 inline 코틀린에선 고차 함수를 사용할 수 있다. 함수를 인자 혹은 반환값으로 사용할 경우 내부적인 동작에서 무의미한 객체/함수를 생성하여 메모리를 낭비시키고 성능 저하를 일으킬 수 있다. 이러한 무의미한 행위를 줄이기 위해 inline 키워드가 제공되는데, 해당 키워드를 사용할 경우 고차 함수 내부의 코드가 그대로 복사되므로 위에서 말한 페널티를 줄일 수 있다. 원본 코드 fun main(){ val someText = foo("main"){ println("in") } } fun foo(value: String, doSomeThing: () -> Unit): String{ doSomeThing() return value + "foo()" } 인라인이 아닐경우 (Java 변환) public ..

    [Android] Context

    Context는 어플리케이션 환경에 대해 글로벌 정보를 갖는 일종의 인터페이스로써 android 시스템에서 구현체를 제공하는 추상 클래스로 어플리케이션 별 리소스 및 클래스 접근에 사용되며, Actvity 실행, BroadCast, Intent 수신 등 어플리케이션 수준의 작업에 사용된다. Context의 역할을 요약해보면 아래와 같다. 어플리케이션의 현재 상태를 나타낸다. 액티비티와 어플리케이션의 정보를 얻기 위해 사용할 수 있다. 리소스, 데이터베이스, shared preference 등에 접근하기 위해 사용한다. 액티비티와 어플리케이션 클래스는 Context 클래스를 확장한 클래스다. Context는 여기서 두 종류로 나눠 볼 수 있다. - Application Context - Activity C..

    [Kotlin] Flow

    Flow란? 코틀린의 플로우는 순차적으로 값을 내보내고 정삭적으로 또는 예외로 완료되는 비동기적 데이터 스트림이다. map, filter, take, zip 등과 같은 flow의 중간 연산자는 업스트림 flow나 flow에 적용되어 추가 연산자를 적용할 수 있는 다운 스트림 flow를 반환하는 함수다. 위 중간 연산자는 flow에서 코드를 실행하지 않고 함수 자체를 일시 중단하지 않는다. 단지 향후 실행과 신속한 복귀를 위해 일련의 작업을 설정한다. 이를 cold flow라고 부른다. flow의 터미널 연산자는 collect, single, reduce, toList 등과 같은 일시 중단 함수이거나 지정된 스코프에서 flow 수집을 시작하는 launchIn 연산자이다. 이는 업스트림 flow에 적용되며 ..