Skip to content

Commit

Permalink
read: 교착상태,경쟁상태,기아상태
Browse files Browse the repository at this point in the history
  • Loading branch information
yunseorim1116 committed Apr 21, 2024
1 parent 0785174 commit 8d9cd77
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 0 deletions.
34 changes: 34 additions & 0 deletions 파이브라인스오브코드/7장_컴파일러.md
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 컴파일러 활용
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.

0 comments on commit 8d9cd77

Please sign in to comment.