프로세스는 실행중인 프로그램이다.
프로세스의 문맥(Context)
프로세스의 현재 상태를 나타내는 아래와 같은 것들을 프로세스의 문맥이라 한다.
프로세스들이 번갈아가며 실행되기때문에 프로세스의 문맥에 대한 백업을 필수이다.(시분할, 멀티태스킹 환경 등에서)
- CPU 수행 상태를 나타내는 하드웨어 문맥
- Program Counter
- 각종 Register
- 프로세스의 주소 공간
- code, data, stack(어떤 코드가 실행되고 있고, 어떤 데이터가 저장되어있고, 어떤 함수가 스택에 있는지)
- 프로세스 관련 커널 자료 구조
- PCB(운영체제가 프로세스 각각을 관리하기 위해 자신의 data 영역에 생성한 자료구조)
- Kernel Stack(시스템 콜을 한 프로세스 별로 커널 함수를 구분지어 스택에 저장)
PCB(Process Control Block)
프로세스의 상태
프로세스는 상태가 변경이 되며 수행된다.
- Running: CPU를 점유하고 Instruction을 수행하는 상태
- Ready: CPU를 점유하기 위해 대기하는 상태(프로세스가 실행되기 위한 모든 조건을 충족한)
- Blocked(Wait, Sleep): CPU를 점유하더라도 당장 Instruction을 수행할 수 없는 상태. 프로세스가 요청한 event(I/O 작업 등)가 완료되기까지 기다리는 상태
- Suspended(stopped): 외부적인 이유로 프로세스의 수행이 정지된 상태 프로세스가 통째로
swap out
됨
- ex) 사용자가 프로그램을 일시 정지시킨 경우(break key. 사람이 다시 재개시키면 위 상태로 돌아갈 수 있음)
- 중기 스케쥴러에 의해(메모리에 너무 많은 프로세스가 로드되어있을 때, 프로세스 하나를 통째로 메모리에서 디스크로 내보냄)
- New: 프로세스 생성중인 상태(Optional)
- Terminated: 실행이 끝난 상태(Optional)
프로세스 상태도
하드웨어 자원(I/O Device)뿐만아니라 소프트웨어 자원인 공유데이터를 사용할때도 Resource Queue(운영체제가 자신의 주소공간 중 data 영역에 큐 자료구조를 만들어 놓고, 프로세스의 상태를 바꿔가면서 CPU 줬다뺏는다)에서 대기하고 프로세스는 blocked
상태가 된다.
문맥 교환(Context Switch)
- CPU를 한 프로세스에서 다른 프로세스로 넘기는 과정
- CPU가 다른 프로세스에 넘어갈 때 운영체제는 다음과 같은 작업을 수행
- CPU를 넘기는 프로세스의 상태를 해당 프로세스의 PCB에 저장
- CPU를 받는 프로세스의 상태를 해당 프로세스의 PCB에서 읽어옴
- 문맥 교환은 오버헤드가 큰 작업(CPU를 넘기는 프로세스의 Cache Memory를 모두 비워야 하기때문(Cache Memory Flush))
프로세스를 스케쥴링 하기 위한 큐
프로세스는 각 큐들을 오가며 수행됨
- Job Queue: 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready Queue: 현재 메모리 내에 있으면서 CPU를 점유하기 위해 대기하는 프로세스의 집합
- Device Queue: I/O Device의 처리를 기다리는 프로세스의 집합
스케쥴러
- 장기 스케쥴러(Job Scheduler)
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- 프로세스에(프로세스는 메모리에 로드되어야 CPU 점유 권한을 얻을 수 있음) 메모리(나 각종 자원)을 주는 문제
- 메모리에 로드되는 프로세스의 수를 제어(메모리에 많은 프로세스(프로세스별로 차지하는 공간이 적어지기에 필요한 데이터가 없으면, I/O를 하러가야함)가 로드되어도, 적은 프로세스(CPU 유휴시간 김)가 로드되어도 컴퓨터 성능에 문제가 생김)
- 시분할 시스템(대부분의 시스템)에는 장기 스케쥴러없이 모든 프로세스를 메모리어 로드시킴(무조건 ready)
- 단기 스케쥴러(CPU Scheduler)
- 어떤 프로세스를 다음번에 실행시킬지 결정
- 프로세스에 CPU를 주는 문제
- 빠름(milisecond 단위)
- 중기 스케쥴러(Swapper)
- (일단 모든 프로세스를 올려놓고 메모리에 로드된 프로세스 수가 많다싶으면)일부 프로세스를 통째로 메모리에서 디스크로 내보냄
- 프로세스를 메모리에서 디스크로 내보내는 문제(뺏는 문제)
- 메모리의 로드되는 프로세스 수 제어
- 대부분의 시스템(현대의 운영체제)
Thread
만약 동일한 일을 수행하는 프로세스가 여러개 있다고 하면, 각 프로세스들의 주소공간이 만들어지고 메모리에 주소공간들이 로드되고, PCB가 여러개 생성되어 커널 주소공간의 data 영역에 로드된다. 이는 메모리 낭비이며, 이러한 낭비를 막기위해 Thread가 있다.
Thread를 이용하면, 메모리에 각각 주소공간들이 로드되는 것이 아니라, 주소공간 하나만 로드되고, 하나의 code 영역을 공유하면서 code 영역 내 다른 Instruction을 수행할 수 있다.
각각의 프로세스가 수행하는 Instruction에 대한 정보(Program Counter, Registers)를 PCB의 Thread 영역에 저장한다.(또한, Stack 영역에 Thread 별로 함수 호출 정보를 쌓는다)
즉, Thread는 프로세스 하나에 CPU 수행 단위만 여러개 두는 것을 말한다.(프로세스 하나에서 공유할 수 있는 것을 최대한 공유하고, CPU 수행과 관련된 정보만 별도로 가진다)
Thead의 구성
- Program Counter
- Register Set
- Stack
Thread끼리 공유하는 부분(task)
- Code Section
- Data Section
- OS Resources
Thread 사용 장점
- 다중 스레드로 구성된 태스크 구조에서 하나의 스레드가 blocked된 상태여도 동일한 태스크 내 다른 스레드가 실행되어 처리를 빠르게 할 수 있음(응답시간 빨라짐. 웹 포털에 접속할 때 페이지를 읽어오는 동안 프로세스가 blocked되지 않게, 다른 스레드가 HTML 문서 정도를 화면에 띄워준다)
- 동일한 일을 수행하는 다중 스레드가 협력해 높은 처리율(스레드를 생성하거나 다른 스레드에게 CPU를 전달하는 것은 크게 오버헤드가 없기때문)과 성능 향상, 자원 절약(메모리)
- 병렬성을 높일 수 있음(CPU가 여러개 있는 경우. 처리가 빠름)
스레드 구현 방식
- 커널 스레드: 스레드가 운영체제의 지원을 받음. 운영체제가 하나의 스레드에서 다른 스레드로 CPU가 넘어가는 것을 관리
- 유저 스레드: 라이브러리를 통해 지원. 유저 프로그램자체가 여러 스레드를 관리(라이브러리의 지원을 받아). 커널 스레드에 비해 구현 상 제약이 있을 수 있음
참고
https://core.ewha.ac.kr/publicview/C0101020140307151724641842?vmode=f