오늘의 주제는 운영체제의 개념과 구조입니다!

운영체제란? 🤷🏻‍♀️


컴퓨터 하드웨어 시스템을 효율적으로 운영하기 위한 소프트웨어

자 이제 우리는 운영체제가 어떻게 하드웨어 시스템을 효율적으로 운영하는지에 대해 공부해볼 것입니다!

운영체제의 필요성과 역할 ⭐️


그 전에 운영체제가 왜 필요한 것인지, 어떤 역할을 하는지 알아보겠습니다.

초기 컴퓨터의 역할은 특별한 사용 규칙이 필요없이 그저 정해진 계산을 잘하는 것이었습니다. (최초 컴퓨터인 ENIAC은 지금의 공학 전자계산기 수준에 불과했다고 합니다.)

하지만 메모리, CPU등의 성능이 향상되고, 여러 작업을 동시에 해야하는 복잡한 환경이 만들어지면서 규칙이 필요하게 된 것입니다.

현재 우리는 컴퓨터를 사용할 때 음악을 들으며, 채팅도 하고, 웹 서핑을 동시에 하고 있습니다.

만약 운영체제가 없다면 이것을 동시에 할 수 있을까요?

아마 없을 것입니다 ‼️


하나의 응용프로그램 즉, 음악 어플리케이션은 모니터, 메모리, CPU 등의 장치를 독차지 하려고 했을 것입니다.

이때 필요한 것이 운영체제입니다. 하나뿐인 자원 즉, 모니터, 메모리 등의 장치를 누구에게 먼저 줄지를 결정하는 중재자 역할을 하는 것이죠!

또한, 각각의 어플리케이션이 하드웨어와 올바르게 통신하는 역할을 합니다.

이렇게 애플리케이션이 잘 작동하도록 돕고, 하드웨어를 관리 및 제어하는 것이 운영체제의 역할입니다.

운영체제의 구조 🏛️


이제 운영체제의 구조에 대해 알아보겠습니다.

컴퓨터의 구조

위 그림에서 운영체제는 커널, 인터페이스, 시스템콜, 드라이버를 포함합니다. 그 중 시스템콜과 드라이버는 커널에 속해있으므로 가장 크게보면 커널인터페이스로 이루져있다고 볼 수 있죠.


인터페이스 ⭐️

먼저 인터페이스를 보도록 하겠습니다.

인터페이스사용자와 응용프로그램에 인접하여 커널에 명령을 전달하고 실행 결과를 사용자와 응용프로그램에 돌려줍니다.

옹,, 명령을 전달하는군,,😵‍💫 그래서 몬데.

자 그럼 Unix 운영체제를 한번 살펴보겠습니다! Unix의 인터페이스다음과 같은 명령어 기반인 셸로 이루어져 있습니다.

그리고 Mac OS 또한, Unix 기반의 커널을 사용하여 만든 운영체제입니다.

같은 커널을 사용했지만 다른 화면을 볼 수 있죠?

처음 말했던 인터페이스는 사용자와 응용프로그램에 인접해있다! 는 의미를 이해할 수 있습니다.

사용자가 Xcode에서 print() 함수를 실행시킨다면? 구체적으론 아직 알 수 없지만 무언가를 커널로 전달한다는 의미겠죠? 이것 또한, 아까 정의했던 커널의 명령을 전달한다는 의미로 이해할 수 있습니다.

이렇게 인터페이스가 무엇인지에 대해 이해하였습니다. 이제는 커널을 파헤치러 가보겠습니다. ***

커널 🔉

커널전반적인 프로세스, 메모리, 저장장치 등을 관리하는 매우 핵심적인 역할을 합니다.

프로세스 관리.. 그거 어떻게 하는거징.. 프로세스의 개념은 나중에 자세히 살펴보도록 하고 지금은 하나의 프로그램이라고 생각합시다.

아까 보았던 구조를 다시보면 인터페이스와 커널 사이에 하나의 선이 존재합니다.

운영체제의 역할 부분에서 운영체제는 중재자! 라고 말했죠?

