[OS] 운영체제 정리 (1)

calm0_0·2023년 11월 8일
0

OS

목록 보기
1/4

운영체제의 정의 및 역할


운영체제란

운영체제(OS, Operating System)는 컴퓨터 시스템의 자원들을(CPU, 메모리, 보조기억장치, 입출력장치 등) 효율적으로 관리하며, 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 시스템 소프트웨어이다.

운영체제는 커널 영역에 적재되어 실행되며, 사용자 영역에 적재된 응용 프로그램들에 자원을 할당하고 이들을 올바르게 실행되도록 한다.

운영체제의 역할

프로세스 관리

운영체제에서 작동하는 응용 프로그램을 관리하는 기능이다. 일반적으로 CPU는 한 번에 하나의 프로세스만 실행할 수 있고, 각 프로세스는 상태나 사용하고자 하는 자원이 다양하다. 그래서 운영체제는 다양한 프로세스를 일목요연하게 관리하고 실행할 수 있어야 한다.

자원 접근 및 할당

모든 프로세스는 실행을 위해 자원을 필요로 하며, 운영체제는 프로세스들이 사용할 자원(CPU, 메모리, 입출력장치 등)에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당해 준다.

파일 시스템 관리

운영체제는 파일 시스템을 통해 보조기억장치 속 데이터를 파일과 디렉터리로 관리한다.


운영체제의 유형


시분할 시스템(Time sharing system)

CPU의 작업 시간을 여러 프로그램들이 조금씩 나누어 쓰는 시스템을 시분할 시스템이라고 한다.

하나의 CPU는 같은 시점에 여러 작업을 동시에 수행할 수 없기 때문에 CPU의 전체 사용 시간을 작은 작업 시간량으로 나누어 그 시간량 동안만 번갈아가면서 CPU를 할당하여 각 프로세스를 처리한다.

다중 프로그래밍 시스템(Multi-programming system)

CPU와 달리 메모리의 경우 여러 프로그램들이 조금씩 메모리 공간을 보유하며 여러 프로그램들을 동시에 메모리에 올려 놓을 수 있다.

메모리 공간을 분할해 여러 프로그램들을 동시에 메모리에 올려놓고 처리하는 시스템을 다중 프로그래밍 시스템이라고 한다.

하나의 메모리에 여러 개의 프로그램을 올려 놓고 하나의 CPU와 대화하면서 동시에 처리한다.

메인 메모리의 크기가 커야 하며 CPU 사용률과 처리량이 증가하지만 반응시간이 늦다.

다중 처리기 시스템(Multi-processor system)

여러 개의 CPU하나의 주기억장치를 이용하여 다수의 프로그램을 동시에 처리하는 방식이다.

하나의 CPU가 고장나더라도 다른 CPU를 이용하여 작업을 처리할 수 있어 시스템의 신뢰성과 안정성이 높다.

CPU가 여러 개라 병렬 처리가 가능하고 처리 속도는 빨라지지만, 운영 체제 입장에서는 여러 개의 CPU를 컨트롤 해야하므로 더 복잡한 메커니즘을 필요로 한다.


커널 & 시스템 콜


커널(Kernel)

자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능 등 운영체제의 핵심 서비스를 담당하는 부분을 커널(Kernel)이라고 한다.

유저 모드(user mode) & 커널 모드(kernel mode)

운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다.

만약 응용 프로그램들이 CPU, 메모리, 하드 디스크 등에 마음대로 접근하여 조작할 수 있다면 자원의 관리가 어렵고, 응용 프로그램이 실수하게 되면 컴퓨터 전체에 큰 악영향을 미칠 수 있기 때문이다.

이러한 운영체제의 문지기 역할은 CPU가 명령어를 실행하는 모드를 크게 유저 모드커널 모드로 구분함으로써 구현된다.

유저 모드

유저 모드는 운영체제 서비스를 제공받을 수 없는 실행 모드이다. 즉, 커널 영역의 코드를 실행할 수 없는 모드이다. 일반적인 응용 프로그램은 기본적으로 유저 모드로 실행된다.

유저 모드로 실행 중인 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없다. 그래서 유저 모드로 실행 중인 응용 프로그램은 자원에 접근할 수 없다.

커널 모드

반면에 커널 모드는 운영체제 서비스를 제공받을 수 있는 실행 모드이다. 즉, 커널 영역의 코드를 실행할 수 있다. CPU가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다.

시스템 콜(System call)

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

시스템 콜의 작동

