운영 체제는 프로그램 실행 환경을 제공하고 프로그램 및 사용자에게 다양한 서비스를 제공합니다.
운영 체제는 이러한 서비스와 기능을 통해 하드웨어를 추상화하고, 사용자와 애플리케이션에 고수준의 인터페이스를 제공합니다. 이를 통해 사용자는 복잡한 하드웨어 세부 정보에 대해 걱정하지 않고, 컴퓨터 시스템을 보다 쉽고 효율적으로 사용할 수 있습니다.

명령 줄 인터페이스 또는 명령 해석기 : 사용자로부터 직접 명령을 입력받아 실행 가능
사용자 친화적인 데스크탑 메타포 인터페이스
GUI는 사용자가 시스템과 상호작용할 수 있게 하는 직관적이고 시각적인 방법을 제공합니다. 사용자는 텍스트 명령어를 직접 입력하는 대신, 마우스나 다른 포인팅 장치를 사용하여 아이콘, 버튼, 메뉴 등의 그래픽 요소를 클릭하거나 선택함으로써 작업을 수행할 수 있습니다. 이는 컴퓨터를 사용하는 데 있어서의 학습 곡선을 낮추고, 더 폭넓은 사용자층이 컴퓨터와 상호작용할 수 있게 만들어줍니다.
터치스크린 장치는 새로운 형태의 인터페이스를 요구합니다.
마우스 사용이 불가능하거나 원치 않는 경우가 많습니다.
동작 및 선택은 제스처 기반으로 이루어집니다.
텍스트 입력을 위한 가상 키보드가 제공됩니다.
음성 명령(+AI) 기능이 있습니다.
System Calls : 운영 체제가 제공하는 서비스에 대한 인터페이스를 제공
시스템 호출은 사용자 모드에서 실행되는 응용 프로그램이 운영 체제의 커널 모드 기능을 안전하게 사용할 수 있도록 하는 중요한 인터페이스입니다. 이는 파일 시스템 조작, 프로세스 관리, 네트워크 통신 등 운영 체제의 핵심 기능에 접근할 수 있게 해줍니다.
시스템 호출의 사용은 운영 체제의 보안과 안정성을 유지하는 데 중요한 역할을 합니다. 운영 체제는 시스템 호출을 통해 요청된 작업이 유효하고 안전한지 검사할 수 있으며, 필요한 권한이 있는지 확인할 수 있습니다. 이를 통해 무분별한 자원 접근이나 잘못된 작업 요청으로부터 시스템을 보호할 수 있습니다.
-> 간단히 말해서, System Calls는 interrupt를 발생한 경우, kernel mode로 바꿔주는 것

정리) 사용자 모드에서는 제한된 권한으로 코드가 실행되어, 시스템 전체에 영향을 미칠 수 있는 위험한 작업을 방지합니다. 반면, 커널 모드에서는 운영 체제가 시스템의 전반적인 관리와 제어를 할 수 있으며, 이를 통해 하드웨어와 시스템 자원을 효율적으로 관리할 수 있습니다.
시스템 호출은 이 두 모드 사이의 중요한 다리 역할을 하며, 사용자 애플리케이션이 필요한 시스템 자원과 서비스에 안전하게 접근할 수 있게 해줍니다. 운영 체제는 시스템 호출을 통해 전달된 요청을 검증하고, 적절한 작업을 수행한 후 결과를 애플리케이션에 반환합니다.

밑의 그림은 중요!

시스템 호출 구현은 운영 체제(OS)의 핵심적인 부분
-> 사용자 프로그램이 커널 모드에서 실행되는 운영 체제의 기능을 안전하게 이용할 수 있게 해줌.
프로그래머는 시스템 호출이 어떻게 구현되어 있는지 알 필요가 없습니다. 대신, 프로그래머는 시스템 호출 API를 사용하는 방법과 OS가 시스템 호출 결과로 무엇을 할 것인지를 이해해야 합니다. 대부분의 OS 인터페이스 세부 사항은 프로그래머로부터 API에 의해 숨겨져 있습니다. 이러한 추상화는 프로그래머가 복잡한 내부 메커니즘에 대해 걱정하지 않고 OS 기능을 쉽게 사용할 수 있게 해줍니다.
-> 두 가지 예시(write() vs. printf() 그리고 read() vs. fread())를 통해 설명
read()는 파일 기술자를 통해 데이터를 읽는 운영 체제의 시스템 호출입니다. 이 함수는 지정된 파일 기술자로부터 최대 지정된 바이트 수만큼 데이터를 읽어서 주어진 버퍼에 저장합니다. read()는 낮은 수준의 입력 기능을 제공하며, 파일로부터 직접 데이터를 읽습니다.
fread()는 C 언어의 표준 입출력 라이브러리에 정의된 함수입니다. 이 함수는 파일 스트림으로부터 데이터를 읽으며, read() 시스템 호출을 내부적으로 사용합니다. fread()는 사용자에게 보다 고수준의 인터페이스를 제공하며, 데이터를 읽을 때 추가적인 버퍼링과 처리를 수행합니다.
결론적으로, 시스템 호출(write(), read())은 운영 체제가 제공하는 낮은 수준의 기능을 직접 사용하는 반면, 프로그래밍 언어의 I/O 함수(printf(), fread())는 이러한 시스템 호출을 기반으로 하면서도 보다 사용하기 쉬운 고수준의 인터페이스를 제공합니다. 프로그래머는 작업의 요구 사항에 따라 적절한 수준의 함수를 선택하여 사용할 수 있습니다.
Parameter passing methods
레지스터를 사용한 전달 (간단한 정보)
가장 기본적이고 빠른 방법 중 하나입니다. 시스템 호출에 필요한 매개변수가 간단하거나 소량일 때, 이들 매개변수를 직접 CPU의 레지스터에 저장하여 전달할 수 있습니다. 이 방식의 장점은 매개변수 접근 속도가 매우 빠르다는 것입니다. 하지만, 한정된 수의 레지스터로 인해 전달할 수 있는 매개변수의 수가 제한됩니다.
블록 주소를 사용한 전달 (대량의 정보)
매개변수의 양이 많거나 구조가 복잡할 때는, 이 매개변수들을 메모리 내의 블록이나 테이블에 저장하고, 해당 블록의 주소만을 레지스터를 통해 전달합니다. 시스템 호출이 실행될 때, 커널은 이 주소를 참조하여 필요한 모든 매개변수를 얻습니다. 이 방법은 많은 양의 데이터를 전달할 수 있지만, 메모리 접근에 따른 추가적인 오버헤드가 발생할 수 있습니다.
시스템 스택을 사용한 전달
매개변수를 시스템 스택에 넣거나(push) 스택에 배치하여 전달하는 방법입니다. 이 방식은 함수 호출 시 매개변수를 전달하는 전통적인 방법과 유사합니다. 프로세스의 스택 영역을 사용하여 매개변수를 저장하고, 시스템 호출 시 이들 매개변수를 스택에서 읽어들입니다. 스택을 사용하는 방법은 매개변수의 수가 가변적이거나 매우 많을 때 유용할 수 있으며, 레지스터만을 사용하는 방법보다 더 유연합니다. 하지만, 스택을 통한 접근은 레지스터 접근보다 느릴 수 있습니다.
블록 주소를 사용한 전달이나 시스템 스택을 사용한 전달 모두 정보량이 많을 때 사용하는데, 구지 차이를 두어야 할까?
: 두 방법은 모두 대량의 데이터를 전달할 때 사용되지만, 데이터를 저장하고 접근하는 메커니즘에서 차이가 있습니다. 블록 주소 방식은 메모리 내의 임의의 위치에 데이터를 유연하게 배치할 수 있는 반면, 시스템 스택 방식은 프로세스의 스택 영역을 사용하여 데이터를 순차적으로 관리합니다.

