본 게시물은 운영체제 과목의 강의영상과 강의자료를 바탕으로 작성한 학습용 게시물입니다.
프로세스 정의
# 프로세스
: 실행 중인 프로그램
- 시스템 콜을 통해 자원을 요구하는 주체
- 멀티 프로세싱 혹은 멀티 태스킹
- 사용자 프로세스 - 응용 프로그램이 실행되는 것
- 시스템 프로세스 - 운영체제가 필요에 의해 생성
문맥과 문맥교환
# 문맥 (Context)
: 프로세스의 실행 중단 시 보존되고, 속개 시 다시 원상 복구되어야하는 프로세스의 모든 실행 정보
- 사용자 수준 문맥 (User-level context) - 메인 메모리 현재 상태
- 텍스트 영역 : 프로그램 코드 부분
- 자료 영역 : 프로그램 광역변수 부분
- 스택 영역 : 프로그램 실행시간 스택 부분 - 커널 수준 문맥 (Kernel-level context) - 커널이 관리하는 내용
- CPU 내의 각종 특수 레지스터의 내용 : 프로그램 카운터 (PC), 스택 포인터 (SP), CPU 상태 레지스터(PCR)
- CPU 내의 각종 범용 레지스터 내용
- 프로세스의 현재의 각종 자원 사용 정보
- 커널의 프로세스 관리 정보
# 커널 수준 문맥
- CPU 내의 특수 레지스터의 내용
- 프로그램 카운터 (PC)
- 스택 포인터 (SP)
- CPU 상태 레지스터(PCR) (모드비트) - CPU 내의 각종 범용 레지스터 - 일반 계산용
- 프로세스의 현재의 각종 자원 사용 정보
- 커널의 프로세스 관리 정보
# 문맥 교환
- CPU를 다른 프로세스로 넘기는 작업
- 실행이 정지되는 프로세스의 문맥은 보존되고, 새로 실행되는 프로세스의 문맥이 활성화됨
- 사용자 수준 문맥은 메모리에 남아 있음
- CPU에 있던 레지스터의 내용들은 추후의 복구를 위해 저장되고, 스케쥴링된 새로운 프로세스의 문맥이 적재(store) 됨
# 문맥교환 시점
- 비자발적 문맥교환
- 시분할 기반의 스케쥴링(타임 슬라이스 소진)
- 인터럽트로 인해 CPU 선점 당함 - 자발적 문맥교환
- 프로세스 스스로 입출력 요청을 함
- 프로세스 스스로 다른 프로세스가 보낼 시그널에 대한 대기 요청을 하여 CPU를 반납
프로세스의 상태 천이
# 프로세스의 상태
- 생성 : 프로세스가 생성된 상태
- 준비 : CPU의 배정을 기다리는 상태
- 실행 : 프로세스가 CPU에 의해 실행되고 있는 상태
- 대기 : 프로세스가 어떤 사건이 발생하기를 기다리고 있는 상태
- 종료 : 프로세스가 종료된 상태
# 준비 상태
- 스케쥴링에 의해 언제든지 실행이 될 수 있는 상태
- 준비 리스트 또는 준비 큐에서 기다리고 있게 됨 - 준비상태로 천이되어 오는 경우
- 프로세스 생성 후, 선정되어 CPU 할당을 대기
- 프로세스가 실행되던 도중에 비자발적인 문맥교환 일어남
- 대기하고 있던 입출력 또는 시그널 사건이 완료된 경우
# 실행 상태
- CPU가 프로세스를 수행하는 상태
- CPU를 회수 당하거나 반납할 때까지 실행 상태에 있게됨
- 회수당할 경우 준비상태로 천이, 반납할 경우 대기 상태로 천이 - 사용자 모드 실행 : 사용자나 라이브러리 코드가 실행되고 있는 상태
- 커널 모드 실행 : 프로세스가 시스템 호출을 해 커널 내부로 진입해 커널의 코드부분이 실행되는 상태
# 대기 상태
- 사용자 프로세스가 시스템 호출을 통한 입출력 요구나, 사건 발생 대기 중에는 CPU에 의해 수행될 필요x →반납
- CPU 반납 후 입출력 완료 또는 사건 발생 시까지 대기
- 사건의 종류별로 구성된 대기 리스트로 이동
- 사건 발생시, 즉 사건 완료 시에는 준비 상태로 천이 - 대기 상태 중에도 I/O 는 진행됨
- CPU와 I/O를 overlap 할 수 있는 기반이 됨
PCB (Process Control Block)
# 프로세스 제어 블록 (PCB, Process Control Block)
- 프로세스의 일생 동안 해당 프로세스의 모든 정적 및 동적인 정보를 가짐
- 커널 내의 프로세스 문맥 정보를 저장하는 자료 구조 - 커널이 프로세스를 관리하기 위한 실체
- 커널은 PCB를 통해 프로세스 관리 - 준비리스트나 대기리스트는 결국 PCB의 리스트
- 실행 상태 시에 PCB는 준비 리스트에 존재, 상태표시만 RUNNING 상태로 변경
- 프로세스 각자의 PCB에 각자의 문맥과 상태를 save하고 restore 하면서 프로세스들이 번갈아가며 수행
시스템 호출, 인터럽트, 문맥교환
- 시스템 호출 처리
- 대기에 의한 문맥 교환
- 인터럽트에 의한 디스크 입출력의 처리
- 상태천이와 PCB의 이동
# 상태천이 예시 ( read() )
- (사용자모드) 프로세스 A가 수행중인 상태에서 read() 시스템 콜 호출
- (커널모드) 하드디스크 구동
- 프로세스 A가 대기상태로 천이
- 프로세스 B가 수행상태가 됨
- 프로세스 A가 준비상태로 천이
- 프로세스 B가 준비상태로 천이
- 프로세스 A가 다시 수행상태로 천이 - read() 시스템 콜의 return 과정 수행
프로세스의 생성과 종료
- fork 시스템 콜을 통해 생성
- exit 시스템 콜 호출로 종료
- 부모 프로세스가 fork()를 호출하지만 부모와 자식 두곳으로 fork()로부터의 리턴이 일어남
- 부모 : 자식의 PID
- 자식 : 0 - 동일한 프로그램을 수행하는 가상적인 CPU가 하나 만들어져 따로 실행을 시작하게 된 것으로 생각
- 사용자 문맥의 text는 공유, data, stack 공간은 별도로 생성 , PCB 생성 (커널문맥도 별도 존재)
# 자원 상속과 문맥
- PCB 생성 후 Cloning
- 자원 상속
- 자식은 부모로부터 속성, 자원 등을 상속 - 레지스터 문맥 복제
- 부모의 특수 레지스터 및 범용 레지스터 값도 자식의 초기값으로 복제되나 수행되는 즉시 값들은 달라짐 - 사용자 수준 문맥 복제
- text 영역은 공유
- data, heap, stack 영역은 복사되어 별도 할당
# exec family의 사용
- 디스크의 프로그램을 새로운 프로세스로 생성하기 위해 fork+exec 사용
- 자식이 생성된 후 자신의 주소 공간에 디스크로부터 새로운 프로그램을 적재해 수행시킴
- PCB의 정보 및 부모 자식 관계 등은 유지한 채, text, data, stack 영역이 새로운 프로그램을 위한 것으로 교체
→ 새로운 문맥 탄생
# 프로세스의 종료
- exit() 시스템 콜 통해 커널에 자신의 종료 요청
- abort() 사용해 다른 프로세스의 종료 요청
- 주로 부모만 → fork의 리턴값이 자식의 PID인 이유 - main 함수 끝까지 도달해 return이 일어남
쓰레드 (thread)
- 전통적 프로세스
- 프로세스 간 공유변수 갖기 어려움
- 운영체제가 제공하는 특수 구조체난 공유파일 사용
- fork 시 text만 공유하고 나머지 모두를 복사해 생성하므로 시간적 오버헤드와 메모리 낭비 - 쓰레드
- 텍스트와 데이터는 공유, 스택만 따로
- 전역 변수를 자료교환 수단으로 사용
- 생성이 더 빠르고 자원 점유 적음
# 쓰레드
- 사용자 프로세스 입장에서 보면 하나의 프로세스를 여러 CPU가 수행중인 것으로 볼 수 있음
- 장점
- 응답성, 자원 공유, 경제성, 다중처리기 구조 활용 - 한 프로세스 내에서 여러 프로세스가 동시에 동작되도록 하려면 시분할 단위를 쓰레드로
- 레지스터 문맥을 쓰레드 별로 관리하면서 이 레지스터 문맥을 대상으로 문맥 교환을 하도록
# TCB (Thread Control Block)
: CPU 관련 정보를 가지고 있는다.
- 하나의 쓰레드 만들어질 때마다 TCB 확장
# 사용자 쓰레드 vs. 커널 쓰레드
: 사용자 입장에서는 별 차이 x
- 사용자 쓰레드 : 응용프로그램의 라이브러리에 의해 관리
- 단점 : 한 쓰레드가 blocking I/O 상태면 다른 쓰레드도 block
- 장점 : 커널에 의해 관리될 필요 x → 관리 빠름 - 커널 쓰레드 : 커널 자체적으로 쓰레드를 만들어 관리
- 단점 : 생성, 관리 느림
- 장점 : 한 쓰레드가 블로킹되어도 다른 쓰레드에 영향 x - 혼합형 모델 - 대부분 두 가지 형태의 쓰레드 모두 지원
# 다중 쓰레드 모델
- 다-대-일 모델
- 다-대-다 모델
- 일-대-일 모델
# 쓰레드 스케쥴링 범주
- 쓰레드가 지원되는 운영체제에서는 프로세스가 아닌 쓰레드가 스케쥴 대상
- PCS (Process-Contention Scope)
- 사용자 라이브러리에 의해 사용자 레벨 쓰레드에 대해 스케쥴링이 이루어지는 범주 - SCS(System-Contention Scope)
- CPU 할당을 위해 시스템 내 모든 커널 쓰레드에 대해 스케쥴링이 이루어지는 범주
'LECTURE > [2021-1] 운영체제' 카테고리의 다른 글
[운영체제] 6. 상호작용 프로세스와 동기화 (0) | 2021.06.17 |
---|---|
[운영체제] 5. 실시간 스케쥴링 (0) | 2021.06.17 |
[운영체제] 4. 프로세스 스케쥴링 (0) | 2021.06.17 |
[운영체제] 2. 컴퓨터구조와 OS 연계 (0) | 2021.06.15 |
[운영체제] 1. 운영체제의 태동과 발전 (0) | 2021.06.14 |