운영체제

운영체제란?

blackbearwow 2024. 8. 29. 16:19

운영체제란 컴퓨터 하드웨어와 소프트웨어 자원을 관리하고 컴퓨터 프로그램의 일반적인 서비스를 제공하는 시스템 소프트웨어이다. input & output 또는 메모리 할당같은 하드웨어 기능을 위해서 운영체제는 프로그램과 하드웨어 사이의 중재자 역할을 한다.

운영체제를 정의하는것은 어렵지만, "유저와 앱을 위해서 컴퓨터 자원을 관리하는 소프트웨어 계층이다" 라고 불려왔다.

 

운영체제가 충족시켜야할 세가지 메인 목적이 있다.

- 다른 앱들 사이에서 자원을 할당한다. CPU시간과 memory공간을 각 앱에 제공하는것. 

- 프로그래머들이 무언가를 만들기 쉽게 하드웨어 디테일에 접근하는 디테일의 추상화 인터페이스를 제공한다.

- 네트워크와 디스크 디바이스에 접근하기위한 인터페이스같은 흔한 서비스를 제공한다.

 

1. 운영체제의 타입 (Typed of operating systems)

1.1. 멀티컴퓨터 운영체제 (Multicomputer operating systems)

멀티컴퓨터는 자기만의 메모리를 소유한 여러 CPU들을 가지고있다. 그것들은 필요한 기계의 크기 때문에 클라우드 컴퓨팅에서 보편적이다. 각 노드(processor + memory)들은 네트워크로 연결되어 있다.

1.2. 분산 시스템 (Distributed systems)

분명한 네트워크된 컴퓨터의 그룹이다 - 각각 그들만의 운영체제와 파일 시스템이 있다. 멀티컴퓨터와 다르게, 그들은 세계 어디에든 흩어져있을 수 있다. 일관성을 향상시키기 위해 운영체제와 앱 사이의 추가적인 소프트웨어 계층인 middleware가 종종 사용된다. 이 기능이 운영체제와 비슷하긴 하지만, 진짜 운영체제는 아니다.

1.3. 임베디드 (Embedded)

임베디드 운영체제는 임베디드 컴퓨터에서 사용하기위해 디자인되었다. 그것들이 iot객체이든 네트워크에 연결하지 않던 말이다. 임베디드 시스템은 많은 가정 가전제품을 포함한다. 특징적인 요인은, 그것들은 유저가 설치한 소프트웨어를 로드하지 않는다는 것이다. 따라서 그들은 다른 앱들 사이에 보호가 필요하지 않고 간단한 디자인을 가능하게 한다. 

1.4. 실시간 (Real-time)

실시간 운영체제란 특정 시점까지 또는 특정 시점안에 이벤트나 데이터가 처리되는 것을 보장하는 운영체제이다. 

RTOS는 멀티태스킹 또는 멀티프로그래밍 환경에서 스케줄러, 데이터 버퍼, 고정 작업 우선순위로 시스템 자원의 공유를 관리하는 Unix같은 시분할 운영체제와는 구별된다. 처리 시간 요구사항은 단순히 최소값으로 유지하는 것이 아니라 완전히 이해하고 묶여야 한다. 모든 과정이 정의된 제한 안에 일어나야 한다. 실시간 운영체제 시스템은 이벤트 구동 방식이고 선점형이다. os가 관련있는 경쟁하는 작업을 모니터하고, 작업 우선도에 변화를 줄 수 있다는 의미이다. 이벤트 구동 시스템은 그들의 우선순위를 바탕으로 작업들간의 전환이 이루어지는 반면, 시분할 시스템은 시계 인터럽트를 바탕으로 작업 전환이 이루어진다. 

1.5. 가상 머신 (Virtual machine)

가상머신은 또다른 운영체제를 앱으로서 실행하는 운영체제이다. 가상머신은 자신이 앱인지 알지 못하며 자신만의 하드웨어가 있는 것 처럼 동작한다. 가상머신은 일시중지, 저장, 재개가 가능하며 운영체제 연구 개발 디버깅을 위해 유용하게 만들어졌다. 그들은 또한 기본 운영체제가 호환되지 않아도 컴퓨터에서 앱으로 실행할 수 있도록 해 휴대성을 높였다. 

