정글사관학교 개발일지/운영체제-PintOS

운영체제(1) - 시스템 구조/프로그램 실행 (정글사관학교 53일차 TIL)

Woonys 2021. 12. 25. 03:28
반응형

1. 운영체제

운영체제란 무엇인가?

운영체제란, 사용자 및 다른 모든 소프트웨어, 하드웨어를 연결하는 소프트웨어 계층으로, 컴퓨터 계층구조 상에서 하드웨어 바로 위에 올라와있다. 좁은 의미로는 커널(운영체제 중 메모리에 상주하고 있는 핵심 부분)만을 말하고(이는 보통 전공자 입장에서 해당), 넓은 범위로는 커널 뿐만 아니라 각종 주변 시스템 유틸까지 포함한다.

 

운영체제를 쓰는 목적

1. 하드웨어, 즉 시스템 자원 (CPU, 메모리, 기억장치, 입출력 장치 등)을 효율적으로 관리

여기서 효율성이란, 하드웨어라는 유한한 자원은 이미 주어져있고 세팅된 상황에서는 변경되지 않는데 이 자원을 가지고서 최대한 성능을 낼 수 있도록 하는 관점을 말한다.한 가지 예로 CPU의 경우, 실행 중인 프로그램들에게 짧은 시간씩 CPU를 번갈아 할당시키는 방식으로 효율성을 높인다. (이를 시분할 방식이라고 함. 아래에서 설명할 것임.)

 

2. 사용자 간 형평성 있는 자원 분배

효율성만 강조하다 보면 특정 사용자 프로그램이 차별받는 상황이 발생할 수도 있음. 이를 위해 사용자 간 형평성 있게 자원을 분배하는 것 역시 운영체제의 역할이자 목적.

 

3. 사용자로 하여금 컴퓨터를 편하게 사용하게 해줌

운영체제는 각 프로그램이 동시에 실행되는 것 같은 환상을 심어준다. 또한, 각 프로그램이 각 독자적인 컴퓨터에서 실행되는 것 같은 환상 역시 심어주는데(by 가상 메모리) 이 역시 운영체제의 역할이다. 이렇게 느끼는 이유는 운영체제가 관리를 효율적으로 잘했기 때문이다. 자원을 어떻게 효율적으로 다루는지는 운영체제가 대행해주기 때문에 사용자는 여기에 신경쓸 필요 없이 자신이 원하는 작업을 수행하기만 하면 된다.

 

4. 프로세스, 파일, 메시지 등 SW 자원 관리

 

5. 사용자로부터 운영체제 자신을 보호 (사용자 모드 / 커널 모드로 분류하고 커널 모드 상태에서는 사용자가 침범할 수 없게끔 설계되어 있음)

 

운영체제 분류

1. 동시 작업 가능 여부

  • 단일 작업 지원 => 예전 운영체제. 한 번에 하나의 작업만 처리. 한 명령 수행 끝내기 전에 다른 명령 수행시킬 수 없음(동기 처리)
  • 다중 작업 지원 => 현대 컴퓨터

2. 사용자의 수 - 몇명의 사용자가 서버에 접근 가능? 동시에 접근 가능한지?

3. 처리방식

  • 일괄처리(배치 프로세싱)
    • 작업 요청 일정량 모아서 한꺼번에 처리
    • 작업이 종료될 때까지 기다려야
  • 시분할(time sharing)
    • 현재 컴퓨터가 쓰는 방식. 여러 작업 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용.
    • 일괄 처리 시스템에 비해 짧은 응답 시간을 가짐.
    • 상호작용하는 방식.
    • 각 사용자가 컴퓨터로부터 서비스를 제공받는 시간을 숫자로 표시
  • *파이프라인: 컴퓨터 아키텍쳐. 반도체 장비 공정을 생각하면 됨. 반도체 하나를 만드는데 일주일이 걸리지만 컨베이어 벨트를 생각하면 매 공정마다 계속 하나씩 들어오니 결과적으로는 매일 한 개씩 반도체가 만들어짐.

현대 컴퓨터: 다중 작업 & 다중 사용자 & 시분할 시스템

 

 

운영체제 구조

