-
[운영체제(OS)] 프로세스와 스레드, Context Switch란?Computer Science/Operating System 2024. 1. 10. 09:30728x90
프로세스 (Process)
프로세스 : 실행 중인 프로그램
프로세스 Context
프로세스의 context는 크게 3가지로 분류할 수 있다.
- 하드웨어 context : CPU 수행상태를 나타내는 것으로 PC(Program Counter)와 각종 레지스터에 저장하고 있는 값들
- 프로세스의 주소 공간 : 코드(code), 데이터(data), 스택(stack)으로 구성된 프로세스만의 독자적인 주소 공간
- 커널 상의 context : 프로세스 관리를 위한 자료구조인 PCB(Process Control Block)와 Kernel stack(커널 내의 주소)
커널? 리눅스 구성요소 중 핵심 구성 요소. 하드웨어와 프로세스 운용을 위한 인터페이스.
프로세스의 주소 공간 (Big Endian)
OS Code 실행 명령을 포함하는 코드들 Data Static 변수(정적 변수) 혹은 Global 변수(전역 변수) Heap 동적할달 시 사용(malloc(), new() 등) → 동적 메모리 영역 Stack 지역변수, 매개변수, 리턴값 등등 일시적인 데이터 → 임시 메모리 영역 PCB(Process Control Block)
- pointer : 준비 상태나 대기 상태 큐를 구현하기 위해 필요한 포인터
- process state : 현재 프로세스 상태(Create, Ready, Running, Waiting, Terminated)
- process number : 프로세스 번호
- process counter : 다음 실행할 명령어의 주소 값
- CPU registers : accumulator, index register, stack pointers, general purpose registers
인터럽트가 발생해서 CPU를 할당받은 프로세스가 대기 상태가 되고 다른 프로세스를 CPU에 할당해 실행 상태로 바꿔올릴 때, 대기상태가 된 프로세스 정보를 PCB에 저장한다.
PCB는 연결리스트 방식으로 관리한다. 프로세스가 생성되면 해당 PCB가 생성되고 프로세스 완료 시 PCB가 제거된다.
프로세스의 상태
시스템에는 Batch Job 시스템(일괄 작업 시스템)과 시분할 시스템이 있다.
Batch Job 시스템
사용자가 수정이나 삽입같은 데이터 변경을 할 수 없는, 모든 작업을 한번에 처리하는 시스템이다.
시분할 시스템 (Time Sharing System)
CPU를 쪼개서 여러가지 프로세스들에게 CPU를 사용할 수 있도록 한다. 그래서 CPU 효율이 Batch Job 시스템에 비해서 높은 편이다.
시분할 시스템을 기준으로 프로세스 상태를 분류하면 다음과 같다.
▷ 시작(new) 상태
프로세스가 생성 중인 상태이다. 프로세스가 생성되어 PCB와 같은 프로세스를 위한 자료구조는 생성되었지만 아직 메모리를 획득하지 못한 상태로 disk, ssd에 들어있다.
▷ 준비(ready) 상태
프로세스가 메인 메모리에 들어온 상태로 ready queue에서 기다린다. CPU scheduler를 통해 CPU를 얻을 때까지 기다린다.
▷실행(running) 상태
프로세스가 CPU를 보유하고 기계어 명령을 실행하고 있는 상태이다. 일반적인 컴퓨터 시스템에서 CPU는 하나 뿐이기 때문에 여러 프로세스가 동시에 수행된다고 해도 실제로 실행 상태에 있는 프로세스는 하나 뿐이다.
Ready Queue에 있던 프로세스가 자신의 차례를 부여받아 실제로 수행된다. CPU Scheduler가 dispatch()를 수행하면 준비상태에서 실행상태로 바뀐다.
▷ 대기(Blocked) 상태
CPU를 할당받더라도 당장 명령을 실행할 수 없는 프로세스의 상태이다. 예를 들어 프로세스가 실행 상태에서 입출력 이벤트가 발생했을 때 CPU는 입출력 관리자에게 작업을 맡기고 프로세스를 대기 상태로 만든다. 이후에 입출력 관리자가 해당 입출력 작업을 완료했다면 인터럽트가 발생해 대기 상태의 프로세스들 중에서 해당 프로세스를 찾고, 해당 프로세스는 다시 Ready Queue에 들어간다.
▷ 완료(terminated) 상태
프로세스가 종료 중인 일시적 상태이다. 프로세스가 종료되었으나 운영체제가 PCB와 같은 프로세스와 관련된 자료구조를 완전히 종료하지 못해 메인 메모리에 남아있는 상태이다. (좀비 프로세스) exit()을 실행하여 처리한다.
스레드 (Thread)
스레드란? 프로세스 안에서 실행되는 여러 흐름 단위이다. 기본적으로 프로세스마다 최소 1개의 스레드를 소유하고 있다. 하나의 프로세스가 생성될 때, 기본적으로 하나의 스레드를 같이 생성한다.
프로세스 VS 스레드
프로세스 스레드 각각 별도의 주소 공간을 독립적으로 할당한다.
프로세스 자신만의 고유 공간과 자원을 할당받아 사용한다.Stack 영역만 따로 할당 받고 나머지 영역은 서로 공유한다.
스레드는 다른 스레드와 공간, 자원을 공유하면서 사용한다.멀티 프로세스 멀티 스레드 정의 여러 개의 프로세스가 동시에 실행되는 것 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것 통신방법 IPC를 사용한 통신 (참고) 공유된 자원을 활용한 통신 특징 프로세스 별 자원으로 자원 소모
개별 메모리 차지
context switch 비용이 큼공유된 자원으로 통신 비용 절감
공유된 자원으로 메모리 효율적
context switch 비용 적음자원관리 동기화 작업이 필요하지 않음 동기화 작업이 필요함 Context Switch
멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위인 프로세스가 실행되어야 할 때 기존의 프로세스 상태 또는 레지스터 값(context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(context)를 교체하는 작업이다. 즉 현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정을 말한다.
Context Switch가 필요한 경우
context switch가 발생하는 경우는 멀티 태스킹, 인터럽트 핸들링, 사용자 모드와 커널 모드 간의 전환까지 크게 3가지가 존재한다.
멀티태스킹(Multitasking)
하나의 CPU에서 실행 가능한 프로세스들이 운영체제의 스케줄러에 의해 조금씩 번갈아가면서 수행되는 것을 말한다. (멀티프로세스는 여러개의 CPU가 각각 작업을 처리하는 것)
번갈아가면서 프로세스가 CPU를 할당받을 때 프로세스 변경을 위해 context switch를 한다. 사용자가 체감하기 힘든 속도로 context switch 되기 때문에 여러 프로세스가 동시에 처리되는 것처럼 느껴진다.
인터럽트 핸들링(Interrupt Handling)
인터럽트란 컴퓨터 시스템에서 예외 상황이 발생했을 때 CPU에게 알려 처리할 수 있도록 하는 것을 말한다. 인터럽트가 발생하면 Context Switch 한다.
- I/O request : 입출력 요청
- time slice expired : CPU 사용 시간이 만료
- fork a child : 자식 프로세스 생성
- wait for an interrupt : 인터럽트 처리 대기
사용자 모드와 커널 모드 전환(User mode and Kernel mode switching)
사용자와 커널 모드 전환은 Context Switch가 필수는 아니지만 운영체제에 따라 발생할 수 있다.
Context Switch 과정
Task의 대부분 정보는 Register에 저장되고 PCB로 관리된다. 현재 실행하고 있는 Task의 PCB 정보를 저장하게 된다. 이후 다음 실행할 Task의 PCB 정보를 읽어 Register에 적재하고 CPU가 이전에 진행했던 과정을 연속적으로 수행할 수 있다.
- 요청발생
- 인터럽트(하드웨어 또는 소프트웨어 인터럽트) 또는 예외(트랩)와 같은 이벤트로 인해 컨텍스트 스위치 시작
- 주로 타이머 인터럽트, 입출력 완료, 혹은 다른 프로세스 실행을 위한 스케줄링 등이 해당
- 현재 프로세스 PCB에 저장
- 운영체제는 실행 중인 프로세스의 정보(Program Counter, 레지스터 값, 스택포인터(SP), 상태 레지스터 등)를 PCB에 저장
- 프로세스 상태 변경
- 현재 실행 중인 프로세스는 실행 중단되었기 때문에, 해당 프로세스 상태를 PCB에 반영한다.
- 이 상태는 ready queue에 있거나 Blocked 상태일 수 있다.
- PCB를 적당한 큐로 이동
- ready or blocked or read/suspend queue로 이동
- 프로세스 스케줄링
- 다음으로 실행될 프로세스 선택
- 일반적으로 ready queue에서 우선순위가 가장 높은 프로세스를 선택하거나 라운드 로빈(Round Robin)과 같은 스케줄링 알고리즘에 따라 선택
- 다음 프로세스 정보 로드
- 선택된 프로세스의 PCB에서 저장된 정보를 레지스터, 프로그램 카운터, 스택 포인터 등에 로드한다.
- 프로세스 상태 변경
- 선택된 프로세스의 PCB의 상태를 running으로 변경
- 메모리 관리 정보 업데이트
- 선택된 프로세스에게 할당된 메모리 정보 등과 같은 메모리 관리 자료구조를 업데이트 한다.
- CPU 할당
Context Switch 비용
Context Swtich가 발생하게 되면 많은 Cost가 소요된다. cache 초기화(프로세스 변경 시 캐시 비운 후 다시 채우는 과정 필요), memory mapping 초기화(가상 주소 공간 변경, 페이지 테이블 변경, TLB 초기화), kernel은 항상 실행되어야 한다. Context Switch 비용은 Process가 Thread보다 많이 든다. Thread는 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 Context Switch 발생 시 Stack 영역만 변경을 진행하면 된다.
참고
728x90