1.6. 라이브러리 (Library)

라이브러리 운영체제는 네트워킹과 같은 일반적인 운영체제가 제공하는 서비스를 라이브러리 형태로 제공하고, 하나의 앱과 환경설정 코드로 unikernel을 구성한다.

운영체제 코드와 앱 코드는 별개의 protection domain에서 실행되지 않고, 운영체제 서비스는 임베디드나 실시간 운영체제와 비슷하게 보통의 문맥 교환 오버헤드 없이 간단한 라이브러리 호출을 통해 접근할 수 있다.

2. 요소 (Components)

운영체제의 요소는 다양한 컴퓨터 기능들이 점착력있는것을 보장하기 위해 디자인되었다. 모든 유저 소프트웨어는 하드웨어에 접근하기 위해 운영체제와 상호작용해야한다.

2.1. 커널 (Kernel)

커널은 앱 소프트웨어를 컴퓨터의 하드웨어에 연결한다.

커널은 다른 앱과 유저 사이에 보호를 제공하는 운영체제의 부분이다. 보호는 에러를 하나의 프로그램에 고립시켜 신뢰성을 향상시키는 열쇠이다. 게다가 악의적인 소프트웨어의 힘을 제한시키고 개인적인 데이터를 보호한다. 또 하나의 프로그램이 컴퓨터의 자원을 독점할 수 없는것을 보장한다. 대부분의 운영체제는 두가지 모드의 실행을 가진다: 유저모드는 소프트웨어가 합법적인 명령을 실행하는지 체크하는 반면에 커널은 제한되지 않은 권한을 가지고 있으며 이러한 검사의 대상이 아니다. 커널은 또한 다른 프로세스들을 위해 메모리를 관리하며 입출력 디바이스 접근을 컨트롤한다.

2.1.1. 프로그램 실행 (Program execution)

운영체제는 앱 프로그램과 컴퓨터 하드웨어 사이에 인터페이스를 제공한다. 앱 프로그램은 운영체제에 프로그램된 규칙과 절차를 따르기만 하면 하드웨어와 상호작용할 수 있다. 운영체제 또한 개발 간소화와 응용 프로그램들의 실행해주는 서비스의 집합이다. 응용 프로그램 실행은 보통 운영체제 커널이 프로세스를 만드는 것을 수반한다, 메모리 공간과 다른 자원을 할당하고 멀티테스킹 시스템에서 프로세스의 우선순위를 설립하고, 프로그램 이진 코드를 메모리에 로드하고, 응용 프로그램의 실행을 개시되게 하고, 유저와 하드웨어 디바이스와 상호작용한다. 그러나 일부 시스템에서는 응용 프로그램이 운영체제가 서브루틴 또는 분리된 쓰레드로서 같은 프로세스 안에서 또다른 응용 프로그램을 실행시키는 것을 요청할 수 있다.

2.1.2. 인터럽트 (Interrupts)

인터럽트는 대부분의 운영체제가 환경에 반응하는 효율적인 방법을 제공한다. 인터럽트는 cpu가 현재 실행중인 프로그램에서 인터럽트 핸들러로 제어 흐름을 바꾸는 것을 야기한다. 인터럽트 서비스 루틴(핸들러)는 cpu에게 문맥 교환을 야기할 수 있다. 어떻게 컴퓨터가 인터럽트를 처리하는지 자세한 부분은 아키텍처마다 서로 다르며, 인터럽트 서비스 루팅니 어떻게 자세히 동작하는지도 운영체제마다 서로 다르게 동작한다. 그러나, 몇몇의 인터럽트 기능은 흔하다. 이키텍처와 운영체제는 반드시:

1) 인터럽트 서비스 루틴에게 제어를 넘겨준다.

2) 현재 실행중인 프로세스 상태를 저장한다.

3) 인터럽트가 서비스된 후 상태를 복원한다. 

2.1.2.1. 소프트웨어 인터럽트 (Software interrupt)

