@ 개념적인 이해부터 먼저 공부하겠습니다.
@ 스마트폰에서는 굉장히 방대한 OS인 Linux가 수행됩니다.
// 또한 CPU 코어도 증가하고 있습니다.
> CPU를 늘리는 이유는 무엇일까요?
.. 성능이 원활하게 일어나게 하기 위해서
@ 일반적으로 CPU 성능이 증가되었을 때,
// Linear하게 소프트웨어를 핸들링하는 것을 원하지만
> 실제로는 그런일이 발생하지 않습니다.
@ CPU능력이 어느 순간에 다다르면
// 더 이상 증가하지 않는 능력은
> 이를 Synchronization 문제라고 합니다.
@ 예전에는 Rockup 상황이 많았습니다.
// 화면이 Prize되는 상황입니다.
> Input key를 눌렀을 때, Interrupt가 발생하기 않을 때 발생합니다.
.. 이 문제가 Synchronization 문제로 일어나고
.. 데드락이 발생합니다.
// Interaction이 중요한 스마트폰에서는 굉장히 중요한 문제였습니다.
@ Synchronization은 무슨 문제일까요?
// Syn : Together
// Chronization : Timely
// 프로세스들이 동시간에 인터렉션할 때 발생합니다.
> 프로세스는 Design Time entity가 되어
.. Decomposition된 프로세스들끼리 Interaction을 해야 합니다.
.. 모듈러 디자인
> Degree of concurrency를 높여야 합니다.
.. Thread가 많을 때 일을 수행해야 합니다.
> Process가 많아질 수록 Resource를 쉐어할 수 있어야 합니다.
// 이렇게 Interaction을 할 때 문제가 발생합니다.
// 그리고 이보다 더 많은 Interaction이 존재합니다.
> Resource sharing 관점에서는
.. Logically 관련이 없는 것들도 Interaction을 합니다.
// 유의미한 S/W System을 개발하면 이 문제를 피할 수 없습니다.
@ 이렇게 Process가 Interaction을 하면 특징이 있습니다.
// Resource Sharing, 컴퓨터 시스템 상태 Sharing
> 메인메모리나 레지스터
.. 물리적인 장치 뿐 아니라 정보도, Global Information이 공유의 대상입니다.
// 프로세스의 수행이 non determinstic 해집니다.
> 프로세스 수행의 결과가 reproduce가 되지 않습니다.
.. 디버깅을 하기 힘들게 됩니다.
@ 실제로 어떤 나쁜 영향을 미치게 될까요?
@ 원자로 모니터링을 예시로 들겠습니다.
// 원자로의 온도센서 두개를 모니터링하겠습니다.
> 차이가 어떤 범위를 넘어가면 알람을 발생합니다.
// 이 프로그램은 제대로 동작하지 않습니다.
> 이 상황은 Non Reentrant Code입니다.
> Reentrant Code (재진입 가능 코드)
.. 여러 Process들에 의해 동시에 호출되거나,
.. 이전 호출이 완료되기 전에 반복 호출되어도 올바르게 수행되는 코드
// 현재 코드는 Interrupt와 main이 concureent하게 움직이며
> shared Resource는 itempratures입니다.
.. itemp0 = <...> 를 수행할 때 10을 받은 후
.. interrupt가 발생하게 되면 (온도 수정)
.. itemp1 = <...> 를 수행할 때에는 수정된 온도가 들어가서
.. 알람 시스템은 정상적인 수행을 하는게 아니게 됩니다.
// 이 문제를 해결하기 위해서는
> 온도를 불러오는 구간을 한번에 불러올 수 있게 만들면 됩니다.
.. 밑은 잘못된 예시를 보여드리겠습니다.
..
.. 어셈블리 코드상 둘은 나뉘어져 있습니다.
> 실제로 Reentrant하게 만들기 위해서는
.. Interrupt를 Disable해야 합니다.
@ 이와 같이 Synchronization 문제는
// 성능 뿐만 아니라, 결과에도 영향을 미치게 됩니다.
@ 위와 같은 상황에서 Non-interrupt operation을 구현해야 한다는 것을 알 수 있습니다.
> 이 Operation을 구현하는 것은 S/W적 만으로는 힘듭니다.
@ Synchronization 문제는
// Resource를 매니징 해주지 않아
> 누구나 다 접근을 해버리는 상황에서 발생합니다.
.. Race Condition
.. OS가 아무것도 해주지 않아, 문제가 발생하는 현상
@ 이런 상황이 발생하지 않게 하기 위해서
// Process와 Interrupt 사이에서는 Interrupt Disable을 사용합니다.
// 마찬가지고 Process와 Process 사이에서도 Interrupt Disable을 사용합니다.
> 어느 코드 섹션을 non-Interruptable 하게 만들면
.. 이를 Critical secssion이라고 합니다.
.. 그리고 이때는 Mutual Exclution 해야 합니다.
@ 그렇다면 Mutual Exclution은 어떻게 구현할까요?
// 요구사항은 다음과 같습니다.
> 언제나 하나의 프로세스만 허용되어야 합니다.
> 여러개의 프로세스가 진입을 원하면 하나만 허락해야 합니다.
> Critical Secssion안에 들어가면 최대한 빨리 나와야 합니다.
> 빈번히 발생하기에 성능도 좋아야 합니다.
// 위의 요구사항을 만족하기 위해서 필요한 것은 바로
> Interrupt Disable과 enable입니다.