운영체제 수업을 수강하며 정리한 내용을 작성하려고 합니다.
Process의 자원 및 생성

- 프로세스에 할당된 자원과 Abstraction
- 메모리: (virtual) Address space
- 스토리지: (opened) files
- 네트워크: (opened) sockets
- 프로세스의 메모리 공간
- text: 프로그램 코드
- data: 전역 변수와 데이터
- heap: 동적으로 할당된 메모리 구역 (e.g., malloc, free)
- stack: 일시적인 데이터(e.g., 함수 호출시 넘겨주는 파라미터)
- 프로세스의 주소 공간
- 프로그램의 메모리 관점은 물리적인 메모리와 구분됨
Process from program

- 디스크 이미지(실행 파일) vs (메모리) 프로세스
- 같은 프로그램이 서로 다른 프로세스로 동작할 수 있음
- 디스크 이미지의 header를 파일 시스템의 메타데이터라고 함
- 프로세스는 storage에 저장된 프로그램으로부터 변환되어 메모리로 로드됨
Context switch (문맥 전환)
- CPU에서 수행되는 프로세스가 바뀌는 것
- 언제 발생하는가?
- Time quantum expires : 타임슬라이스가 지날 때
- I/O 호출 (인터럽트)
- 기타 등등
- 현재 수행중인 프로세스를 (old) P라고 할 때, (old) P가 위의 조건에 해당되면 (old) P의 동작을 멈추고 새롭게 수행할 프로세스 (new) P를 정하고 (new) P를 실행시킴
- (new) P를 정하는 과정을 스케줄링(Scheduling)이라고 한다.
OS가 Context switch를 지원하는 방법

- Context switch: OS는 (old) P의 상태를 저장, 새로운 프로세스의 저장된 상태를 불러옴
- 운영체제의 구현: 프로세스의 상태를 저장하기 위한 구조체가 필요함
- Process Control Block (PCB or TCB)
- 각 프로세스는 PCB로 표현됨 - 구조체
- 커널 메모리에 위치
- 현대 OS에서 흔히 사용됨
- context switching은 PCB를 저장하고 새로운 프로세스를 골라 로드하는 것
Process Control Block

각 프로세스와 관련된 정보들
- 프로세스 상태
- 프로그램 카운터
- CPU 레지스터
- CPU 스케줄링 정보 : Priority 정보
- 메모리 관리 정보
- 계산 정보
- I/O 상태 정보
시스템콜은 context switching을 하는가?

시스템콜은 context switch를 하지 않는다. 다른 프로세스를 실행하는 것이 아닌 현재 프로세스에서 모드가 바뀌는 것이다. 즉, context switch가 아닌 mode switch을 한다.
Context switching의 병목
- Context-switch time = CPU 병목
- 교체를 수행하는 동안에는 CPU가 유저의 프로세스를 수행하지 않음
- 한정된 물리 CPU를 여러 프로세스가 공유하게 하기 위한 비용
- OS가 복잡하고, 프로세스의 Context가 다양할수록 context switch가 오래 걸림
- 프로세서 구조에 따라 병목이 상이함
- CISC
- 복잡한 명령어 셋으로 구성 = 효율이 높지만 클럭 속도가 저하
- 복잡한 회로 → 물리적 공간 차지 → 레지스터 용량 저하
- e.g., 인텔 펜티엄 프로세서
- RISC
- 간단한 명령어 셋으로 구성 = 클럭 속도를 높임 = 빠른 수행 속도
- 절약된 물리적 공간에 보다 많은 레지스터 장착
- Context switch시 레지스터 내용 변경에 상대적으로 큰 오버헤드가 생김
- e.g., ARM 프로세서, Sparc
Process State
프로세스 상태의 전환

Process APIs
- 프로세스의 생성, 삭제, 실행과 관련된 시스템콜 API들
- 새로운 프로세스를 생성하고 실행하는 과정
- 새로운 프로세스를 생성한다 → fork()
- 새로운 프로세스를 위한 새로운 주소 공간을 생성한다 = 새로운 프로세스가 사용할 프로그램을 로드한다 → exec()
새로운 (자식) 프로세스 생성: fork()

- 생성되는 프로세스들은 process identifier (pid)라는 고유 식별자로 구분됨
- 프로세스 생성을 용이하게 하기 위하여
- 실행 중인 프로세스에서 다른 프로세스를 만들 수 있도록 함
- 최초의 프로세스 (부모)로부터 타 프로세스(자식)가 순차적으로 생성
- 프로세스들의 트리 계층을 구성
- 최초의 프로세스 = init
fork()의 동작
- 새로운 프로세스 (자식)에 필요한 데이터 구조를 할당
- fork()를 호출하는 프로세스 (부모)의 주소 공간 복사
- 자식은 프로세스로서 동작할 준비가 됨
- fork()는 부모와 자식에게 각각 다른 값을 return 함
- parent: 자식 프로세스의 pid 반환
- child: 0 반환
- Child 생성 후 부모는 계속 실행되거나(concurrently), 자식이 종료될 때까지 기다리거나(wait)
- 시스템콜 wait()