소프트웨어 인터럽트는 이벤트가 발생했다는 프로세스에게 메시지이다. 이벤트가 발생했다는 cpu에게 메시지인 하드웨어 인터럽트와 대조된다. 소프트웨어 인터럽트와 하드웨어 인터럽트는 비슷하다 - 현재 실행시키는 프로세스에서 벗어난다는 변화가 있다. 비슷하게, 하드웨어와 소프트웨어 인터럽트 둘다 인터럽트 서비스 루틴을 실행시킨다. 

소프트웨어 인터럽트는 평범하게 발생하는 이벤트이다. 타임 슬라이스가 발생할 것으로 예상되므로 커널은 문맥 교환을 행해야 한다. 컴퓨터 프로그램은 너무 많은 데이터로 인해 알고리즘이 너무 오래 걸리는 경우 몇초 후에 타이머가 꺼지도록 설정할 수 있다. 

소프트웨어 인터럽트는 기형인 기계 명령같은 에러 상태일 수 있다. 그러나 가장 많은 에러 상태는 0으로 나누기와 무효한 메모리 주소 접근이다. 

유저는 현재 실행중인 프로세스의 행동을 바꾸기 위해 커널에게 메시지를 보낼 수 있다. 예를들어, 명령-라인 환경에서 인터럽트 캐릭터(보통 Ctrl+C)를 누르면 현재 실행중인 프로세스를 종료시킬것이다.

2.1.2.2. 시그널 (Signal)

Unix같은 운영체제에서 소프트웨어 인터럽트를 발생시키기 위해, 또다른 프로세스에게 kill(pid, signum) 시스템 콜이 시그널을 보낼 것이다. pid는 받는 프로세스의 프로세스 식별자이다. signum은 보내질 시그널 넘버이다.

Unix같은 운영체제안에서, 시그널들은 프로세스들에게 비동기 이벤트 발생을 알려준다. 비동기적으로 전달하기 위해 인터럽트가 필요하다. 프로세스가 다른 프로세스와 비동기적으로 통신할 필요가 있는 한가지 이유는, 고전적인 리더/라이터 문제의 변형을 해결한다. writer는 reader의 입력 스트림에게 전송하기 위해 셸의 아웃풋 파이프를 받는다. 명령-라인 문법은 alpha | bravo이다. alpha는 계산이 준비될 때 파이프에게 쓴다, 그리고 wait queue에 들어가 잔다. 그러면 bravo는 ready queue로 이동되고 그것의 입력 스트림으로부터 읽을 것이다. 커널은 파이핑을 조정하기 위해 소프트웨어 인터럽트를 발생시킬 것이다.

시그널들은 7 카테고리로 분류된다.

1) 프로세스가 일반적으로 끝났을 때

2) 프로세스에 에러 예외가 발생했을 때

3) 프로세스에 시스템 자원이 부족할 때

4) 프로세스가 불법적인 명령을 실행할 때

5) 프로세스가 알람 이벤트를 설정했을 때

6) 프로세스가 키보드로 인해 중단되었을 때

7) 프로세스가 디버깅에 대한 추적 경고가 있을 때

2.1.2.3. 하드웨어 인터럽트 (Hardware interrupt)

입출력 디바이스는 cpu보다 느리다. 그러므로, cpu가 각 입출력이 끝나는것을 기다린다면 컴퓨터는 느려질 것이다. 대신에 컴퓨터는 입출력 완료 인터럽트를 시행한다.

일부 컴퓨터는 각 문자 또는 단어마다 인터럽트가 필요하므로 상당히 많은 cpu시간이 소요된다. 직접메모리접근(DMA)는 디바이스가 cpu를 건너뛰어 직접 메인 메모리에 접근할 수 있게하는 아키텍처 특징이다.

2.1.3. 입출력 (Input/output)

2.1.3.1. 인터럽트 주도의 입출력 (Interrupt-driven I/O)

 

컴퓨터 유저가 키보드로 키를 입력했을 때, 보통 문자는 즉시 화면에 나타난다. 또한, 유저가 마우스를 움직일 때, 커서는 화면을 즉시 가로질러 움직인다. 각 키누름과 마우스 움직임은 입터럽트 주도의 입출력이라는 인터럽트를 발생시킨다. 입터럽트 주도의 입출력은 프로세스가 모든 문자 또는 단어를 전송하는 인터럽트를 야기할 때 발생한다. 

