... | ... | @@ -2475,7 +2475,30 @@ Console.WriteLine(string.Format("{0:t}", DateTime.Now)); |
|
|
|
|
|
1. p430의 thread race condition에 대한 상세 설명을 부탁드립니다.
|
|
|
|
|
|
키워드는 thread context, atomic operation, register 등입니다.
|
|
|
키워드는 thread context, atomic operation, register 등입니다.
|
|
|
|
|
|
**1. number 변수는 0으로 초기화돼 있다.**
|
|
|
-> 힙 영역 내의 number 변수는 0인 상태이다.
|
|
|
**2. CPU 1번에서 t1 스레드를 실행한다. t1은 메모리로부터 number 변수의 값을 가져온다.**
|
|
|
-> 현재 t1 스레드가 실행중인 상태이고, 힙 영역 내의 number 변수의 값이 t1 스레드의 레지스터로 가져온 상태이다.
|
|
|
**3. t1 스레드는 number 변수의 값에 1을 더한다.(아직 저장을 하지 못했다.)**
|
|
|
-> CPU의 ALU에서 레지스터로 가져온 number 변수의 값에 1을 더한다. 아직 저장을 못했다고 한 이유는 연산을 마친 number 변수의 값을 다시 힙 영역에 기록하지 못했기 때문이다.
|
|
|
**4. CPU 1번에서 t1 스레드의 실행이 멈추고 t2 스레드를 선택해 실행한다.**
|
|
|
-> thread context switching이 발생한다. t1 스레드의 레지스터 값이 tcb에 저장된다.
|
|
|
**5. t2 스레드는 메모리에서 number 변수의 값을 가져온다. 현재 number 변수가 가리키는 주소의 메모리에 있는 값은 0이다.**
|
|
|
-> t2 스레드의 레지스터로 힙 영역 내의 number 변수의 값인 0을 가져온다.
|
|
|
**6. t2 스레드는 number 변수의 값에 1을 더한다.**
|
|
|
-> 마찬가지로 t2 스레드의 레지스터로 가져온 number 변수의 값에 1을 더한 것이다. 아직 힙 영역에 있는 number 변수의 값은 그대로 0인 상태이다.
|
|
|
**7. t2 스레드는 1로 증가된 number 변수의 값을 메모리에 저장한다.**
|
|
|
-> t2 스레드의 레지스터에 있는 number 변수의 값 1을 힙 영역의 number 변수에 저장한다.
|
|
|
**8. CPU 1번에서 t2 스레드의 실행이 멈추고 다시 t1 스레드를 선택해 실행한다.**
|
|
|
-> thread context switching이 발생한다. t2 스레드의 레지스터 값이 tcb에 저장되고, t1 스레드의 레지스터 값을 불러온다.
|
|
|
**9. t1 스레드는 마지막으로 3번 작업까지 수행했었다. 따라서 1만큼 증가시켰던 number 변수의 값 1을 메모리에 저장한다.**
|
|
|
-> t1 스레드도 t2와 마찬가지로 레지스터에 있는 number 변수의 값 1을 힙 영역에 저장한다. 힙 영역의 number 변수 값은 여전히 1이 된다.
|
|
|
|
|
|
=> 의도했던 결과는 t1과 t2가 number 변수를 각각 1씩 더해서 힙 영역의 결과가 2가 되는 것이었다. 하지만 2개의 스레드가 공유 자원으로 동시에 접근하여 의도와 다른 결과가 나타났다. 이처럼 두 개 이상의 스레드들이 공유 자원에 동시에 접근하여 나타나는 논리적 오류를 thread race codintion 라 한다.
|
|
|
|
|
|
atomic operation은 thread race condition을 방지 할 수 있다. atomic operation은 실행 도중에 다른 operation으로부터 간섭을 받지 않고, 전체 연산 중 하나라도 실패하면 전체 연산이 시작되기 전의 상태로 복구한다는 특성을 가지고 있기 때문이다.
|
|
|
|
|
|
2. DateTime.Now를 문자열로 아래와 같이 출력하고 싶습니다.
|
|
|
|
... | ... | |