개발자는 기록이 답이다

운영체제 1주차 스터디 운영체제 개요 & 컴퓨터 시스템 동작원리 본문

CS/운영체제

운영체제 1주차 스터디 운영체제 개요 & 컴퓨터 시스템 동작원리

slow-walker 2024. 8. 16. 01:00

📌 운영체제는 무엇이고 어떤 역할을 수행하는지 설명해주세요.

 

모든 프로그램은 실행을 위해 자원을 필요로 하는데, 운영체제는 운영체제는 컴퓨터 하드웨어와 소프트웨어 자원을 관리하며, 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 소프트웨어입니다. 이 자원에는 CPU, 메모리, 저장 장치, 네트워크 패킷, 파일 등이 포함됩니다.

혼공컴운을 참고하여 필자가 그린 이미지

 

실행중인 응용 프로그램은 메모리에 적재되는데, 운영체제도 실행중인 응용프로그램이기 때문에 메모리에 적재되어 실행됩니다.

하지만 운영체제는 컴퓨터를 동작시키는 너무 중요한 프로그램이기 때문에, 메모리에 따로 적재되는데 커널 영역이라는 곳에 적재됩니다.

즉, 메모리의 사용자 영역에서 실행 중인 여러 응용 프로그램들이 적재되어 있다면, 그 위에 커널 영역에 운영체제가 적재되는 형태로 배치됩니다.

혼공컴운을 참고하여 필자가 그린 이미지

 

1. 메모리 관리

 

운영체제는 메모리 내의 빈 공간을 찾아 실행할 프로그램을 적재합니다. 예를 들어, 게임 프로그램을 새롭게 실행하려고 할 때, 운영체제는 메모리에서 적절한 공간을 찾아 이 프로그램을 적재합니다. 반대로, 더 이상 사용하지 않는 프로그램은 메모리에서 제거하여, 사용 가능한 공간을 확보합니다.

 

2. CPU 관리

 

여러 프로그램이 동시에 실행되는 것처럼 보이지만, 실제로는 CPU가 각 프로그램에 짧은 시간 동안 교대로 자원을 할당해주는 방식으로 처리합니다. 예를 들어, 워드프로세서, 인터넷 브라우저, 메모장을 동시에 실행할 때, CPU는 이 프로그램들을 빠르게 전환하며 실행합니다. 운영체제는 각 프로그램에 할당할 CPU 시간을 조정하고, 실행 순서를 결정하며, 효율적으로 자원을 배분합니다.

 

3. 입출력장치 관리

 

여러 프로그램이 동일한 장치를 동시에 사용하려고 할 때 충돌을 방지하는 역할을 합니다. 예를 들어, 워드 프로세서가 프린터를 사용 중이면, 운영체제는 메모장 등 다른 프로그램이 프린터를 사용하지 못하게 조정하여 자원을 효율적으로 관리합니다. 또한, 보조기억 장치의 데이터를 파일과 디렉토리 구조로 관리하며, 파일 입출력 작업을 처리합니다.

* 폴더 : 윈도우 용어 / 디렉토리 : macOS, 리눅스

 

참고 : 혼자 공부하는 컴퓨터구조와 운영체제

 

📌 시분할 시스템에 대해서 설명해주세요.

시분할 시스템(Time Sharing System) 이란 컴퓨터 시스템의 자원을 프로세스가 동시에 사용할 수 있도록 하기 위한 운영체제의 기술입니다. 이 시스템은 CPU와 같은 자원을 여러 사용자나 작업에 짧은 시간(time slice / quantum) 동안 번갈아 가며 할당하여, 사용자가 마치 시스템을 독점적으로 사용하는 것처럼 느낄 수 있게 합니다.

 

컴퓨터를 대화식으로 사용하려는 시도에서 탄생했으며 멀티태스킹을 가능하게 하는 운영체제의 한 방식이며 라운드 로빈(Round Robin) 방식이라고도 합니다.

 

 

참고 : https://scottxchoo.xyz/cs-os-002/

참고 : https://velog.io/@weweweme/1731-221217 

 

 

📌 다중 프로그래밍 시스템(multi-programming system)에 대해서 설명해주세요.

 

여러가지 작업 중 우선순위를 정해 작업을 결정하는 과정을 CPU 스케줄링이라고 하는데, 그 중 CPU작업과 입출력 작업을 병행하는 방식을 다중 프로그래밍이라고 한다.

 

다중 프로그래밍이 중요한 이유는 비다중 프로그래밍 시스템에서는 입출력을 기다리는 동안 CPU가 유휴 상태가 되어 비효율적이지만, 다중 프로그래밍 시스템에서는 주기억장치에 적재된 여러 개의 프로그램들을 CPU가 항상 수행할 수 있도록 CPU 이용률을 증진시키기 때문이다.

 

