[OS] Thread

Doodung·2022년 3월 9일
0

OS - 운영체제

목록 보기
8/15
post-thumbnail

🤔 프로세스 상태도

running(user mode) : 프로세스가 cpu를 가지고 있으면서 본인의 코드를 실행중인 상태
running(monitor, 커널 mode) : 본인이 어떤 일을 할 수 없어서 운영체제에게 요청 (시스템 콜) 그럼 운영체제 코드가 실행중.

inactive : 외부적인 요인으로 프로세스가 정지 외부에서 재개를 해줘야지만 액티브 상태로 갈 수 있다.
suspended → 메모리를 완전히 잃어버리는 스왑아웃 형태
suspended blocked : I/O같은 오래 걸리는 작업이 진행중이면 suspended ready 로 넘어갈 수 있다


🤔 Thread


“A thread (of lightweight process) is a basic unit of CPU utilization”

프로세스 내부의 CPU 수행 단위가 여러개 있는 것

프로세스가 하나 주어지면 code, data, stack 으로 구성된 주소공간이 프로세스마다 만들어진다. 이 프로세스 하나를 관리하기 위해서 운영체제 내부에 PCB를 두고 있다. (프로세스의 상태, 아이디 등등을 나타낸다.) 현재 메모리의 어느 부분을 수행하고 있는지 PC가 가리킨다.

어떤 동일한 일을 하는 프로세스가 여러개 있다고 하면 그것을 별도의 프로세스로 만들면 메모리 주소공간이 여러개가 만들어진다. → 메모리 낭비

같은 일을 하는 프로세스를 여러개 띄워놓고 싶다면 주소 공간(메모리 공간)을 하나만 띄워놓고 각 프로세스마다 다른 부분의 코드를 실행할 수 있게 해주면 된다. 그것이 쓰레드의 개념이다.

쓰레드는 프로세스 하나만 띄워놓고 현재 CPU가 코드의 어느 부분을 실행하고 있는가 (즉, 프로그램 카운터만 여러개 둔다.) 즉, 프로세스 하나에 CPU 수행 단위만 여러개 두고 있는 것을 쓰레드라고 부른다.

CPU 수행을 위해서는 (인스트럭션을 수행할려면) PC가 있어야 하고, 각 쓰레드 마다 레지스터에 어떤 값을 넣고, PC가 어디를 가리키는 지를 별도로 갖고 있다. 또한 함수를 호출하고 리턴하는 정보들을 스택에 쌓아야 한다. 그래서 쓰레드는 프로세스 하나에서 공유할 수 있는 메모리 주소공간, 프로세스 상태, 프로세스 자원 등등을 공유하고, 별도로 CPU 수행과 관련된 정보들은 별도로 가지고 관리한다.

Thread의 구성 (쓰레드 간에 독립적으로 가지고 있음)

  • program counter
  • register set
  • stack space

Thread가 동료 Thread와 공유하는 부분(=task)

  • code section
  • data section
  • OS resources

전통적인 개념의 heavy weight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.


🤔 Thread 사용의 장점


  1. 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.

  2. 하나의 프로세스 안에 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다. (성능향상, 자원절약)
    -> 만약 별도의 프로세스로 만들게 되면 메모리나 자원들이 낭비된다. 그 프로세스만의 독자적인 주소공간이 만들어져야 하고, 그 주소공간은 메모리를 차지하기 때문. 메모리 낭비가 심하다.

  3. 스레드를 사용하면 병렬성을 높일 수 있다.
    -> 이례적인 경우인데, CPU 여러개 달린 컴퓨터에서 얻을 수 있는 장점이다.
    1000X1000행렬을 곱하는 것을 서로 다른 CPU에서 한다음에 합쳐주면 결과가 빨리 나올 것이다.