예를 들어 응용 프로그램이 실행되는 중에 하드 디스크에 접근하여 데이터를 저장하려면,

  • 응용 프로그램은 하드 디스크에 데이터를 저장하는 시스템 콜을 발생시켜 커널 모드로 전환하고,
  • 운영체제 내의 하드 디스크에 데이터를 저장하는 코드를 실행함으로써 하드 디스크에 접근한다.
  • 하드 디스크에 접근이 끝났다면 다시 유저 모드로 복귀하여 실행을 계속해 간다.

일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스를 자주 이용한다. 그래서 빈번하게 시스템 콜을 발생시키고 유저 모드와 커널 모드를 오가며 실행된다.


인터럽트(Interrupt)


인터럽트란

CPU가 수행 중인 작업방해를 받아 잠시 중단될 때, CPU의 작업을 방해하는 신호를 인터럽트(interrupt)라고 한다.

프로그램의 실행 중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고, 발생된 상황을 먼저 처리가 필요하다고 CPU에 알리는 것이다.

키보드 마우스 등 입출력장치로 인해 발생하는 인터럽트, 0으로 나누기와 같이 잘못된 명령이나 데이터를 사용할 때 발생하는 인터럽트, 프로세스 오류 등으로 발생한다.

인터럽트 발생 처리 과정

프로그램 실행 중에 인터럽트가 발생하면,

  • 현재 수행 중인 프로그램을 멈추고, 현재 상태를 백업해둔다.
  • 인터럽트 핸들러 함수가 모여 있는 인터럽트 백터로 가서 인터럽트를 처리한다.
  • 인터럽트 처리를 마치면, 백업해둔 주소로 돌아가 다시 프로그램을 실행한다.

폴링(polling)

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

폴링 방식은 인터럽트 방식보다 CPU의 부담이 더 크다. 인터럽트는 CPU가 인터럽트 요청을 받을 때까지 온전히 다른일에 집중할 수 있지만, 폴링의 경우 폴링을 하는 시간에는 원래 하던일에 집중할 수 없기 때문이다.


DMA(Direct Memory Access)


DMA(Direct Memory Access)는 입출력장치와 메모리가 CPU를 거치지 않고 데이터를 주고 받는 입출력 방식이다.

입출력장치와 메모리 사이에 전송되는 모든 데이터가 CPU를 거친다면 CPU의 부담이 너무 커진다. DMA는 CPU의 부하를 줄이기 위해 사용한다.

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

DMA 입출력 과정

  • CPU는 DMA 컨트롤러에 입출력장치의 주소, 수행할 연산, 메모리의 주소 등과같은 정보로 입출력 작업을 명령한다.
  • DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다. 필요한 경우, DMA 컨트롤러가 메모리에 직접 접근하여 정보를 읽거나 쓴다.
  • 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 작업이 끝났음을 알린다.

동기 & 비동기


동기(Synchronous)

synchronous: 동시에 발생하는

컴퓨터 공학에서의 동기: 현재 작업의 응답과 다음 작업의 요청이 동시에 일어나는 것

  • 어떤 작업을 요청했을 때 그 작업이 종료될 때까지 기다린 후 다음 작업을 수행한다.
  • 데이터를 주고받는 '순서'가 중요할때 사용된다.
  • 요청한 작업만 처리하면 되기 때문에 전체적인 수행 속도는 빠를 수 있다. (일만 하면 된다)
  • 한 작업에 대한 시간이 길어질 경우, 전체 응답이 지연될 수 있다.

비동기(Asynchronous)

asynchronous: 동시에 발생하지 않는

컴퓨터 공학에서의 비동기: 현재 작업의 응답과 다음 작업의 요청이 동시에 일어나지 않는 것

  • 어떤 작업을 요청했을 때 그 작업이 종료될 때까지 기다리지 않고(작업을 위임하고), 다음 작업을 수행한다. 요청했던 작업이 끝나면 결과를 받고, 그에 따른 추가 작업이 있다면 수행한다.
  • 요청 순서에 상관없이, 동시에 다수의 작업을 처리할 수 있다.
  • 작업이 끝날 때 따로 이벤트를 감지하고 결과를 받아 그에 따른 추가 작업을 해줘야하기 때문에, 비교적 느릴 수 있다.
  • I/O 작업이 잦고, 빠른 응답속도를 요구하는 프로그램에 적합하다.


Reference

혼자 공부하는 컴퓨터 구조+운영체제
https://velog.io/@nayeon15/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%A2%85%EB%A5%98
https://velog.io/@yoonuk/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%EB%B6%84%EB%A5%98
https://matice.tistory.com/27
https://gyoogle.dev/blog/computer-science/operating-system/Interrupt.html
https://velog.io/@soyeon207/%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-blocking-non-blocking
https://github.com/WeareSoft/tech-interview/blob/master/contents/os.md#%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0

profile
공부한 내용들을 정리하는 블로그

0개의 댓글