운영 체제는 사용자와 하드웨어 사이의 중재자 역할을 하며, 커널과 추가 프로그램들로 구성됩니다. 커널은 운영 체제의 핵심으로 항상 실행되고, 시스템이나 응용 프로그램은 포함되지 않습니다.
Middleware: 앱 개발자에게 추가 서비스(예: 데이터베이스, 멀티미디어, 그래픽 등)를 제공하는 소프트웨어 프레임워크 세트입니다.
운영 체제의 목표는 사용자 프로그램을 실행하여 사용자 문제 해결을 용이하게 하고, 컴퓨터 시스템을 사용하기 편리하게 만들며, 컴퓨터 하드웨어를 효율적으로 사용하는 것입니다.

이 fetch와 execute의 과정을 폰 노이만 구조라 한다.

위의 과정을 통해 프로그램 실행.
(이것 이외에 VM, 메모리 계층 구조, pipeline datapath 등등이 있음.)

각 장치 컨트롤러는 로컬 버퍼를 가지고 있습니다.
CPU는 메인 메모리와 로컬 버퍼 사이에서 데이터를 이동시킵니다.
입출력(I/O) 작업은 장치에서 해당 컨트롤러의 로컬 버퍼로 이루어집니다.
장치 컨트롤러는 작업이 끝났음을 CPU에 알리기 위해 인터럽트를 발생시킵니다.
◼ Interrupt(인터럽트): 하드웨어나 소프트웨어로부터의 비동기적 신호로, 주의가 필요함을 나타냄
하드웨어에서 지원.
각 인터럽트 유형은 번호(IRQ 번호)와 연관.
인터럽트 핸들러에 의해 처리.
각 유형의 인터럽트에 대해 취해야 할 조치를 결정하는 별도의 코드 세그먼트 존재.
인터럽트 핸들러 테이블: 인터럽트 벡터
이벤트를 처리하는 메커니즘
◼ Interrupt Handling
운영 체제는 CPU의 상태를 저장하기 위해 레지스터와 프로그램 카운터를 저장하고, 실행을 인터럽트 핸들러로 전달합니다.
인터럽트 벡터: 각 유형의 인터럽트에 대한 핸들러 테이블
인터럽트는 해당 핸들러에 의해 처리됩니다.
CPU의 상태를 복원하고 중단된 프로그램으로 돌아갑니다.

◼ Interrupt Driven I/O
CPU는 요청을 보내고 현재 프로세스를 계속하거나 다른 작업을 수행합니다.
데이터 전송이 완료되면 I/O 장치가 인터럽트를 발생시킵니다. (문제가 있는 경우)
◼ Storage Hierarchy
캐싱(Caching): 정보를 더 빠른 저장 시스템으로 복사하는 것
주 메모리는 보조 저장소의 캐시로 볼 수 있음
각 장치 컨트롤러에 대한 장치 드라이버를 사용하여 I/O를 관리
컨트롤러와 커널 사이의 일관된 인터페이스를 제공함
◼ Interrupt Driven Data Transfer
장점: 사용자 프로그램 진행이 실제 전송 중에만 중단됨
단점:
특별한 하드웨어가 필요함:
인터럽트 발생 (I/O 장치)
인터럽트 감지 (프로세서)
인터럽트 후 재개를 위한 적절한 상태 저장 (프로세서)
대량의 데이터 블록을 전송할 때, 프로세서가 데이터 전송에 관여해야 함 → DMA가 해결책이 됨

◼ DMA (Direct Memory Access)
장치 컨트롤러가 대량의 데이터를 직접 주 메모리로 전송
CPU는 데이터 전송에 관여할 필요가 없음
하드 디스크와 같은 대역폭이 높은 I/O 장치의 블록 전송에 적합함

On modern computers, multiprocessor systems now dominate the
landscape of computing.
다중 프로세서 시스템의 장점

Muticore system : 하나의 CPU에 여러 chip이 있으니까, 서로 통신의 속도가 빨라
Symmetric multiprocessing architecture : 여러 process가 동시에 실행 가능
클러스터 시스템의 주요 목적은 고가용성 서비스를 제공하여 시스템의 장애를 견디는 것입니다. 이는 시스템의 일부 구성 요소가 실패해도 전체 시스템이 계속 작동할 수 있도록 하는 것을 의미합니다. 또한, 일부 클러스터는 고성능 컴퓨팅(HPC)을 위해 설계되어 병렬 처리를 통해 높은 성능을 제공합니다.
(쉽게 말해서, multicore + multiprocessor)

