Thread & Process

HMS·2023년 4월 7일
0

쓰레드와 프로세스에 대해 여러 블로그와 문서들을 참고하면서 정리한 글 입니다. 잘못된 정보가 있다면 지적해주시면 감사하겠습니다!


쓰레드란 무엇일까?

  • 쓰레드란 프로세스(프로그램)의 실행 단위로 하나의 프로세스는 여러개의 쓰레드로 구성
  • 하나의 프로세스내의 쓰레드들은 heap ,static영역을 공유한다.
  • 각 쓰레드들은 각자의 stack영역과 Register를 가진다.
  • 한 순간에 하나의 쓰레드만이 실행 가능하다
  • 프로세스와 같이 실행 준비 대기등의 실행 상태를 가지며 실행 상태가 변할 때 마다 Context Switching을 수행한다.

Context Switching

  • 멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 PCB에 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)을 교체하는 작업

스레드 데이터

  • 스레드 기본 데이터
    - 실행과 관련된 데이터 필요
    - 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택
    - 코드, 데이터, 파일등 기타 자원은 프로세스 내의 다른 스레드와 공유
  • 스레드 특정 데이터 TSD(Thread Specific Data)
    - 하나의 스레드에만 연관된 데이터로 스레드 라이브러리가 지원하는 기능
    - 개별스레드만의 자료공간
    - 트랜잭션을 스레드로 처리할경우 각각의 트랜잭션 ID를 기억해야함

fork || exec 문제

  • fork문제 : 프로세스 내의 스레드가 fork를 호출하면 모든 스레드를 가진 프로세스를 생성할 것인지, fork를 요청한 스레드를 가진 프로세스만 생성할 것인지의 문제.
  • exec 문제 : fork를 통해 스레드를 복제한 후 exec를 수행하면 모든 스레드들이 초기화됨. 그렇다면 교체될 스레드를 복제하는 작업은 필요가 없기에 fork를 요청한 스레드만 복제했어야함. fork를 수행한 후 exec를 수행하지 않는다면 모든 스레드를 복제할 필요가 있는 경우도 있음

User-Level Thread vs Kernel Level Thread

사용자 레벨 스레드(User-Level Thread)

  • 사용자 스레드는 커널이 내부 스레드를 인식 하지 못한다. 프로세스 내의 Thread library가 쓰레드의 생성 및 스케줄링을 모두 담당한다.
  • 동일한 메모리 영역에서 스레드가 생성 및 관리되므로 속도가 빠른 장점이 있는 반면
    여러개의 사용자 스레드 중 하나의 스레드가 시스템 호출등으로 중단되면 나머지 모든 스레드 역시 중단되는 단점이 있다.

커널 레벨 스레드(Kernel-Level Thread)

  • 커널이 모든 프로세스와 모든 스레드의 생성 및 스케줄링 관리를 하는 방식이다.
  • 모든 프로세스와 스레드들은 커널에 의해 독자적으로 스케줄링 된다. 스레드가 시스템 호출등으로 중단 되더라도, 커널은 프로세스 내의 다른 스레드를 중단시키지 않고 계속 실행 시켜준다.
  • 멀티프로세스 환경에서 커널은 여러 개의 스레드를 각각 다른 프로세스에 할당할 수 있다. 하지만 사용자 스레드에 비해 생성 및 관리가 느리다.

스케줄링

  • 메모리에 적재된 프로그램을 CPU가 실행할 수 있도록 운영체제 O/S로 하여금 프로세스 또는 스레드에 CPU를 할당하는것을 스케줄링 이라 한다.
  • 스케줄러는 제한된자원을 효율적으로 사용하도록 어떤 프로세스 또는 스레드에게 어떤 순서 또는 어떤 기준으로 CPU를 할당할지 결정한다.
    - 프로세스와 스레드의 스케줄링은 할당 대상만 다를뿐 방식은 동일
  • 프로세스를 스케줄링하기 위한 세가지 Queue
    - Job Queue : 시스템 안의 모든 프로세스의 집합
    - Ready Queue : ready 상태인 메인 메모리 안에 상주하는 모든 프로세스의 집합
    - Device Queue : I/O 장치 사용을 대기하는 프로세스들의 집합

스케줄러의 종류

  • 장기 스케줄러(long term scheduler)/ Job scheduler
    - 디스크와 메모리 사이의 스케줄링 담당
    - 어떤 프로세스에 메모리를 할당하여 ready queue에 보낼지 결정하는 역할
  • 단기 스케줄러(short term scheduler)/ CPU scheduler
    - 메모리와 CPU 사이의 스케줄링 담당
    - 어떤 프로세스를 running상태로 전환 시킬지 결정
  • 중기 스케줄러(Mid-term scheduler)/ 스와퍼(Swapper)
    - 여유공간을 마련하기 위해 프로세스를 통째로 메모리에서 디스크로 쫓아내는 역할(swap in/swap out)