ex) 웹 브라우저에 네이버를 본다고 해보자. 네트워크를 통해 웹페이지를 읽어와야 하는데 이것은 I/O 작업이다. 웹페이지를 읽어오는 동안에는 blocked 상태가 된다. 그렇게 되면 사용자 입장에서 답답하다. 다 읽어오기 까지 화면에 아무것도 안뜨기 때문.
만약 웹 브라우저를 여러개 쓰레드를 사용해서 만들게 되면 하나의 쓰레드가 네이버 웹 서버에서 그림같은걸 불러오는 동안에 프로세스를 blocked 시키지 않고 이미 읽어온 text 같은걸 보여주면 결과를 빨리 볼수 있게 된다.

PCB - 프로세스마다 하나의 PCB가 만들어져서 운영체제가 관리.
쓰레드가 있게 되면 CPU 관련 정보만 각각 쓰레드마다 별도로 갖게 된다. → pc, registers

Single and Multithreaded Processes

(binary는 무시하자)


🤔 Benefits of Threads


1. Responsiveness : 응답성

사용자 입장에서 빠르다.
ex) multi-thread Web : 웹브라우저가 여러개의 쓰레드를 가지고 있다면

  • if one thread is blocked (ex network) another thread continues (ex display)
    - 웹페이지 읽어올 때 프로세스가 블럭되어 디스플레이에 안뜰때, 그렇게 하지 않고 웹브라우저를 여러개 쓰레드를 사용해서 만들게 되면, 이미지 파일들을 웹서버에 다시 요청을 한다. 이때 네트워크 요청을 한 쓰레드만 블럭된다. 다른 쓰레드가 이미 읽어온 html 문서라도 화면에 먼저 디스플레이 해주게 되면 사용자 입장에서는 답답함이 덜할 것.
  • 동기식과 비동기식으로 설명 해보자면 이미지 파일을 읽어오는 동안에 (I/O를 실행하는 동안에) 블럭시키는게 아니고, 프로세스는 아이오가 끝나기 전에 씨피유를 얻어서 텍스트라도 먼저 보여주는 것. 이게 일종의 비동기식 입출력이 되는 것이다.
    - 아이오 작업을 보고 실행하는게 아니라 아이오 던져놓고 다른 할일 처리.

2. Resource Sharing : 자원 공유

  • n threads can share binary code, data, resource of the process
    • 코드 데이터, 각종 자원을 쓰레드들이 공유하여 효율적으로 사용

3. Economy : 경제성

  • 프로세스를 하나 만드는 것은 오버헤드가 상당히 크다. 프로세스 하나 안에 쓰레드를 하나 추가하는 것은 오버헤드가 크지 않다.
  • context switch 문맥 교환 시 프로세스에서는 오버헤드가 크다. 프로세스 내부에서 쓰레드간에 문맥교환 하는것은 동일한 주소공간을 쓰고있기 때문에 대부분의 문맥을 그대로 사용할 수 있다. 그래서 오버헤드가 작다.
  • creating & CPU switching thread (rather than a process)
  • Solaris의 경우 위 두가지 overhead가 각각 30배, 5배

4. Utilization of MP Architectures : CPU 여러개가 있을때

  • each thread may be running in parallel on a diffrerent processor
    • 각각의 쓰레드가 서로 다른 cpu에서 병렬적으로 일을 할 수 있다.

🤔 Implementation of Threads

: 쓰레드를 구현하는 방법


1. Some are supported by kernel → Kernel Threads

: 어떤 쓰레드는 운영체제 커널의 지원을 받고있다.

쓰레드가 여러개 있다는 사실을 운영체제 커널이 알고 있다. 다른 쓰레드로 넘길때도 커널이 관여.

  • Windows 95/98/NT
  • Solaris
  • Digital UNIX, Mach

2. Others are supported by library → User Threads

: 또 다른 쓰레드는 라이브러리의 지원을 받는다.

프로세스 안에 쓰레드가 여러개 있다는 사실을 운영체제는 모르고 유저 프로그램이 스스로 여러개의 쓰레드를 관리한다. 그래서 구현상의 제약점이 있을 수 있다.

  • POSIX Pthreads
  • Mach C-threads
  • Solaris threads

3. Some are real-time threads

: 리얼 타임 기능을 지원하는 쓰레드들도 생성할 수 있다.

profile
반가워요!

0개의 댓글