운영체제#2 프로세스와 스레드

성찬홍·6일 전

Computer Science

목록 보기
12/17

프로세스

-> 프로세스는 실행중인 프로그램을 말한다.

  • 포그라운드 프로세스
    • 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스
    • 사용자와 직접 상호작용이 가능한 백그라운드 프로세스
    • 사용자와 직접 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스
    • 데몬 ( daemon ) , 서비스 ( service )

프로세스 제어 블록

  • 모든 프로세스는 실행을 위해 CPU가 필요하다

  • But, CPU 자원은 한정되어 있다.

  • 프로세스들은 돌아가며 한정된 시간만큼만 CPU 이용

    • 자신의 차례에 정해진 시간만큼 CPU 이용
    • 타이머 인터럽트가 발생하면 차례 양보
  • 빠르게 번갈아 수행되는 프로세스들을 관리해야한다

  • 이를 위해 사용하는 자료구조가 프로세스 제어 블록 ( 이하 PCB )

    • 프로세스 관련 정보를 저장하는 자료 구조이다.
    • 마치 상품에 달린 태그와 같은 정보
    • 프로세스 생성 시 커널 영역에 생성 , 종료 시 폐기

  • PCB에 담기는 대표적인 정보
    • 프로세스 ID ( = PID )
      • 특정 프로세스를 식별하기 위한 고유 ID ⇒ PK
    • 레지스터 값
      • 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 → 실행 제게
      • 프로그램 카운터 , 스택 포인터 등등
    • 프로세스 상태
      • 입출력 장치를 사용하기 위해 기다리는 상태 ,CPU를 사용하기 위해 기다리는 상태 등등
    • CPU 스케쥴링 정보
      • 프로세스가 언제 , 어떤 순서로 CPU에 할당받을지에 대한 정보
    • 메모리 정보
      • 프로세스가 어느 주소에 저장되어있는지에 대한 정보
      • 페이지 테이블 정보
    • 사용한 파일과 입출력장치 정보
      • 할당된 입출력장치 , 사용중인 파일 정보

문맥 교환

  • 한 프로세스에서 다른 프로세스로 실행 순서가 넘어가면?
  • 기존에 실행되던 프로세스 A는 지금까지의 중가 정보를 백업
    • 프로그램 카운터 등 각종 레지스터 값, 메모리 저장, 열었던 파일, 사용한 입출력 장치 등
    • 이러한 중간 정보 == 문맥(context)
    • 다음 차례가 왔을 떄 실행을 재개하기 위한 정보
    • 실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다
  • 뒤이어 실행할 프로세스 B의 문맥을 복구
    • 자연스럽게 실행 중인 프로세스가 바뀜

사용자 영역에는 어떻게 되어있을까

  • 크게 코드 영역 =(텍스트 영역), 데이터 영영, 힙 영역 , 스택 영역이 있다

코드 영역 (= 텍스트 영역 )

  • 실행할 수 있는 코드 , 기계어로 이루어진 명령어 저장
  • 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역

데이터 영역

  • 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터 저장
  • e.g. 전역 변수

힙 영역

  • 프로그램을 만든 사용자 , 즉 프로그래머가 직접 할당할 수 있는 저장 공간

→ 요새는 가비지 컬렉션이 있어서 , 알아서 비워줌

스택 영역

  • 데이터가 일시적으로 저장되는 공간
  • ( 데이터 영역에 담기는 값과는 달리 ) 잠깐 쓰다가 말 값들이 저장되는 공간
  • e.g 매개 변수, 항당 변수

& 힙 영역과 스택 영역의 크기는 가변적

  • 일반적으로 힙 영역은 낮은 주소 → 높은 주소로 할당
  • 일반적으로 스택 영역은 높은 주소 → 낮은 주소로 할당

프로세스 상태와 계층 구조

프로세스 상태

  • 생성 상태
    • 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
    • 준비가 완료되었다면 준비 상태로
  • 준비 상태
    • 당장이라도 CPU를 할당 받아 실행할 수 있지만
    • 자신의 차례가 아니기에 기다리는 상태
    • 자신의 차례가 된다면 실행 상태로
  • 실행 상태
    • CPU를 할당 받아 실행중인 상태
    • 할당된 시간을 모두 사용 시 준비 상태로
    • 실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태로 간다
  • 대기 상태
    • 프러세스가 실행 도중 입출력장치를 사용하는 경우
    • 입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 접어듬
    • 입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면 ) 준비 상태로 간다
  • 종료 상태
    • 프로세스가 종료된 상태를 말한다
    • PCB,프로세스의 메모리 영역 정리

