오늘은 프로세스에 대해서 공부해 본다.
프로그램과 프로세스
- 소스코드 (.c file) : 프로그램이 수행하고자 하는 작업이 프로그래밍 언어로 표현
- 컴파일러 (compiler) : 사람이 이해할 수 있는 프로그래밍 언어로 작성된 소스코드를 컴퓨터(CPU)가 이해할 수 있는 기계어로 표현된 오브젝트 파일로 변환
- 오브젝트 (.o file) : 컴퓨터가 이해할 수 있는 기계어로 구성된 파일. 자체로는 수행이 이루어지지 못함. 프로세스로 변환되기 위한 정보가 삽입되어야 함. 상대 주소로 표현
- 링커 (linker) : 관련된 여러 오브젝트 파일들과 라이브러리들을 연결하여 메모리로 로드될 수 있는 하나의 실행파일만 작성
- 실행파일 (.exe) : 특정한 환경(OS)에서 수행될 수 있는 파일. 프로세스로의 변환을 위한 header, 작업 내용인 text, 필요한 데이터인 data를 포함한다. 절대 주소로 표현
컴파일러와 링커는 결과물이 수행될 OS와 CPU에 따라 다른 형태의 파일을 만든다. 동적 연결(Dynamic Linking)에서 메모리에 로드되면 RTS(Run Time System)에 의해 라이브러리를 동적으로 접근한다. 프로그램이 실행될 때, RTS가 그 프로그램을 둘러싸고 있다. 예를 들면 자바스크립트로 만들어진 프로그램의 RTS는 Node.js이다. 이러한 프로그램을 실행하면 RTS가 main()을 호출한다. 또한 여기에서 환경 변수도 설정해 주어야 한다.
아래에 있는 그림에서 메모리 영역은 크게 5가지로 이루어져 있다.
- Text
- 코드 자체를 구성하는 메모리 영역
- Data
- 전역 변수와 정적 변수가 할당되는 공간
- 초기화 된 변수들이 저장
- 프로그램이 실행 될 때 생성되고, 프로그램이 종료되면 시스템에 반환
- Bss
- 전역 변수와 정적 변수가 할당되는 공간
- 초기화가 되지 않은 변수들이 저장
- Heap
- 사용자가 인위적으로 할당하고 해제할 수 있는 공간
- malloc() in C, new() in C++
- Stack
- 지역 변수나 매개변수가 저장되는 공간
- 함수 호출 시 생성되고 함수가 끝나면 시스템에 반환된다.
- 스택 사이즈는 각 프로세스마다 고정된 값으로 할당
프로세스는 프로그램이 실행 될 때 스케줄링의 단위이며 실행 단위이다.(참고로, 쓰레드도 스케줄링의 단위) 프로세스는 Protection domain을 제공하여 다른 프로세스가 침범할 수 없게 만든다. 프로세스는 Program counter, Stack, Pointer 그리고 Data section으로 구성된다. 프로세스는 디스크에 저장된 프로그램으로부터 변환되어 메모리에 로딩된다.
문맥 전환 (Context Switching)
CPU에서 수행되는 프로세스가 바뀌는 것을 의미한다. CPU가 할당되는 프로세스를 변경하기 위해 현재 CPU를 사용하여 실행되고 있는 프로세서의 상태 정보를 저장하고 제어권을 ISR(Interrupt Service Routine)에 넘기는 작업을 의미한다. Time Quantum이 만료되거나 I/O 호출이 될 때 발생하는데, old 프로세스가 위의 조건을 수행하면 old의 동작을 멈추고 new 프로세스를 수행한다. 이 때 커널에서 문맥교환을 담당하는 부분을 dispatcher 라고 한다.
save state 상태에서 모든 프로세스의 데이터를 저장한다. 그리고 나서 new PCB를 reload한다. CPU는 어떤 거를 수행하는지 모른다. 단지 커널이 순서를 바꿔줄 뿐이다. 시스템 콜 자체는 문맥 교환을 일으키는 것이 아니다. 프로세스 제어 블록(PCB, Process Control Block)은 운영체제가 프로세스에 대한 중요한 정보를 저장하는 곳으로 각 프로세스가 생성 될 때 마다 고유의 PCB가 생성되고, 프로세스가 종료되면 PCB는 제거된다. 프로세스는 CPU 를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU 를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB 에 저장하게 된다. 그리고 다시 CPU 를 할당받게 되면 PCB 에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.
프로세스 상태 (Process State)
- New : 프로세스 생성
- Running : 프로세스 실행
- Sleep : 프로세스가 I/O와 같은 다른 이벤트를 기다림
- Ready : 프로세스가 dispatch(프로세스가 CPU에 할당받아 실행)되기를 기다리는 중
- Terminated : 프로세스가 실행을 끝냄
참고 자료
- 고려대학교 유혁 교수님 운영체제(COSE341) 수업 자료
- <Operating System Concepts> 9th ed. by A. Silberschatz
- https://m.blog.naver.com/PostView.nhn?blogId=bsy9109&logNo=130166630482&proxyReferer=https%3A%2F%2Fwww.google.com%2F
- https://sfixer.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%ADcode-data-stack-heap
'Computer Sci. > Operating System' 카테고리의 다른 글
OS #6. 동기화(Synchronization) Part1 (1) | 2020.04.01 |
---|---|
OS #5. 쓰레드 (Thread) (0) | 2020.03.24 |
OS #4. CPU 스케줄링 (CPU Scheduling) (0) | 2020.03.20 |
OS #2. 운영체제 디자인, 커널 관점 설계 (OS Design, Kernel Arch.) (0) | 2019.10.11 |
OS #1. 운영체제 구조 (OS Structure) (0) | 2019.10.09 |