기록공간

1-1장. 운영체제 개요 - CPU 가상화 본문

OS

1-1장. 운영체제 개요 - CPU 가상화

입코딩 2020. 2. 4. 21:55
반응형

Ctrl + Alt + Del를 눌러 작업 관리자를 실행해보자. 그러면 많은 프로그램이 실행되고 있을 것이다. CPU는 하나이기 때문에 여러 프로그램에 대한 연산 처리는 불가능하다. 결국 어떤 프로그램을 실행시키기 위해서는 전에 실행되고 있던 프로그램에서 CPU를 양보해야 한다. 그럼 이러한 작업은 어떻게 가능한 것일까?

 

여러 프로그램을 실행 시키기위해 컴퓨터에는 마치 수십 개의 CPU가 존재하는것 처럼 보이게 한다. 이것이 바로 CPU 가상화이다. CPU 가상화는 가상의 CPU가 여러 개 있는것과 같은 효과를 낸다. 즉, CPU를 무한한 개수의 CPU로 증식시킬 수 있다는 것이다.

 

프로그램을 실행하고, 멈추고, 어떤 프로그램을 실행시킬 것인가를 운영체제에게 알려주기 위해서는 원하는 바를 운영체제에게 전달할 수 있는 인터페이스(API)가 필요하다. API는 운영체제와 사용자가 상호작용할 수 있는 주된 방법이다. 이를 통해서 많은 프로그램을 즉시 실행시키거나 멈추는 등의 작업을 운영체제에게 시킬 수 있다. 

 

다음 프로그램을 실행시켜 보자.

#include <iostream> 
using namespace std;

int main()
{
	while (true) 
	{ 
		volatile int sum = 0; 
		for (auto i = 0; i < 200000000; ++i) 
			sum = sum + i; 
		cout << "I am using CPU\n"; 
	} 
}

실행결과

여러 개를 실행해 보자.

 

이 상황을 3가지 방법으로 설명하면 다음과 같다.

 

  • CPU는 하나 지만 여러 개의 프로그램이 동시에 실행된다.

  • 코어는 네 개이지만 16개의 프로그램이 동시에 실행된다.

  • 논리 코어는 8개이지만 16개의 프로그램이 동시에 실행된다.

 

예제를 실행했을때 컴퓨터의 상태

 

메모리 가상화

실제 우리가 컴퓨터에서 사용하는 메모리는 C언어에서 자주 보았던 byte의 배열과 같다. 그리고 모든 프로그램의 모든 자료구조는 메모리에 존재한다. 하드디스크에 있는 데이터도 일단 메모리 읽어놔야 읽을 수 있다. CPU를 통해 메모리에서는 두 가지 일이 일어난다. 

 

첫 번째는 메모리 읽기(Read, Load)이다.  CPU에서는 주소를 주소 버스를 통해 메모리에 전달하면 메모리에서 그 주소에 맞는 데이터를 얻을 수 있다.

 

두 번째는 메모리 쓰기(Write, Store)이다. CPU에서 주소와 쓸 데이터를 메모리에 전달하면 메모리에서 그 주소에 맞는 곳에 데이터를 쓸 수 있다.

 

다음 프로그램을 실행시켜보자.

#include <iostream>
using namespace std;

int main()
{
   // int 한개를 얻는다.
   int *p = new int;
   // 주소를 출력한다.
   cout << "Address of P: " << hex << reinterpret_cast<int>(p) << endl;
   // 초기화 한다.
   *p = 0;
   
   while(true)
   {
      int sum = 0;
      for(auto i = 0; i < 400000000; ++i) 
          sum = sum + i;
          
      *p = *p + 1;
      // p값을 출력한다.
      cout << dec << " p: " << *p << endl;
   }
}

실행결과

이제 여러개를 실행시켜 보자 여러 개를 실행시켰다면 '프로그램에서 주소를 출력했을 때 프로그램들은 할당받은 p가 물리 메모리 상에서 서로 공유하는 주소이므로 출력되는 주소 값이 서로 같다. 그리고 출력되는 *p의 값도 그것에 맞게 증가할 것이다'라고 유추해볼 수 있다. 하지만...

 

출력되는 주소값이 서로 다르며 같은 주소에 1을 더하는데 독립적으로 1씩 증가한다.

위 결과처럼 나오는 이유는 모든 실행중인 프로그램은 각자 고유의 메모리를 갖고 있기 때문이다. 만약에라도 출력된 주소 값이 서로 같다고 하더라도 프로그램이 다르면 서로 다른 메모리이다.

 

전문용어를 사용하면, 각 프로세스는 각자의 가상 주소 공간을 갖는다고 할 수 있다. 운영체제에서 가상 주소를 실제 주소로 매핑(mapping)한다. 이렇게 하는 이유는 보안 때문이다. 만약에 실제 주소에 접근이 가능하게 된다면 운영체제 더 나아가서 컴퓨터의 안정성을 보장할 수 없을 것이기 때문이다. 그래서 실행 중인 프로그램이 메모리를 건드릴 때 다른 프로세스의 메모리에는 영향이 없다. 그래서 실제(Physical) 메모리운영체제의 관리를 받는 공유 자원(Shared Resource)이다. 

반응형

'OS' 카테고리의 다른 글

2장. 가상화  (0) 2020.02.07
1-4장. 운영체제 개요 - 설계 목표와 역사  (0) 2020.02.04
1-3장. 운영체제 개요 - 영속성  (2) 2020.02.04
1-2장. 운영체제 개요 - 병행성  (0) 2020.02.04
1장. 운영체제의 개요  (0) 2020.02.04
Comments