2.1.3.2. 직접 메모리 접근 (Direct memory access)

hdd, ssd, 자기테이프 드라이브 같은 장치는 모든 바이트나 단어에 대해 CPU를 중단시키기 충분히 높은 비율로 데이터를 전송할 수 있다. 그리고 디바이스와 메모리 사이에 바이트 또는 단어를 CPU전송을 한다면, 너무 많은 CPU시간이 필요하다. 대신에 디바이스와 메모리 사이에 CPU와 관계없이 채널 또는 직접메모리접근 컨트롤러 하드웨어를 통해 데이터를 전송한다; 인터럽트는 모든 데이터가 전송되었을 때만 전달된다.

만약 컴퓨터 프로그램이 블록 입출력 쓰기 작업을 위해 시스템 콜을 실행했다면, 시스템 콜은 다음 명령을 따라 실행될 것이다:

- PCB에 CPU의 레지스터 내용을 담는다.

- 장치-상태 테이블에 항목 생성. 운영체제는 어떤 프로세스가 어떤 장치를 기다리는중인지 테이블로 관리한다. 테이블의 한 필드는 PCB의 메모리 주소이다.

- 메모리 버퍼안에 장치로 보내질 문자들을 놓는다.

- 메모리 버퍼의 메모리 주소를 미리 지정된 장치 레지스터로 설정한다.

- 버퍼 사이즈를 또다른 미리 결정된 레지스터로 설정한다.

- 쓰기 시작하기 위해 기계 명령을 실행한다.

- ready queue에 있는 다음 프로세스를 위해 문맥 교환을 한다.

쓰기가 진행중일 때, 운영체제는 정상적으로 다른 프로세스들로 문맥 교환이 일어날 것이다. 디바이스 쓰기가 끝났을 때, 장치는 인터럽트 요청을 발생시켜 현재 실행중인 프로세스를 중단시킬 것이다. 장치는 데이터 버스에 정수를 놓을것이다. 인터럽트 요청을 수락하면, 운영체제는 다음과 같이 될것이다:

- 콜 스택에 상태 레지스터에 따라 프로그램 카운터 내용을 넣는다.

- 콜 스택에 다른 레지스터의 내용을 넣는다.

- 데이터 버스에서 정수를 읽는다. 그 정수는 인터럽트 벡터 테이블의 오프셋이다. 그 벡터 테이블의 명령은 다음을 할 것이다:

  - 장치-상태 테이블에 접근한다

  - PCB를 추출한다

  - 쓰기 작업중인 프로세스로 문맥 교환을 행한다.

쓰기 작업중인 프로세스의 타임 슬라이스가 만료되었을 때, 운영체제는 다음을 할 것이다:

- 상태 레지스터와 프로그램 카운터가 아닌 레지스터를 콜 스택에서 pop한다.

- 상태 레지스터를 콜 스택에서 pop한다.

- 다음 명령 주소를 콜 스택에서 pop하고, 프로그램 카운터에 되돌려놓는다.

프로그램 카운터가 리셋되면, 중단되었던 프로세스는 그거의 타임 슬라이스를 재개할 것이다.

2.1.4. 메모리 관리 (Memory management)

멀티프로그래밍 운영체제 커널은 현재 프로그램에 의해 사용되고있는 모든 시스템 메모리의 관리를 책임져야 한다. 이것은 프로그램이 또다른 프로그램이 사용하고 있는 메모리와 간섭받지 않는것을 보장한다. 프로그램 시간 분배 때문에, 각 프로그램은 독립적인 메모리 접근을 가져야 한다.

 

많은 초기 운영체제에서 쓰인 협동적인 메모리 관리는 모든 프로그램이 커널의 메모리 관리를 자발적으로 사용하고, 그들에게 할당된 메모리를 넘지 않는 것으로 추정했다. 이러한 메모리 관리 시스템은 지금은 거의 볼 수 없다, 프로그램들이 할당된 메모리를 넘는것을 야기할 수 있는 버그들을 프로그램이 종종 가졌기 때문에. 프로그램이 실패하면, 하나 이상의 다른 프로그램이 사용하는 메모리에 영향을 끼치거나 덮어쓰기를 야기할 수 있다. 악의적인 프로그램 또는 바이러스는 또다른 프로그램의 메모리를 바꾸거나 운영체제 자체의 작업에 영향을 끼칠 수 있다. 협동적인 메모리 관리는 하나의 못된짓을 하는 프로그램으로 시스템을 박살낼 수 있다.

 

