운영체제 - (1)

2024. 10. 31. 22:24CS/운영체제

컴퓨터의 하드웨어 자원을 효율적으로 관리하는 운영체제는 자원 관리, 프로세스 관리, 메모리 관리 등의 다양한 역할을 수행합니다. 인터럽트와 시스템 콜을 통해 빠른 입출력 처리를 가능하게 하며, DMA를 활용해 CPU 사용을 최적화합니다.zKzBIwT.png

 

 

 

 

 

 

 

운영체제는 컴퓨터 하드웨어를 관리하는 소프트웨어입니다.

응용 프로그램을 위한 기반을 제공하고, 시스템 자원을 관리, 스케줄링하며 효율적으로 사용할 수 있도록 합니다.

컴퓨터 관점에서 운영체제는 하드웨어와 가장 밀접하게 연관되어 자원 할당자의 역할을 수행합니다.

일반적으로 CPU는 코어당 1개의 물리(하드웨어) 스레드를 지원합니다. 이는 프로세서(코어)와 직결되므로 매우 빠르고 귀중한 자원입니다.

 

현대의 하드웨어 아키텍처는, 이렇게 귀중한 자원을 효율적으로 사용하기 위해

`Symmetric Multiprocessing` (이하 SMP) 방식을 활용합니다.

Symmetric Multiprocessing (SMP)

"SMP ( Symmetric Multiprocessing ) 는 둘 이상의 동일한 프로세서가 단일 공유 주 메모리 에 연결되고 모든 I / O 장치에 대한 전체 액세스 권한을 가지며 처리하는 단일 운영 체제 인스턴스에 의해 제어되는 다중 프로세서 컴퓨터 하드웨어 및 소프트웨어 아키텍처 를 포함합니다 모든 프로세서는 동등하게 특별한 목적을 위해 아무 것도 예약하지 않습니다. 오늘날 대부분의 멀티 프로세서 시스템은 SMP 아키텍처를 사용합니다. 의 경우 멀티 코어 프로세서 의 SMP 아키텍처는 별도의 프로세서로 처리, 코어에 적용됩니다." - 위키피디아


SMP 기술 덕분에, 귀중한 자원인 하드웨어 스레드를 효율적으로 활용하고, 병렬 처리 효율을 높일 수 있습니다.

운영체제는 각 프로세서를 독립적으로 인식하고 작업을 고르게 분배하여 모든 프로세서를 최대한 활용합니다.

 

 

CPU를 제외한 다른 하드웨어 자원 또한 관리됩니다.
또한 이러한 자원은 '시스템 버스'를 통해, 메모리와 소통하게 됩니다.

운영체제의 역할

그렇다면 운영체제는 하드웨어 자원만 관리할까요 ?

다음은 운영체제가 담당하는 역할들입니다.

  1. 자원 관리
  2. 프로세스 및 스레드 관리
  3. 메모리 관리
  4. 파일 시스템 관리
  5. 입출력 장치 관리
  6. 보안과 보호

한눈에 봐도, 많은 역할을 담당하고 있습니다. 운영체제를 구성하는 핵심적인 역할은
커널이 수행하고 있습니다.

커널

커널은 운영체제의 핵심을 담당합니다.

컴퓨터에 전원이 공급되면 부트스트랩은 운영체제를 메모리에 적재하고, 커널을 실행합니다.

커널은 운영체제와 함께 로드되어 자원을 관리하게 됩니다.

 

 

운영체제와 사용자는 시스템 하드웨어 자원을 공유하는 존재입니다.

만약 불완전한 사용자의 어플리케이션이 악의적으로 하드웨어 자원을 사용하게 될 경우, 보안적인 문제에 빠질 수 있습니다.

따라서 Mode bit을 통해 사용자와 시스템의 권한을 분리하고 연산을 처리합니다.

 

Mode bit == 0 -> 커널 모드
Mode bit == 1 -> 사용자 모드 로 구현됩니다.

 