◼ bootstrap program : 시스템을 초기화하고 커널을 로드하는 간단한 코드
◼ Kernel loads
◼ system daemons (커널 외부에서 제공되는 서비스)을 시작합니다.
◼ Kernel interrupt driven (하드웨어 및 소프트웨어)
여러 작업을 동시에 메모리에 유지하고 실행하는 방식입니다. 이를 통해 CPU와 I/O 장치를 효율적으로 활용할 수 있습니다. 단일 사용자가 CPU와 I/O 장치를 항상 사용 중으로 유지할 수 없는 상황에서, 다중 프로그래밍은 작업을 조직화하여 CPU가 항상 실행할 작업을 가지고 있도록 합니다. 메모리에는 전체 작업 중 일부가 유지되며, 작업 스케줄링을 통해 선택된 작업이 실행됩니다. 작업이 I/O를 기다려야 하는 경우에는 운영 체제가 다른 작업으로 전환하여 실행을 지속합니다. 이를 통해 CPU와 I/O 장치의 활용도를 향상시킬 수 있습니다.
다중 프로그래밍의 논리적 확장입니다. CPU가 작업을 너무 자주 전환하여 사용자가 실행 중인 각 작업과 상호 작용할 수 있는 환경을 제공합니다. 이는 대화형 컴퓨팅을 가능하게 합니다. 멀티태스킹은 응답 시간을 1초 미만으로 유지하는 것이 목표입니다. 각 사용자는 적어도 하나의 실행 중인 프로그램(프로세스)을 메모리에 가지고 있으며, CPU 스케줄러는 실행 준비가 된 작업을 선택하여 실행합니다. 이를 통해 여러 사용자가 동시에 컴퓨터를 사용하고, 각각의 작업을 독립적으로 처리할 수 있습니다.
◼ 현대의 운영 체제 -> interrupt-driven programs 방식
◼ 다중 사용자 운영 체제의 필수 요구 사항: 한 프로그램의 오류가 다른 프로그램에 영향을 주어서는 안 됩니다.
◼ Dangerous instructions → Dual mode operation
◼ Preventing long execution of user process → Timer
이중 모드 동작은 운영 체제가 자체와 다른 시스템 구성 요소를 보호할 수 있도록 하는데 도움이 됩니다(하드웨어의 지원이 필요합니다).
◼ User mode
사용자가 정의한 코드(응용 프로그램)
Privileged instructions, which can cause harm to other system, are prohibited
-> I/O 명령어, 타이머 명령어 등
Privileged instructions -> OS system call을 통해서만 실행될 수 있습니다.
◼ kernel mode (supervisor mode, system mode, privileged mode)
OS code
Privileged instructions 허용됨.
Mode Bit == ring이라 칭하기도 함.
◼ 하드웨어에서 제공하는 모드 비트(mode bit)가 있습니다. ->
◼ 이를 통해 시스템이 사용자 코드 또는 커널 코드를 실행 중인지를 구별할 수 있습니다.
◼ 사용자가 실행 중인 경우 → 모드 비트는 "사용자" (1)입니다.
◼ 커널 코드가 실행 중인 경우 → 모드 비트는 "커널" (0)입니다.

"Mode bit"은 단일 비트로 현재 실행 중인 코드가 사용자 모드인지 커널 모드인지를 나타냅니다. 일반적으로 0과 1로 표현되며, 0은 커널 모드를 나타내고 1은 사용자 모드를 나타냅니다.
"Ring"은 비트 필드로서 여러 비트를 사용하여 현재 실행 중인 코드의 모드를 나타냅니다. 일반적으로 2의 거듭제곱 수(2^n)의 비트를 사용하며, 각 비트는 특정한 보호 수준을 나타냅니다.
실제 적용해보기
프로그램의 긴 실행으로부터 보호하는 방법은 다음과 같습니다.
사용자 프로세스에 CPU 제어권을 넘기기 전에 타이머를 설정하여 미리 정의된 기간 후에 인터럽트를 발생시킵니다.
만약 타이머 인터럽트가 발생하면, 운영 체제는 각 상황을 적절히 처리하기 위해 제어권을 가져올 수 있습니다.
중요한 점은 시간 카운터는 특권 명령으로만 수정할 수 있다는 것입니다. 이는 일반 사용자 프로세스가 시간 카운터를 조작하는 것을 방지하여 운영 체제가 제어를 유지할 수 있도록 합니다.
이와 같은 방식을 사용하면 운영 체제는 타이머와 인터럽트를 활용하여 프로그램의 실행 시간을 제한하고, 사용자 프로세스가 무한히 실행되는 상황을 방지할 수 있습니다.

