Swifter {Swift Developer}

메뉴

지나칠 수 있는 Swift 기초 – 스레드편

프로젝트를 하다보면, 가끔 개발자들이 고생하는 부분이 비동기 처리를 구현할 때라고 생각된다. 이중에서 가장 큰 이유는 사실 디버깅이다. 이는 처리 순서도를 머리속으로 이해하고 있지 않으면 할 수 없는 것으로 교착상태등이 발생하는 것이 이슈이다.

멀티쓰레딩

컴퓨터의 처리 플로우차트에 표기하는 분기나 반복처리를 나열해보면 다음과 같다.

pc-flowchart

이런 처리의 속도를 높이기 위해 여러가지 작업을 병렬로 실행하는 프로그램을 멀티스레드 프로그램이라고 한다.

스레드를 사용할 경우 주의점

  • 멀티스레드 처리를 한다고 해서 처리 속도가 오르지 않고 성능저하가 발생할 수 있다.
  • 교착 상태로 인한 중단이나 데이터 무결성이 망가질 수 있어 디버깅이 어렵다.

구조

작업

  • 프로세스
    • 스레드
    • 스레드
  • 프로세스
    • 스레드
    • 스레드
    • 스레드

스레드 ∈ 프로세스 ∈ 작업

프로세스는 메모리 영역을 공유하지 않지만, 새 프로세스를 생성시 CPU나 메모리공간등을 할당하게 됨에 따라 메모리를 많이 사용한다. 스레드는 메모리 영역을 공유하기 위해 교착 상태등을 일으킬 위험성도 있지만 메모리 효율은 좋다.

그렇기 때문에 프로세스에서 메모리를 공유할 수 있는 부분을 스레드에서 실행한다. 따라서, 메모리를 절약하고 관리하지 않으면 안되는 부분이 적어지고 균형을 잡아 설계하는 것이 중요해진다.

사용하는 형태에 따라 주의해야할 점

멀티스레드가 효과를 발휘하는 경우는 한정되어 있다. 예를들어, 응답 시간의 향상을 말할 수 있다. 이 경우, 고속화되는 것은 사용자가 본 반응에 대해 처리하는 것으로 실제 완료까지의 처리량은 오버헤드가 추가되어 처리 자체를 고속화하는 것은 아니다. (오버헤드는 처리를 실행하는데 간접적으로 소요되는 처리시간을 말함)
스레드의 생성과 스케줄링에 큰 오버헤드 부하가 CPU에 걸리기 위해 명확하게 처리하는 것이 어렵지만 교착상태가 발생하지 않도록 잘 설계하지 않으면 안되기 때문에 다양하게 고려해야 한다.

CPU의 동작

CPU는 하나의 작업만 수행할 수 없기 때문에 (멀티프로세서 제외) 멀티스레드 프로그램에서는 CPU가 고속으로 여러 처리를 전환 실행하고 있다. 이 전환동작을 컨텍스트 스위치라고 말한다.

—|A처리|B처리|A처리|B처리|—>

멀티스레드를 구현하는데 필요한 것은 응답시간 및 처리량(단위시간당 처리능력)을 명확하게 인식할 수 있어야 하며, CPU가 느린 장치의 처리결과를 기다릴 때 발생하는 시간 낭비를 멀티스레딩을 사용하여 처리한다.

디스크에 있는 모든 파일을 나열하는 처리를 한다면 디스크에 접근하는 시간이 매우 길어지지만 그 동안 CPU에서 처리하는 것은 거의 없다. 이런 것을 유휴CPU시간이 성능 향상의 여지가 될 수 있다. 즉, 디스크에 대한 접근을 다른 스레드에 밑기고 메인스레드는 CPU를 이용한 다른 작업을 수행하여 전체 처리량 향상을 도모할 수 있다. 예를 들어, 웹사이트를 표시하는 경우 HTML파일과 페이지에 포함된 리소스(이미지, CSS, JS)파일들의 다운로드를 다른 스레드에서 실행하여 표시시간을 단축한다.

Swift언어에서 스레드 확인하기

메인스레드에서 실행되고 있는지 확인하기

NSThread isMainThead

스레드 No얻음

NSThread currentThread

  • 스레드 안전 – 코드를 여러개의 스레드가 동시 병행적으로 실행해도 문제가 발생하지 않는다는 것을 의미함
  • 사용자 영역 – 사용자 프로세스의 실행주소공간, 앱이 사용하는 메모리 영역
  • 커널 영역 – 사용자 영역에서 커널 영역이 있고 커널이 사용하는 메모리 영역

커널 시스템은 시스템의 중추이기 때문에 앱이 메모리 영역에 들어가면 버그가 커널까지 영향을 미쳐 운영체제가 멈출 수 있다. 이를 피하기 위해 사용자 영역과 커널영역으로 나뉘어 있다.

참고

Process View Display 

 

Facebook Comments

카테고리:   Swift 3.0

댓글

죄송하지만 댓글은 닫혀 있습니다.