[운영체제] CPU 추상화

1 minute read

CPU 추상화

프로그램 동작 과정

1) Fetch(인출) 메모리에서 명령어를 인출한다 2) Decode(해석) 명령어의 종류나 타겟 등을 해석한다. 3) Execute(실행) 해석한 명령어를 수행한다. 예) 두개의 숫자를 더한다. 메모리에 접근한다. 조건을 확인한다. 4) Writeback(쓰기) 명령어대로 초기된 데이터를 메모리에 기록하고 다음 명령어로 이동하여 1~4를 반복한다.

운영체제의 책임

정확하고 효율적으로!! 1) 프로그램의 간편한 동작

  • 더블클릭이나 엔터로 위의 프로그램 동작 과정이 잘 진행될 수 있어야 한다. 2) 메모리 공유
  • 한정적인 메모리로 여러개의 프로그램이 잘 동작하도록 적절히 공유시켜줘야한다. 3) 기기간 상호작용
  • 프로그램이 모니터 등의 기기들과 상호작용할 수 있어야 된다.

추상화

  • 물리적인 자원을 추상화된 형태로 바꿔야한다.
    • 물리적인 자원: 프로세서, 메모리, 디스크 등
    • 추상화된 형태: 프로그램이 마치 혼자서 메모리를 쓰는 것처럼 착각하도록 만든다.
  • 운영체제를 가상머신(virtual machine) 이라고 부르기도 한다.

시스템 콜

  • 시스템콜은 유저가 운영체제에게 할 일을 할당할 수 있도록 하는 일종의 가상화 인터페이스이다.
  • 아래와 같은 계층 구조에서, 프로그램과 자원 사이에서 운영체제가 잘 동작하도록하는 일종의 매개체가 필요한데 그 역할을 하는 것이 시스템콜이다.
  • 즉, 프로그램의 동작에서 자원을 사용하기 위함이 시스템콜의 목적이다.

    ㅡㅡㅡㅡㅡㅡㅡㅡ
    프로그램 동작
    ㅡㅡㅡㅡㅡㅡㅡㅡ
    운영체제
    ㅡㅡㅡㅡㅡㅡㅡㅡ
    물리적 자원
    ㅡㅡㅡㅡㅡㅡㅡㅡ
    가상머신
    ㅡㅡㅡㅡㅡㅡㅡㅡ

1. CPU 가상화

하나의 cpu를 마치 엄청나게 많은 cpu가 돌아가는 것처럼 해야한다. 이를 통해 많은 프로그램이 마치 동시에 돌아가는 것처럼 만드는 과정을 cpu 가상화라고 일컫는다.

예제

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <assert.h>
#include "common.h"

int main (int argc, char *argv[])
{
    if (argc != 2) {
        fprintf(stderr, "usage:cpu <string>\n");
        exit(1)
    }
    char *str = argv[1];
    while (1){
        Spin(1);
        printf("%s\n",str);
    }
    return 0;
}

결과1. 프로그램 하나만 돌렸을 경우

prompt> gcc -o cpu cpu.c -Wall
prompt> ./cpu "A"
A
A
A
^C

결과2. 프로그램 여러개를 돌렸을 경우

- 아래 출력 결과 순서는 바뀔 수 있따.
- 프로그램 4개를 돌리면 프로세스 4개가 생성되면서 돌아가지만 마치 혼자 쓰는 것처럼 돌아간다.
- 프로세스 1개에서 여러 프로그램을 돌려도 마찬가지이다. ``` prompt> ./cpu "A" & ; ./cpu "B" & ; ./cpu "C" & ; ./cpu "D" &   [1] 7353 [2] 7354 [3] 7355 [4] 7356 A B D C A B D C A C B D ^C ```

2. 메모리 가상화

  • 물리적메모리: 바이트의 배열

    예제

  • 메모리에 접근해서 동일한 변수 p의 값을 1씩 증가시키는 무한루프 프로그램이 있다고 하자.
  • 이 프로그램 두개를 동시에 1000번 돌리게 되면 p의 값은 예상대로 2000이 출력된다.
  • 그러나 루프 횟수가 100000으로 커지면 p는 200000이 아닌 훨씬 작은 수가 나오게 된다.

    이유

  • concurency bug! 두개의 쓰레드가 동일한 메모리 영역에 접근하게 되면 충돌이 발생할 수 있다.
  • 충돌이 발생하게 되면 값은 덮어쓰기가 되거나 잘못 읽는 경우가 생긴다. Why?
  • 코드 상의 p++는 간단해보이지만 실제로는 3개의 명령어로 이루어져있다.
    ㅇㅇㅇ
    ㅇㅇㅇ
    ㅇㅇㅇ
    

Categories:

Updated: