본문 바로가기
개발/컴퓨터 사이언스

Process와 Thread

by Dahna 2022. 10. 11.

Process와 Thread

목차

  • Process
  • Thread
    • User Level Thread
    • Kernel Level Thread
    • Kernel Thread
  • Context

Process

  • 프로그램을 실행시키면 프로세스라는 형태로 메모리에서 관리가 된다.
  • 프로세스는 하나 이상의 스레드(thread of control)를 가진다.
  • 프로세스간에 서로 통신하려면 IPC를 거쳐야한다.
  • 프로세스는 스케쥴링의 대상이 된다.
  • 스케쥴링의 대상은(Process, Thread, Data-Flow)이다.
  • 프로세스는 스레드가 동작하는 환경이다

Thread( of control)

  • 프로세스 코드가 진행되는 흐름을 스레드라고 함
  • 스레드를 LWP(light weight process)라고도 한다.
  • 필수요소에는 context(PC등의 register), stack, event flag가 있다.

User Level Thread

  • 하나의 프로세스에 여러 개의 스레드를 라이브러리로 구현
  • 커널이 제공하는 scheduling은 timer interrupt로 schedule 시점이 정해지는데, user-level thread는 프로세스 1개로 보이기 때문에 timer interrupt로 schdule 시점을 결정할 수 없다. 따라서 일정 time slice가 지나면 스레드가 다음 스레드로 넘어간다.
  • 하나의 프로세스이기 때문에 각각의 스레드는 커널 스케쥴러의 스케쥴링의 대상이 되지 않는다.
    • 스케쥴링 system call을 호출하지 않기 때문에 오버헤드가 적다. = 속도가 빠르다.
    • context swithing은 발생한다.
    • M:1 방식(멀티 코어 프로그래밍 불가 => 진정한 병렬은 아니다.)
    • 한 스레드 내에서 I/O interrupt와 같은 block signal이 발생하면 프로세스 자체가 sleep되는 문제가 있다. (활성화된 다른 thread들도 같이 block 상태가 된다.)
  • 속도에 최적

Kernel Level Thread

  • 리눅스에서는 Process와 Thread를 구현하기 위해 Task_struct라는 구조체를 사용한다.
    • Process를 담는 구조체가 Task_struct였는데, thread라는 개념이 POSIX 표준에 추가되면서 Task_struct를 그대로 사용하여 Thread를 구현하였다
    • 사실, thread는 Process 내부에 linked-list와 같은 형태의 attribute로 추가되는 것이 맞지만, 리눅스 구현은 그렇게 하지 않고, thread 하나를 하나의 task_struct구조체로 만들고, process에 있는 내용들은 포인터로 가리키는 형식으로 구현하였다.
    • 그렇기 때문에 리눅스에서 process와 thread를 구분하는 기준은 내부에 있는 flag로 구분하고, 프로그램이 실행되기 위해 필요한 환경은 포인터로 공유하고 있다.
      • stack, context, event flag들은 자체적으로 갖고, 나머지 자원은 같은 곳(address space, file discripter등)을 가리키게 하면 thread
      • 모든 자원을 자체적으로 가지면 process
    • 이러한 단위를 Task라고하고, Task를 사용하는 리눅스에서는 Task 단위로 스케쥴링을 수행한다.
    • 또한 Task로 Process, Thread, data flow가 존재한다.
  • Kernel level Thread는 system call(thread_create())을 통해 만들어진 스레드이다.
  • system call(스케쥴링)에 대한 오버헤드가 발생한다. = 속도가 느려진다. (하지만, 자원은 공유하기 때문에 process를 만드는 것보다는 오버헤드가 적다.)
  • M:M 모델 이나 N:M 모델로 구현된다.
    • 멀티 프로세스 환경에서는 멀티 스레드로 관리된다.
  • 병렬성에 최적

Kernel Thread

  • 운영체제(Kernel)의 작업을 수행하기 위해 생성된 Thread로, User level Thread와 연결되지 않은 Thread

추가 정보

Context

  • context = register
  • register를 context라고 표현하는 이유는 register에 들어있는 값들이 현재 실행중인 instruction의 위치, instruction에 필요한 인자들 등등 프로그램을 실행시킬때 필요한 정보들을 담고 있기 때문이다.
  • context switching: 현재 실행중인 레지스터 값들을 메모리에 저장된 context와 바꿈으로서 cpu의 수행중인 작업을 변경

cpu의 core

  • cpu의 processor이다.
  • 과거에는 하나의 cpu가 하나의 core를 가졌지만 오늘날에는 2~18개의 코어를 가진다.
  • 하나의 코어는 하나의 Task를 수행한다.

'개발 > 컴퓨터 사이언스' 카테고리의 다른 글

[운영체제] Memory Management  (0) 2022.12.04
스케쥴링  (0) 2022.11.20
운영체제와 Kernel  (2) 2022.10.04
Instruction과 Pipelining  (0) 2022.09.27
CPU와 RAM  (1) 2022.09.21

댓글