1. CPU

  • 누구한테 CPU를 넘겨줄까? => CPU 스케쥴링.
  • CPU 스케쥴링은 먼저 온 애가 먼저 작업하는 게 기본적이긴 하나 다른 알고리즘이 추가되어 우선순위가 결정됨. 무조건 빨리 왔다고 먼저 작업하지는 않음. 시간 배정해서 타이머 초과하면 인터럽트 들어오고 그 프로세스는 ready 상태로 변화됨.
  • 왜? 이론상으로 CPU를 가장 짧게 쓸 놈한테 먼저 배정하는 게 더 굳이기 때문.
    • 길게 쓰려는 애한테 먼저 배정하면 뒤에 짧게 금방 끝낼 애들이 굳이 기다리지 않아도 되는데 줄서서 기다려야 함

2. 메모리

  • 메모리 관리: 한정된 메모리를 어떻게 쪼개 쓸까?/
  • CPU에 프로그램 실행되려면 메모리에 올라와 있어야 하는데, 메모리가 없으면 전체 시스템이 원활하게 실행되지 않는다.
  • working set 모델: 너무 많은 프로그램이 동시에 실행되려고 하면 몇 프로그램만 메모리에 남기고 나머지는 하드 디스크로 쫓아낸다. 모든 프로세스에 대해 물리 메모리를 1/n으로 나누는 구조가 아님. (전에 정리했던 가상 메모리 내용과 비슷)
    • 디스크에서 메모리에 작업할 애들을 올리려면 기존에 메모리에 자리 차지하고 있던 애들은 내쫓아야 한다. 이때, 어떤 것들을 내쫓을까? 나중에 사용 안할 것 같은 애들. 이는 미래를 예측한다는 개념인데, 이를 실현하게 하는 건 locality. 이 역시 위 링크에서 정리한 내용.

3. 하드 디스크

  • 디스크에 파일을 어떻게 보관할까? 파일을 관리해줘야 한다. 여기서도 스케쥴링이 필요하다. 이를 디스크 스케쥴링이라 함.
  • 디스크 스케쥴링과 CPU 스케쥴링은 약간 다른데, CPU는 너무 빨라서 이걸 어떻게 효율적으로 배정할 것인가, 디스크는 너무 느려서 이걸 어떻게 효율적으로 쓸 것인가라는 측면.

4. 입출력 장치

  • 입출력 관리: 각기 다른 입출력 장치와 컴퓨터 간에 정보를 어떻게 주고받는가?

 

 

 

2. 컴퓨터 시스템 구조

 

프로그램 실행(memory load)

프로그램을 실행시키면 각 파일 시스템으로부터 해당 파일마다 가상 메모리를 생성한다. 사용하고 나면 그제서야 가상 메모리에서 물리 메모리로 올리고 그렇지 않은 부분은 디스크로 내려놓는다(swap out). 이때 스왑 영역은 전원이 나가면 의미 없는 정보가 되어버린다. 따라서 여기는 전원이 꺼지면 지워진다.

 

커널 주소 공간(kernel address area)

code

커널 코드에는 시스템 콜, 인터럽트를 처리하는 코드 / 자원을 관리하는 코드 / 사용자에게 편리 서비스를 제공하는 코드 등이 들어있다.

 

data

CPU/메모리/디스크를 관리하기 위한 자료구조가 담겨 있다. 거기다 운영체제가 각 프로세스별로 관리하기 위해 필요한 자료구조 역시 이 안에 들어있는데, 이를 PCB(process controller block)이라 한다.

 

stack

사용자 프로그램에서 운영체제를 호출해 커널 코드를 실행하면 관련 리턴값들이 스택에 쌓인다. 사용자 프로그램이 시스템 콜하거나 할때 각 프로세스마다 구별해서 스택을 만든다 (Process A의 스택, Process B의 스택, Process C의 스택, ...)

 

사용자 프로그램이 사용하는 함수

함수

  • 사용자 정의 함수: 자기 프로그램에서 정의한 함수
  • 라이브러리 함수: 자기 프로그램에서 정의하지 않고 가져다 쓴 함수.
  • 커널 함수: 운영체제 프로그램에서 정의한 함수로 커널 코드에 들어있다. 이를 호출하는 게 시스템 콜.

 

3. 프로세스 (내일 계속...)

 

프로세스 개념

프로세스는 실행 상태의 프로그램을 뜻한다.

 

프로세스에서 문맥(context)

문맥(context)란, 특정 시점에서 이 프로세스가 어디까지 수행했는지에 대한 전반적인 수행 상태를 말한다.

 

반응형