학습 목표 
- 프로세스가 생성된 후 어떤 상태 변화를 거치는지 알아본다.
- 프로세스 제어 블록의 구성과 문맥 교환 시 동작 과정을 알아본다.
- 프로세스의 생성과 복사, 전환 과정을 알아본다.
- 스레드의 개념을 이해하고 멀티스레드 시스템의 장점을 알아본다.

     


    목차

    • 스레드의 개념
    • 멀티스레드의 구조와 예
    • 멀티스레드의 장단점
    • 멀티스레드 모델

     


    스레드의 개념

    thread 스레드란?

    운영체제는 프로세스 성능의 낭비 요소를 제거하기 위해 멀티스레드를 사용한다.

     

    스레드의 사용 목적
    프로세스를 다양한 스레드로 나누어 여러개의 코어에 배분함으로써
    시스템 효율을 높이기 위함이다.

     

     

    프로세스와 스레드의 관계

    • 프로세스 = 요리의 전체 과정
      요리를 하는 과정으로 스레드와 프로세스의 차이를 이해할 수 있다. 안심 스테이크를 만들 때를 떠올려보자. 레시피를 준비하고 고기나 채소, 조리도구(칼, 도마)등을 가져온다. 그리고 조리를 해서 안심 스테이크를 완성한다. 
    • 스레드 = 요리를 완성하기 위해 수행하는 각 조리 단계
      고기를 굽거나 채소를 썰거나 소스를 뿌리는 각 과정을 나누는걸 스레드로 빗댈 수 있다.

     

    프로세스의 작업 과정
    1. 운영체제가 코드와 데이터를 메모리에 올린다.
    2. PCB(프로세스 제어 블록)을 생성한다. 
    3. 작업에 필요한 메모리 영역을 확보한다.
    4. 준비된 프로세스를 준비 큐에 올린다.
    5. CPU 스케줄러가 CPU가 수행 해야할 작업을 정해준다. ( 작업 = 스레드 )
    6. CPU가 작업을 수행한다. 

     

    여기서 스케줄러가 CPU에게 전달하는 하나의 작업의 단위는 스레드이다.  즉, 운영체제 입장에서 작업의 단위는 프로세스이고 CPU입장에서의 작업 단위는 스레드이다.

     

    기준 작업 단위
    OS 운영체제 프로세스
    CPU  스레드

     

     

    스레드란
    프로세스의 코드에 작성된 절차에 따라 CPU에 작업을 요청하는 실행 단위이다.

     

    - 작업의 크기
    프로세스와 스레드를 구분하기 위해 작업의 크기를 고려해본다. 작은 단위(operation)이 모여 하나의 작업(task)가 된다. 집짓기를 예를 들면 토지 구입, 설계, 공사는 operation이며 집짓기와 같이 operation을 통틀어 명칭하는 것을 하나의 작업 task라고 한다. 여기서 스레드는 operation이며 프로세스는 task라고 볼 수 있다.
    처리(job) > 프로세스(task) > 스레드(operation)

     

     

    프로세스와 스레드의 차이

     

    • 프로세스 (= 작업 단위 task)
      운영체제가 인식하는 하나의 작업 단위이며, 요리를 빗대면 고기썰기, 채소썰기, 재료 준비, 조리와 같은 작은 작업들을 모두 포함한 개념이다.
    • 스레드 (= 작업 단위 operation)
      CPU, 프로세스가 인식하는 하나의 작업 단위이다. 고기썰기, 채소썰기 등 각각의 작은 작업들을 의미한다.

     

     

    멀티태스크와 멀티스레드

     

    • 멀티태스크
      위 그림에서 스풀러(https://sksnxjs.tistory.com/159) 를 보자. 워드프로세서와 스풀러는 서로 독립적이다. 서로 독립적이라는 것은 워드프로세서가 비정상적으로 종료되어도 스풀러에겐 영향이 없다는 뜻이다. 워드프로세서와 스풀러는 서로 데이터를 주고받는다. 즉 워드프로세서와 스풀러는 운영체제 입장에서 각각의 task 단위이다. 각 독립적인 프로세스간에 데이터를 주고 받을때는 프로세스 간 통신(IPC, Inter Process Communication)을 사용한다.
    • 멀티스레드
      워드프로세서 내에서 문서 편집, 문서 입출력, 맞춤법 검사와 같은 각각의 스레드들을 동시에 작업을 하는 것을 멀티 스레드라고 한다. 스레드들은 서로 독립적이지 않고 강하게 연결되어있다. 즉 워드프로세서가 종료되면 스레드도 강제 종료된다. 멀티스레드는 변수나 파일을 공유한다. 전역변수와 함수 호출등의 방법으로 스레드간 통신을 한다.

     

    명칭 작업 단위 대화 시스템 성격
    멀티태스크 task(프로세스) 프로세스 간 통신(IPC) 상호 독립적
    멀티스레드 thread(스레드) 전역변수, 함수호출 등 스레드간 통신 상호 의존적

     

     

     

    스레드 관련 용어 정리

     

    • 멀티스레드
      프로세스 내 작업을 여러 개의 스레드로 분할 처리하여 작업의 부담을 줄이는 프로세스 운영 기법
    • 멀티태스킹
      운영체제가 CPU에게 작업 시간을 줄 때 시간을 잘게 나누어 배분하는 기법
      여러 스레드에 시간을 잘게 나누는 시스템을 시분할 시스템(time-sharing system)이라 한다.
      시분할 시스템에서 운영체제가 CPU에 전달하는 작업은 프로세스가 아닌 스레드이다.
    • 멀티프로세싱
      CPU를 여러개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경
      병렬 처리에서의 슈퍼스칼라 기법과 같다. 
      네트워크로 연결된 여러 컴퓨터에 스레드를 나우어 협업하는 분산 시스템도 멀티 프로세싱이라 한다.
    • CPU 멀티스레드
      한 번에 하나씩 처리해야하는 스렏를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법

     

    멀티스레드와 CPU 멀티스레드의 차이

     

    • 멀티스레드
      운영체제가 소프트웨어적으로 프로세스를 작은 단위의 스레드로 분할하여 운영하는 기법
    • CPU 멀티스레드
      하드웨어적인 방법으로 하나의 CPU에서 여러 스레드를 동시에 처리하는 병렬 처리 기법

     

     


     

    멀티스레드의 구조와 예

    멀티태스킹의 구조

    위 그림은 시스템 호출 fork()를 이용해 task(프로세스)를 복사하는 모습이다. PCB와 코드 영역, 데이터 영역, 스택 영역을 전부 복사해서 재활용하므로 메모리적으로 낭비적인 요소가 많은걸 확인할 수 있다. 대신 서로 독립적으로 동작이 가능하다.

     

    멀티스레드의 구조

    멀티태스크와 멀티스레드

    멀티태스크와 다르게 멀티스레드는 PCB와 코드,전역데이터,파일을 공유하며 자원의 낭비를 막고 효율성을 향상시키는걸 확인할 수 있다. 대신 멀티태스크와 다르게 서로 상호 의존적이다.

     

    스레드는 가벼운 프로세스(LWP, Light Weight Process)라고 부르며,
    스레드가 1개인 일반 프로세스는 무거운 프로세스(HWP, Heavy Weight Process)라고도 부른다.

     

    멀티스레드의 예

    자바에서 스레드로 각 작업을 분할시켜 출력하면 2개의 서로 독립된 스레드가 100번의 반복문을 사용하기 때문에 서로 뒤죽박죽 출력이 된다.

     

     

    멀티태스킹의 예

    결과는 위에 멀티스레드와 동일하지만 fork()를 사용해 PCB, 코드, 데이터등을 모두 복사해 2배가 되었으므로 스레드보다 상대적으로 메모리 낭비가 더 심하다.

     

     


     

    멀티스레드의 장단점

    멀티스레드의 장점

    멀티태스크와 다르게 정적영역(PCB, 데이터, 코드)과 같은 자원을 공유하여 사용하므로 자원의 낭비를 막을 수 있다. 단일 프로세스가 처리하는 작업의 단위를 잘게 쪼개므로 작업의 효율을 높일 수 있다.

     

      비디오 플레이어를 통해 멀티스레드 이해하기
    비디오 플레이어는 재생할 파일을 저장장치로부터 가져오는 입출력과 가져온 데이터를 화면에 송출하는 재생 부분으로 나눌 수 있다. 만약 단일 스레드로 이 과정을 동작시킬 경우 비디오 플레이어는 재생할 파일을 가져오는 동안 재생할 수 없게되고 입출력이 완료될 때까지 대기 상태에 머물러야한다. 하지만 멀티스레드로 구현하면 입출력과 동시에 재생을 할 수 있게된다. 서로 독립적으로 작업을하기 때문이다. 이외로 채팅 프로그램처럼 채팅을 하면서 파일을 주고받거나, 워드프로세서로 문서를 편집하며 틀린 글자를 찾는 작업 등 멀티스레드를 통해 작업의 효율을 꾀하고 있다.

     

    • 응답성 향상
      한 스레드가 입출력으로 작업이 진행되지 않아도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빠르게 응답할 수 있다.
    • 자원 공유
      한 프로세스 내에서 독립적인 스레드를 여러개 생성하면 프로세스가 가진 자원을 모든 스레드가 공유해서 작업을 진행할 수 있다.
    • 효율성 향상
      여러 개의 프로세스를 생성하는 것과 달리 멀티스레드는 불필요한 자원의 중복을 막음으로써 시스템의 효율이 향상된다.
    • 다중 CPU 지원
      2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축된다.

     

    멀티스레드의 단점

     

    • 구글 크롬
      멀티태스크를 사용하고 있으며 탭을 생성할 때마다 새로운 프로세스를 생성한다. 각 탭은 상호 독립적이기 때문에 하나의 탭이 비정상적으로 종료되어도 복구가 가능하다.
    • 인터넷 익스플로러
      멀티스레드를 사용하고 있으며 탭을 생성할 때마다 새로운 스레드를 생성한다. 각 탭은 상호 의존적이기 때문에 하나의 탭에 문제가 생길 경우 모든 탭이 강제적으로 종료된다.

     

    크롬은 각 탭이 독립적인 프로세스이므로 문제가 생겨서 종료해도 다른 탭에 미치는 영향이 적다. 과거와 달리 요즘은 메모리가 넉넉하고 멀티코어 CPU가 대중화되어 있기 때문에 자주 사용된다. 크롬은 멀티스레드의 사용으로 인해 다른 스레드가 영향을 받는 것을 최소화하기 위해 메모리적인 낭비가 있더라도 멀티스레드 대신 멀티태스킹을 채택했다.


     

    멀티스레드 모델

    프로세스커널 프로세스사용자 프로세스로 나뉘며, 스레드커널 스레드사용자 스레드로 나뉜다.

     

    • 커널 스레드
      커널이 직접 생성하고 관리하는 스레드
    • 사용자 스레드
      라이브러리에 의해 구현된 일반적인 스레드

     

    사용자 스레드

    사용자 스레드는 운영체제가 멀티스레드를 지원하지 않을 때 사용하는 방법이다. 초기의 스레드 시스템에서 이용됐다. 사용자가 직접 라이브러리를 사용해 구현하기 때문에 커널 입장에서 이 스레드는 하나의 프로세스 처럼 보인다. 따라서 사용자 프로세스 내에 여러개의 스레드가 존재하는 형태이므로 1 to N 모델이라고도 부른다.

     

    사용자 스레드는 문맥교환이 필요없기 때문에 작업 속도가 빠르다. 단점은 여러개의 스레드가 하나의 커널에 연결되기 때문에 커널 스레드가 대기모드에 들어가면 모든 스레드가 대기 상태가 된다. 그리고 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러개의 CPU를 동시에 사용할 수 없다.  그리고 공유 자원을 보호해주는 장치를 직접 구현해야하므로 보안에 취약하다. (자세한 내용은 p176)

     

    커널 스레드

    커널이 멀티스레드를 지원하는 방식이다. 하나의 사용자 스레드에 하나의 커널 스레드와 연결되기 때문에 1 to 1 모델이라고도 부른다. 커널 스레드는 독립적으로 스케줄링이 되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있다. 그리고 공유 자원의 대한 보호도 커널이 제공한다.

     

     

     사용자 스레드와 커널 스레드의 장단점
    사용자 스레드의 장단점과 커널 스레드의 장단점은 서로 반대라고 생각하면 된다. 커널 스레드는 커널 레벨에서 모든 작업을 지원하기 때문에 멀티 CPU를 사용할 수 있다. 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 지속할 수 있다. 또한 커널의 기능을 사용하므로 보안에 강하다. 하지만 문맥 교환을 할 때 오버헤드 때문에 상대적으로 느리다.

     

    멀티레벨 스레드 or 하이브리드 스레드

    사용자 스레드와 커널 스레드를 혼합한 방식, M to N 모델이라고도 한다. 멀티레벨 스레드에서는 커널 스레드의 개수가 사용자 스레드보다 같거나 작다. 두 방식을 혼용하기 때문에 하나의 커널 스레드가 대기 상태에 들어가도 다른 커널 스레드가 대신 작업을 한다. 보다 유연하게 작업을 처리할 수 잇다. 하지만 커널 스레드를 같이 사용하기 때문에 여전히 문맥 교환시 오버헤드가 발생한다. 즉, 사용자 스레드만큼 빠르지는 않다. 따라서 빠르게 동작해야하는 스레드는 사용자 스레드로, 안정적으로 동작해야하는 스레드는 커널 스레드로 작동한다.