Operating System : 운영체제 (2)

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

6. Process Synchronization

@ 개념적인 이해부터 먼저 공부하겠습니다.

 

@ 스마트폰에서는 굉장히 방대한 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입니다.

댓글

댓글 본문
버전 관리
박천명
현재 버전
선택 버전
graphittie 자세히 보기