Written by JS970
on
on
운영체제 2023-03-20 수업정리
Flow
- Process
- creation
- hierarchy
- termination
- state
- Implementing Process
- Context Switch
Process
프로세스란?
- Program in execution, 즉 실행 중인 프로그램을 프로세스라고 말한다.
- 프로세스는 아래를 포함한다.
- CPU contexts(registers) -> 연산상태 저장
- Program Counter, Stack Pointer -> 프로그램 실행 정보
- OS resources(주소 공간, 파일 포인터 등)
- Other informations(PID, state, owner, etc.)
- time-shared system에서 보안의 기본 단위가 된다.
- 프로세스는 유일한 프로세스 식별 넘버인 PID를 통해 식별된다.
- 한 개의 프로그램은 여러 개의 프로세스로 이루어질 수 있다.
- 프로세스는 아래와 같이 분류될 수 있다.
- I/O-bound process : read/write에서 많은 시간을 소요, disk에서의 데이터 처리 속도에 더 많은영향을 받는 프로세스.(system I/O의 속도에 영향을 받는다.)
- CPU-bound process : 행렬 곱셈 연산 등 CPU의 처리 속도에 더 많은 영향을 받는 프로세스
프로세스 생성
- 프로세스 생성 과정
- 프로그램을 코드 영역에서 메모리 및 프로세스 주소 공간으로 load한다.
- 프로그램은 실행 가능한 형태로 디스크 드라이브에 저장되어 있다.
- OS는 현재 시점에서 필요한 것들만
lazily
하게 메모리로 load한다.
- 프로그램의 run time stack을 할당한다.
- stack영역에는 아래와 같은 값들이 저장된다.
- local variables
- function parameters
- return address
- stack영역에는 아래와 같은 값들이 저장된다.
- 프로그램 heap을 생성한다.
- heap에는 명시적으로 동적 할당되어 사용되는 데이터들이 저장된다.
- C언어에서는 malloc()을 호출하여 공간을 할당하고 free()를 호출하여 공간을 해제할 수 있다.
- OS는 위에서 언급한 것 이외의 초기화 동작을 수행한다.
- Input/Output setup - 프로세스는 기본적으로 세 개의 open file descriptor를 가진다.
- standard input, output, error
- Input/Output setup - 프로세스는 기본적으로 세 개의 open file descriptor를 가진다.
- 프로그램의 시작 지점(entry point, main())에서부터 프로그램을 실행한다.
- OS는 CPU점유를 새롭게 생성된 프로세스로 넘겨준다.
- 프로그램을 코드 영역에서 메모리 및 프로세스 주소 공간으로 load한다.
- fork()
- 프로세스를 생성하는 system call이다. 부모 프로세스를 복제한다.
- 부모 프로세스는 대부분의 자원 및 privileges를 공유한다.(open files, UID, etc.)
- 자식 프로세스는 부모 프로세스의 주소 공간도 복제한다.
- 부모 프로세스는 wait()을 이용하여 자식 프로세스의 수행이 끝날 때까지 대기할 수 있다.
- wait()을 사용하지 않았다면 자식 프로세스와 부모 프로세스는 병렬 수행된다.
- Shell 또는 GUI는 이 system call을 자체적으로 사용한다.
- exec()
- 현재 프로세스를 새로운 프로그램으로 교체한다.(system call 호출 즉시 자원을 점유한다.)
- Windows 운영체제 에서는 CreateProcess() system call이 fork() + exec() 동작을 수행한다.
프로세스 계층 구조
- 아래는 유닉스 환경에서 프로세스의 계층 구조를 쉽게 이해하기 위한 도식이다.
cat file1 | wc
- shell이 parent process 이고 shell에서 실행된 cat, wc는 child process이다.
- Unix에서는 이러한 계층 구조를
process group
이라고 한다. - Windows에서는 이러한 계층 구조 개념이 존재하지 않는다.
프로세스 종료
- Normal exit(voluntary) : 할 일을 모두 수행하고 return하여 프로세스를 종료하는 경우
- Error exit(voluntary) : error가 발생하여 프로세스를 종료하는 경우
- Fatal error(involuntary) : operating system 규칙 윙반, 권한 침범으로 인한 kill process
- Segmentation fault
- Protection fault
- Exceed allocated resources, etc.
- Killed by another process(involuntary) : 특정 신호 수신 등 다른 프로세스를 통해 프로세스가 종료되는 경우
- Ctrl + C
- Zombie process : 프로세스는 종료되었지만 제거되지 않은 상태
프로세스 state
- New : 프로세스가 생성되는 상태, fork()로 인해 새롭게 프로세스가 생성되는 것을 생각할 수 있다.
- Running : 프로그램의 명령어들이 실행되고 있는 상태, exec()를 통해 프로세스가 CPU를 점유한 상태를 생각할 수 있다.
- Waiting : 프로세스가 어떠한 이벤트를 기다리고 있는 상태, wait()에 의해 부모 프로세스가 자식 프로세스의 종료를 기다리는 상황을 생각할 수 있다.
- Ready : 프로세스가 프로세서 자원을 할당받기를 대기하는 상태, OS에 의해 실행될 때까지 대기하는 상태이다.
- Terminated : 프로세스가 실행을 종료한 상태이다. exit()에 의해 프로세스 종료가 일어난 상황을 생각할 수 있다.
Implementing Process
- 프로세스의 구현은 PCB(Process Control Block)자료 구조를 통해 이뤄진다.
- PCB는 TCB라고도 불린다(Task Control Block)
- 아래는 TCB를 간단하게 설명하는 그림이다.
- 대략적으로 아래와 같은 정보들이 TCB자료 구조에 저장되어 프로세스 상태를 나타낸다.
- Process state : running, waiting 등 process state정보를 저장
- Program Counter : 다음 실행될 명령어의 위치 저장
- CPU register : 연산 상태를 저장하는 CPU 레지스터
- CPU scheduling informations : 우선순위 및 scheduling queue pointers
- Memory management information : CPU used, clock time elapsed since start, etc.
- I/O status
- etc.
- TCB는 프로세스 마다 다를 수 있는 거의 모든 정보들을 저장하고 있다고 생각하면 된다.
- Linux 3.2.0기준으로 TCB는 task_struct 로 구현되었으며 이 구조체의 크기는 3248바이트로 굉장히 큰 크기를 가진다.
Context Switch
- CPU의 프로세스에서 다른 프로세스로 CPU의 점유를 넘기는 것
- 일반적으로 CPU에서는 초당 100 ~ 1000 회의 context switch가 발생한다.
- 필연적으로 overhead가 발생한다. context switch횟수를 줄일 수록 성능 향상이 있다.
- 아래는 context switch 간에 overhead가 발생하는 이유를 설명하는 도식이다.