선점 스케줄링(preemptive)

  • 실행중인 스로세스가 강제적으로 실행권을 빼앗기는것
  • SRTF(Shortest Remaining Time First)
    - 선점형 스케줄링방식
    - 남은 burst time(CPU점유시간)이 더 짧은 프로세스에 CPU를 할당
    - starvation 기아 현상 발생 가능
    - 기아현상 : 계속해서 우선순위가 높은 프로세스가 먼저 실행되어 먼저 도착했어도 우선순위가 낮은 프로세스가 계속해서 CPU를 할당받지 못하는 현상
  • 라운드 로빈(RR, Round Robin)
    - 선점형 스케줄링 방식, 현대적인 CPU 스케줄링
    - 프로세스에 동일한 할당 시간(Time Quantum)만큼 순서대로 계속 CPU를 할당
    - 응답시간이 빠르며 모든 프로세스가 공정하게 CPU를 할당 받을 수 있음을 보장
    - 단!, CPU 할당시간이 길 경우 FCFS랑 같아지며 반대로 짧은 경우 잦은 Context Switching으로 오버헤드 발생, 적당한 CPU 할당시간을 설정하는것이 중요
  • 우선순위 스케줄링(Priority Scheduling)
    - 선점과 비선점 두가지 방식에 모두 적용
  • 우선순위가 높은 프로세스에 CPU를 먼저 할당
  • 기아 현상고 무기한 봉쇄가 발생할 수 있으며 에이징 기법을 통해 해결
    - 무기한 봉쇄(Indefinite blocking) 실행준비는 되어있으나 cpu를 사용 못하는 프로세스를 cpu가 무기한 대기하는 상태
    - 에이징 기법(Aging) 먼저 도착한 프로세스가 나이를 계속 먹으며 우선순위가 올라가는 기법

비선점 스케줄링(non-preemptive)

  • 실행중인 프로세스가 자신의 실행권을 자발적으로 내려놓는것
  • SJF(Shortest Job First)
    - 비선점형 스케줄링 방식
    - burst time(CPU점유시간)이 짧은 프로세스가 먼저 cpu를 할당
    - 기아현상 발생 가능
  • FCFS(First Come First Served)선입선출
    - 비선점형 스케줄링 방식
    - 먼저 도착한 프로세스가 cpu를 먼저 할당
    - 큐를 이용해 쉽게 구현가능
    - 콘보이 현상 발생 가능
    - burst time이 긴 프로세스가 먼저 도착해 다른 프로세스의 실행시간이 전부 늦춰져 효율을 떨어뜨리는 현상

프로그램이란 무엇일까?

  • 프로그램이란 파일이 저장 장치에 저장 되어 있지만 메모리에는 올라가 있지 않은 정적인 상태
  • 메모리에 올라가 있지 않다는건 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해 주지 않았다는 뜻
  • 정적인 상태는 단어 그대로 움직이지 않는 실행되지 않고 있는 상태

프로세스란? Process is a Programing execution

  • 운영체제로 부터 자원을 할당받은 작업의 단위
  • 프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고 이 상태를 동적인 상태라 하며 이 상태의 프로그램을 프로세스라고 한다..
  • 실행되고 있는 컴퓨터 프로그램, 스케줄링 단계에서의 작업과 같은 단어라고 봐도 무방하다.

프로세스와 스레드의 차이

  • 프로세스는 각각 별도의 주소 공간(code, data, heap, stack)을 할당 받는다.
  • 프로세스는 자신만의 고유 공간과 자원을 할당받아 사용한다.
  • 스레드는 다른 스레드와 속한 프로세스 영역의 heap, data, code영역을 공유한다.
  • 과거에는 프로그램의 시작과 끝을 프로세스 하나만을 사용해서 진행했지만 복잡해지는 프로그램을 처리하는데 한계가 생김
  • 운영체제는 안정성을 위해 프로세스마다 자신에게 할당된 메모리 내의 정보만 접근할 수 있도록 제약을 두고있어서 프로세스보다 더 작은 실행단위 개념이 필요하게 되었고 이것이 스레드다.
  • 스레드끼리 메모리를 공유하며 프로세스 실행의 일부가 되는것.
  • 스레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로