프로세스의 종료에는 재사용 가능한 자원을 회수하는 것이 필요합니다.
단일 스레드 프로세스는 프로그램 카운터를 가지며, 명령을 순차적으로 하나씩 실행하여 완료됩니다. 동일한 프로그램의 여러 인스턴스는 별도의 프로세스로 실행됩니다. 프로세스는 작업의 단위이며, 운영 체제 프로세스와 사용자 프로세스가 있을 수 있습니다.
프로세스는 실행 중인 프로그램으로 필요한 자원을 할당받고 작업을 수행합니다. 프로세스의 종료 시에는 사용한 자원을 회수하여 다른 프로세스가 사용할 수 있도록 해야 합니다.
스레드(Thread): 프로그램이 자신을 두 개 이상의 동시에 실행되는 작업으로 분할하는 방법입니다. 스레드는 CPU 활용의 기본 단위이며, 프로세스보다 작은 단위입니다. 각 스레드는 고유한 ID, 프로그램 카운터, 레지스터 세트, 스택 등을 갖습니다. 주요 자원은 공유됩니다.
작업(Task): 주소 공간을 통한 실행 경로입니다. 작업은 메모리에 로드된 프로그램 명령어의 집합을 의미합니다. 일부 상황에서는 작업이 프로세스를 의미하거나 프로세스와 스레드를 모두 포함할 수 있습니다. 예를 들어, Linux와 같은 환경에서는 작업이 프로세스를 의미하기도 하며, 때로는 프로세스와 스레드를 모두 포함하는 의미로 사용됩니다.
스레드는 프로세스 내에서 동시에 실행되는 작업 단위로, 프로세스보다 더 작은 단위로 CPU를 활용합니다. 작업은 메모리에 로드된 프로그램의 실행 경로를 의미하며, 일부 환경에서는 프로세스를 의미하거나 프로세스와 스레드를 모두 포함할 수 있습니다.
중요
Process management by OS
◼ Creating/deleting processes : 운영 체제는 프로세스를 생성하고 삭제할 수 있습니다. 프로세스를 생성하는 것은 새로운 프로그램을 실행하기 위해 해당 프로그램의 메모리 공간을 할당하는 것을 의미합니다. 프로세스 삭제는 실행을 완료한 프로세스의 자원을 회수하는 것을 의미합니다.
◼ Suspending/resuming process : 운영 체제는 프로세스를 일시 중지하거나 재개할 수 있습니다. 프로세스를 일시 중지하면 해당 프로세스의 실행이 일시적으로 중단되며, 재개되면 다시 실행이 이어집니다. 이는 우선순위나 자원 할당 등의 이유로 필요한 기능입니다.
◼ Process synchronization : 여러 프로세스가 동시에 실행될 때, 운영 체제는 프로세스 간의 동기화를 관리합니다. 동기화를 통해 프로세스들은 자원의 접근 순서, 임계 영역(Critical Section)의 상호 배제, 동기화 객체(세마포어, 뮤텍스 등)를 사용하여 상호 작용할 수 있습니다.
◼ Process communication : 운영 체제는 프로세스 간의 통신을 지원합니다. 프로세스 간 통신은 데이터를 주고받거나 서로의 상태를 알리는 등의 기능을 수행할 수 있습니다. 이를 통해 프로세스들은 협력하여 작업을 수행하거나 정보를 공유할 수 있습니다.
◼ Deadlock handling : 교착 상태(Deadlock)는 여러 프로세스가 서로의 자원을 점유하고 있어 상호 대기 상태에 빠지는 현상입니다. 운영 체제는 교착 상태를 감지하고 처리하는 기능을 제공합니다. 이를 위해 자원 할당 그래프 알고리즘 등을 사용하여 교착 상태를 해결하거나 예방할 수 있습니다.
프로그램 실행을 위한 메모리 할당: 프로그램을 실행하기 위해서는 모든(또는 일부) 명령어가 메모리에 있어야 합니다. 메모리 할당은 프로그램의 명령어를 메모리 공간에 할당하는 것을 의미합니다.
프로그램이 필요로 하는 데이터의 메모리 할당: 프로그램이 필요로 하는 모든(또는 일부) 데이터는 메모리에 있어야 합니다. 이를 위해 운영 체제는 프로그램이 사용하는 데이터를 메모리에 할당합니다.
CPU 활용과 사용자에 대한 컴퓨터 응답 최적화: 메모리 관리는 CPU 활용과 컴퓨터가 사용자에게 빠른 응답을 제공하는 데에도 영향을 미칩니다. 효율적인 메모리 관리는 CPU의 활용을 최적화하고 사용자에게 신속한 응답을 제공하기 위해 필요합니다.
메모리 관리 활동: 메모리 관리는 다음과 같은 활동을 수행합니다.
현재 메모리의 어느 부분이 사용 중인지 및 어떤 프로세스에 의해 사용되고 있는지 추적하는 것
어떤 프로세스(또는 일부분)와 데이터를 메모리로 이동시키거나 메모리에서 제거할지 결정하는 것
필요에 따라 메모리 공간을 할당하고 해제하는 것
메모리 관리는 시스템의 성능과 안정성에 매우 중요한 역할을 합니다. 효율적인 메모리 관리를 통해 시스템은 자원을 효율적으로 활용하고 프로세스와 데이터의 원활한 실행을 보장할 수 있습니다.
파일 시스템 관리는 다음과 같은 활동을 포함합니다:
다중 프로세서 환경에서는 모든 CPU가 자신의 캐시에 가장 최신 값을 가지도록 하기 위해 하드웨어에서 캐시 일관성(cache coherency)을 제공해야 합니다.
캐시 일관성은 공유 리소스의 로컬 캐시에 저장된 데이터의 무결성을 의미합니다. 각 CPU는 자체적으로 캐시를 가지고 있으며, 이 캐시들은 동일한 공유된 리소스에 대한 데이터를 저장합니다. 그러나 여러 CPU가 동시에 해당 데이터를 수정하거나 업데이트할 경우, 캐시들 간에 일관성을 유지해야 합니다. 이는 다른 CPU가 수정한 최신 데이터를 모든 CPU가 공유할 수 있도록 하여 데이터 일관성을 보장하는 것을 의미합니다.
캐시 일관성을 제공하기 위한 하드웨어적인 메커니즘은 캐시 일관성 프로토콜을 통해 이루어집니다. 일반적으로 캐시 일관성 프로토콜은 쓰기 갱신(write invalidate) 또는 쓰기 갱신(write update) 방식을 사용하여 캐시들 간에 데이터의 일관성을 유지합니다. 이를 통해 모든 CPU는 항상 가장 최신의 데이터를 갖게 되며, 데이터의 무결성과 일관성이 유지됩니다.
캐시 일관성은 다중 프로세서 시스템에서 데이터의 정확성과 일관성을 보장하기 위해 중요한 개념입니다. 하드웨어에서 캐시 일관성을 제공함으로써 프로세서 간의 데이터 동기화를 유지하고, 잘못된 데이터 접근이나 충돌을 방지할 수 있습니다.
운영체제(OS)의 한 가지 목적은 하드웨어 장치의 특징을 사용자로부터 숨기는 것입니다.
이를 위해 OS는 다양한 기기들의 특성과 동작을 추상화하여 사용자가 하드웨어에 대한 세부 정보를 알 필요 없이 편리하게 사용할 수 있도록 합니다.
I/O 부분 시스템은 다음과 같은 역할을 담당합니다:
I/O 메모리 관리: 데이터의 임시 저장(전송 중에 데이터를 일시적으로 저장), 캐싱(성능을 위해 일부 데이터를 빠른 저장소에 저장), 스풀링(한 작업의 출력과 다른 작업의 입력을 겹치게 함) 등 I/O의 메모리 관리를 담당합니다.
일반적인 장치 드라이버 인터페이스: 다양한 하드웨어 장치에 대한 일반적인 드라이버 인터페이스를 제공하여 장치와의 통신을 관리합니다.
특정 하드웨어 장치용 드라이버: 각각의 특정 하드웨어 장치에 대한 드라이버를 제공하여 해당 장치와의 상호 작용을 관리합니다.
이러한 기능들을 통해 운영체제는 사용자가 하드웨어 장치들의 세부 사항에 대해 신경 쓰지 않고도 편리하게 사용할 수 있도록 합니다. 사용자는 운영체제를 통해 일관된 인터페이스를 제공받으며, 하드웨어와 관련된 복잡한 부분은 운영체제가 처리해줍니다.
보호(Protection)는 운영체제(OS)에서 정의된 자원에 대한 프로세스나 사용자의 액세스를 제어하는 메커니즘입니다. 보호를 위한 다양한 메커니즘이 있습니다:
고유한 사용자 ID와 그룹 ID: 모든 프로세스와 자원에게 고유한 사용자 ID와 그룹 ID가 할당됩니다. 사용자 ID에는 사용자의 이름과 관련 번호가 포함되며, 각 사용자마다 하나의 ID가 있습니다. 그리고 해당 사용자의 모든 파일과 프로세스에 사용자 ID가 연결되어 액세스 제어를 결정합니다.
그룹 ID: 사용자 그룹을 정의하고 관리하는 데 사용되며, 각 프로세스와 파일에도 연결됩니다. 그룹 ID를 사용하여 여러 사용자의 액세스를 제어할 수 있습니다.
권한 상승(Privilege escalation): 사용자가 더 많은 권한을 가진 유효한 ID로 변경하는 것을 의미합니다. 권한 상승을 통해 사용자는 더 많은 권한을 가진 상태로 작업을 수행할 수 있습니다.
하지만 보호만으로는 충분하지 않습니다. 보호 메커니즘은 인증이 도난될 수 있다는 한계가 있습니다. 인증이 도난되면 보안의 취약점이 될 수 있습니다. 따라서 보안(Security) 메커니즘도 필요합니다.
보안(Security)은 외부 및 내부 공격으로부터 인증을 불법적으로 획득하는 것을 방지하는 목적을 가지는 메커니즘입니다. 이는 다양한 형태의 공격을 포함합니다. 예를 들면 거부 서비스 공격, 웜, 바이러스, 신분 도용, 서비스 도난 등이 있습니다. 최근의 환경에서 보안 문제는 매우 중요한 이슈입니다.
사이버 공격과 보안 위협은 계속해서 진화하고 있으며, 기술의 발전과 함께 새로운 취약점과 위협이 등장하고 있습니다. 이에 따라 기업과 개인 모두 보안에 대한 관심과 대비가 필요합니다. 시스템과 데이터의 기밀성, 무결성, 가용성을 보호하기 위해 다양한 보안 메커니즘과 방법이 사용되고 있습니다. 예를 들면 암호화, 방화벽, 침입 탐지 시스템, 악성 코드 검사 등이 있습니다.
보안은 사용자의 개인 정보와 중요한 비즈니스 데이터 등을 보호하여 사이버 공격으로부터 안전하게 보호하는 것을 목표로 합니다. 따라서 보안에 대한 지속적인 관심과 대비가 필요하며, 최신 보안 기술과 모범 사례를 따르는 것이 중요합니다.
가상화(Virtualization)은 운영 체제가 다른 운영 체제 내에서 애플리케이션을 실행할 수 있도록 하는 기술입니다. 이는 광범위하고 성장 중인 산업입니다.
가상화는 소스 CPU 유형과 대상 유형이 다른 경우에 에뮬레이션(Emulation)을 사용합니다. 예를 들어 PowerPC에서 Intel x86으로의 변환과 같은 경우입니다. 일반적으로 가장 느린 방법으로 알려져 있습니다. 또한 컴퓨터 언어가 네이티브 코드로 컴파일되지 않은 경우에는 해석(Interpretation) 방식이 사용됩니다.
가상화는 가상화된 운영 체제가 CPU에 네이티브로 컴파일된 상태로 게스트 운영 체제를 실행하는 방식입니다. 예를 들면 VMware가 네이티브 WinXP 호스트 운영 체제 위에서 실행되는 여러 개의 WinXP 게스트 운영 체제와 애플리케이션을 동시에 실행하는 상황을 상상해 볼 수 있습니다.
가상 머신 관리자(Virtual Machine Manager 또는 VMM)는 가상화 서비스를 제공합니다. 이를 통해 가상화된 환경에서 여러 운영 체제와 애플리케이션을 동시에 실행하고 관리할 수 있습니다. 이를 통해 하나의 물리적인 서버나 호스트 시스템에서 여러 개의 가상 환경을 운영할 수 있으며, 자원의 효율성과 유연성을 높일 수 있습니다.