메모리 보호는 커널이 컴퓨터 메모리에 프로세스의 접근을 제한시킬 수 있게한다. 메모리 세그멘테이션과 페이징을 포함해 다양한 메모리 보호 방법이 존재한다. 모든 방법들은 일부 컴퓨터에는 존재하지 않는 하드웨어 레벨의 지원을 필요로 한다. 

 

세그멘테이션과 페이징 둘다 특정한 보호 모드의 레지스터가 CPU에게 어떤 메모리 주소가 실행중인 프로그램이 접근하는 것을 허용하는지 명시한다. 다른 주조에 접근하는 시도는 CPU가 supervisor모드에 재진입해 커널을 담당하도록 하는 인터럽트를 발생시킨다. 이를 세그멘테이션 위반이라고 하며, 작업에 의미있는 결과를 부여하기 어렵고, 보통 잘못된 동작을 하는 프로그램의 징후이기 때문에 커널은 공격적인 프로그램을 종료하는것에 의존하며 에러를 보고한다.

 

ME를 통한 Windows 3.1버전은 몇 단계의 메모리 보호를 가지고있지만, 프로그램은 그것을 사용할 필요성을 쉽게 피할 수 있었다. 세그멘테이션 위반이 발생했다는것을 나타내는 일반적인 보호 잘못이 제공될 수 있다. 그러나 시스템은 종종 박살났다.

2.1.5. 가상 메모리 (Virtual memory)

가상 메모리 주소를 사용한다는 것은 커널이 주어진 시간에 각 프로그램 마다 어떤 메모리를 사용할지 고를 수 있다는 것을 의미하고, 운영체제가 여러 작업에 대해 같은 메모리 위치를 사용도록 허용한다. 

 

프로그램이 그것에게 할당되었지만 접근할 수 없는 메모리에 접근을 시도할경우, 커널은 중단된다. 이러한 종류의 인터럽트는 보통 page fault이다.

 

커널이 page fault를 감지하면 그것은 일반적으로 발동시킨 프로그램의 가상 메모리 범위를 조정하여, 메모리 요청에 접근하는것을 승인한다. 이는 특정 애플리케이션의 메모리가 저장된 위치 또는 실제 할당되었는지 여부에 대한 커널의 재량권을 부여한다. 

 

현대의 운영체제에서 접근 빈도가 낮은 메모리는 디스크나 다른 미디어에 임시로 저장해서 다른 프로그램에서 사용할 수 있는 공간으로 만들 수 있다. 이것은 여러 프로그램에 사용되는 메모리 공간인 swapping이라 불리고, 그 메모리 공간에 있는 것은 요구에 의해서 스왑되거나 교환될 수 있다.

 

가상 메모리는 프로그래머나 유저에게 RAM이 실제 있는 것보다 많아보이게 한다.

2.2. 동시 실행 (Concurrency)

동시 실행은 운영체제가 동시에 여러 작업을 수행할 수 있는 능력을 말한다. 현대의 모든 운영체제는 가상적으로 동시 실행을 지원한다.

 

쓰레드는 프로세스의 작업을 여러 부분으로 나누어 동시에 실행하는 것을 가능하게 한다. 쓰레드의 숫자는 프로세서의 숫자에 제한받지 않는다. 프로세서보다 스레드의 숫자가 많다면, 운영체제의 커널은 쓰레드를 스케줄하고 멈추고 재개하고 각 쓰레드를 언제 실행할지와 얼마나 많은 CPU시간을 받을지 컨트롤한다. 문맥 교환동안 실행중인 쓰레드는 중단되고, 그것의 상태는 쓰레드 컨트롤 블록과 스택에 저장된다, 그리고 새로운 쓰레드가 로드된다. 역사적으로, 많은 시스템에서 쓰레드는 그것이 컨트롤을 포기할 때까지 실행될 수 있다(협동하는 멀티태스킹). 이 모델은 하나의 쓰레드가 프로세서를 독점할 수 있으므로 많은 운영체제는 현재 쓰레드를 인터럽트 시킬 수 있다(선점형 멀티태스킹).

 