프로세스와 스레드의 작동방식

  • 운영체제는 프로세스마다 각각 독립된 메모리 영역을 code,data,stack,heap의 형식으로 할당
  • 스레드는 code, data, heap영역을 다른 스레드와 공유 stack영역은 각각 할당
  • 스레드는 메모리 영역의 내용을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생하면 프로세스 내의 다른 스레드가 모두 강제 종료됨
  • 이런방식으로 메모리를 공유하는 이유?
    - 스레드는 cpu입장에서 최소 작업 단위가 된다.
    - O/S 관점에서는 프로세스가 최소 작업단위가 되기 때문에 관여하지 않는 프로세스 내 스레드끼리는 메모리 공유를 하지 않을수 없음

멀티태스킹과 멀티스레드

멀티태스킹이란

  • 하나의 운영체제에서 여러 프로세스가 실행되는것
  • 여러 프로세스가 동시에 실행되는 것 처럼 보이지만, 멀티 태스킹은 task를 os의 스케줄링에 의해 번갈아가며 수행하는 것을 의미
  • 여러개의 task를 자주 번갈아가며 수행하니 동시에 수행되고 있다고 느끼게됨

멀티 프로그래밍

  • 하나의 프로세서가 하나의 프로세스를 수행하는 동안 다른 프로세스에 접근할 수 있도록 하는 방법
  • 하나의 프로세스를 처리하는 과정에서 프로세서의 처리 속도와 입출력 속도 간의 차이로 인해 입출력 처리가 완료될 때까지 기다리는 시간을 버리지 말고 다른 프로세스를 처리할 수 있도록 해주는것

멀티 프로세싱

  • 보통 하나의 프로세서(CPU)가 하나의 작업을 맡지만 fork를 통해 프로세스를 다수로 늘려 여러개의 프로그램들을 병렬로 처리하는것
  • 장점은 하나의 프로세서가 고장이 나더라도 해당 프로세서가 진행중인 작업은 다른 프로세서에서 수행하고 있기 때문에 작업이 정지되지않는것

멀티스레드란

  • 하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는것
  • 프로세스를 생성하는 비용보다 스레드를 생성하는 비용이 더 저렴하기 때문에 다수의 스레드를 생성하여 병렬처리
  • 프로세스는 메모리영역을 공유하지 않지만 스레드느 스택영역을 제외한 메모리 영역을 공유하기 때문에 메모리 부분에서 훨씬 효율적

멀티 프로그래밍 vs 멀티 태스킹

  • 멀티 프로그래밍은 프로세서의 자원 낭비를 막기 위함
  • 멀티 태스킹은 정해진 시간동안 각각의 task를 번갈아가며 수행하는 것

멀티 프로세싱 vs 멀티 스레딩

  • 멀티 프로세싱은 여러개의 프로그램들을 병렬로 처리
  • 멀티 스레딩은 하나의 프로그램 안에서 병렬처리
  • 멀티스레딩이 훨씬 적은 자원을 소모
  • 멀티 프로세싱이 더 안정적

멀티 태스킹 vs 멀티 스레딩

  • 멀티스레딩은 스레드들끼리의 자원공유가 가능하고, 프로그래밍을 통해 구현가능
  • 멀티태스킹은 os에서 지원하는것으로 독립된 메모리를 가지며 서로간의 자원 공유가 이루어지지 않음
  • 자원공유를 위해 별도의 IPC(inter process communication)을 구현해야하며 멀티스레딩에 비해 운여에제에 부담을 줄 수 있음
  • 멀티 태스킹은 독립된 수행이 가능하다는 이점이 있으므로 각각 용도에 따라 적절하게 사용

다른 프로세스의 정보에 정말로 접근할 수 없는걸까?

  • CPU 레지스터 교체 뿐 아니라 RAM과 CPU 사이의 캐시메모리까지 초기화 되기 떄문에 자원부담이 큼
  • IPC를 사용한다
  • LPC를 사용한다.
  • 별도로 공유 메모리를 만들어 정보를 주고 받도록 설정해 준다.

참고)
스레드
https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)
https://goodgid.github.io/What-is-Thread/
https://vicente-blog.com/blog/68/
스케줄링
https://woo-dev.tistory.com/148
https://velog.io/@sangjin98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C
https://zzsza.github.io/development/2018/07/29/cpu-scheduling-and-process/
프로세스와 스레드/ 멀티태스킹과 멀티스레드
https://velog.io/@raejoonee/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://velog.io/@raejoonee/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://sorjfkrh5078.tistory.com/56
https://velog.io/@chy0428/OS-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rhkdals1206&logNo=221572073363
https://www.youtube.com/watch?v=eELCTRdSj7o

profile
안녕하세요

0개의 댓글