2023. 12. 7. 16:58ㆍ컴퓨터공학 전공공부/시스템 프로그래밍
1. Processes
process
process란 쉽게 말하면, 실행되고 있는 프로그램을 말한다. 정확하게는 실행되고 있는 프로그램의 상태이다. 프로그램, 프로세서(프로세스를 실행시키는 하드웨어)와 다른 말임에 유의하자.
프로그램은 하나여도 프로세스는 여러 개일 수 있다. 예를 들어, 크롬 창을 여러 개 띄워두는 것은 하나의 프로그램(크롬)에 여러 프로세스(각각의 창)가 존재하는 것이다.
프로세스와 두 가지 추상화
프로세스는 각 프로그램에 두 가지 주요 추상화를 제공한다. 이는 다음과 같다.
- logical control flow (실행 흐름)
- 하나의 CPU가 여러 개의 프로그램을 순회하며 동작하는데, 프로그램 입장에선 자신이 CPU를 독점적으로 사용하는 것처럼 보인다.
- 이는 context switching을 통해 실현된다.
- private address space (독자적인 메모리공간)
- 프로그램 입장에서, 각각의 프로그램은 메인 메모리 공간을 독점적으로 이용하는 것처럼 보인다.
- 이는 virtual memory를 통해 실현된다.
multiprocessing : 과거의 현실
하나의 CPU가 여러 개의 프로그램을 순회하며 동작하는 현실과 달리, 프로그램 입장에선 각각이 CPU를 하나씩 차지하는 것처럼 보인다. 이는 결국 illusion인 것이다.
실제로는, 하나의 프로세서가 여러 개의 프로세스를 동시에 실행한다. 여러 프로세스가 CPU 시간을 공유하며 실행되며, 각 프로세스의 실행은 다른 프로세스의 실행과 번갈아 가면서 이루어진다. 이를 통해 여러 프로세스가 동시에 실행되는 것처럼 보이게 할 수 있다.
CPU가 다른 프로세스를 실행하기 위해 옮겨질 때 운영체제는 프로세스의 현재 상태(레지스터값, pc값 등)를 saved register에 피신시킨다. 한편 CPU 옮겨짐은 매우 빠르게 수행되므로, 동시에 실행되는 것처럼 보인다. 이 CPU 옮겨짐을 context switching이라고 한다.
multiprocessing : 현재의 현실
현재에는, CPU가 단 하나만 있지 않다. (multiple CPUs) 하지만 프로세스마다 CPU가 존재하진 않기 때문에 여전히 context switching은 일어나며, 메인 메모리를 공유한다.
context switching
CPU가 다른 프로세스로 옮겨가기 전, 운영체제는 자신의 현재 상태를 메모리에 저장하고 실행할 다음 프로세스를 선택한다.(scheduling) 이후 saved register 정보를 불러오고 주소 공간을 바꾸는데, 이를 context switching이라 부른다.
(참고) 비유적으로 말해, CPU를 통해 실행되지 않고 있는 프로세스는 '기절' 상태인 것이다. 기절했다가 다시 깨어나면 CPU와 함께 있는 것이다. 따라서 프로세스 입장에선 자신이 독점적으로 CPU를 이용한다고 생각한다.
프로세스는 kernal(커널)이라 불리는, 메모리에 상주하는 OS 코드에 의해 제어된다. 커널은 별도의 프로세스가 아니라 기존 프로세스의 일부로 실행된다. 각 프로세스는 사용자 코드(user code)와 커널 코드(kernal code0를 번갈아 실행하면서, context switching이 발생할 때마다 해당 프로세스의 상태를 저장하고 다음 프로세스의 상태를 로드한다.
동시의 프로세스
두 개의 프로세스가 concurrent하게 실행된다는 건, 그들의 실행 시간이 겹친다는 의미이다. 실행 시간이 겹치지 않으면 sequential하게 실행되는 것이다.
한편 parallel과 concurrent가 다름에 유의하자. parallel은 물리적으로 동시인 것이고, concurrent는 사용자가 느끼기에 동시인 것이다. 따라서 parallel하면 concurrent하지만, concurrent하다고 무조건 parallel하지는 않다.
동시의 프로세스 예시 문제
2. Virtual Memory : Address Spaces (가상 메모리와 주소 공간)
physical addressing
physical addressing은 virtual addressing과 반대되는 개념으로, 물리적 주소를 CPU가 직접적으로 지칭하는 것이다. 간단한 시스템(작은 프로세서나 간단한 컴퓨터)에서 쓰인다.
virtual addressing
CPU는 가상의 주소를 지칭하고, 관리자가 가상의 주소에 해당하는 물리적 주소를 결정하여 지칭한다. 현대의 서버, 노트북, 스마트폰에서 쓰인다.
주소 공간
주소 공간에는 세 종류가 있다.
- linear address space : 0 이상 정수의 정렬된 집합이다.
- {0, 1, 2, 3, ...}
- virtual address space : N=2n virtual address들의 집합이다.
- N은 CPU에서 프로세스들이 사용하는 메모리 공간이며, 1bit이 0과 1 두 개를 나타낼 수 있으므로 다음과 같은 식이 나온다. 따라서 n개의 bit이 필요하다.
- {0, 1, 2, 3,... N-1}
- physical address space : M = 2m physical address들의 집합이다.
- m개의 bit이 필요하다.
- {0, 1, 2, 3,... M-1}
virtual memory를 쓰는 이유
- 메인 메모리를 효율적으로 사용할 수 있다.
- 모든 프로세스의 data는 disk에, 현재 사용중인 data(자주 사용하는 data)는 DRAM(주기억장치)에 구분해 올릴 수 있다.
- 메모리 관리를 단순화할 수 있다.
- 모든 프로세스가 동일한, linear 주소 공간을 사용하기 때문이다.
- 주소 공간을 독립시킨다. 즉, 여러 프로세스가 같이 돌기에 발생할 수 있는 충돌을 방지한다.
3. Caching의 도구로써의 Virtual Memory
caching의 도구로써의 vm
개념적으로, vm은 disk에 저장되어 있는 N짜리 배열이다. 이 배열의 내용은 physical memory(DRAM cache)에 캐싱되어 있으며, 이 캐시 블록들을 페이지라 부른다. 페이지의 크기는 P=2p바이트이다. 즉, 캐싱된 바이트를 하나 하나 가져오는 것이 아니라, 페이지 단위로 가져오는 것이다.
page table
page table은 page table entries(PTE)의 배열으로, virtual page와 physical page를 매핑한다.
entry 하나 하나를 PTE라 부르며, 현재 보는 페이지(VP 1,2,4,7)은 DRAM에, 나머지는 disk에 저장한다. DRAM에 1,2,4,7이 꼭 순서대로 들어갈 필요는 없으며, 이 순서는 관리자가 알아서 관리한다.
page hit
DRAM 캐시 hit이라고도 불리며, 프로세스가 요청한 데이터가 이미 DRAM에 있어 메모리 접근이 바로 이루어지는 상황이다.
page fault
DRAM 캐시 miss라고도 불리며, 프로세스가 요청한 데이터가 DRAM에 없는 상황이다. 이 경우 page fault handler가 DRAM에서 쫓아낼 희생자를 결정하고, disk에서 요청한 데이터를 찾아와 DRAM의 기존 희생자 자리에 저장한다. 이후 page table 또한 수정한다.
page fault handler의 동작 이후 page hit을 다시 수행한다. 핵심은, page fault가 발생하면 handling을 수행한다는 것이다. (미리 수행하지 않는다.)
새로운 페이지 할당
page table의 빈 공간에 새로운 페이지를 할당할 수 있다.
지역성
vm이 비효율적으로 보이지만, 이는 지역성이라는 특성에 의해 효율성을 가진다. 보통 실제 사용하는 메모리(메인 메모리 크기)보다 working set이 현저히 작기 때문이다. 하지만 working set이 메인 메모리 크기보다 큰 경우, vm은 엄청나게 비효율적이다.
4. 메모리 관리 도구로써의 Virtual Memory
메모리 관리 도구로써의 vm
핵심은, 각각의 프로세스가 각자의 virtual address 공간을 가진다는 것이다. 다른 프로세스를 신경 쓸 필요가 없다. 이에 따라 vm은 메모리 할당을 단순하게 수행할 수 있게 하며(규칙을 하나만 만들면 되니까), 코드나 데이터의 공유도 쉽게 한다(같은 physical page로 향하게 하면 되니까).
vm을 통한 linking, loading
- linking
- 각각의 프로그램을 링킹한다.
- loading
- execve : 프로그램을 실행하는 함수
- execve는 .text, .data 섹션을 위한 virtual page를 할당하고, PTE를 만든다.
5. 메모리 보호 도구로써의 Virtual Memory
메모리 보호 도구로써의 vm
PTE에 permission bit를 포함시키고, 관리자가 메모리에 접근할 때마다 이 비트를 확인하면 메모리 보호 기능을 구현할 수 있다.
6. Virtual Memory 주소 번역
주소 번역 symbols
- 기본 변수들
- virtual address space : N=2n, n bit이 필요하다.
- physical address space : M = 2m, m bit이 필요하다.
- page size : P=2p바이트, p bit이 필요하다.
- virtual address의 구성요소
- VPO : virtual page offset
- VPN : virtual page number
- physical address의 구성요소
- PPO : physical page offset (VPO와 같다.)
- PPN : physical page numger (VPN에서 PPN으로, 관리자가 번역한다.)
page table을 이용한 주소 번역
주소 번역 : page hit
- 가상 주소를 관리자에게 보낸다.
- 관리자는 PTE를 읽어, 해당 가상 주소에 대응하는 물리적 주소를 얻는다.
- 이 물리적 주소를 캐시/메모리에게 보낸다.
- 캐시/메모리가 데이터를 프로세서에 보낸다.
메모리에 두 번 접근함을 볼 수 있다. (page table 접근 위해 한번, 실제 메모리 접근 위해 한번)
주소 번역 : page fault
- 가상 주소를 관리자에게 보낸다.
- 관리자는 PTE를 읽어, 해당 가상 주소에 대응하는 물리적 주소를 얻으려 했지만... 없다! (valid bit=0)
- valid bit=0이 page fault exeption을 일으킨다.
- page fault handler가 희생자를 정하고, 해당 희생자가 수정된 데이터(정보가 있음)면 그 내용을 disk에 옮긴다.
- page fault handler가 희생자 자리에 새로운 페이지를 넣는다.
- 1번으로 돌아간다.
'컴퓨터공학 전공공부 > 시스템 프로그래밍' 카테고리의 다른 글
시스템 프로그래밍 chap 7. Linking (1) | 2023.12.07 |
---|---|
시스템 프로그래밍 chap 6. Machine-Level 프로그래밍 : 데이터 (2) | 2023.12.07 |
시스템 프로그래밍 chap 5. Machine-Level 프로그래밍 과정 (2) | 2023.12.04 |