티스토리 뷰

Study/Architecture

[Architecture] Contexts

생각많은 소심남 2016. 7. 5. 00:10

 Context란 page map상의 entry에 의해서 교환되어지는 정보들을 말한다.

사실상 cpu가 memory를 접근하는데 있어서 다뤄지는 정보를 말할 수도 있겠다. 아무튼 프로그램이 구동되려면 해당 프로그램도 실제 physical memory상에 올라가야 하는데, 이 것도 일종의 context로 구성되어 있다고 할 수 있다. 참고로 이런 context는 프로그램상으로 중복되지 않는다. 아는 개념이겠지만, 프로그램이 shared memory를 쓰지 않는 이상, 사용하는 memory 영역은 각각 독립적이며, 예를 등러 어떤 프로그램내에서 virtual address 0번이 가리키는 physical address는 다른 프로그램내의 virtual address 0번이 가리키는 physical address와 별개라는 것이다. 다시 말해서 프로그램은 자신만의 virtual address 공간을 가지고 있다는 말로 표현할 수 있다.

 그런데 만약 하나의 프로그램을 실행하다가 다른 프로그램을 동작시키려면 어떻게 해야 될까? 다시 말하지만 프로그램은 자신만의 virtual address space를 가지고, 이를 공유할 수 없다. 따라서 다른 프로그램을 구동시키려면 기존의 memory 상의 program 정보와 원하는 프로그램 정보와 맞바꿈을 해야 한다. 이걸 보통 context switching이라고 하고, 보통 page map을 reload하면서 발생한다. 

timesharing system에서는 여러 동작하는 프로그램을 하나의 time slice로 잘게 쪼개 실행하는데, 이 하나하나의 조각도 context라고 할 수 있고, OS가 돌다가 다른 프로그램을 실행시킬 필요가 있을 경우 적절한 context를 page map에 load시킨다. 얼마 있다가 소개할 내용이지만 virtual machine이라는 개념도 이런 context switching이 일어나는 주요 요소 중 하나이다. 여러 virtual machine이 동작하는 OS라면 어떤 하나의 physical 자원을 모든 virtual machine이 쓸 수 있게 효율적으로 배분하는 것도 성능을 올릴 수 있는 주요 기능 중 하나 일 것이다.

 Linux를 공부하거나 다룬 사람이라면 흔하게 접했을 kernel도 어떻게보면 memory상에 상주해있는 context이다. 사실 이전 포스트에서도 context라는 단어를 언급한 적이 있다. 바로 page fault가 나면서 exception이 발생했을때 CPU가 자기 자신이 가지고 있던 정보를 어딘가에 저장한후 exception 을 처리할 수 있는 handler로 넘어가는 과정이 있고, 이런 작업을 context switching이라고 표현했었다. OS에 내장되어 있는 exception handler는 physical memory를 직접적으로 관리하기 때문에 page fault과 같이 exception이 발생했을 때 physical location을 직접 접근가능하다. 

 프로그램을 돌리다가 hardware에 의해서 kernel context를 switching이 발생하는 경우를 kernel mode에 들어갔다 라고 하며, context switching이 발생한 이후에 exception handling을 종료후 다시 이전 프로그램을 다시 실행하는 것을 보고 user mode에 들어갔다고 표현한다. OS가 kernel mode에서 동작있는 상태에선 앞에서 언급했다시피 하드웨어에 포함되어 있는 register에 대해서 접근이 가능하다. 반대로 user-mode 상태에서는 이런 hardware에 접근할 수 없기 때문에 만약 hardware 접근할 필요가 있는 경우 OS로 하여금 kernel mode로 진입할 수 있는 권한을 요청하게 된다. 이렇게 kernel mode로 진입해서 해당 작업을 처리하고 난후 user mode로 다시 돌아와 프로그램을 구동하게 된다.

우리가 보통 application이라고 하는 user-mode에서 동작하는 프로그램은 OS에서 할당된 모든 virtual address에 접근 가능하도록 작성되어 있다. 앞에서 언급한 내용과 헷갈릴 수 있는데, program이 독립적으로 사용하는 공간은 physical memory 상에서의 공간이며, virtual memory에서는 어떤 프로그램이 동작하는지 상관없이 원하는 영역에 접근 가능하다. 물론 virtual memory의 특정 영역은 OS나 system 구동과 관련된 중요한 역할을 하는 부분이 있으므로, 이런 영역을 제외한 나머지 memory 영역에만 접근하도록 하나의 convention을 정해놓았다. 바로 stack과 heap이라는 개념이다.

 stack은 보통 procedure가 동작하는데 임시로 필요한 정보를 담고 있는 영역이며, 보통 높은 주소로 grow 하는 방식으로 영역이 설정된다. 반면 heap은 코드내에서 global하게 선언한, 다시 말해 프로그램이 동작하면서 오랫동안 쓸 정보를 담고 있을 영역이며, 낮은 주소로 grow 한다. 이런 영역 할당을 위 그림에서 보여주고 있는데, 이 둘의 차이가 궁금하다면 해당 링크를 살펴보면 좋을거 같다.

'Study > Architecture' 카테고리의 다른 글

[ARM] Registers on the ARM Cortex M4  (0) 2017.02.10
[Architecture] Processes  (0) 2016.07.07
[Architecture] MMU improvements  (0) 2016.07.06
[Architecture] Building the MMU (2)  (1) 2016.07.04
[Architecture] Building the MMU (1)  (0) 2016.06.30
[Architecture] Page faults  (0) 2016.06.29
[Architecture] Basics of Virtual Memory (2)  (0) 2016.06.26
댓글