Develop/CS

[OS] 프로세스와 스레드

연로그 2022. 2. 8. 00:00
반응형

프로그램 vs 프로세스 vs 스레드

 

프로그램

  • 어떤 작업을 위해 실행할 수 있는 파일
  • 메모리에 올라가지 않은 Windows의 *.exe 같은 정적 파일
    (메모리에 올라가다: 실행을 하려면 OS가 독립적인 메모리 공간을 할당해줘야 함)

 

프로세스

  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
  • OS로부터 시스템 자원을 할당 받는 작업의 단위

 

스레드

  • 프로세스 내에서 실행되는 여러 흐름의 단위
  • 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로
  • 프로세스 내에 여러개 존재할 수 있으며 Code, Data, Heap 영역은 공유하고 Stack은 각자 할당 받음
  • 실행 중 오류 발생 시 다른 스레드까지 강제 종료될 수 있음

 

프로세스와 스레드의 메모리 구조

 

🔻 데이터 영역

더보기
  • 코드: 현재 프로세스에서 실행 중인 프로그램의 바이너리 코드
  • 데이터: 전역 변수, 상수 등
  • 힙: 런타임에 할당할 메모리 영역
  • 스택: 지역 함수, 변수처럼 현재 실행 중인 컨텍스트와 관련된 정보

 

 


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

 

멀티 프로세스

  • 하나의 응용 프로그램을 여러 프로세스로 구성해 각 프로세스가 하나의 작업을 처리하도록 하는 것
  • 여러 자식 프로세스 중 하나가 문제 발생 시 해당 프로세스만 죽음. (= 서로 영향 없음)
  • Context-Switching에서의 오버헤드
    • 캐시 메모리 초기화 등 무거운 작업이 진행되어 많은 시간이 소모
    • 프로세스 사이에 공유된 메모리가 없음
      (= Context Switching 발생 시 캐시의 모든 데이터를 리셋하고 정보를 불러와야 함)
  • 프로세스 간 복잡한 통신 기법 필요 (IPC; Inter-Process Communication)

 

🔻 Context-Switching이란?

더보기

: 현재 진행중인 프로세스의 상태를 저장하고 다음 진행할 프로세스의 상태 값을 읽어 적용하는 과정

 

프로세스 상태

  • new: 프로세스를 위한 PCB가 생성되었지만 메모리에는 올라가있지 않은 상태
  • ready: 프로세스가 CPU를 점유하고 사용이 가능한(dispatch) 상태
  • running: 프로세스가 현재 CPU를 점유해 작업을 처리 중인 상태
  • waiting: running 상태인 프로세스가 입출력을 요청한 후 입출력 완료때까지 기다리는 상태
  • terminated: 프로세스가 작업을 완료해 메모리 자원을 반납하고 PCB가 삭제된 상태

 

Context-Switcing은 인터럽트 기반으로 동작한다.

  1. 인터럽트 발생 시 CPU가 진행 중인 작업 중단
  2. 해야할 일이 정의된 인터럽트 서비스 루틴 수행
  3. 현재 실행 중인 Task의 Process Control Block 정보 저장
  4. 다음 실행할 Task의 Process Control Block 정보 읽어 Register에 적재

 

인터럽트란?

  • CPU가 프로그램을 실행중에 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것
  • 하드웨어 인터럽트: 하드웨어가 발생시킨 인터럽트
  • 소프트웨어 인터럽트
    • Exception: 프로그램의 오류 발생
    • System Call: 프로그램이 커널 함수 호출
  • 인터럽트 벡터: 인터럽트가 발생했을 때, 그 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간

 

context switching 예외 케이스

  1. 프로세스 A 실행 중에 인터럽트나 시스템콜 호출
  2. 커널 모드로 수행
  3. 프로세스 A로 복귀 

이 경우에도 CPU 수행 정보 등 context 일부를 PCB에 저장은 해야한다. 프로세스 A 실행 후 어떤 로직을 거쳐 CPU를 프로세스 B에게 넘겨주게 되어야 context switching이라고 한다.

커널 모드사용자 모드

  • 커널 모드: OS가 CPU의 제어권 갖고 명령 수행. 특권 명령 수행 가능
  • 사용자 모드: 일반 사용자 프로그램이 CPU 제어권 갖고 명령 수행. 일반 명령만 수행 가능

 

특권 명령이란?

  • 일반 명령: 메모든 프로그램이 수행할 수 있는 명령
  • 특권 명령: 보안이 필요한 명령 (ex: 입출력 장치, 타이머 장치 접근 명령 등)

 

🔻 PCB란?

더보기
  • = Process Controler Block

  • 멀티 태스킹에서 커널이 각 프로세스의 정보를 저장하고 관리하기 위해 사용
    (스레드의 정보를 저장하는건 Thread Control Block으로 PCB에 저장됨)

  • 커널의 데이터 영역에 저장됨

  • PCB의 레지스터에 프로그램 카운터 저장
    (프로그램 카운터: Context Switching이 일어날 때 현재까지 실행된 코드와 다음으로 실행할 코드 주소)

 

저장되는 정보 (구조체로 유지)

  • OS가 관리상 사용하는 정보
    • 프로세스 상태, ID
    • 스케줄링 정보, 우선순위
  • CPU 수행 관련 하드웨어 값
    • Program counter, registers
  • 메모리 관련
    • Code, Data, Stack 위치 정보
  • 파일 관련
    • Open file descriptors

 

 

멀티 스레드

  • Context-Switching 시 공유하는 메모리 만큼 메모리 자원을 아낄 수 있음
  • 스레드는 Stack 영역을 제외한 모든 메모리를 공유해 통신의 부담이 적음 -> 응답 시간 ↓
  • 한 스레드가 프로세스 내 자원 망치면 모든 프로세스가 종료되어야 함
  • 자원 공유로 인한 동기화 문제
  • 각 스레드는 자신만의 실행 상태를 가질 수 있어 서로 다른 CPU에서도 동작 가능
    -> 여러 CPU를 단일 회로로 통합한 멀티 코어 프로세서를 이용하면 물리적인 병렬 처리 가능

 

🔻 동시성과 병렬성

더보기
  • 동시성: 동시 실행되는 것처럼 보임
  • 병렬성: 실제로 동시에 실행

 


참고

  1. velog - @raejoonee
  2. github - nesoy
  3. 레스토랑에 비유해서 알아보는 운영체제
  4. KOCW 무료 강의 - 반효경 교수님의 운영체제
  5. github - splin / 뮤텍스, 세마포어, 모니터
반응형