본문 바로가기

CS/운영체제

[OS] 운영체제 개요

이 글은 '운영체제 아주 쉬운 세가지 이야기' 책을 학습하고 정리한 내용입니다.

 

 

운영체제 아주 쉬운 세 가지 이야기

운영체제 아주 쉬운 세 가지 이야기

www.aladin.co.kr

 

 


 

 

운영체제란?

 OS(운영체제)란 프로그램을 쉽게 실행시키고, 여러 프로그램을 하나의 컴퓨터에서 동작할 수 있도록 하며, 여러 프로그램이 하나의 메모리를 함께 공유할 수 있게 하며, 프로그램이 컴퓨터의 물리적인 장치와 상호작용할 수 있게 도와주는 소프트웨어를 말한다.

 

 OS에서 위와 같은 기능들을 지원하기 위해, 도입한 핵심적인 개념은 ‘가상화(virtualization)’, ‘병행성(concurrency)’, ‘영속성(persistence)’이다. 가상화를 지원한다는 측면에서 가상 머신(virtual machine)리가 불리기도 하며, 시스템 자원을 여러 프로그램이 함께 공유할 수 있게 한다는 점에서 자원 관리자(resource manager)라고 불리기도 한다.

 

CPU 가상화

 OS는, 하드웨어의 도움을 받아, 스스템에 매우 많은 수의 가상 CPU가 존재하는 듯한 환상(Illusion)을 만들어 낸다. 하나의 CPU 또는 소규모의 CPU 집합을 무한개의 CPU가 존재하는 것처럼 변환하여 동시에 많은 수의 프로그램을 실행시키는 것은 CPU 가상화라고 말한다.

 

 

메모리 가상화

 각 프로세스는 자신만의 가상 주소 공간을 갖는다. OS는 메모리 가상화를 통해, 가상 주소 공간을 실제 컴퓨터의 물리 메모리 공간에 매핑한다. 하나의 프로그램이 수행하는 각종 메모리 연산은 다른 프로그램의 주소 공간에 영향을 주지 않게된다.

 

 

병행성

 병행성은 프로그램이 한 번에 많은 일을 수행하고자 할때 발생하는 문제를 해결하기 위한 개념을 말한다. 구체적으로는, 멀티 쓰레드 환경에서 각 쓰레드들이 공유 자원을 다룰 경우, 공유 자원의 데이터 정합성이 유지되도록 하는 개념이다. 더 구체적으로 설명하자면 아래의 예시를 들 수 있다.

int counter = 0;
void *worker(void *arg){
		int i;
		for(i = 0; i < 100; i++){
				counter++;
		}
		return NULL;
}

int main(int argc, char *argv[]){
		pthread_t p1, p2;
    
		Pthread_create(&p1, NULL, worker, NULL);
		Pthread_create(&p2, NULL, worker, NULL);
		Pthread_join(p1, NULL);
		Pthread_join(p2, NULL);
		printf("Final Value : %d\\n" , counter);
}

 

 위 코드는 두개의 쓰레드가 하나의 공유 자원에 대해 덧셈 연산을 수행하는 코드이다.

 

 p1 쓰레드가 counter 변수에 1을 100번 더하고, p2 쓰레드가 동일한 연산을 수행한다면 counter 변수의 값은 200이 나와야 한다. 하지만 그럴까? 위 상태로는 보장할 수 없다. 왜냐하면 잘못된 가정을 갖고 생각했기 때문이다.

컴퓨터에서 덧셈 연산은 하나의 동작으로 보여지지만, 실제로는 대략 3단계로 나눠진다.

  1. counter 값을 메모리에서 레지스터로 적재
  2. 레지스터의 값을 1 증가
  3. 레지스터의 값을 메모리의 counter 변수 공간에 저장

 위 3단계의 명령어들일 원자적(atomic)하게 동작하지 않기 때문에 발생하는 문제이다. 세 단계가 각 쓰레드 별로 순차적으로 동작한다는 것을 보장할 수 없기 때문이다. (여기서 원자적이라고 함은, 여러개의 동작이 마치 하나의 동작처럼, 다른 프로그램에 방해를 받지 않고 수행될 수 있음을 의미한다.)

 

 

영속성

 데이터는 영속적으로 저장할 수 있는 하드웨어나 소프트웨어를 필요로 한다. 이를 지원하기 위해 저장 장치는 모든 시스템에 필수적이다. 컴퓨터에서 디스크를 관리하는 운영체제 시스템을 파일 시스템이라고 부른다. 영속성 개념은 이러한 파일 시스템이 안전하고 효율적인 방식으로 동작하도록 하는 것과 관련이 있다.

 

 

시분할 시스템이란?

 시분할 시스템은 운영체제가 사용하는 가장 기본적인 자원 공유 기법이다. 한 개체가 잠깐 자원을 사용한 후, 다른 개체가 또 잠깐 자원 사용하고, 다 다음 개체가 사용하면서, 동일한 자원을 여러 개체(혹은 프로그램)이 사용하게 된다. 이러한 시분할 기법은 매우 빠르게 변환되기 때문에, 사용자 입장에서는 여러 프로그램이 동시에 동작하는 것 같은 착각을 불러 일으킨다. 사실 앞서 언급한 “여러 프로그램이 동시에 동작하는 것 같은 착각”이 CPU 가상화의 목적이다. 시분할 시스템은 이러한 CPU 가상화를 구현하기 위한 알고리즘 혹은 정책이라고 표현할 수 있다.

 

 시분할 시스템을 구현하기 위해서, CPU를 점유하는 프로그램들이 전환될 때, 각각의 프로그램들은 CPU를 점유하고 있을 때의 자신의 상태값들을 유지하고 있어야 한다. 실행되고 있는 프로그램의 개념을 “프로세스”라고 부른다. 구현의 측면에서 보면, 프로세스는 데이터를 저장해둔 상태에 불과하다. 그러나, 이러한 개념을 도입함으로써, 프로그램을 개발하는 프로그래머는 시스템 내부동작이나 그외 부차적인 사항들을 고려하지 않아도 괜찮게 되었다. (프로세스와 프로세스의 상태 값을 저장하는 자료구조는 다른 포스팅에서 이어가고자 한다.)

https://www.geeksforgeeks.org/time-sharing-operating-system/

 

'CS > 운영체제' 카테고리의 다른 글

[OS] I/O 장치 - 폴링 & 인터럽트 & DMA  (0) 2024.01.22
[OS] 시스템콜, 그리고 관련된 개념들  (0) 2024.01.17