현대 사회에서 걸음을 조금만 옮겨도 보이는 것들이 바로 스마트폰, TV, 컴퓨터와 같은 기기다.
우리는 윈도우, IOS, 리눅스, 타이젠과 같은 네이밍을 들었을 수도 있고, 아니면 그것도 모른 채로 살아왔을 수 있다.
컴퓨터 부품들은 전기를 공급한다고 해서 알아서 동작하는 것이 아니기 때문에 이를 동작시켜 줄 수 있는 프로그램이 필요하고 이를 OS라고 한다.


사용자가 어떤 응용 프로그램을 실행했을 때, 우리는 이 프로그램을 메모리에 따로 어디에 할당하라고 지정하지 않는다. “그렇다면 이 프로그램들이 메모리에 할당하는 존재는 무엇일까?”
“운영체제”다.

처음 개요에서 설명했듯이, OS는 사용자가 컴퓨터를 쉽게 동작할 수 있도록 도와주는 프로그램이라고 했는데, 지금 이 메모리에 자동으로 할당해주는 것 또한 OS가 사용자를 도와주는 것이다.
우리는 여러 프로그램을 동시에 사용하는 경우가 많다. 그러나 우리 입장에서는 동시에 사용하는 것이지만, 우리가 인지할 수 없는 시간 단위에서 번갈아가면서 실행된다고 볼 수 있다.

CPU가 이 여러 프로그램을 빠르게 번갈아가면서 실행하는 것이다.
따라서, CPU는 해당 프로그램들을 구동하기 위해 최적화를 하게 되는데,
“어떤 프로그램을 먼저 실행할 것인지, 얼마나 오랫동안 실행할지”를 운영체제가 결정해준다.

워드 프로세서가 프린터라는 IO를 먼저 사용하고 있기 때문에, 메모장은 워드 프로세스의 실행이 끝날 때까지 대기해야하는데 이를 OS가 명령을 한다.
그렇기 때문에, 운영체제는 응용 프로그램의 최적화를 해주는 것 뿐만이 아니라, 하드웨어와 연결도 해주는 프로그램이다.

< 1과 2의 덧셈 결과를 모니터에 출력하는 프로그램 >
Q. 모니터에 계산 결과를 출력하는 것은 C언어의 printf으로 충분히 할 수 있는 간단한 것 아닌가요?
A. 운영체제 내에 있는 특정 코드를 수행하라. 라는 식으로 정의되어 있기 때문에, 이 또한 운영체제의 도움을 받아 실행되는 함수라고 볼 수 있다.
개발자는 하드웨어에 접근하는 코드를 직접 작성할 필요가 없다.
예를 들어, 파일을 읽고 싶을 때, 보조기억장치에 있는 파일을 접근해야 하는 코드가 필요한 것이 아니라, 그 파일에 접근할 수 있는 운영체제의 코드를 실행해서 운영체제한테 부탁만 하면 된다.
응용 프로그램이 운영체제를 통해 하드웨어를 접근한다 했을 때 어떤 문제점이 생겼다고 한다면, 운영체제가 먼저 알아차리게 된다.

따라서, OS는 프로그램이 실행될 때 메모리와 CPU 관리를 자동으로 해주고, 응용 프로그램과 하드웨어 사이에서 매개 역할을 해주기 때문에, 사용자가 아닌 프로그램을 위한 프로그램이라고 볼 수 있다.

단, UI는 OS에 포함되지만 사용자가 컴퓨터를 이용할 수 있게 해주는 기능이기 때문에 핵심 기능, 즉 커널이라고 하지는 않는다.

| 사용자 모드 | 커널 모드 |
|---|---|
| 운영체제 서비스를 제공받을 수 없는 실행 모드 | 운영체제의 서비스를 제공받을 수 있는 실행 모드 |
| 커널 영역의 코드를 실행할 수 없는 실행 모드 | 자원 접근을 비롯한 모든 명령어 실행 가능 |
| 결정적으로, 자원 접근이 불가 | |
| 웹 브라우저, 게임 등의 응용 프로그램, 사용자 어플리케이션 파일 읽기/쓰기 요청 | 파일 시스템 접근, 하드웨 제어, 스케줄링 등 |
유저 모드에서 사용자 애플리케이션 파일 읽기, 쓰기를 요청하면 System Call(시스템 호출)을 통해 커널에 전달이 된다. 이 때, 일시적으로 커널 모드로 전환이 되고 작업이 완료되면, 다시 유저 모드로 돌아온다.

응용 프로그램이 실행되다가 자원에 접근할 경우가 생긴다면, 시스템 호출을 이용해 커널 모드가 된다. 이 때, 하드웨어에 접근할 수 있는 코드를 실행하게 되고 다시 응용 프로그램으로 돌아오게 된다.

프로세스 : 실행 중인 프로그램

운영체제가 이 프로세스를 어떻게 관리하는지에 대해서는 추후 공부를 통해 더 알아보도록 한다.
ex) 프로세스와 스레드, 프로세스 동기화, 교착상태 해결
참고 : 혼자 공부하는 컴퓨터구조 + 운영체제