참고: wikipedia_다중프로그래밍

 

📌 대화형 시스템(interactive system)에 대해서 설명해주세요.

 

대화형 시스템은 사용자의 입력을 받아 결과를 바로 출력하는 시스템으로, 요즘 사용하는 운영체제(윈도우즈, 유닉스, 리눅스)가 대화형 시스템입니다.

 

반면 일괄처리 시스템은 천공카드를 입력으로 넣고 모든 결과가 끝나야 결과를 확인할 수 있는 시스템입니다.

 

참고 :

대화형 시스템이란 무엇인가요?

Online Interactive System

 

📌 다중 처리기 시스템(multi-processor system)에 대해서 설명해주세요.

다중 처리기 시스템은 둘 이상의 CPU와 하나의 주 기억장치가 통합된 시스템으로 여러 개의 프로그램을 동시에 병렬적으로 처리할 수 있는 능력을 갖추고 있습니다.

  • 프로세서를 여러 개 사용하여 여러 개의 작업을 동시에 수행함으로써 작업 속도를 높일 수 있다.
  • 프로세서 중 일부에 문제가 발생하더라도 다른 프로세서를 이용해 처리할 수 있으므로 신뢰성이 높다.

마이크로프로세서가 등장함으로써 다중처리기 시스템이 시작되었는데,마이크로프로세서의 크기가 작기 때문에 하나의 시스템에 여러 개의 프로세서를 두는 것이 가능하기 때문입니다.

 

참고 :

wikipedia_다중처리기시스템

다중처리 시스템

📌 시스템 콜에 대해 설명해주세요.

 

간단히 말하면,  응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스 역할을 합니다.

사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내어 커널 모드로 전환되어야 합니다. 이때 운영체제 서비스를 제공받기 위한 요청을 시스템 콜(System call)이라고 합니다. 사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있습니다.

https://luckyyowu.tistory.com/133

📌 커널에 대해 설명해주세요.

커널(Kernel)은 운영체제의 핵심적인 부분으로, 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하며 컴퓨터 시스템의 자원을 관리하는 역할을 합니다. 항상 메모리에 상주하면서 컴퓨터가 동작하는 동안 지속적으로 실행됩니다.

즉, 커널은 인터페이스로써 응용 프로그램 수행에 필요한 여러가지 서비스를 제공하고, 여러가지 하드웨어 등의 리소스를 관리하는 역할을 한다.

 

커널의 역할

  1. 보안 : 사용자와 프로그램이 시스템 자원에 접근할 때, 커널은 이를 제어하여 무단 접근을 방지하고, 시스템의 무결성과 안정성을 보장합니다. 예를 들어, 메모리 보호, 사용자 권한 관리, 접근 제어 등을 통해 시스템의 보안을 유지합니다.
  2. 자원관리 : 자원을 효율적으로 관리하기위해서 CPU 스케줄링, 메모리관리, 입출력관리, 파일시스템 관리 등의 업무를 수행합니다.
  3. 추상화 : 하드웨어의 복잡성을 숨기고, 응용 프로그램이 하드웨어에 쉽게 접근할 수 있도록 추상화를 제공합니다. 예를 들어, 커널은 파일 시스템을 통해 물리적인 디스크를 논리적인 파일과 디렉토리 구조로 추상화하여 사용자가 쉽게 데이터를 다룰 수 있게 합니다.

참고 : https://minkwon4.tistory.com/295

인프런 - 곰책으로 쉽게 배우는 최소한의 운영체제론 참고하여 필자가 그린 이미지

📌 커널모드와 유저모드에 대해 설명해주세요.

CPU는 유저 애플리케이션(User Application)이 시스템을 손상시키는 것을 방지하기 위해서 2가지 모드를 제공합니다. CPU에 있는 Mode bit로 모드를 구분하여 0은 커널 모드(kernel mode), 1은 유저 모드(user mode)로 나뉘어서 구동됩니다.

운영체제에서 프로그램이 구동되는 데 있어서 파일을 읽어오거나, 파일을 쓰거나, 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용합니다.

 

유저 모드

 

유저 모드에서 유저 애플리케이션 코드가 실행이 됩니다.
유저는 접근할 수 있는 영역에 제한이 있기 때문에 유저 모드에서는 하드웨어(디스크, I/O 등)에 접근할 수 없습니다. 

접근을 위해서는 시스템 콜(System Call)을 사용해야 합니다.

 

커널모드

 

운영체제가 CPU를 포함한 하드웨어를 제어할 수 있는 모드입니다.
시스템 콜을 통해 커널 모드로 전환이 되면, 운영체제는 하드웨어를 제어하는 명령어(Privileged Instructions)를 실행합니다.

 

참고 : 이중모드 속 유저와 커널 모드