쓰레드는 그들만의 쓰레드ID, 프로그램 카운터, 레지스터 집합, 스택을 가지지만 코드, heap데이터, 다른 자원은 같은 프로세스의 다른 쓰레드에게 공유한다. 그러므로, 새로 프로세스를 만드는 것보다 쓰레드를 만드는것이 오버헤드가 덜 든다. 하나의 CPU시스템에서는 동시 실행은 프로세스들의 스위칭이다. 많은 컴퓨터는 여러 CPU들을 가지고 있다. 다른 CPU에 여러 쓰레드를 평행하게 실행시키는것은 프로그램 속도를 증가시킬 수 있고, 그것이 얼마나 동시실행할 수 있는지에 의존한다. 

2.3. 파일 시스템 (File system)

21세기 컴퓨터에서 사용된는 영구적인 저장장치는, 휘발성의 DRAM와 다르게, 파워 실패또는 박살 뒤에도 여전히 접근 가능하다. 영구적인 저장장치는 바이트단위로 더 싸지만, 접근 읽기 쓰기가 더 오래걸린다. 두 중요 기술은 자성 디스크로 구성되어있는 하드 드라이브와 플래시 메모리(전기 회로에 데이터를 저장하는 ssd)이다. 후자가 더 비싸지만 빠르고 내구성 있다.

 

파일 시스템은 운영체제가 영구 저장장치에 접근하는것을 간단히 한 추상화 개념이다. 그것은 사람이 읽을 수 있는 파일 이름과 메타데이터를 제공하고 접근의 분할(?)을 통해 성능을 향상시키고, 여러 쓰레드가 같은 메모리 섹션에 접근에 접근하는 것을 막고, 부패되었는지 알아내기 위해 체크섬을 포함한다. 파일 시스템은 사람이 읽을 수 있는 파일 이름 및 기타 디렉토리를 나열하는 파일 및 디렉토리로 구성됩니다. 절대 파일 경로는 root 디렉토리로부터 시작되고 하위디렉토리는 구두점으로 나누어진다, 상대 경로는 디렉토리로부터의 파일 위치이다.

 

시스템 콜은 응용 프로그램이 파일을 만들고 삭제하고 열고 닫고 링크하고 읽고 쓰게할 수 있다. 이런 모든 작업들은 응용 프로그램을 대신하여 운영체제가 수행한다. 지연시간을 줄이기 위한 운영체제의 노력은 캐시에 최근 요청된 메모리의 블록을 저장하고, 응용 프로그램이 요청하지 않았지만 다음에 필요할 수 있는 데이터를 프리페칭하는 것을 포함한다. 특정한 입출력 장치의 장치 드라이버는 운영체제가 다른 하드웨어일지라도 변경 없이 일할 수 있게 해준다. 

 

또다른 파일 시스템의 요소는 파일 이름과 메타데이터를 콘텐트가 저장된 데이터 블록으로 매핑하는 사전이다. 대부분의 파일 시스템은 디렉토리를 사용해 파일 이름을 파일 숫자로 바꾼다. 블록 넘버를 찾기 위해 운영체제는 인덱스(종종 tree로 구현되는)를 사용한다. 따로, 빈 블록을 추적하는 빈 공간 지도가 있다, 보통 비트맵으로 구현되는. 빈 블록은 새로운 파일을 저장하는데 사용될 수 있지만, 많은 운영체제는 성능을 극대화시키기 위해 같은 디렉토리안에 있는 파일들을 그룹화를 시도하거나, 조각화를 줄이기 위해 파일을 주기적으로 재조직한다. 

 

컴퓨터 박살이나 하드웨어 실패를 직면했을 때 데이터 신뢰성을 유지하는것은 또다른 문제이다. 파일 작성 프로토콜을 쓰기 도중 어느 시점에서 충돌이 일어날 경우 영구 저장소에 일부분 쓰기, 일관성 없는 상태를 막기 위해 원자적 작업으로 디자인되었다. 데이터 오염은 중복 스토리지로 해결, 체크썸으로 데이커가 오렴되었는지 감지한다. 여러 계층의 체크섬과 파일 백업으로 시스템은 여러 하드웨어 실패로부터 회복될 수 있다. 백그라운드 프로세스들은 종종 데이터 오염을 감지하고 회복시키는데 사용된다.

