
Operating System
운영체제란, 하드웨어를 애플리케이션에 유용한 형태로 변환하는 소프트웨어를 의미한다.
프로그램이 실행될 때, 프로세서는 명령어를 반입(fetch)하고, 해석(decode)하고, 실행(execute)한다.
이러한 방식을 반복하는데, 이것이 바로 VonNeumann컴퓨팅 모델의 기초이다.
이렇듯, 프로그램 간의 메모리 공유를 가능하게 하고, 장치와 상호작용하며 다양한 일을 할 수 있게 해주는 소프트웨어가 바로 운영체제인 것이다.
운영체제에 문제가 생긴다면, 컴퓨터 시스템에 문제가 생기는 것이기에 매우 중요하다!
Abstraction (추상화)
컴퓨터에는 물리적으로 존재하는 자원이 있다. Processor, Memory, Disk들이 해당한다.
운영체제는 이런 물리적 자원들을 추상화하여 더 일반적이고, 강력하며, 사용하기 편한 형태로 바꿔준다.
ex) 사용자가 메모리 주소는 알고 있지만, 실제 물리적 주소는 모른다.
이 때문에 사용자는 OS가 제공하는 가상 자원만 사용하기 때문에 "Virtual Machine"이라고 부르기도 한다.
System Call
시스템 콜 호출을 통해 사용자는 OS에게 어떤 일을 해야 할지 지시할 수 있다.
운영체제는 수백 개의 시스템 콜을 제공한다. 프로그램 실행 (Run programs), 메모리 접근 (Access memory), 디바이스 접근 (Access devices)이 바로 그것들이다.
Virtualizing the CPU
OS는 하나의 CPU 또는 소규모 CPU 집합을 무한의 CPU가 존재하는 것처럼 반환하여 동시에 많은 수의 프로그램을 실행시킨다. 이렇듯, 시스템에 매우 많은 수의 가상 CPU가 존재하는 듯한 환상(illusion)을 만들어내는 것을 CPU 가상화라고 한다.
코드로 확인해보자.
#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<assert.h>
#include“common.h”
int main(intargc, 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−ocpucpu.c−Wall
prompt> ./cpu“A”
A
A
A
A
∧C
prompt>
만약에 여러 인스턴스를 동시에 실행시켜 본다면 어떻게 될까.
프로세서가 하나에 없음에도 프로그램 4개 모두 동시에 실행되는 것처럼 보인다. 즉, 환상을 일으킨 것이다.
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
...
Virtualizing Memory
malloc()을 호출하여 메모리를 할당하는 아래의 코드를 살펴보자.
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include“common.h”
int main(intargc, char*argv[]) {
int*p=malloc(sizeof(int)); //a1
assert(p != NULL);
printf(“(%d)memoryaddressof p: %08x\n”,
getpid(), (unsigned)p); //a2
*p=0; //a3
while(1){
Spin(1);
*p=*p+1;
printf(“(%d)p:%d\n”, getpid(), *p);//a4
}
return0;
}
이 코드의 출력은 다음과 같다.
과정을 설명하자면, 메모리를 할당 받아서 메모리의 주소를 출력한다. 새로 할당받은 메모리의 첫 슬롯에 0을 넣고, 1초 후 1씩 값을 증가시킨다.
prompt> ./mem
(2134) memory address of p: 00200000
(2134) p: 1
(2134) p: 2
(2134) p: 3
(2134) p: 4
(2134) p: 5
∧C
같은 프로그램을 여러 번 실행시켜 보면 어떻게 될까.
프로그램들은 같은 주소에 메모리를 할당지만 (00200000), 각각 독립적으로 00200000 번지의 값을 갱신한다.
즉, 각자 자신의 메모리를 가지고 있는 것처럼 보이고 있다.
prompt> ./mem &; ./mem &
[1] 24113
[2] 24114
(24113) memory address of p: 00200000
(24114) memory address of p: 00200000
(24113) p: 1
(24114) p: 1
(24114) p: 2
(24113) p: 2
(24113) p: 3
(24114) p: 3
(24113) p: 4
(24114) p: 4
...
운영체제가 메모리 가상화(virtualizing memory)를 하기 때문에 이런 현상이 생긴 것이다.
Concurrency
운영 체제는 처음에 하나의 프로세스를 실행하면서 여러 가지를 동시에 저글링하고 있다.
현대 프로그램은 프로세스 내부에서 여러 스레드를 동시에 실행시키는데, 이때 여러 스레드가 동시에 실행되다 보면 병행성 문제가 발생할 수 있다.
Persistence
DRAM과 같은 장치는 휘발성으로 값을 저장하기 때문에 데이터를 영속적으로 저장하기 위해서는 하드웨어와 소프트웨어가 필요하다.
- Hardware: hard drive, solid-state drives와 같은 I/O 장치
- Software: 디스크를 관리하는 운영체제 소프트웨어를 파일 시스템이라고 부른다.
'3-2 학기 > Operating Systems' 카테고리의 다른 글
| [운영체제] Scheduling (0) | 2025.09.16 |
|---|---|
| [운영체제] Limited Direct Execution (0) | 2025.09.13 |
| [운영체제] xv6 구조 및 동작 원리 (0) | 2024.10.29 |
| [운영체제] Memory API (1) | 2024.10.14 |
| [운영체제] The Abstration : Address Space (0) | 2024.10.13 |