lala9663
Bump into
lala9663
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (1)
    • Java (39)
    • Spring (28)
    • IntelliJ (7)
    • Git,Github (2)
    • CS (22)
    • Algorithm (23)
      • Algorithm 문제 (13)
    • 공부방 (9)
    • 그 외 (27)
      • TIL (24)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • try-catch
  • Java
  • 동적
  • 자바 람다
  • 정적
  • was
  • Spring
  • 1193
  • 백준 2292
  • 웹 3.0
  • 백준 벌집
  • 백준
  • 스트림(Stream)
  • jsp
  • thread
  • Intellij
  • 웹서버
  • 자바
  • servlet
  • Post
  • Til
  • Get

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
lala9663

Bump into

CS

[운영체제] Thread(스레드)

2022. 12. 1. 20:43

Thread 란?

  • Light Weight Process라고도 한다.
  • 프로세스
    • 프로세스 간에는 각 프로세스의 데이터 접근이 불가
  • 스레드
    • 하나의 프로세스에 여러개의 스레드 생성 가능
    • 스레드들은 동시에 실행 가능
    • 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능

  • 프로그램(프로세스) 실행 단위이며 하나의 프로세스는 여러개의 스레드로 구성이 가능하다.
  • 하나의 프로세스를 구성하는 스레드들은 프로세스에 할당된 메모리, 자원 등을 공유한다.
  • 프로세스와 같이 실행, 준비, 대기 등의 실행 상태를 가지며 실행 상태가 변할 때마다 Context Switching을 수행한다.
  • 각 스레드별로 자신만의 스택과 레지스터를 가진다.
  • 한 순간에 하나의 스레드만이 실행 가능하다.

프로세스와 스레드의 차이

프로세스는 운영체제로부터 자원을 할당받은 작업의 단위이고,
스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.
  • 프로세스는 실행 중인 프로그램으로 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것을 말한다.
  • 하지만 프로세스 생성은 많은 시간과 자원을 소비한다.
  • 스레드는 프로세스의 실행 단위라고 할 수 있다.
  • 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유할 수 있다.
  • 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 가지고 있다.

 

 

스택을 스레드마다 독립적으로 할당하는 이유
  • 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소 값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메로리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 가능하게 한다.
  • 따라서 독립적인 실행 흐름을 위한 최소 조건으로 독립된 스택을 할당한다.
PC Resister를 스레드마다 독립적으로 할당하는 이유
  • PC값은 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다.
  • 스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분가지 수행했는지 기억할 필요가 있다.
  • 따라서 PC 레지스터를 독립적으로 할당한다.

한 프로세스가 하나의 스레드를 이용하여 한 번에 한 작업만 수행하는 것은 싱글 스레드(Single thread), 한 프로세스가 여러 스레드로 동시에 여러 작업을 수행하는 것은 멀티 스레드(Multi thead)라고 한다. 프로세스 내의 스레드는 모두 각각 독립적인 실행 파일이며, 모든 스레드는 프로세스의 일부이다. 프로세스를 여러 개 수행해도 되지만 굳이 스레드를 사용하는 이유는 다음과 같다.

  1. 프로세스를 생성하거나 Context switching 하는 작업은 너무 무겁고 잦으면 성능 저하가 발생하는데, 스레드를 생성하거나 switching 하는 것은 그에 비해 가볍다.
  2. 두 프로세스가 하나의 데이터를 공유하려면 메시지 패싱이나 공유 메모리 또는 파이프를 사용해야 하는데, 이는 효율도 떨어지고 개발자 구현, 관리하기도 번거롭다.

Multithreading

프로세서가 여러 개인 경우 멀티 스레드를 통해 병렬성(Parallelism)을 높일 수 있다. 즉, 여러 작업이 동시에 실행될 수 있다.

프로세스의 스레드들이 각각 다른 프로세서에서 병렬적으로 수행될 수 있기 때문이다. 병렬성은 CPU 의 개수에 비례한다.

 

장점

  1. 응답성(Responsiveness)
    싱글 스레드인 경우, 작업이 끝나기 전까지 사용자에게 응답하지 않는다. 반면 멀티스레드인 경우 작업을 분리해서 수행하므로 실시간으로 사용자에게 응답할 수 있다.
  2. 자원 공유(Resource sharing)
    프로세스는 오직 공유 메모리나 패싱을 이용하여 자원을 공유할 수 있지만, 스레드는 자신이 속한 프로세스 내의 스레드들과 메모리나 자원을 공유하여 효율적으로 사용할 수 있다.
  3. 경제성(Economy)
    프로세스를 새로 생성하는 비용보다 스레드를 새로 생성하는게 훨씬 싸다. 그리고 Context switching의 오버헤드 또한 스레드가 더 경제적이다. 실제로 Solaris에서 프로세스 생성은 스레드 생성보다 30배 느리고, switching은 5배 느리다.
  4. 확장성(Scalability)
    싱글 스레드인 경우 한 프로세스는 오직 한 프로세서에서만 수행 가능하다. 반면 멀티 스레드인 경우 한 프로세스를 여러 프로세서에서 수행할 수 있으므로 훨씬 효율적이다.

단점

  • 스레드 중 한 스레드만 문제가 있어도 전체 프로세스가 영향을 받는다.

  • 스레드를 많이 생성하면, Context Switching이 많이 일어나, 성능 저하
  • 동기화 이슈로 비정상적으로 동작가능
    • 동기화 코드를 적절히 추가해줘야 한다.


      동기화 이슈 문제는 중요한 내용이니 다음에 다시 한번 설명하겠다.

 

 

 

 

참고: https://goodgid.github.io/What-is-Thread/

 

'CS' 카테고리의 다른 글

[네트워크] OSI 7 Layer / 7계층  (0) 2022.12.16
[운영체제] 가상 메모리  (0) 2022.12.03
[운영체제] 프로세스와 프로세서의 차이  (0) 2022.11.28
[운영체제] 컴퓨터 운영 체제 종류와 특징  (0) 2022.11.27
운영체제(OS)  (0) 2022.11.27
    'CS' 카테고리의 다른 글
    • [네트워크] OSI 7 Layer / 7계층
    • [운영체제] 가상 메모리
    • [운영체제] 프로세스와 프로세서의 차이
    • [운영체제] 컴퓨터 운영 체제 종류와 특징
    lala9663
    lala9663
    초보의 험난한 공부

    티스토리툴바