📌 인터럽트와 폴링에 대해 설명해주세요.

CPU는 정해진 흐름에 따라 명령어를 처리하지만,  방해를 받아 잠시 중단될 수 있는데, 이렇게 CPU의 작업을 방해하는 신호를 인터럽트라고 합니다. 현재 실행중인 작업을 중단하고 발생된 상황을 처리한 후 다시 실행중인 작업으로 복귀합니다.

 

인터럽트 종류

 

외부 인터럽트

  • 전원 이상 인터럽트(Power fail interrupt) : 말그대로 정전, 파워 이상 등
  • 기계 착오 인터럽트(Machine check interrupt) : CPU의 기능적인 오류
  • 외부 신호 인터럽트(External interrupt)
    - 타이머에 의한 인터럽트 : Preemptive개념을 생각하면 된다. 자원이 할당된 시간이 다 끝난 경우
    - 키보드로 인터럽트 키를 누른 경우 : 대표적으로 Control + Alt + Delete (소프트웨어 적으로 reset하는 바식)
    - 외부장치로부터 인터럽트 요청이 있는 경우 : I/O 인터럽트 아님!! 다른 개념이다
  • 입출력 인터럽트(I/O Interrupt)
    - 입출력장치가 데이터 전송을 요구하거나 전송이 끝나 다음 동작이 수행되어야 할 경우
    - 입출력 데이터에 이상이 있는 경우

 

내부 인터럽트

  • 잘못된 명령이나 잘못된 데이터를 사용할때 발생하며 Trap이라 부른다.
  • 프로그램 검사 인터럽트(Program check interrupt
    • Division by zero
      • ex) 컴퓨터가 5 ÷ 2 연산을 수행할 때, 실제로는 5에서 2를 반복적으로 빼는 과정을 통해 몫과 나머지를 계산합니다. '
        즉, 5 - 2 = 3, 3 - 2 = 1이 되어 몫은 2, 나머지는 1이 됩니다.
      • 하지만, 5 ÷ 0의 경우, 5에서 0을 반복해서 빼는 연산이 이루어지는데, 0을 아무리 빼더라도 값은 변하지 않으므로, 이 연산은 무한히 반복되며 종료되지 않습니다.
      • 결과적으로, 이는 무한 루프를 초래하게 되고, 컴퓨터 시스템에서는 이 상황을 처리할 수 없기 때문에 'Division by Zero' 오류를 발생시킵니다.
    •  Overflow/Underflow
      • Overflow : 연산 결과가 주어진 데이터 타입의 범위를 초과할 때 발생하는 오류입니다. 예를 들어, 8비트 정수 데이터 타입을 사용할 때, 그 값의 범위는 -128에서 127까지입니다. 만약 127 + 1과 같은 연산을 수행하면, 결과는 128이 되어야 하지만, 8비트로는 이 값을 표현할 수 없으므로 값이 순환하여 -128이 됩니다. 이는 예상치 못한 결과를 초래할 수 있으며, 시스템에서는 이를 Overflow로 감지하고, 필요한 경우 Trap을 발생시켜 처리합니다.
      • Underflow : 연산 결과가 주어진 데이터 타입의 하한보다 작은 값이 될 때 발생하는 오류입니다. 예를 들어, 부동소수점 연산에서 매우 작은 수를 연산할 때, 결과가 데이터 타입으로 표현할 수 있는 최소 값보다 작아지면, 이 값은 0으로 처리되거나 매우 작은 다른 값으로 근사화됩니다. 이로 인해 연산의 정확성이 크게 떨어질 수 있으며, 시스템에서는 이를 Underflow로 인식하여 Trap을 발생시킬 수 있습니다.
    • 기타 Exception
  • 소프트웨어적이 내용이나 분류상 인터럽트가 아니다!

 

소프트웨어 인터럽트(SVC : SuperVisor Call)

  • 사용자가 프로그램을 실행시키거나 감시프로그램(Supervisor)을 호출하는 동작을 수행하는 경우
  • 소프트웨어 이용중 다른 프로세스를 실행시키면 시분할 처리를 위해 자원 할당 등의 동작이 수행된다.

출처: https://raisonde.tistory.com/entry/인터럽트Interrupt의-개념과-종류 

 

 

폴링(Polling)은 프로그램 입출력 시 CPU는 주기적으로 장치 컨트롤러의 상태 레지스터를 확인하며, 입출력 장치의 상태를 확인합니다.

이처럼 폴링이란 입출력장치의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식입니다.

 

- 폴링 방식 : 인터럽트 방식보다 CPU의 부담이 더 크다

- 인터럽트 : CPU가 인터럽트 요청을 받을 때 까지 온전히 다른 일에 집중할 수 있다.

 

