[OS] 프로세스와 스레드

심지혜·2023년 4월 5일

OperatingSystem

목록 보기
1/2

👻[운영체제/OS] 프로세스와 스레드

프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위

스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위

💫프로세스(Process)

  • Process is a program in execution
  • 프로세스란 실행중에 있는 프로그램
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  • 스케줄링의 대상이 되는 작업(task)와 같은 의미로 쓰인다.
  • 프로세스 내부에는 최소 하나의 스레드(thread)를 가지고 있는데, 실제로는 스레드(thread) 단위로 스케줄링을 한다.
  • 하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불린다.
  • 프로세스의 메모리 영역
    • Code 영역
      • 실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역이다. CPU는 코드영역에 저장된 명령어들을 하나씩 처리한다.
    • Data 영역
      • 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역이다. 프로그램이 실행되면서 할당되고 종료되면서 소멸한다.
    • Stack 영역
      • 함수 안에서 선언된 지역변수, 매개변수, 리터값등이 저장된다. 함수 호출시 기록되고 종료되면 제거된다.
    • Heap 영역
      • 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 자유공간이다.
  • 프로세스 관련 자료 구조
    • PCB (Process Control Block)

📦프로세스의 상태(State)

  • 프로세스는 상태(state)가 변경되며 수행된다.
    • Running
      • CPU 를 잡고 instruction 을 수행중인 상태
    • Ready
      • CPU 를 기다리는 상태
    • Blocked (waiting, sleep)
      • CPU를 주어도 당장 instruction 을 수행할 수 없는 상태
      • Process 자신이 요청한 event(예: I/O) 가 즉시 만족되지 않아, 이를 기다리는 상태
    • New : 디스크에서 메모리로 프로그램이 올라가 실행준비를 하는 상태
    • Terminated : 수행 (execution)이 끝난 상태

https://velog.velcdn.com/cloudflare/aeong98/f79ef46b-d5ac-46c9-ac39-732e6f5cf470/image.png

🧱PCB (Process Control Block)

  • PCB운영체제가 프로세스를 표현한 자료구조이다. 특정 프로세스에 대한 정보를 갖고 있다. 각 프로세스가 생성될때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB 는 제거된다. 프로세스 간 문맥교환이 일어나면서, 프로세스는 진행하던 작업들을 PCB에 저장하고, 이후에 자신의 순서가 왔을 때 이어서 처리한다.
    • OS 가 관리상 사용하는 정보
      • Process state, Process ID
      • scheduling information, pritoiry
    • CPU 수행 관련 하드웨어 값
      • Program counter, registers
    • 메모리 관련
      • Code, Data, Stack, Heap ..
    • 파일 관련
      • open file descriptors

💱문맥교환 (Context Switch)

  • 하나의 프로세스가 이미 CPU 를 사용중인 상태에서 다른 프로세스가 CPU 를 사용하기 위해 이전 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 적재하는 것.
    • ex) 카카오톡을 켜놓고 유튜브로 노래를 들으면서 웹서핑을 하는 것은 사용자 입장에서 동시에 일어나는 일처럼 보이지만 실제로는 그렇지 않음.
    • 현재 프로세스 A 가 CPU 를 사용하고 있는 상황에서 CPU 사용시간이 끝나, 다음 프로세스에게 CPU 를 넘겨주어야 합니다. 스케줄링 알고리즘에 의해 다음 CPU 를 받을 프로세스B 가 선택되었고, 타이머 인터럽트가 발생해 CPU 제어권이 운영체제 커널에 넘어가게 됨.
  • 이 과정에서 운영체제는 타이머 인터럽트 처리 루틴으로 가서 직전까지 수행중이던 프로세스 A 의 문맥을 자신의 PCB 에 저장하고, 프로세스 B 는 예전에 저장했던 자신의 문맥을 PCB로부터 실제 하드웨어로 복원 시키는 과정을 거치게 됨.
  • CPU 가 동시에 여러개의 프로세스를 실행시키는 것처럼 보이지만, 사실은 CPU 가 재빠르게 여러 프로세스를 번갈아가며 실행하고 관리하고 있는것. 이때 프로세스를 번갈아가면서 처리하는 것을 Context Switching(문맥교환)이라고 한다.

스레드 (Thread)

  • 프로세스 하나만을 사용해서 프로그램을 실행하기에는 메모리의 낭비가 발생한다. 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
  • 즉, 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다. 스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 시퀀스이다. 하나의 프로세스는 하나 이상의 스레드를 갖고 있다. https://velog.velcdn.com/cloudflare/aeong98/411e94f9-758b-40e3-93cb-938cde5fbd15/image.png
  • 스레드가 독립적으로 가지고 있는 부분
    • program counter (→ 실행 흐름)
    • register set
    • stack space
  • 스레드가 동료 스레드와 공유하는 부분 (=task)
    • code section
    • data section
    • OS resources
  • 전통적인 개념의 heavyweight process 는 하나의 thread 를 가지고 있는 task 로 볼 수 있다.

프로세스와 스레드의 차이점

운영체제는 프로세스마다 독립된 메모리 영역을 Code/Data/Stack/Heap의 형식으로 할당한다. 각각 독립된 메모리 영역을 할당해주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.

이와 다르게, 스레드는 메모리를 서로 공유할 수 있다. 자세히 말하자면 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 다로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서, 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.

https://velog.velcdn.com/cloudflare/aeong98/ce1b2913-bef7-46ff-9444-00dbd22489ef/image.png

정리하자면, 프로세스는 운영체제로부터 별도의 메모리 영역을 할당 받고

스레드는 Stack 을 제외한 Code/Data/Heap 부분은 공유해 서로 읽고 쓸 수 있게 된다. (공유자원을 가진다.)

0개의 댓글