이렇게 사용자와 하드웨어의 중간에서 잘 통신하도록 돕기 위해 운영체제는 user 모드kernel 모드로 나누어져 있습니다.

그래서 user 모드에서 kernel 모드로 가기 위해서는 장벽(선)을 뚫고(?) 들어갈 진입점이 필요합니다.

이것이 바로 커널 내부에 존재하는 system call 입니다.

system call을 설명하기 전, user 모드에서 kernel 모드로 들어간다는 것은 거의 새로운 세상에 가는 것과 같은 매우 다른 환경임을 기억해주세요 ‼️ ***

system call 📱

시스템 콜은 커널이 자신을 보호하기 위해 만든 인터페이스이다. 또한, 커널이 제공하는 시스템 관련 서비스를 모아놓은 것이며 함수 형태로 제공된다.

커널이 자신을 보호? 왜 보호?

아까 말했다시피 운영체제는 중재자의 역할입니다. 그런데 여기서 사용자가 자기 맘대로 커널 영역에 들어와서 직접 자원(하드웨어)을 사용한다..?

그럼 운영체제 .. 왜 있…? 🤷🏻‍♀️

그래서 커널은 사용자나 응용프로그램이 자신의 범위에 침범하지 못하게 시스템 콜 이라는 인터페이스를 “통해서만” 접근이 가능하도록 한것입니다.

이해를 돕기 위해

print("I love MAC")

swift의 print 함수로 “I love MAC” 이라는 문자열을 모니터에 출력하는 과정을 생각해봅시다. (앱등이에용🙋🏻‍♀️)

user 모드에서 print() 함수를 썼다고 생각합시다.

그럼 user 모드에서는 print() 함수를 사용해 인터페이스를 지나 엄청나게 새로운 세상인 kernel 영역으로 들어가게 됩니다. (중간 과정이 생략되었습니다. 나중에 자세히 설명하도록 하죠!)

이렇게 kernel 모드로 진입을 하게 되면 이때부터는 새로운 코드가 시작됩니다. 아까 시스템 콜이 시스템 관련 서비스를 함수 형태로 제공한다고 했었죠?

여기서 이 새로운 코드를 시스템 콜 이라고 하는 것입니다!

오케이.. 커널 모드로 넘어왔어.. 그래서 어떻게 화면에 보이는건데…? 🫣

이제 화면에 출력하려면 하드웨어에 연결이 되어야겠죠?

system call은 user 모드와 kernel 모드를 연결하고.. 그럼 하드웨어랑은 어떻게 연결하지??

마지막으로 아까 보았던 구조를 보도록 하겠습니다.

그림에서 볼 수 있듯이 커널과 하드웨어의 인터페이스 역할은 드라이버가 하고 있습니다. ***

드라이버 🪛

드라이버는 프린터, 키보드, 디스크 드라이브와 같은 하드웨어 장치와 운영체제 간의 인터페이스 역할을 합니다.

드라이버는 이제 하드웨어 단에 “I love MAC” 이라는 문자열을 전달하는 일만 남았습니다.

드라이버가 장치(하드웨어)에게 “I love MAC” 문자열을 전달하면 이때 interrupt 가 일어나게 되고, 장치와 통신을 하게 됩니다.

여기서 interrupt는 원래 잘 흘러가던 일을 잠깐 stop! 하는 것과 비슷합니다. 이후에 더 자세히…

통신을 하면 실제로 선으로 연결되어있던 모니터에 “I love MAC” 가 출력되게 되면서 출력의 모든 과정이 마무리됩니다.

마무리하며..✨


운영체제의 기본적인 개념과 구조에 대해 알아보았습니다!

간략하게 설명하기 위해 추가적인 과정이나 세세한 내용은 추후 다른 글로 업데이트해보도록 하겠습니다!

공부하며 정리한 글이라 오류가 있을 수 있습니다. 읽어주셔서 감사합니다😊

참고 📜


  • ▶조성호. 『쉽게 배우는 운영체제』. 한빛 아카데미, 2018.
  • 인프런 / 널널한 개발자의 운영체제 강의