전반적인 운영체제의 구성 요소를 알아보았습니다.

 

 


인터럽트

앞선 설명에서 운영체제는 커널을 통해 시스템 자원을 관리하고 CPU 스케줄링을 통해 자원을 효율적으로 활용할 수 있음을 알게 되었습니다.

 

저는 여기서 한가지 의문이 생겼는데요, "키보드, 마우스 입력은 즉각적으로 반응하는데 이런 어떻게 이뤄지는거지?" 입니다.


입출력 장치는 보통의 상황에서도 언제나 마음대로 움직일 수 있습니다.

현대 운영체제에서는, 이를 인터럽트를 사용하여 달성합니다.

 

 

각 장치는 입출력을 수행하기 위해 장치 드라이버가 장치 컨트롤러의 적절한 레지스터에 값을 적재합니다.
그다음 컨트롤러는 레지스터 내용을 검사하여 수행할 작업을 결정합니다.

 

이후 장치에서 로컬 버퍼로 전송을 시작하고, 완료되었을 때, 데이터 또는 데이터에 대한 포인터를 반환하며 운영체제의 일부분에 제어권을 넘기게 됩니다.

 

이렇게, 작업을 완료했다는 사실을 인터럽트를 통해 처리하게 됩니다.

하드웨어는 어느 순간에도 시스템 버스를 통해 CPU에 신호를 보내고, 인터럽트를 발생시킬 수 있습니다.

 

CPU가 인터럽트 될 경우, CPU는 하는 일을 즉시 중단하고 지정된 인터럽트를 탐색합니다. 행동(코드)이 명세 된 테이블을

인터럽트 벡터 라고 합니다. 인터럽트 벡터 테이블은 요청과 고유의 유일한 장치 번호와 매핑이 되어 특정한 명령어가 실행됩니다.

 

인터럽트 벡터를 통해 매핑된 명령의 주소를 찾았을 경우, 해당 인터럽트를 실행하게 됩니다. 이를 인터럽트 서비스 루틴(ISR)라고 합니다.

특별한 서비스 루틴 ( 파일 입출력 )등이 완료된다면 당연하게도 다시 실행하던 장소로 돌아와야 합니다.
서비스 루틴이 완료된 이후 CPU는 인터럽트 되었던 연산을 재개합니다.

 

순서도는 다음과 같습니다.

기본적인 컨셉은 이와 같지만, 현대의 최신 운영체제에서는 더욱 정교한 인터럽트 처리 기능이 필요합니다.

  1. 중요 처리 중 인터럽트 처리를 연기할 수 있어야 함
  2. 장치의 적절한 핸들러로 효율적으게 디스패치 할 수 있어야 함
  3. 우선순위가 높은 인터럽트와 낮은 인터럽트를 구분하고, 적절한 긴급도로 대응할 수 있어야 함.
  4. 인터럽트 체인을 사용하여 이러한 문제를 일반적으로 해결합니다.

 

위와 같이, 벡터 테이블에 우선순위별로 번호를 지정하여 모든 인터럽트를 마스킹 하지 않아도 CPU는 우선순위가 낮은 인터럽트를 연기할 수 있도록 합니다.

 


시스템 콜

시스템 호출 또는 시스템 콜(system call), 간단히 시스콜(syscall)은 운영 체제커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 보통 C나 C++과 같은 고급 언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없기 때문에 고급 API를 통해 시스템 호출에 접근하게 하는 방법이다.

즉, 커널이 제공하는 서비스를 사용자의 애플리케이션이 이용하기 위해, 커널에서 실행을 대신 요청하는 인터페이스입니다.

시스템 콜을 사용함으로써, 사용자는 직접적으로 커널 수준의 명령어를 실행하지 않고 커널에 역할을 위임할 수 있습니다.

 