프로레스 계층 구조

  • 프로세스 실행 도중 (시스템 호출을 위해 ) 다른 프로세스 생성 가능
  • 새 프로세스를 생성한 프로세스 : 부모 프로세스
  • 부모 프로세스에 의해 생성된 프로세스 : 자식 프로세스

→ 부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID를 가진다
→ 일부 운영체제에서는 자식 프로세스 PCB에 부모 프렛스 PID를 명시하기도 한다
⇒ 이렇게 프로세스는 계층 구조를 형성한다

부모 프로세스는 자식 프로세스를 어떻게 만들어 내고 , 자식 프로세스는 어떻게 자신의 코드를 실행할까?

  • 복제와 옷 갈아입기
    • 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성한다
    • 자식 프로세스느 exec 시스템 호출을 통해 자신의메모리 공간을 다른 프로그램으로 교체한다

fork 시스템 호출

  • 복사본(=자식 프로세스) 생성
  • 부모 프로세스의 자원 상속

exec 시스템 호출

  • 메모리 공간을 새로운 프로그램으로 덮어쓰기
  • 코드/데이터 영역을 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화

스레드

  • 스레드는 프로세스를 구성하는 실해 흐름의 단위이다.
    • 하나의 프로그램이 동시에 여러 일을 할 수 있게 하는 작업 흐름 단위
    • Ex) 웹브라우저가 웹페이지 로딩, 사용자 입력 처리, 동영상 재생을 동시에 하는 것 → 각각이 스레드
    • 같은 프로세스 안에서 메모리를 공유한다
  • 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.

실행 흐름이 여러 개인 프로세스 ( 멀티 스레드 프로세스 )

→ 프로세스를 이루는 여러 명령어 동시 실행 가능

실행 흐름이 여러 개인 프로세스 ( 멀티 스레드 프로세스 )

→ 프로세스를 이루는 여러 명령어 동시 실행 가능

스레드의 구성 요소

  • 스레드 ID , 프로그램 카운터를 비롯한 레지스터 값 , 스택 등
  • 실행에 필요한 최소한의 정보

멀티 프로세스와 멀티 스레드

case1 : 동일한 작업을 수행하는 단일 스레드 프로세트 여러개 실행

  • 프로세스를 fork하면 코드/데이터/힙 영역 등 모든 자원이 복제되어 저장됨
  • 저장된 메모리 주소를 제외하면 모든것이 동일한 프로세스 2개가 통째로 메모리에 적재
  • fork를 세번 네번하면 메모리에는 가틍ㄴ 프로세스가 통째로 3개 4개 적재

참고)

fork 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않는 방법도 있다.

이를 쓰기 시 복사기법이라 한다.

case2 : 하나의 프로세스를 여러 스레드로 실행

  • 스레드들은 각기 다른 스레드 ID , 프로그램 카운터 값을 포함한 레지스터 값 , 스택을 가질 뿐 프로세스가 가지는 자원을 공유한다.

정리

프로세스는 실행 중인 프로그램을 의미하며, 포그라운드/백그라운드 프로세스로 나뉜다. 운영체제는 여러 프로세스를 빠르게 번갈아 실행하기 위해 프로세스 제어 블록(PCB) 을 사용하여 PID, 레지스터 값, 메모리 정보 등 실행 상태 유지를 위한 핵심 정보를 관리한다. 또한 프로세스 간 전환 시 문맥(context)을 저장·복구하는 문맥 교환(Context Switching) 이 일어나며, 프로세스의 메모리 영역은 코드, 데이터, 힙, 스택 영역으로 구성된다.

프로세스는 생성·준비·실행·대기·종료 상태를 오가며 실행되며, 부모 프로세스는 fork() 시스템 호출을 통해 자신의 복제본인 자식 프로세스를 만들고, 자식 프로세스는 exec() 를 사용하여 실행할 프로그램으로 메모리를 갈아입는다. 이를 통해 운영체제는 계층 구조 형태로 프로세스를 관리하며, 각각의 프로세스는 독립적인 PID를 가진다.

스레드는 프로세스를 이루는 실행 흐름 단위로, 하나의 프로세스가 여러 스레드를 갖는 멀티스레드 구조를 통해 동시에 여러 작업을 수행할 수 있다. 스레드는 스택과 레지스터 같은 최소한의 정보만 따로 갖고, 코드·데이터·힙 영역은 프로세스 내에서 공유한다. 반면 멀티프로세스는 프로세스를 여러 개 생성하므로 메모리 사용량이 크지만, 멀티스레드는 자원을 공유하여 효율적이다.

참고

https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

profile
꾸준한 개발자

0개의 댓글