[운영체제] 프로세스와 쓰레드

moonee·2021년 7월 29일
0

운영체제

목록 보기
2/10
post-custom-banner

프로세스란?

  • 프로그램은 디스크에 저장되어있는 실행코드
  • 프로세스는 프로그램을 구동하여 프로그램 자체와, 프로그램의 상태가 메모리 상에서 실행되는 작업단위


프로세스의 메모리 구조

  1. Text 영역
    • 코드가 저장된다.
  2. Data 영역
    • 전역 변수가 저장된다.
  3. Heap 영역
    • 프로그램 동작 후 할당된 메모리가 저장된다.
  4. Stack 영역
    • 함수에 관한 정보가 저장된다.
    • 함수 파라미터, 리턴 주소, 지역 변수 등이 저장된다.

PCB (Process Control Block)

  • 프로세스 제어 블록이란, 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영체제 커널의 자료구조 이다.
  • 즉 간단히 말해서 운영체제가 프로세스에 대한 정보를 담고있는 구조체이다.
  • PCB는 중요한 정보들이 담겨있기 때문에 운영체제->커널 내부에 담겨진다.


프로세스의 생명 주기

  1. new : 프로세스가 생성됨
  2. Running : CPU 에 해당 프로세스를 점유시킴으로써, CPU가 실행되어 명령어가 실행된다.
  3. Wating : CPU가 다른 작업을 끝낼 때 까지 기다리는 상태
  4. Ready : I/O에 대기하며 CPU가 점유되기 전 상태. (이 때 작업은 Ready Queue에서 기다리고 있다)
  5. Terminated : 다 끝내고 종료한 상태
  • running -> ready Interrupt
    • CPU의 과부하가 판단되는 경우
  • running -> wating
    • I/O 나 event wait가 있을 경우
    • 이 후 I/O나 evet가 끝나면 ready 상태로 복구


쓰레드(Thread)

  • 프로세스의 실행단위
  • 하나의 프로세스 내부에서 동작되는 여러 실행 흐름
  • 프로세스 내부의 주소, 자원 공유 가능
  • 쓰레드끼리 주소와 자원은 공유가 가능하나, 프로세스끼리 공유는 불가능 하다.
  • 하나의 쓰레드에서 특정 데이터를 변경할 시, 이를 다른 쓰레드도 확인할 수 있다.

프로세스와 쓰레드

  • 쓰레드는 프로세스와 데이터, 힙, 텍스트 영역을 공유하지만 스택 영역은 따로 할당 받는다
    • 왜 ? 쓰레드의 정의 = 프로세스의 실행 단위
    • 스택얼 따로 할당받음으로써, 독립적인 함수 호출 가능 -> 독립적인 실행 가능
  • 쓰레드는 PC 레지스터를 독립적으로 할당 받는다.
    • PC 레지스터란, Program Counter 레지스터로 CPU에서 다음 실행의 명령을 기억하고 있는 레지스터이다.
    • 이를 왜, 쓰레드 마다 독립적으로 할당받을까?
    • 먼저, 쓰레드의 경우 CPU를 할당받았다가, 스케줄러에 의해 다시 선점당한다. 따라서 명령어가 연속적으로 수행되지 못하므로 추후에 다시 CPU를 할당 받을 때 다음 실행 명령을 기억해놔야한다.
    • 즉, PC 레지스터를 통해 쓰레드가 어디까지 실행하고, 다음 실행 명령이 무엇인지 기억 할 수 있으므로 쓰레드마다 독립적으로 PC 레지스터를 할당해준다.

멀티 쓰레드

  • 하나의 프로세스에 여러개의 쓰레드를 생성하여 프로세스를 처리한다.

  • 멀티 프로세스보다 멀티 쓰레드를 사용하는 이유는, 여러개의 실행을 위해 여러개의 프로그램을 할당하는 것 보다, 여러개의 실행을 위해 하나의 프로그램의 여러 실행단위를 할당하는 것이 더 효율적이기 때문이다.

    • 프로세스를 생성할 때마다 자원을 할당하는 시스템 콜을 실행해야 하므로 여러개의 프로세스를 생성하는 것은 자원 할당에 비효율적이다.
  • Context-Switcing 시 더 빠르다.

    • Context-Switching 이란 여러개의 프로세스를 사용 할 때 , 이미 A 프로세스가 점유된 CPU가 B 프로세스를 점유하기 위해서 캐시된 메모리를 삭제하고, 결과를 저장하는 비용이다.
    • 프로세스 간 Context-Switching 은 일단 CPU의 캐시를 비우고, 결괏값을 저장해야하지만 쓰레드간 Context-Switching 의 경우 쓰레드 간, 스택 영역을 제외한 모든 영역을 공유하고 있으므로, Stack 영역만 비우면 된다.

참고 / 이미지 출처

profile
기록
post-custom-banner

0개의 댓글