운영체제를 구현하면서 배운 것들

승톨·2021년 2월 3일
2
post-thumbnail

OS 구현 1주차 정리

  • 이번주부터 SW아카데미 정글에서 PintOS 구현을 하기 시작했다.

  • PintOS는 스탠포드에서 개발한 교육용 OS이다. 우리가 아는 OS인 MacOS, Windows, 안드로이드 등보다는 당연히 퀄리티가 떨어지지만 그 핵심원리는 같다.

  • 그래서 아무리 PintOS가 교육용 OS라고 할지라도 OS이기 때문에, OS를 구현은 이전부터 상당한 부담감이 있었다. 그치만 한편으론 되게 설레기도 했다.

  • OS는 컴퓨터의 핵심 중 핵심이기 때문에 OS를 이해하면 컴퓨터를 거의 대부분 이해할 수 있을 것이라 생각했기 때문이다.

PintOS란? : https://ko.wikipedia.org/wiki/Pintos

  • 공부를 통해 쓰레드, 프로세스, 동기화, 파일시스템, 시스템 콜 등의 개념을 이해하면서 컴퓨터가 정말 잘 만들어진 시스템이라는 생각이 절로 들었다.
  • 그리고 컴퓨터를 관통하는 몇가지 개념들이 있다는 것 또한 알게 되었다.
  1. 추상화
    • 추상화는 컴퓨터 사이언스에서 가장 중요한 개념 중 하나라고 생각한다. 여기서 추상화에 대해 깊이 다룰 생각은 없다. 추상화를 꺼낸 이유는, OS를 구현하기 위해 꼭 필요한 개념이기 때문이다.
    • OS 시스템 디자이너가 추상화를 사용한 이유는 시스템 사용자와 컴퓨터 시스템과의 편리한 상호작용을 만들고 싶기 때문이다.(Human-Computer Interaction의 관점에서 바라보았다.)
    • 컴퓨터를 뜯어보면, 결국 하드웨어 즉, 메인 메모리, cpu 등의 결합이자 소통이다.
    • 그 소통을 다루는 사람은 컴퓨터를 다루는 프로그래머이다. 프로그래머인 인간이 하드웨어인 기계를 잘 다루기 위해 OS는 추상화 된 인터페이스를 제공해서 프로그래머가 모든 원리를 이해하고 다룰 필요가 없게 만든다.
    • 예를 들어, 디스크를 편리하게 사용하기 위해 file, file table이라는 요소 등으로 추상화해서 사용하고,
    • CPU, 메모리 등의 컴퓨팅 파워를 작은 단위로 사용해 개발자가 짠 코드를 돌리는 컴퓨팅 머신이 결국 프로세스이다. 프로세스 또한 추상화 된 개념이라고 생각한다.
  1. 무언가를 삭제한다는 것
  • 우리는 컴퓨터를 쓸 때 항상 '삭제'라는 것을 한다. 컴퓨터를 제대로 공부하기 전에 '삭제'라는 것이 그 존재를 아예 제거해버린다는 의미인줄로만 알았다.
  • 그러나 개념을 공부하다보니, '삭제'라는 것은 그 존재 자체를 없애는 것 보다는 잊혀지는 것에 가깝다. 라는 생각이 들었다.
  • 예를 들어 연결리스트에서 A를 삭제한다는 것은, 연결리스트를 구성하는 노드 리스트에서 A를 연결하는 포인터를 없애버린다는 것이다. 없앤 뒤에도 A는 남아있지만, 연결리스트에서의 A는 삭제된 요소가 된다.
  • 마찬가지로, 메모리 해제를 하는 free() 의 경우에도, 지정한 메모리를 삭제한다고 이해할 수 있다. 그러나 안을 뜯어보면, 결국 free() 는 이 영역을 사용했다는 flag를 비어있다는 flag로 바꾸는 것에 불과하다. 어짜피 그 영역에 데이터가 들어있었다고 하더라도, flag가 바뀌었기 때문에 다른 데이터가 덮어씌우면 그만이기 때문이다.

컴퓨터 곳곳에서 삭제는 '잊혀진다' 라는 개념이다. 라는 걸 알게 되면서, 사물을 바라보는 관점이 넓어진 느낌이 든다.
생각해보면, 인간 세상에서도 "잊혀진다는 건 내가 이 세상에서 지워진다는 것"과 거의 똑같다. (영화 코코에서도 얘기하지않는가.)

위에서 언급한 2가지 이외에도 운영체제, 컴퓨터를 공부하면서 더 많은 걸 배웠다.

  • 어떻게 동시에 여러가지 프로그램들이 돌아갈 수 있고, 왜 동시에 돌아가도 데이터가 동기화가 되는지
  • 윈도우나 맥에서 파일 정보 보기를 클릭하면 나오는 그 정보들은 어떻게 만들어진 것인지
  • 동일한 컴퓨팅 자원이라도 캐시 등을 쓰면 어떻게 더 성능이 좋아질 수 있는 것인지
  • 메모리를 쓰려고 하는 프로그램이 메모리 자원보다 많아도 어떻게 컴퓨터는 잘 돌아가는지
  • 왜 권한이라는 게 존재해서 접근을 할 수 없는게 있는지
  • 우리가 쓰고 있는 인터넷에서 어떻게 글을 쓰고 읽고 할 수 있는지
    등등

배운게 당연히 더 있겠지만, 이정도가 현재 기억나는 것들이다.

머리가 아프고 힘든 시간들이지만, 운영체제를 구현한다는 것은 굉장히 매력적이고 재밌는 일이다.

세상 밖으로 나갈 때까지 여기서 더 많은 걸 배우고 싶다. 그러면 세상에 나갔을 때 좀 더 넓은 시야로 세상을 바라볼 수 있지 않을까.


(정리한 개념들이 정확하지 않다면, 댓글로 피드백 주시면 감사하겠습니다.)

profile
소프트웨어 엔지니어링을 연마하고자 합니다.

0개의 댓글