05 Mar 2020
|
Java
String 클래스의 + 연산
백준 15651번 문제를 풀다가 코드 한줄로 복잡도 차이가 크게 나서 (특히 공간복잡도) 찾아본 내용을 정리한다.
사진을 보면 거의 공간복잡도가 2배 가까이 차이가 나는 것을 볼 수 있다.
그 이유를 아래 사진을 보며 알아보자.
###사진1
###사진2
차이점
-
위 사진을 보면 차이가 나는 것은 단 한 줄이다.
// arr[i]는 String 타입이다
// 사진 1
sb.append(arr[i] + " ");
// 사진 2
sb.append(arr[i]);
sb.append(" ");
-
String은 immutable한 객체이므로 + 연산을 할 경우 컴파일러가 런타임에 StringBuilder 또는 StringBuffer로 append 한 후 새로운 String 객체를 반환한다. 이로 인해 + 연산을 할 때마다 메모리에 새로운 String 객체가 생성되어 더 많은 공간복잡도를 차지하게 되는 것이다.
ref. doc
27 Feb 2020
|
OS
Process Synchronization
Critical Section
- 공유 데이터에 접근하는 코드
- 프로세스 1의 ‘X=X+1’, 프로세스 2의 ‘X=X-1’
Critical Section Problem
- 하나의 프로세스가 critical section에 있을 때 다른 모든 프로세스는 critical section에 들어가 수 없어야 한다
Critical Section Solution
- Mutial Exclusion (상호 배제)
- 프로세스 P(i)가 critical section을 수행 중이면 다른 모든 프로세스들은 critical section에 들어가서는 안된다
- Progress (진행)
- 아무도 critical section에 있지 않은 상태에서 critical section에 들어가고자 하는 프로세스가 있으면 critical section에 들어가게 해주어야 한다
- Bounded Waiting (유한대기)
- 프로세스가 critical section에 들어가려고 요청한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 critical section에 들어가는 횟수에 한계가 있어야 한다
-
turn variable 을 사용한다
-
상호배제조건은 만족하지만 진행조건은 만족하지 못한다
-
과잉양보 - 반드시 한번씩 교대로 들어가야한다.
-
특정 프로세스가 더 빈번히 critical section에 들어가야 한다면?
특정 프로세스는 critical section에 접근하지 않는다면?
-
interest(flag) variable을 사용한다
- Peterson’s Algorithm을 사용한다
- turn variable, flag variable 알고리즘을 합친 것
- 모든 조건을 충족하지만 busy waiting이 발생할 수 있다
- Test & Set Lock을 사용한다
-
하드웨어적으로 Test&Set을 Atomic하게 수행하도록 지원한다
-
Test-and-Set(lock)이 호출되면 Atomic하게 lock의 값(0 또는 1)을 읽고 1로 set 해준다
-
lock의 초기값은 0이므로 처음 호출한 프로세스가 진입하고 작업이 완료되면 lock=0으로 set 해줘서 다른 프로세스가 critical section에 접근할 수 있도록 만들어준다
ref. KOCW
ref. turn variable
ref. interest variable
ref. peterson’s algorithm