운영체제 뽀개기

Sawol·2021년 3월 23일
1

운영체제 뽀개기

목록 보기
1/7
post-thumbnail

운영체제

하드웨어 위에 설치되어 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어.

  • 사용하는 이유
    자원을 효율적(형평성있게 분배)으로 관리하기 위함.
    컴퓨터 시스템을 사용자가 편리하게 사용하기 위함.

  • 만약 운영체제가 없다면?
    모든 사용자는 하드웨어적인 부분까지 자세히 알아야 함.
    초기 PC처럼 사람이 직접 선을 하나씩 뽑았다, 꽂았다 하며 전기적 신호를 줘야함.

    좁은 의미의 운영체제
    운영체제의 핵심 부분으로 메모리에 상주하는 부분인 커널을 의미.

    넓은 의미의 운영체제
    커널을 포함한 모든 유틸리티.

커널

운영체제를 모두 메모리에 올리기에는 너무 크기때문에 필요한 부분만 올린다.
메모리에 상주한 운영체제 부분을 커널 이라고 한다.
아래 사진에서는 System Call Interface, Kernel, Resource ManagementOS이다.

시스템 콜(system call)

사용자(프로그램)가 운영체제에게 무언가를 요청하는 행위를 시스템콜이라고 한다.
사용자가 바로 커널을 조작하는 행위는 위험하기 때문에 중간에 System Call Interface라는 부분을 둬서 사용자가 System Call를 통해 커널에 요청을 보내도록한다.
API라고도 함.(ex- Win32 API)

운영체제의 발전 목적

  • 편리성
    사용자에게 편리한 환경 제공
  • 효율성
    시스템 성능 향상
  • 제어 서비스 향상
    시스템 오류 예방

운영체제의 처리 방식

일괄 처리(batch processing)

일정량을 모아 한번에 처리.

멀티프로그래밍

프로세서가 유휴 상태가 되면 다른 프로그램이 프로세서를 사용하는 기술.
즉, 여러 프로그램이 메모리에 적재되어 하나의 프로그램이 CPU를 사용하다가 입출력 동작 등을 하여 CPU를 사용하지 않을 때 잠깐 메모리에 적재된 다른 프로그램이 CPU를 사용한다.

시분할(time sharing)

여러 작업을 수행할 때 일정 시간 단위로 분할하여 처리.
보통의 PC는 이 방식을 사용.

멀티프로그래밍과 시분할의 차이

멀티프로그래밍: 프로세서 사용을 최대화 목적
시분할: 시스템 응답시간을 최소화 목적

실시간(Realtime OS)

정해진 시간 안에 반드시 종료됨이 보장되어야하는 시스템을 위한 OS.


처리 방식 관련 용어

멀티태스킹 = 멀티프로그래밍 = time sharing = multiprocess

컴퓨터에서 여러 작업을 동시에 수행.
메모리에 여러 프로그램이 올라가 있음.

multiprocessor

cpu가 여러 개 붙어있음.


컴퓨터 시스템 구조

CPU = 프로세서(processor)

cpu는 오직 메모리하고만 주고 받으며 작업을 수행함.
하지만 interrupt line을 통해 device controller에게 일을 시킬 수 있음. ex- 디스크의 어떠한 부분을 읽어오라.
그래서 cpu는 항상 memory에 올라온 작업을 처리하면서 interrupt line에 작업 요청이 들어왔는지 체크함.
만약 interrupt line에 요청이 들어오면 cpu는 하던 일을 멈추고 cpu의 작업권을 사용자 프로그램에서 os로 넘김.
보통 디바이스 컨트롤러가 cpu가 시킨 일을 끝냈을 때 interrupt line으로 언터럽트 신호를 보냄.

mode bit
cpu운영체제가 갖고 있는지 사용자 프로그램이 갖고 있는지 표시해줌.
0일 때는 os가 cpu를 갖고 있음.
1일 때는 사용자 프로그램이 cpu를 갖고 있음.
이렇게 나누는 이유는 사용자 프로그램에 여러 보안상 이유로 제한을 두기 위해 1일 경우 입출력 프로그램이나 여러 시스템을 사용 못하도록 막음.
사용자가 입출력 프로그램을 사용하고 싶을 때는 항상 OS에게 요청해야하기 때문에 사용자 프로그램이 interrupt를 CPU에게 발생시킨 후 CPU가 os에게 cpu 작업권을 넘겨준다.

Register

