본문 바로가기

CS지식

[운영체제] 가상화에 대한 간단한 정리

728x90

 

참고하는 책 : 운영체제 아주 쉬운 세 가지 이야기

참고 : https://github.com/remzi-arpacidusseau/ostep-translations/tree/master/korean

 

ostep-translations/korean at master · remzi-arpacidusseau/ostep-translations

Various translations of OSTEP can be found here. Help the cause and contribute! - remzi-arpacidusseau/ostep-translations

github.com

 

/* 운영체제의 중요성 */

현재는 인턴으로 백엔드 개발자로 생활을 하고 있다. 상사분들과 커피챗을 하면서 백이면 백 내게 조언하는 점은 세 가지이다.
코딩테스트, 운영체제, HTTP !! 취준생활을 하면서 여러 기술을 사용해보는 것은 좋지만 기초가 확실히 필요하다고 한다. 지금 당장은 중요성을 못 깨달을 지 몰라도 시간이 있을 때 공부를 하지 않으면 나중에 무너진다고 한다.. 이러는 이유가 어떤 문제가 생겼을 때 (코딩만으로 해결하지 못하는 문제일 경우) 운영체제 지식, HTTP 지식이 문제의 해결책을 제시해줄 경우가 다반수라고 한다. 그래서 추천받은 책으로 운영체제 공부를 시작하려고 한다.

 

/* 운영체제 개요 */

책의 개요부터 게시글을 쓰도록 하겠다.

 

/* 운영체제란? */

이 책에서는 '시스템을 사용하기 편리하면서 정확하고 올바르게 동작하는 소프트웨어' 라고 표기한다. 하지만 내게는 이 말이 어려웠다. 또한 책의 뒷면에는 이렇게 나와 있다. '하드웨어와 소프트웨어가 만나는 지점.' 을 운영체제로 부른다.

 

운영체제는 가상화 기법을 사용한다. 프로세서, 메모리, 디스크와 같은 물리적인 자원(하드웨어)을 이용하여 가상 형태의 자원(소프트웨어)을 생성한다. 이렇게 보니 하드웨어와 소프트웨어가 만나는 지점이라는 문장이 이해가 간다. 또한 이런 이유때문에 운영체제를 가상 머신이라고도 부른다.

 

운영체제는 응용 프로그램이 사용가능한 수백 개의 시스템 콜을 제공한다. 그래서 운영체제는 라이브러리를 제공한다고도 말한다.

 

/* 가상화 */

가상화는 많은 프로그램들이 CPU를 공유하여 동시에 실행될 수 있게 한다. 

1 #include <unistd.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include“common.h ”
5 int
6 main(int argc, char *argv[])
7 {
8 int *p = malloc(sizeof(int)); // a1
9 assert(p != NULL);
10 printf(“(%d) memory address of p: %08x\n ”,
11 getpid() , (unsigned) p); // a2
12 *p = 0; // a3
13 while (1) {
14 Spin(1);
15 *p = *p + 1;
16 printf(“(%d) p: %d\n ”, getpid() , *p); // a4
17 }
18 return 0;
19 }

 

위의 mem.c 라는 코드가 있고

./mem &; ./mem &

 

위의 명령어를 실행하면 이 책에서는 두 개의 프로세스는 모두 0x200000 라는 주소를 반환한다. 즉 두개의 프로세스는 같은 주소에 메모리를 할당받는다. 하지만 독립적으로 0x200000 번지의 값을 갱신한다. 각 프로그램은 물리 메로리를 다른 프로그램과 공유하는 것이 아니라 각자 자신의 메모리를 갖는다. 이는 메모리 가상화를 하기 때문에 가능하다. 각 프로세스는 자신만의 가상 주소 공간을 갖는다. 운영체제는 이 가상공간의 컴퓨터의 물리 메모리로 매핑한다.

 

하나의 프로그램이 수행하는 각종 메모리 연산은 다른 프로그램의 주소 공간에 영향을 주지 않는다. 실행 중인 프로그램의 입장에서는 자기 자신만의 물리 메모리를 갖는 셈이다. 실제로는 물리 메모리는 공유자원이고 운영체제에 의해 관리된다.

 

/* 병행성 */

같은 메모리 공간에 다수의 쓰레드가 동시에 실행된다고 할 때 올바르게 동작해야 한다.

 

/* 영속성 */

데이터를 영속적으로 저장할 수 있는 하드웨어와 소프트웨어가 필요하다.

 

영속적으로 저장하기 위해서는 모든 프로그램이 파일 시스템에 접근하면 안된다. 그래서 시스템 콜이 등장했다. 사용자 응용 프로그램은 사용자 모드 (user mode)라고 불리는 상태에서 실행된다. 사용자 모드에서는 응용 프로그램이 할 수 있는 일을 하드웨어적으로 제한한다. 즉 파일을 읽고 쓰는 능력 (하드웨어에 직접적으로 관여하는 작업)은 제한이 된다. 시스템 콜을 통해 할 수 있다. 시스템 콜은 보통 trap 이라는 하드웨어 명령어를 이용하여 호출된다. 시스템 콜 시작 시, 하드웨어는 미리 지정된 트랩 핸들러 (trap handler) 함수에게 제어권을 넘기고 사용자모드에서 커널모드 (kernel mode)로 격상시킨다. 운영체제가 서비스를 완료하면 return-from-trap 이라는 특수 명령어를 사용하여 제어권을 다시 사용자에게 넘긴다. 이 명령어는 사용자 모드로 다시 전환한다.

728x90