Q&A 게시판

리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)

메모리 배리어 관련 질문입니다

작성자
배리어
작성일
2020-10-13 21:51
조회
264
안녕하세요.
블로그와 책을 보고 많은 공부를 하고 지식을 얻고 있는 학생입니다.

메모리 배리어에 관해 페이지( http://jake.dothome.co.kr/barriers/ )와 책 1.6.2장 을 보고 궁금한 것이 몇 가지 생겨서 글을 남기게되었습니다.

1. 메모리 배리어, dmb 혹은 dsb를 사용할때에는 항상 아래와 같이 코드가 작성되어야 하는 것인가요?
dmb ish
critical section
dmb ish

2. 만약 멀티코어 아키텍처의 모든 코어에서 동시에 배리어 인스트럭션을 사용하는 경우에는 어떻게 되는것인가요?
코어 간 (각 태스크)의 우선순위가 없는 경우 랜덤(혹은 아주 근소한 차이로 먼저 실행된 순)으로 배리어에 진입하게 되는 것인지, 아니면 데드락과 같은 문제에 빠지게 되는지 궁금합니다.

3. 배리어를 제한하는 영역으로 내부 공유가능(inner shareable)과 외부 공유가능 (outer shareable)이 있는데, 내부 공유 가능의 경우에는 메인메모리(DRAM) 을 제외한 각 코어의 캐시(LLC)까지만 을 포함하는것인지 궁금합니다.


항상 많은 지식을 배워 갑니다
감사합니다
전체 2
  • 2020-10-19 23:07
    안녕하세요?

    거의 매일 이 게시판을 주시하였었는데 질문이 올라와 있었던 것을 못보고 지나쳤습니다. 늦어서 죄송합니다.

    질문에 대한 답변을 하나씩 드립니다.

    1) critical section 은 내부에서 락에 사용되는 전역 변수에 대해 atomic 액세스를 하는데, cpu들 사이에서 경쟁하여 사용하므로 critical section의 위 아래로 메모리 오더링을 방지하는 메모리 베리어가 필요합니다. 다만 구현은 여러 종류의 critical section 마다 다릅니다. critical section의 양쪽을 메모리 베리어로 막지 않고, 규칙을 두어 설계하여 한 쪽만 구현하는 방법도 사용하고 있고, 최신 아키텍처가 지원하면 dmb 대신 더 고성능으로 동작하는 명령(_acquire, _release, relaxed 접미사가 붙은 atomic)을 지원하여 구현하고 있습니다.

    2) dmb ish는 inner share 영역의 코어들 즉, 리눅스 커널이 동작하는 cpu들이 공동으로 사용하는 R/W 버퍼를 비우도록 합니다. 동시에 명령이 도착하면 순서대로 처리하리라 예측됩니다. 첫 수행은 시간이 걸리고, 두 번째 요청은 이미 버퍼가 비워져 있으므로 더 빠르게 처리되리라 생각합니다. 하드웨어 개발자들은 동시 접근이 가능한 신호를 처리하기 위해 arbiter들을 설계합니다. (데드락 없이 아주 조금이라도 느리게 도착한 요청을 지연 시키리라 생각합니다)

    3) inner share 영역에는 리눅스 커널이 동작하는 ARM core들이 포함됩니다. outer share 영역은 주로 ARM 코어 뿐만 아니라 리눅스가 아닌 다른 펌웨어가 동작하는 GPU core 들이 이 영역에 포함됩니다. ARM 코어와 GPU 코어가 비디오 프레임을 갱신할 떄 주고 받는 데이터가 서로 공유된 RAM을 사용하는데, 이 공유된 영역을 사용한 후 동기화를 위해 dmb osh를 사용하여야 합니다. 물론 ARM 코어만이 사용하는 RAM 영역은 dmb ish를 사용합니다. 당연히 dmb osh가 dmb ish보다 느립니다. 따라서 꼭 필요한 경우에만 dmb osh를 사용하고, 그 외에는 dmb ish를 사용합니다.

    추가로 ish와 osh는 수동적으로 움직이는 캐시와 관련된 영역이 아니라, 능동적으로 동작하는 ARM 코어, GPU 코어 등의 메모리 갱신 주체인 Agent(옵저버) 영역을 의미합니다. 시스템의 ish 및 osh에 어떤 코어(agent, 옵저버)가 포함되었는지를 판단하시면 됩니다.
    예) ish 영역의 L1 데이터 캐시를 비운다. -> ish 영역(리눅스가 동작하는 ARM 코어들)의 모든 L1 캐시를 비운다.
    예) osh 영역의 dmb를 수행한다. -> osh 영역(리눅스가 동작하는 ARMv8 코어들과 GPU 펌웨어가 동작 중인 코어들 그리고 특정 펌웨어가 동작하는 ARM M3 코어들)의 dmb를 수행한다.

    아키텍처를 잘 파악하는 것은 고수로 향하는 관문입니다. 특히 베리어, Out-Of-Order execution/memory 및 Atomic 등의 병렬 프로그래밍 영역을 잘 파악해두면 깊은 실력을 갖게합니다.

    그럼 좋은 하루되세요. 감사합니다.

    • 2020-10-20 11:08
      안녕하세요.
      답변 달아주셔서 감사합니다. 제가 질문한 것 외에도 여러 가지 부가 설명을 해주신 덕분에 궁금증이 해결되었습니다.
      인스트럭션과 동작에 대한 것 외에도 말씀해주신 것처럼 아키텍처에서 어떻게 동작하는지 좀 더 공부를 해봐야겠습니다.
      좋은 하루 보내세요.