CPU의 작업공간. CPU 내부에 존재.
여러 레지스터 중 프로그램카운터(PC)라는 레지스터가 cpu가 수행할 다음 작업의 메모리 주소를 갖고 있음.

Device controller

I/O 장치를 cpu가 모두 관리하는 것이 아니라 cpu와 비슷한 controller가 관리함.
즉, 디스크 컨트롤러는 디스크를 관리하고, 키보드 컨트롤러는 키보드를 관리함.

Local buffer

컨트롤러들이 작업하는 공간이 필요한데 그 공간을 로컬 버퍼라고 부름.

버퍼링
메모리내에 한 공간(버퍼)을 CPU와 입출력 장치의 속도차이를 보완하기 위해 임시로 데이터를 저장해둔다.
메모리 <-> CPU 또는 메모리 <-> 입출력 장치 의 데이터 이동에 대한 속도차이.
스풀링
디스크내에 한 공간(스풀)을 CPU와 입출력 장치의 속도차이를 보완하기 위해 임시로 데이터를 저장해둔다.
CPU <-> 입출력 장치의 데이터 입출력에 대한 속도차이.

Timer

특정 프로그램이 cpu를 독점 하는 것을 막기 위함.
타이머에 할당된 시간만큼만 프로그램이 cpu를 사용할 수 있음.

DMA controller

직접 메모리에 접근할 수 있는 컨트롤러.
디바이스 컨트롤러가 결과가 나올 때마다 interrupt를 걸면 cpu에 부하가 크게 발생해 비효율적임.
그래서 DMA 컨트롤러가 중간에서 디바이스 컨트롤러의 작업 결과를 메모리에 올려주고 입출력 장치의 작업이 완전히 끝났을 경우 cpu에게 interrupt를 걸어 입출력 작업이 완전히 끝났다고 알려줌.

Memory controller

cpu와 DMA 컨트롤러가 동시에 메모리에 접근하면 일관성이 깨질 수 있으므로 이것을 막기위해 존재.

캐시 메모리

메모리와 cpu사이의 속도차를 줄이기위해 존재. CPU 내부에 존재. 자주 사용되는 작업을 캐시에 올려둠.
데이터를 블록 단위로 가져와 프로세서에 워드 단위로 전달하여 속도를 높임.

  • 캐시 히트(Cache hit)
    필요한 데이터 블록이 캐시에 존재.
  • 캐시 미스(Cache miss)
    필요한 데이터 블록이 캐시에 없음. 캐시를 한번 확인하고 메인 메모리에서 데이터를 들고 와야해서 캐시가 존재하지 않을때보다 성능이 안 나온다.

공간적 지역성(Spatial locality)
다음에 참조할 주소는 현재 참조할 주소와 인접할 가능성이 높음.
ex - 순차적 프로그래밍
시간적 지역성(Temporal locality)
한번 참조한 주소는 곧 다시 참조할 가능성이 높음.
ex - for 문

이러한 지역성은 캐시 적중률 즉, 성능과 밀접함.

시스템 버스

하드웨어를 물리적으로 연결하여 서로 데이터를 주고받을 수 있게 하는 통로.
기능에 따라 데이터 버스, 주소 버스, 제어 버스로 구분.

  • 데이터 버스
    프로세서, 메인 메모리, 주변장치 사이에서 데이터 전송
  • 주소 버스
    프로세서가 주소 정보를 전송. 주소 정보를 메인 메모리가 받아 처리.
  • 제어 버스
    프로세서가 시스템 구성 요소를 제어하는 데 사용.
    연산 종류, 메모리의 읽기, 쓰기 동작을 결정.

보조기억 장치

메모리의 한 종류로 프로그램과 데이터를 저장.
프로세서가 직접 접근할 수 없어 주 기억장치를 거쳐서 접근할 수 있다.(=주변장치)


명령어

명령어 구조

  • 명령어
    연산 부호 + 처리할 데이터 또는 데이터를 저장한 레지스터나 메모리 주소(피연산자)
    피연산자 수에따라 0 주소 명령어, 1 주소 명령어, 2 주소 명령어, 3 주소 명령어등으로 구분.
  • 연산 부호(OPcode)
    프로세서가 실행할 동작인 연산을 지정.
    산술연산(+=*/), 논리연산(AND, OR, NOT)등을 정의
  • 피연산자(Operand)
    연산할 데이터 정보를 저장.
    데이터가 레지스터나 메모리, 가상 기억장치, 입출력 창지 등에 위치할 수 있으므로 보통의 경우 데이터 자체보다 데이터의 위치를 저장.
    아래 사진은 가장 일반적인 구조로, 소스 피연산자와 연산 부호를 통해 프로세서가 연산을 수행 한 뒤, 결과를 목적지 피연산자에 저장한다.