2.4. 보안 (Security)

보안은 유저를 같은 컴퓨터의 다른 유저로부터 뿐만 아니라 네트워크에서 원격 접근을 하는 것으로부터 보호를 의미한다. 운영체제의 보안은 CIA 3중전을 달성하는데 달려있다: 비밀(인정받지 못한 유저의 데이터 접근 불가), 온전함(인정받지 못한 유저는 데이터를 변경할 수 없음), 가용성(서비스 거부 공격에도 불고하고 허락받은 유저에게 시스템이 가능하게 남아있도록 보장하는것). 다른 컴퓨터 시스템과 마찬가지로, 운영체제의 경우 시스템 커널 프로세스들 가상머신과 같은 보안 도메인을 격리하는것이 보안 달성의 핵심입니다. 보안을 증가시키는 다른 방법은 공격 표면을 최소화하고, 기본적으로 자원의 접근을 막고, 모든 요청에 허락을 체크하고, 최소 권한 원칙, 특권 분리, 공유 데이터 줄이기가 있다.

 

어떤 운영체제 디자인은 다른것보다 더 안전하다. 커널과 응용 프로그램 사이에 고립이 없는것은 가장 안전하지 않은 반면에, 단일 커널로 된 대부분의 일반-목적 운영체제는 만약 커널 일부분이 제대로 작동되지 않으면 여전히 취약하다. 더 안전한 디자인은 커널의 특권을 많은 보안 도메인으로 나누고 단일 커널 침해의 결과를 줄이는 마이크로커널을 특징으로 삼는다. 유니커널은 커널을 최소화시키고 응용 프로그램에 다른 운영체제의 기능을 의해 분리해 보안을 증가시키는 또다른 접근이다. 

 

대부분의 운영체제는 취약점 가능성이 생길 수 있는 C와 C++로 쓰여져있다. 그것들로부터 지키는 시도에도 불구하고, 취약점은 ㅂ퍼 경계 체크의 부족으로 인해 오버플로 공격을 야기할 수 있다. CPU최적화같은 것으로 인한 하드웨어 취약점 또한 운영체제를 위태롭게 사용될 수 있다. 운영체제 프로그래머들이 고의로 취약점을 심는 백도어같은 알려진 예도 있다.

 

운영체제의 보안은 그들의 복잡성의 증가와 피할 수 없는 버그의 결과로 방해된다. 운영체제의 정규 검사는 실현 가능하지 않기 때문에, 개발자들은 운영체제 경화를 통해 취약점을 줄인다. 예를 들어 주소 공간 랜덤화, 컨트롤 흐름 진실성, 엑세스 제한 등등 다른 기술들. 오픈 소스 운영체제에 누가 코드에 참여하는지는 제한이 없다; 이러한 운영체제는 투명한 변화 이력과 분산된 관리 구조가 있다. 오픈소스 개발자들은 악의적인 코드를 지우기 위해 코드 리뷰와 타입 체크를 사용하고, 보안 취약점을 찾고 없애기 위해 협력적으로 일하길 분투하고 있다.

2.5. 유저 인터페이스 (User interface)

유저 인터페이스는 컴퓨터와 사람이 상호작용하는것을 돕는것에 필수적이다. 컴퓨터에 가장 일반적인 두가지 유저 인터페이스 타입은

- CLI, 컴퓨터 명령이 선마다 타입되는 곳

- GUI, 시각적 환경을 사용하는, 가장 일반적인 창 아이콘 메뉴 포인터 요소의 조합이다.

스마트폰과 타블렛을 포함한 개인 컴퓨터를 위해, 그리고 워크스테이션을 위해, 유저 입력은 보통 키보드 마우스 트랙패드나 터치패드의 조합으로, 모두 전문적인 프로그램으로 운영체제와 연결되어있다. 소프트웨어 개발자나 코더가 아닌 개인 컴퓨터 유저는 종종 입출력에 GUI를 선호한다; GIU는 대부분 개인 컴퓨터에서 지원한다. GUI를 지원하는 소프트웨어는 CLI의 입출력보다 더 복잡하다. 평문 텍스트 출력은 종종 프로그래머들에게 선호되며, 지원되기 쉽다.

