-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
0785174
commit 8d9cd77
Showing
3 changed files
with
110 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
## 7.1.8 약점 : 아웃-오브-바운드 오류는 어플리케이션을 손상시킨다. | ||
|
||
컴파일러가 곤란해하는 또 다른 경우는 우리가 직접 데이터 구조에 접근할 때이다. | ||
데이터 구조의 범위 내에 있지 않은 인덱스에 접근하려고 하면 아웃-오브-바운드 오류가 발생한다. | ||
|
||
이 문제를 피하기 위한 두 가지 해결책 | ||
|
||
## 7.1.9 무한 루프는 어플리케이션을 지연시킨다. | ||
|
||
## 7.1.10 약점 : 교착 상태 및 경쟁 상태로 인해 의도하지 않은 동작이 발생한다. | ||
|
||
### 경쟁상태(Race Condition) | ||
|
||
둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 공유자원에 동시에 접근하여 결과값에 영향을 줄 수 있는 상태 | ||
|
||
### 교착상태(Deadlock)상태 | ||
|
||
두개 이상의 작업(프로세스 or 스레드)이 서로 상대방의 작업이 끝나기만을 wait하고 있기 때문에 아무도 작업을 끝내지 못하는 상태 | ||
|
||
: 경쟁상태(raceCondition)에서 서로 lock을 가졌을 때 생길 수 있는 상태 | ||
|
||
모든 작업들이 자원을 얻지 못해 다음 처리를 하지 못하는 상태로, '교착 상태'라고도 하며, 시스템적 작업(프로세스 or 스레드)들이 서로 필요한 자원을 한정적으로 서로 가지고 있을 때 발생한다. | ||
|
||
# 7.2 컴파일러 사용 | ||
|
||
프로그래밍은 건축이 아닌 여러 단계의 커뮤니케이션이다. | ||
|
||
- 컴퓨터에게 무엇을 하라고 지시할 때 우리는 컴퓨터와 의사소통한다. | ||
- 다른 개발자들이 우리의 코드를 읽을 때 우리는 그들과 의사소통한다. | ||
- 컴파일러에게 코드를 읽어달라고 할 때마다 우리는 컴파일러와 의사소통한다. | ||
|
||
따라서 프로그래밍은 문학과 훨씬 더 많은 공통점을 가지고있다. | ||
|
||
# 7.2.1 컴파일러 활용 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
/* | ||
7.10 경쟁 상태에 대한 의사 코드: | ||
두 개 이상의 스레드가 공유하는 변수를 읽고 쓰기 위해 경쟁할 때 발생한다. | ||
이때 일어날 수 있는 일은 두 스레드가 업데이트 하기 위해 동시에 동일한 값을 읽는 것이다. | ||
*/ | ||
|
||
class Counter implements Runnable { | ||
private static number = 0; | ||
run() { | ||
for (let i = 0; i < 10; i++) { | ||
console.log(this.number); | ||
} | ||
} | ||
} | ||
|
||
let a = new Thread(new Counter()); | ||
let b = new Thread(new Counter()); | ||
|
||
a.start(); | ||
b.start(); | ||
|
||
/* | ||
7.12 교착 상태에 대한 의사 코드: | ||
두 스레드가 모두 잠겨 있고 계속 진행하기 전에 서로가 잠금 해제를 기다리고 있다. | ||
이에 대한 일반적인 비유는 두 사람이 하나의 출입구에서 마주쳐 상대방이 먼저 통과해야 한다고 주장하는 것이다. | ||
*/ | ||
|
||
class Counter2 implements Runnable { | ||
private static number = 0; | ||
constructor(private mine: Lock, private other: Lock) {} | ||
run() { | ||
for (let i = 0; i < 10; i++) { | ||
mine.lock(); | ||
other.waitFor(); | ||
console.log(this.number++); | ||
mine.free(); | ||
} | ||
} | ||
} | ||
|
||
let aLock = new Lock(); | ||
let bLock = new Lock(); | ||
|
||
let a2 = new Thread(new Counter2(aLock, bLock)); | ||
let b2 = new Thread(new Counter2(bLock, aLock)); | ||
|
||
a2.start(); | ||
b2.start(); | ||
|
||
/* | ||
7.14 기아에 대한 의사 코드 | ||
여기서 문제는 b가 실행될 수 없다는 것이다. | ||
이런 상황은 매우 드물지만 기술적으로 가능하며, 이를 기아 상태라고 한다. | ||
*/ | ||
|
||
class Printer implements Runnable { | ||
constructor(private name: string, private mine: Lock, private other: Lock) {} | ||
|
||
run() { | ||
while (true) { | ||
other.waitFor(); | ||
mine.Lock(); | ||
console.log(this.name); | ||
mine.free(); | ||
} | ||
} | ||
} | ||
let a3 = new Thread(new Printer("A", aLock, bLock)); | ||
let b3 = new Thread(new Printer("B", bLock, aLock)); | ||
|
||
a3.start(); | ||
b3.start(); | ||
|
||
/* | ||
결론: ..최선의 조언은 데이터를 공유한느 다중 스레드를 사용하지 말라는 것이다. | ||
*/ |
Empty file.