누산기
프로그램의 명령어 수행 중에 연산의 결과를 일시적으로 저장.

직접주소(direct address)

데이터가 있는 레지스터나 메모리 주소를 피연산자에 지정함.

간접주소(indirect address)

데이터가 있는 레지스터나 메모리 주소가 기록된 주소를 지정함.


인터럽트

인터럽트

현재 실행 중인 프로그램을 중단하고 다른 프로그램의 실행을 요구하는 명령어.
입출력장치나 프로그램등에서 프로세서로 보내는 하드웨어 신호.
크게 인터럽트 요청인터럽트 서비스 루틴으로 나눌 수 있음.

인터럽트 벡터
어떤 시스템이 인터럽트를 요청했는지 알려줌.
즉, 인터럽트 서비스 루틴의 주소를 알려줌.

인터럽트 서비스 루틴
인터럽트 요청 신호에 따라 수행하는 루틴. 즉, 인터럽트 처리 프로그램.

인터럽트 사용 이유

프로그램 실행 순서를 바꿔 다중 프로그래밍 할 수 있게 해줘 처리 효율이 향상됨.

인터럽트 처리 과정

프로그램 A가 실행되고 있을 때 프로그램 B에서 인터럽트 신호를 프로세서에게 전달하여 현재 명령어가 종료된다. 그리고 레지스터의 모든 내용을 스택 영역(프로세스 제어 블록)에 보낸다. 프로그램 카운터에는 인터럽트 처리 프로그램(프로그램 B)의 시작 위치를 저장하고 프로그램 B를 실행한다. 인터럽트 처리 프로그램을 완료하면 스택 영역에 있던 내용을 레지스터에 다시 저장하고 프로그램 A를 재실행 한다.

인터럽트와 서브루틴의 차이
서브루틴은 자신을 호출한 프로그램이 요구한 기능을 수행.
인터럽트 처리 프로그램은 인터럽트가 발생했을 때 실행 중인 프로그램과 관련이 없을 수 있음. 그렇기 때문에 인터럽트는 서브루틴과 다르게 나중에 다시 그 프로그램에 복귀했을 때를 위해 정보를 저장해놓는다.

폴링

프로세서가 매번 새로운 연산을 하기 전에 연결된 모든 장치의 상태 비트를 확인하는 작업. 인터럽트는 입출력 장치가 준비가 되면 알아서 프로세서에게 신호를 보내 자기를 실행해달라고 하는 것에 비해 폴링은 항상 프로세서가 확인을 해야함. 그래서 인터럽트에 비해 매우 비효율적인 방법.


프로그램 실행 과정

프로그램의 실행(메모리 로드)

실행 파일을 실행할 때 가장 먼저 가상메모리에 해당 프로세스만에 독자적인 주소 공간이 생김.
여기서 말하는 가상 메모리는 실제 존재하는 공간이 아니라 말 그대로 '가상의' 공간임.
그 공간에는 code, data, stack 이 존재.
code는 cpu가 수행할 기계어가 담겨있고, data는 코드의 변수들이 담겨있고, stack은 함수가 쌓였다가 빠져나가는 공간으로 사용됨.
이러한 가상 주소 공간을 실제 메모리에 올리면서 실행시킴. 이때 가상 메모리처럼 하나로 묶어서 올라가는 것이 아니라 실제 메모리에는 뿔뿔히 흩어진채로 올라감.
가상 주소 공간의 모든 부분을 올리면 메모리가 낭비될 수 있기때문에 지금 당장 필요한 부분만 올림.
만약 프로그램이 종료되기 전까지 필요한 데이터지만 지금 사용하지 않는다면 swap area라는 디스크 공간에 저장 시켜둠.

커널 영역

실제 메모리에 존재하는 커널영역은 운영체제는 항상 메모리에 상주해야하기 때문에 컴퓨터가 켜지면 메모리에 커널 영역이 존재함.
운영체제 또한 하나의 프로세스이므로 code, data, stack 구조를 갖음.
스택부분은 프로세스마다 공간을 나눠서 사용함.
커널 영역의 코드를 사용자 프로그램이 호출할때는 메모리 주소를 단순히 점프 하는 것이 아니라 시스템 콜로 호출해야함.

0개의 댓글