쓰레드(Thread) 개념, 실행방법

    병렬화 시 고려해야 할 것들

    • 메모리 속도, CPU 캐시 메모리, 디스크, 네트워크, 커넥션 등등
    • 때로는 순차적 실행이 병렬실행보다 빠른 경우가 있다. 동시 실행에 따른 오버헤드가 없고 단일 CPU 알고리즘은 하드워드 작업에 더 친화적일 수가 있기 때문이다.

    암달의 법칙(Amdahl's law)

    • 암달의 저주라고도 불리며 컴퓨터 시스템의 일부를 개선할 때 전체적으로 얼마만큼의 최대 성능 향상이 있는지를 계산할때에 사용된다. 
    • 병렬 컴퓨팅을 할 경우 일부 병렬화 가능한 작업들은 사실상 계산에 참여하는 컴퓨터의 갯수에 비례하여 속도가 늘어난다. 이러한 경우 암달의 법칙에 의해 전체 수행시간의 개선효과는 병렬화가 불가능한 작업들의 비중에 크게 영향을 받게 된다. 즉 아무리 컴퓨터의 갯수가 늘어나도 속도의 한계는 정해져 있다는 것이다.

    병렬 vs 병행

    • 병행(Concurrent)은 멀티스레드 프로그래밍을 의미
    • 병렬(Parallel)은 멀티코어 프로그래밍을 의미
    • 이 장에서 살펴볼 것은 쓰레드임으로 병행 프로그래밍(동시성 프로그래밍, 멀티쓰레드 프로그래밍)

    Process

    • 각각의 프로세스는 메모리 공간에서 독립적으로 존재한다.
    • 각각의 프로세스는 자신만의 메모리구조를 가진다.
    • 프로세스 A,B,C가 있을 경우 각각 프로세스는 모두 같은 구조의 메모리 공간을 가진다.
    • 독립적인 만큼 다른 프로세스의 메모리 공간에 접근할 수 있다.

    IPC

    • 프로세스 A에서 B로 직접 접근할 수 없기 때문에 프로세스 간 통신을 하는 특별한 방식이 필요함. 메일슬록(mailslot),파이프(pipe)등이 바로 프로세스 간 통신, 즉 IPC의 예시이다.
    • 프로세스는 독립적인 메모리 공간을 지니기 때문에 IPC를 통하지 않고 통신할 수 없다.
    • 프로세스가 여럿이 병렬적으로 실행되기 위해서는 필연적으로 컨텍스트 스위칭이 발생할 수 밖에 없다. 이 것을 해결할 수 있는 것이 스레드(Thread)이다.

    스레드(Thread)

    • 스레드는 하나의 프로그램 내에 존재하는 여러 개의 실행 흐름을 위한 모델
    • 우리가 생각하는 프로그램이 실행하기 위해서는 하나의 실행흐름으로 처리할 수도 있겠지만, 다수의 실행흐름으로 처리할 수도 있다.
    • 스레드는 프로세스와 별개가 아닌 프로세스를 구성하고 실행하는 흐름이다.

    스레드 vs 프로세스

    • 스레드는 프로세스 안에 존재하는 실행흐름이다.
    • 스레드는 프로세스의 heap, static, code영역등을 공유한다.
    • 스레드는 stack영역을 제외한 메모리 영역은 공유한다.
    • 스레드가 code영역을 공유하기 때문에 프로세스 내부의 스레드들은 프로세스가 가지고 있는 함수를 자연스럽게 모두 호출 할 수 있다.
    • 스레드는 IPC 없이도 스레드 간의 통신이 가능하다. A, B 스레드는 통신하기 위해 heap영역에 메모리 공간을 할당하고, 두 스레드가 자유롭게 접근할 수 있다.
    • 스레드는 프로세스처럼 스케쥴링의 대상이다. 이 과정에서 컨텍스트 스위칭이 일어난다. 하지만 스레드는 공유하고 있는 메모리 공간 덕분에 컨텍스트 스위칭 때문에 발생하는 오버헤드가 프로세스에 비해 작다.
    • 동작 중인 프로세스가 바뀔 때 프로세스는 현재 자신의 상태(context정보)를 일단 보존한 후, 새롭게 동작 개시되는 프로세스는 이전에 보존해 두었던 자신의 context 정보를 다시 복구한다. 이를 컨텍스트 스위칭이라고 한다.
    • 스레드의 컨텍스트 정보는 프로세스보다 작기 때문에 스레드의 컨텍스트 스위칭은 가볍게 행해지는 것이 보통이다.
    • 하지만 실제로 스레드와 프로세스의 관계는 JVM구현에 크게 의존한다.
    • 참고로 플랫폼이 같아도 JVM의 구현방법에 따라 프로세스와 스레드의 관계는 달라질 수 있다. 

     

     

    'JAVA' 카테고리의 다른 글

    네트워크 프로그래밍 - 2  (0) 2023.09.07
    네트워크 프로그래밍 - 1  (0) 2023.09.05
    Java IO 5 - ObjectInputStream, ObjectOutputStream  (0) 2023.08.24
    Java IO 4 - DataInputStream, DataOutputStream  (0) 2023.08.24
    Java IO 3 -Reader, Writer  (0) 2023.08.24

    댓글