다음은 시스템 콜을 활용한 그림입니다.

  1. 사용자 프로세스는 시스템 콜을 사용하여 커널에게 명령 실행을 위임합니다.
  2. 시스템 콜 내부의 인터럽트가 작동하며 커널모드 (mode bit = 0)로 전환됩니다.
  3. 권한이 상승된 이후, 시스템 콜을 처리합니다.
  4. 다시 유저 모드 (mode bit = 1)로 복귀합니다.

인터럽트와 시스템 콜에 대해서 알아보았습니다. 저는 이 부분을 이해하는게 굉장히 힘들었습니다.
얼핏 보면 같은 개념같아 보이는 경향이 있습니다.

 


헷갈리기 쉬운 Interrupt & System call

작업의 범위를 통해서 구분할 수 있을 것 같습니다. 인터럽트는 하드웨어나 시스템 이벤트와 밀접하게 연관이 있으며, 반면 시스템 콜은 사용자 애플리케이션이 커널 기능을 요청할 때 사용됩니다.

 

인터럽트가 발생하면 CPU는 현재 진행 중인 작업을 중단하고 인터럽트 벡터 테이블을 참조하여 적절한 인터럽트 서비스 루틴(ISR)을 실행합니다. ISR은 인터럽트의 종류에 따라 필요한 작업을 수행합니다.

 

반면, 시스템 콜은 사용자 프로그램이 커널의 자원이나 기능을 필요로 할 때 발생합니다. 이때 사용자 프로그램이 직접 커널 모드로 전환하지 않고, 시스템 콜을 통해 커널이 필요한 작업을 대신 수행하도록 요청합니다. 이 과정에서 소프트웨어 인터럽트가 발생하여 CPU가 커널 모드로 전환되고, 작업이 완료되면 다시 사용자 모드로 돌아갑니다.

 

범주로 보자면 시스템 콜이 커널 모드 전환을 위해 소프트웨어 인터럽트를 사용하므로, 시스템 콜 내부에 인터럽트 메커니즘이 포함된다고 할 수 있습니다.

 


DMA

앞서 확인했던 것과 같이, 예외, 파일 입출력 완료, 에러, 기타 이벤트가 발생하면 인터럽트를 통해 CPU에 해당 상황이 전달됩니다. 이러한 방식은 입출력(I/O) 장치와 CPU 간의 효율적인 작업 전달을 가능하게 합니다.

 

위 방식에도 문제가 존재합니다. 현대 컴퓨터는 사용자와 상호 작용하며 프로그램을 처리합니다. 즉, 사람은 주로 I/O 장치와 작업을 통해 컴퓨터와 소통하게 됩니다. I/O 장치의 입출력이 발생하면 인터럽트를 발생시키게 되는데, 이는 사용자가 UI와 상호작용하는 단계에서는 큰 문제가 되지 않습니다.

 

하지만 크기가 큰 파일을 전송하는 상황이라면 이야기가 달라집니다. 파일을 전송하는 경우 1 바이트가 전송될 때 마다 I/O 장치는 인터럽트를 발생시킬 것입니다.

 

이는 인터럽트로 검증이나 추가적인 절차가 필요하지 않지만, 불필요하게 인터럽트가 발생하는 상황입니다.
운영체제는 이러한 부분에서 성능을 보완하기 위해 Direct Memory Access(DMA)를 사용합니다.

 

DMA를 사용하여 장치 컨트롤러는 바이트 단위로 인터럽트를 발생시키지 않고, 블록 단위로 데이터를 전송하고 인터럽트를 발생시킵니다. 위 방식을 사용하여 장치 컨트롤러가 데이터를 이동하는 도중에도 CPU의 사용을 최소화 하고 다른 작업을 수행할 수 있게 됩니다.

'CS > 운영체제' 카테고리의 다른 글

운영체제 - (2)  (0) 2024.11.07
Blocking / Non-Blocking, Synchronous / Asynchronous  (0) 2024.01.20