An operating system (OS) is system software that manages computer hardware, software resources, and provides common services for computer programs. - Wikipedia
OS란 컴퓨터라는 소프트웨어 자원, 하드웨어를 관리하고 컴퓨터 프로그램을 위한 시스템 소프트웨어다.
os는 왜 생겨나게 된걸까? 예전 os가 없던 시절에는 프로그래머가 소프트웨어만 프로그램을 짜는게 아니라 하드웨어와 관련된 것 까지도 프로그래밍을 해주었다고 한다.
Disk를 읽어오는 것, 데이터 request를 하면 packet 패킷을 네트워크로 내보주는 등 os가 hardware 와 관련된 작업을 프로그래머가 짜야했던 것 이다.
이에 Hardware를 컨트롤하는 detail한 부분들을 숨기고 프로그래머가 hardware 까지 컨트롤 하지 않아도 되도록 하기 위해 os가 생겨나게 되었다.
OS는 그럼 어떠한 역할들을 할까?
크게 세 가지 Key role 이 있는데 이를 하나씩 알아보도록 하자.
The process or outcome of making something easier to understand by ignoring some of details that may be unimportant
추상화란, 정의하고자 하는 대상의 디테일, 자세한, 사소한 특징들을 숨기고, 주요한 특징으로 대상을 정의 하는 것 이다.
예를 들어, storage(디스크)를 생각해보자.
Disk 의 종류에는 ssd, hdd가 있다. hdd는 sector 영역들이 있고 ssd는 cell 영역들이 있는데 이 영역들에 비트가 들어가 있고 ssd는 이 셀에 비트를 하나를 넣냐, 두개를 넣냐, 세개를 넣냐에 따라 종류가 나뉘며, 그에 따른 read/ write latency가 달라진다.
hdd는 sector의 데이터를 읽기 위해서 어느 sector에 해당 데이터가 있는지 찾고, head를 물리적으로 해당 위치를 움직이고 이를 전송해야하고 등등..
많은 특징, 자세한, 사소한 부분은 접어(?) 두고 디스크의 가장 본질적이고 핵심적인 특징은 무엇일까? 읽고 쓰는게 disk에 가장 본질적인 부분이 아닐까?
그럼 파일이라는걸 정의(추상화)하고 유저는 해당 파일을 읽고 쓰면 해당 내용이 저장되는 storage에서 읽고 쓰는 복잡한 과정(하드웨어 control) 들을 유저가 직접 하지 않아도 os, 하드웨어에서 해당 작업들을 수행해준다.
이렇듯, os에서는 하드웨어의 자원(cpu, memory, storage) 을 추상화하여 하드웨어에 대한 세부적인 사항들을 모르더라도, 심지어 하드웨어를 인지하지 못하고도 쉽게 computer라는 machine을 쉽게 사용할 수 있도록 한다.
os를 설계한 사람들은 Application(software program that runs on your computer) 들이 위의 추상화한 자원들을 사용하도록 API를 제공하고 이를 시스템 콜(System call) 이라고 한다.
OS Designer 들은 OS가 여러 가지의 실행 프로그램, 작업들을 run(운영, 관리)하고,
각각의 프로그램이 서로에 영향을 주지 않으면서도, 하드웨어를 handling 하지않고 프로그래머들이 쉽게 프로그래밍을 할 수 있도록 프로세스의 개념을 만들어 냈다.
프로세스는 무엇의 추상화일까?
각 프로세스는 실행할 instruction들, ovirtual cpu, address space(메모리), file, socket 등의 resource 등을 갖고 있다. 즉, computer machine을 추상화 시킨 것이며 이 프로세스의 작업을 수행하는 한 단위를 스레드(thread) 라고 한다.
각 프로세스들은 물리메모리의 주소에 직접 접근하지 않고 각자의 가상의 메모리 주소에 할당하고 이용하게 되는데
그럼 이 각 process의 virtual memory, virtual address 를 실제 하나의 물리 메모리에 어떻게 연결되는것 일까?
이 역할을 os와 하드웨어가 한다. 역사적으로 굉장히 많은 기법들이 있다고 하는데 대표적으로는 Segmentation, Paging (Single-level, multi-level ...), Segmented paging 방법이 있다.
그럼 구체적으로 어떤 부분을 os가 하고, 어떤 부분을 하드웨어가 담당하는걸까?
(ebook이나 ppt에 급하게 필기했던 내용을 캡쳐해오다보니 글씨가..ㅠㅠ)
cpu 안에 있는 mmu(memory management unit)에서 해당 접근하려는 page가 물리 메모리에 mapping이 되어 있는지 아닌지를 page table 안의 page table entry 를 보고, 물리 메모리에 mapping이 되어 있지 않으면 exception (예외상황), page fault 가 발생하고 이를 os에게 알려주면 os가 page fault 상황을 handling 한다.
os 가 해당 페이지를 물리메모리에 mapping을 시키고 page table 에 해당 상황(정보) 를 update 하고 나서 다시 cpu가 해당 주소에 접근하면, mmu가 다시 page table을 조회했을 때는 해당 페이지가 물리메모리에 매핑이 되어 있을 것이며 주소번역 과정을 거치고 난 후 물리메모리에 접근 할 수 있게 된다.
요약하자면 mmu가 mapping 상황에 대해 page table을 확인하고 주소번역을 하고, os는 해당 page table 정보를 update하고 mapping 하는 역할을 한다. 이 과정을 컴퓨터 아키텍처(Architecture -컴퓨터 시스템의 하드웨어 구조
) 와 운영체제의 interaction 이라고 한다고 한다.
사실 sw로 os에서 pagetable 을 확인하고, 주소번역을 하는 등의 과정을 구현할 수도 있지만 그 과정에 소요되는 시간이 너무 소요되어 하드웨어 단에서 처리하게 하였다고 한다. disk의 file address 도 block address에 접근하는게 있는데 여기서는 os가 주소 번역을 담당한다고 한다. 디스크가 워낙 느려서 소프트웨어로 주소번역 과정을 거쳐도 큰 차이가 없기 때문이라고 한다.
여기서 재밌는 사실은, page table, page fault 등의 개념이 존재하는 이유는 virtual address(숫자) 를 physical address(숫자) 물리메모리로 매핑하기 위함인데 숫자 -> 숫자 로 패턴을 찾아 내어 매핑하는건 인공지능이 잘하는 영역이기에 주소 번역을 ai로 하는 연구들도 등장했다고 한다.
가상메모리에 대해 적기 시작하니 Demand page, memory type, 주소 번역등 더 쓰고 싶은 것들이 있는데 별도의 가상메모리 게시글에 남기도록 하여야겠다.
글이 좀 길어질 것 같아 abstraction 까지 1편으로 남기고 Protection & Isolation, Sharing resource 은 다음 게시글로 남겨보도록 하겠다.
이 글을 작성하면서 더 공부해야겠다고 남기는 키워드 : 시스템콜, Abstraction of storage