3. 유명한 운영 체제 (Popular operating systems)

2023년 9월 개인 컴퓨터 시장에서, Windows가 약 68%, macOS가 20% Linux가 7%이었다.

모바일 부분에서는 안드로이드가 68.92%, iOS와 iPadOS가 30.42%, 다른 os가 0.66%이었다.

3.1. 리눅스 (Linux)

리눅스는 GNU 일반 공공 라이센스(GPL)아래에 분산된 무료 소프트웨어이다, 이것의 파생상품은 모두 법적으로 소스코드를 공개해야한다. 리눅스는 프로그래머들이 그들을 위해 사용하기 위해 디자인되었으므로 간단함과 일관성과 거의 무제한으로 조합할 수 있는 소수의 기본 요소와 중복을 방지하는것이 강조되었다.

 

이것은 마이크로커널을 사용하지 않는 다른 UNIX시스템과 비슷하게 디자인되었다. 이것은 C로 작성되었고 UNIX System V 문법을 사용했으며, 또한 BSD 문법도 지원한다. 리눅스는 기본적인 UNIX 네트워크 요소 뿐만 아니라 풀 UNIX툴 세트도 지원하는 반면 여러 유저도 지원하고 선점형 멀티태스킹도 고용했다. 처음의 미니멀리스트 디자인에서, 리눅스는 16메가바이트 램 아래에서 작동하지만 큰 멀티프로세서 시스템에서도 사용한다. UNIX시스템과 비슷하게, 리눅스 배포판들은 커널, 시스템 라이브러라, 시스템 유틸리티로 구성되어있다. 유닉스는 데스크타에서 GUI를 가지고있고, 폴더와 파일 아이콘 뿐만 아니라 CLI를 통해 운영체제에 접근할 수 있는 옵션도 있다.

 

안드로이드는 거의 리눅스 기반 부분 오픈소스 운영체제이고, 가장 넓게 유저에 의해 사용되는 운영체제가 되었다, 스마트폰의 유명해짐에 따라, 크기의 작음, "스마트워치, 차동차 대시보드, 비행기 좌석, 의료 장치, 홈 기기"같은 GUI가 필요한 임베디드 시스템으로 인해. 리눅스와 달리, 안드로이드의 많은 부분은 Java로 쓰였고, 객체 지향 디자인을 사용한다.

3.2. 마이크로소프트 윈도우 (Microsoft Windows)

윈도우는 데스크탑 컴퓨터, 랩탑, 테블릿, 폰, 워크스테이션, 기업 서버, Xbox콘솔에 넓게 사용되는 등록 상표가 붙은 운영체제이다. 운영체제는 "보안, 신뢰성, 호환성, 높은 퍼포먼스, 확장성, 휴대성, 국제적 지원"에 디자인되었다 - 나중에는, 에너지 효율과 역동적인 장치 또한 우선순위가 되었다.

 

윈도우 실행파일은 커널 모드 객체를 통해 프로세스, 쓰레드, 섹션과 같은 중요한 데이터 구조에 대해 작동한다. 운영체제는 많은 응용 프로그램을 위해 입출력 속도를 높이는 가상 메모리의 요구 페이징을 지원한다. 입출력 장치 드라이버는 윈도우 드라이버 모델을 사용한다. NTFS파일 시스템은 마스터 테이블과 각 파일을 나타내는 레코드와 메타데이타를 가진다. 스케줄링은 선점형 멀티태스킹을 포함한다. 윈도우는 많은 보안 요소를 가지고있다; 특히 중요한 부분은 접근-통제 리스트와 온전함 레벨의 사용이다. 각 프로세스는 인증 토큰을 가지며 각 객체는 보안 기술어를 가진다. 다음 발표는 더 많은 보안 요소가 추가되었다.

 


참고: https://en.wikipedia.org/wiki/Operating_system

https://www.geeksforgeeks.org/difference-between-multiprocessor-and-multicomputer/

https://en.wikipedia.org/wiki/Real-time_operating_system

-