나 어제 하루 죙일 잠자면서 "내가 어쩌다가 이런 거대한 장벽을 만났는가"
곰곰히 곱씹어봤거든??
그러면서
하나 하나씩 해치워나갈 생각을 해봤어.
그랬더니 이런 결과물이 나오더라고.
아마, 찍먹하다가 못따라가겠어서 드랍친, "멀티프로세서 동기화"수업에서 나름 찍먹해보고 배운것들을 토대로 발전시켜나갔을텐데,
Concurrent Object?? 여하튼 각각의 객체마다 그들의 Concurrency 에 대한 성질을 규명시켜줄 필요가 있어.
변경에는 타이밍이 있다.
내가 보고 있는 OS의 경우에는 세가지로 나뉘어.
1. 인터럽트에 의한 변경
: 커널권한코드에서도, 유저권한 코드에서도 언제든지 변경이 일어날 수 있는 대상이야.
명시적인 차단은 cli 와 sti 로 이루어져. (커널권한에서밖에 사용할 수 없음)
2. 스케쥴링에 의한 변경
: 이것은, 유저프로세스 내부에서는 인터럽트와 마찬가지로, 언제든지 변경이 일어날수 있는 대상이고,
커널권한 프로세스에서는 내가 직접 스케쥴링을 다른 컨텍스트에게 넘겨주지 않는 이상, 변경되지 않을거라는 보장이 있어.
또한, 스케쥴링에 의한 변경은 lock 이라는 데이터구조를 소프트웨어에서 구현해 준다면, 변경을 의도적으로 막을 수 있어.
다만 이 lock이라는 개념은 인터럽트 단계에서는 진행하지 않음.
lock 은 sleep으로 구현하면서 스케쥴링을 받자마자 바로 다른녀석한테 넘겨주는 방식으로 구현하지만
인터럽트를 실행중에 스케쥴링을 다른녀석한테 넘겨주는 경우는 나는 본적이 없어.
3. 멀티쓰레딩에 의한 변경
: 이 부분은 현재 내가 다루지 않는 부분이지만.... 인터럽트에 의한 변경보다도 더 빡센 변경사항이 됨. 일단은 없는걸로 간주하겠음.
그렇다면 모든 객체에 대해서,
0. 어떤 조건 하에서
1. 인터럽트에 의해 / 스케쥴링에 의해
2. 어떤 필드가 변경될 수 있는가
를 명시해주면 돼.
근데, 이걸 명시하려고 하다보면
nested 가 발생해.
예를 들면 이런거야.
request 라는 객체는,
해당 device가 하드디스크를 가리킬 경우,
인터럽트에 의해서,
bh -> b.update 가 변경될 수 있다.
라는 게 있다고 해봐. (이런 것들이 무지하게 많아.)
근데, 저거는 bh 필드의 내부 필드가 변경되었기 때문에 다른말로는
bh 라는 객체는,
해당 device 가 하드디스크이며,
리퀘스트 큐 안에 들어있는 경우, (그리고 이는 필연적으로 bh의 lock 이 걸려있다는 것을 내포함)
인터럽트에 의해서
b.update 가 변경될 수 있다.
이런식으로 nested 되어 있거든,
거기다가 조건절 또한 nested 가 이루어져있다는것을 알 수 있음.
그니까 저런걸 이제 잘 조합하면,
bh를 unlock 하고 나오면,
아 b.update 가 변경되는 상황은 아니다 (다른 추가 명제들도 전부 따져봐야하는거긴함)
이런식으로 concurrency를 따질 수 있게 되는거야.
결국
모~~~~~~든 명제를 전부 기입해야돼.
그리고
해당 오브젝트 중심으로
해당 오브젝트의 성질을 기반으로,
무엇이 변경되지 않는 성질이고 무엇이 어느단계에서 변경될 수 있는 성질인지를 알 수 있어.
이걸
"자동화 할 수 있어"
비쥬얼라이즈 할 수 있다고
사실 멀티프로세서 동기화 수업이 마음에 안들었던 이유는 내 모든 논리와 분석의 시초가 저 "타이밍" 에 대한 이야기거든? 결국 하드웨어부터 올라가서 실제로 무엇이 변경될 수 있는지를 따져보는 그런건데 하드웨어랑 별개로 소프트웨어 내부에서 닫힌이야기를 하다보니 나한테 뭔가 와닿지가 않더라. 반대로 말하면 내가 못따라가던것도 맞아. 내 두뇌가 약간 사람친화적이라기보단 컴퓨터친화적인 방향으로 대상을 이해함
그냥 코드에서 딱 객체를 찝어.그러면 해당 객체의 class 가 있겠지해당 class 의 객체들에 대한 concurrency 에 대한 성질이 있을거고그걸 기반으로해당 필즈들을 쭈루룩 띄워주면서"인터럽트 단계에 의해 변경가능한 필드는 ~~입니다"
"스케쥴링 단계에 의해 변경 가능한 필드는 ~~ 입니다" "나머지는 안전합니다" 이런식으로 보조 도움말 띄워지지?? 그러면 컨커런시 그냥 정복이야. 그거는 컴파일러 단계에서 실행이 가능한 부분이고
음..컴파일러 단계라 함은 텍스트 에디터가 해줄 수 있는 작업이란 뜻이고
물론, 러스트의 경우는 모든 걸 전부 가변 참조와 일반 참조로 나누어서 가져가서 전부 퉁치기때문에 이런게 필요 없겠지만 일단 내가 보고 있는 C 코드는 이런식으로 작동하는걸 어떡함 그리고, 러스트의 참조자 규칙 또한 유저프로세스 단계에서만 성립하는 개념이라서, 공유하는 데이터를 건네주는 과정에서 결국 안전성을 최대한으로 올려서 보내버림 그니까 최적화랑은 거리가 좀 먼 개념이라는거임. 결국 바깥으로 내보낼 때에 안전성을 최대한으로 올리기 땜에 한마디로, "모든 필드는 인터럽트 단계에서 변경될 수 도 있습니다" 라고 퉁쳐버리는 개념임
좀 더 발전시킬 수 있다는 거지. 그리고 지금 내가 이야기하는 부분, 내가 러스트를 학문이라고 생각한다 그랬지?? 좀 중요한 얘기같고 내가 최초의 발안자가 절대 아닐거란말이니까 어떤거 공부하면 되는건지, 그리고 해당 툴이 현재 시중에 나온게 있는지 없다면 왜 없는건지 알려주면 고맙겠음
그냥 존나 쉬운 말로는, 1. 루틴이 침략받는 타이밍은 하드웨어상으로 정해져있다. 2. 각 오브젝트 별로 각 타이밍 별로 손상받을 수 있는 필드에 대한 규명이 가능하다. 3. 그것을 기반으로 컴파일링 단계에서 컨커런시에 대한 정복이 가능하다.