티스토리 뷰

Android/Android Multi Threading

2. 자바의 멀티 스레딩

안드로이드용용 2016. 7. 20. 09:43

스레드 정의

응용 프로그램 관점에서 스레드는 순차적으로 수행되는 자바 문장들로 이루어진 코드 경로의 실행이다. 하나의 작업에서 실행하는 작업의 단위를 '테스크' 라고 한다.

// Thread 정의 
private class MyTask implements Runnable {
    public void run() {
    int i = 0;
    }
}

// 사용 부분
Therad myThread = new Thread(new MyTask());
myThread.start();

CPU는 한번에 하나의 스레드를 실행시킬 수 있다. 그러나 일반적으로 시스템은 여러 응용프로그램이 동시에 처리해야하는 멀티스레드를 보유한다. 그러기 위해서는 CPU는 응용프로그램의 스레드 사이의 처리 시간을 공유해야 하는데 이는 스케줄러에 의해 스레드 우선순위에 따라 처리된다.

이ㄷ 때 고려해야할 사항은 우선순위에 의해서 처리되지 못하는 thread가 지속적으로 발생할 경우가 있는데 이를 기아(starvation)이라고 한다.


1. 싱글스레드

싱글스레드 구현은 순서가 결정적인 프로그래밍 모델이지만 명령어가 이전 명령어에 종속되지 않더라도 이전 명령어를 기다려야 하므로 시스템이 상당히 지연될 수 있기 때문에 적합하지 않다.


2. 멀티스레드 프로그래밍

응용프로그래밍 코드를 여러 코드로 분리할 수 있는데, 스레드의 수가 프로세서의 수를 초과하면 완벽한 동시성이 될수 없기 때문에 스케줄러를 통해서 스레드 사이를 바르게 전환하며 순차적으로 처리하여야 한다. 그러나 이럴때 프로그래머가 고려해야 할 사항이 매우 많다. 


자원 소비 증가

사용량 측면에서 오버헤드가 있다. 메서드 실행 중 지역변수 매개변수를 저장하는데 사용하는 전용 메모리를 할당한다. 여러 스레드가 활성화 되어 있을경우 그만큼 할당되는 메모리가 많아진다. 

프로세스 측면에서는 스레드를 설정 및 해제할 때 소모데는 문맥 교환에서 오버헤드가 생기고 성능이 저하될 수 있다.


복잡성 증가

소스만 봐서는 스레드 실행 순서를 알 수 없기 때문에, 오류를 디버깅하기가 매우 어려워지고, 멀티 스레드를 조정할 필요성이 새로운 오류를 낳을 위험도 생김.


데이터 불일치 

두개의 각각 다른 스레드가 하나의 자원을 접근할 경우, 해당자원이 먼저 증가할 수도 있고 감소할 수도 있다.

해결 방법 : 메서드라면 synchronized키워드를 붙이고, 변수라면 Atomic 변수로 선언한다.


2.2 스레드 안전

멀티프로세스 프로그래밍을 할 때 반드시 고려되어야 할 사항이다.

임계영역 (critical section) : 스레드에 의해 변경되는 도중에 다른 스레드 접근이 가능한 모든 변수를 쓰거나 읽을 때 쓰는 코드에 적용되어야 한다.


객체 암시적 잠금 :  synchronized 키워드 사용

명시적 잠금 : ReentrantLock, ReentrantReadWriteLock 사용



'Android > Android Multi Threading' 카테고리의 다른 글

6. 메모리 관리  (0) 2016.07.29
5. 프로세스 간 통신  (0) 2016.07.28
4. 스레드 통신  (0) 2016.07.26
3. 안드로이드 스레드  (0) 2016.07.25
안드로이드 멀티스레딩 정리 개요  (0) 2016.07.20
댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
66,013
Today
0
Yesterday
10
TAG
more
«   2022/12   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함