시스템 프로그램은 프로그램 개발과 실행을 위한 편리한 환경을 제공합니다. 이 프로그램들은 사용자와 운영 체제 간의 인터페이스 역할을 하며, 운영 체제의 기능을 보다 쉽게 사용할 수 있도록 도와줍니다. 시스템 프로그램은 다음과 같이 여러 범주로 나눌 수 있습니다:
6.백그라운드 서비스
대부분의 사용자는 시스템 호출이 아닌 시스템 프로그램을 통해 운영 체제와 상호 작용합니다. 시스템 프로그램은 사용자에게 보다 직관적이고 친숙한 인터페이스를 제공하며, 복잡한 시스템 호출을 추상화하여 사용자의 작업을 단순화합니다. 따라서, 시스템 프로그램은 운영 체제의 사용성과 접근성을 크게 향상시키는 중요한 역할을 합니다.
응용 프로그램이 운영 체제별로 특정되는 이유 : 기본적으로 운영 체제의 구현 차이 때문입니다. 그러나 다중 운영 체제를 지원하는 방법을 통해 이러한 문제를 해결하고 다양한 환경에서 응용 프로그램을 사용할 수 있게 할 수 있습니다. 이러한 접근법들은 소프트웨어 개발자들이 다양한 사용자 기반에 서비스를 제공할 수 있게 하며, 운영 체제 간의 호환성 문제를 최소화합니다.
운영 체제를 설계하고 구현하는 과정은 다음과 같은 단계들이 있다.
목표와 사양 정의
설계 과정은 운영 체제가 달성해야 할 목표와 사양을 명확히 정의하는 것으로 시작합니다. 이 목표는 시스템의 유형(예: 일반 목적, 실시간 시스템, 임베디드 시스템 등)과 선택된 하드웨어에 의해 영향을 받습니다.
사용자 목표와 시스템 목표
사용자 목표: 사용자는 운영 체제가 사용하기 편리하고, 배우기 쉽고, 신뢰할 수 있으며, 안전하고, 빠른 성능을 제공하기를 원합니다.
시스템 목표: 시스템 관점에서는 운영 체제가 설계, 구현, 유지 관리하기 쉽고, 유연하며, 신뢰할 수 있고, 오류가 없으며, 효율적인 시스템이 되어야 합니다.
설계 과정
설계 과정에서는 운영 체제의 주요 구성 요소와 그들 사이의 상호 작용을 결정합니다. 이 과정에서는 추상화, 캡슐화, 모듈화와 같은 소프트웨어 공학 원칙이 중요한 역할을 합니다.
구현
설계 단계 후, 구현 단계에서는 선택된 프로그래밍 언어를 사용하여 운영 체제의 구성 요소를 실제 코드로 변환합니다. 이 단계는 성능 최적화와 오류 검출을 포함한 다양한 시험을 필요로 합니다.
유지 관리
운영 체제는 출시 후에도 지속적인 유지 관리가 필요합니다. 이는 버그 수정, 성능 개선, 새로운 하드웨어 지원 추가 등을 포함합니다.
운영 체제의 설계와 구현은 복잡하고 계속 발전하는 과정입니다. 성공적인 운영 체제는 사용자와 시스템의 목표를 모두 만족시킬 수 있는 유연성과 확장성을 갖추고 있어야 합니다.
Policy: What to do it? , Mechanism: How to do it?
부팅 : 커널로 로딩됨으로써 컴퓨터가 실행되는 절차
<세부적>
전원 초기화 시 고정 메모리 위치에서 실행 시작
펌웨어 ROM과 초기 부트 코드
운영 체제를 하드웨어에 사용 가능하게 만들기
부트스트랩 로더와 OS의 부트 블록
GRUB과 같은 일반적인 부트스트랩 로더
커널 로드와 시스템 실행