폴링 대비 인터럽트가 갖고 있는 특징이 무엇인지 살펴보겠습니다.

  • 비동기 처리: 인터럽트는 비동기적으로 이벤트를 처리하므로, CPU는 불필요한 폴링 없이 다른 작업을 수행할 수 있습니다.
  • 자원 사용 최적화: 폴링은 주기적인 체크로 CPU 시간을 낭비하지만, 인터럽트는 이벤트가 실제로 발생했을 때만 CPU 자원을 사용합니다.
  • 실시간 대응 가능: 인터럽트는 이벤트 발생 즉시 대응하기 때문에, 시스템의 반응 시간을 최소화합니다.

인터럽트 기반의 시스템은 폴링 방식이 가진 한계를 극복하고, 현대의 다양한 컴퓨팅 환경에 적합한 유연성과 효율성을 제공합니다.

 

참고 :

인터럽트(Interrupt)의 개념과 종류

혼자 공부하는 컴퓨터 구조와 운영체제

인터럽트 & DMA

📌  DMA에 대해 설명해주세요.

DMA는 Direct Memory Access의 약자로, I/O 디바이스 등의 장치가 CPU의 도움 없이 데이터를 메모리로 직접 전송할 수 있게 하는 하드웨어 장치입니다.

그 이유는 입출력 장치와 메모리 사이에 전송되는 모든 데이터가 반드시 CPU를 거쳐야 한다면 가뜩이나 바쁜 CPU는 입출력 장치를 위한 연산 때문에 시간을 뺏기게 되기 때문에, 하드 디스크 백업과 같이 대용량 데이터를 옮길 때는 CPU부담이 더욱 커집니다. 그래서 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식인 DMA가 등장했습니다.

 

DMA입출력을 하기 위해서는 시스템 버스에 연결된 DMA컨트롤러라는 하드웨어가 필요합니다.

 

DMA 입출력 과정

  1. CPU는 DMA 컨트롤러에 입출력장치의 주소, 수행할 연산(읽기/쓰기), 읽거나 쓸 메모리의 주소 등과 같은 정보로 입출력 작업을 명령합니다.
  2. DMA 컨트롤러는 CPU대신 자치 컨트롤러와 상호작용하며 입출력 작업을 수행합니다. 이때 DMA컨트롤러는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 씁니다
  3. 입출력 작업이 끝나면 DMA컨트롤러는 CPU를 걸어 작업이 끝났음을 알립니다.

참고 :

DMA 컨트롤러란?

혼자 공부하는 컴퓨터 구조와 운영체제

📌  동기식 I/O와 비동기식 I/O에 대해 설명해주세요.

동기식 I/OI/O 작업이 끝날 때까지 기다렸다가, 작업이 완료되면 다음 명령을 실행합니다.

  • 작동 방식: 프로그램이 파일을 읽거나 네트워크에서 데이터를 전송하는 등의 I/O 작업을 요청하면, 이 작업이 완료될 때까지 프로그램의 흐름이 중단됩니다. 이후 작업이 완료되면 프로그램은 작업의 결과를 받아 처리합니다.
  • 장점: 구현이 간단하고, 작업 순서가 명확해 이해하기 쉽습니다.
  • 단점: I/O 작업이 오래 걸릴 경우, 프로그램 전체가 그 시간 동안 멈추게 되어 비효율적일 수 있습니다.

예를 들어, 파일을 읽는 작업을 동기식으로 수행하면 파일을 다 읽을 때까지 다른 작업을 할 수 없고, 파일 읽기가 끝나야만 다음 작업으로 넘어갈 수 있습니다.

 

비동기식 I/O I/O 작업이 완료되면 특정 시점에 알림을 받거나, 콜백 함수를 통해 결과를 처리합니다.

  • 작동 방식: 프로그램이 I/O 작업을 요청하면, 즉시 제어가 프로그램으로 돌아옵니다. 이때 프로그램은 I/O 작업이 완료되기를 기다리지 않고 다른 작업을 계속합니다. I/O 작업이 끝나면 프로그램에 그 결과가 통보되고, 결과를 처리할 수 있습니다.
  • 장점: 프로그램이 I/O 작업을 기다리는 동안 다른 작업을 수행할 수 있어, 시스템 자원을 보다 효율적으로 사용할 수 있습니다. 특히, 네트워크 통신이나 대용량 파일 입출력에서 유리합니다.
  • 단점: 동기식 I/O보다 복잡하며, 프로그램 흐름을 이해하기 어렵고 디버깅이 까다로울 수 있습니다.

예를 들어, 비동기식으로 파일을 읽는 작업을 수행하면 파일 읽기를 요청한 후 바로 다음 명령을 실행할 수 있습니다. 파일 읽기가 완료되면 그때 결과를 받아 처리합니다.