일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- scheduling policy
- 미국
- 여행
- 7월4일
- 코딩
- 직업으로서의 정치 서평
- CLRS
- 맛집
- Lock
- 운영체제 강의
- Snap!
- 잘 짜인 코드
- 독립기념일
- 스크래치
- 프로그래밍
- list
- Scratch
- The beauty and Joy of computing
- Operating System
- 푸드트럭
- Jupyter Notebook
- 균형의 정치
- 버클리
- Deep Learning
- insertion Sort
- 영어논문
- Process
- concurrency
- control flow
- xv6
- Today
- Total
여행다니는 펭귄
Operating System 이란? 본문
Q1. 프로그램이 실행(Process, Task)되면 컴퓨터 내에서는 어떤 일이 일어날까요?
Process란?
실행되는 프로그램을 의미, Processor(=CPU)로 Process와는 다르다.
Task는 Process를 Linux 개발환경에서 칭하는 말.
Program 이란?
다수의 Instruction으로 이루어진 Binary File.
Disk(Program) -> Memory(Task[Code, Data]) ①- Cpu(② ③[Instructions])
0. Disk에 저장되어 있는 Program이 Memory로 올라오고
1. CPU가 instruction을 Memory로 부터 ①Fetch(가져오다) 합니다
2. ② Decode : 어떤 Instruction을 실행해야 할지 알아냅니다.
3. ③ Execute : 실행하기 (ex: 곱셈, 메모리 쓰기/읽기...)
4. CPU가 다음 instruction을 읽고 ① ② ③을 반복합니다.
Q2 . 그렇다면 Operating System (OS)이란 무엇일까요?
The OS is in charge of making sure the system operate correctly and efficiently
Operating System이란 system이 정확하고 효율적으로 만들어주는 역할을 하는 프로그램입니다.
예시) Program이 실행 되는것, Memory Share, File System..
자 그렇다면 우리(User)는 Operating System을 어떻게 사용하여야 할까요?
바로 System Call을 사용합니다.
Q3. System Call이란 무엇이고 왜 필요한 것일까요?
Task -> System Call interface -> Operating System -> Computer
저희가 Operating System을 직접 사용할 수 있게 되면 어렵고, 많은 문제가 생깁니다(보안, 해킹 등등..)고로 OS에서 제공하는 기능인 System Call만을 사용하게 해 주는 것이죠.보통의 OS는 수백개 정도의 System Call을 제공합니다.
기능 예시) To run Program, to access memory, and to acess devices
그렇다면 Operating System은 Resource Manager 라고 부를 수 있겠군요?뭐 많은 프로그램을 실행하게 해주기도 하고. -> (Cpu Sharing)어떤 프로그램이 어떤 메모리를 얼만큼 쓸 건지도 정해줘야하고 -> (Sharing Memory)많은 프로그램이 외부 저장 장치를 쓰게 도와주니까요 -> (Sharing Disks)
그렇다면 위와 같은 작업은 어떻게 진행되는 것일까요?
- Virtualization
- Concurrency
- Persistence
에 의해 진행되게 됩니다. 오늘은 간단하게 저 세 용어의 컨셉트에 대해서만 알아보고 다음에 더 자세히 알아보도록 해요 :>
Virtualization
Physical resource -> Virtual form
Operating System 은 실제 저장공간, Cpu, Memory를 Virtual form으로 바꿔줍니다.
① CPU Virtualization ② Memory Virtualization ③ Storage Virtualization
이는 훨씬 더 general 하고 powerful 하며 무엇보다도 사용하기 쉽다는 장점이 있죠.
이런 것을 해주기 때문에 우리는 OS를 Virtual Machine 이라고 부르기도 해요.
1. How to Virtualize CPU
컴퓨터에 CPU 몇개 있나요? 8개? 4개? Core 개수마다 다르죠?
이런 개수에 상관없이 OS는 CPU가 어마어마하게 많다고 생각합니다. 왜냐구요? 여러 프로그램이 동시실행 되어야 하니까요. 이것이 바로 CPU 가상화의 주 개념입니다.
예시) 하이퍼스레딩 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
하이퍼스레딩 - 위키백과, 우리 모두의 백과사전
하이퍼스레딩 위키백과, 우리 모두의 백과사전.
ko.wikipedia.org
참고 : 이 Thread는 Processor Thread가 아님
그렇다면 저희 한번 Example을 들어봅시다.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/time.h>
4 #include <assert.h>
5 #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); // Repeatedly checks the time and returns once it has run for a second
printf("%s\n", str);
}
return 0;
}
이렇게 되었을때
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
처럼 실행이 되게 됩니다.
2. How to Virtualize Memory?
OS는 각 프로세스가 침해되지 않는 메모리 공간을 가지고 있다고 생각하도록 만들어야 합니다. 그리고 겹치지 않도록 이 Address space를 Physical memory에 제대로 Mapping 해야 하죠.
그렇다면 실제로 메모리가 침범되는지 아닌지 예시를 통해서 알아볼까요?
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
int
main(int argc, char *argv[])
{
int *p = malloc(sizeof(int)); // a1: allocate some memory
assert(p != NULL);
printf("(%d) address of p: %08x\n",
getpid(), (unsigned) p); // a2: print out the address of the memmory
*p = 0; // a3: put zero into the first slot of the memory
while (1) {
Spin(1);
*p = *p + 1;
printf("(%d) p: %d\n", getpid(), *p); // a4
}
return 0;
}
를 실행하면
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
...
놀랍게도 메모리 침범은 일어나지 않았죠. 늘어났다면 p: 1 p: 2 ... p: 6 가 되었겠죠?
이 말은 각자 가상 메모리 주소인 memory adress for p : 00200000 가 같더라도 물리적 주소로 변환되는 과정에서 다른 주소를 할당받게 된다는 의미입니다.
3. How to Virtualize Storage?
[4 kb byte block][][][][][....][] -> ./root/folder/file1
매우 큰 메모리 공간을 file and directory hierarchy로 바꿔줘서 보기 편하게 해주는 역할을 합니다.
Concurrency
Occurs when many program runs
이 개념을 이해하기 위해서는 예시를 먼저 봐야합니다.
include <stdio.h>
include <stdlib.h>
include "common.h"
volatile int counter = 0; // 최적화에서 제거
int loops;
void *worker(void *arg) {
int i;
for (i = 0; i < loops; i++) {
counter++;
}
return NULL;
}
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "usage: threads <value>\n");
exit(1);
}
loops = atoi(argv[1]);
pthread_t p1, p2;
printf("Initial value : %d\n", counter);
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);
return 0;
}
이 경우 main이 두개의 쓰레드를 생성하게 되는데요 (쓰레드 개념은 추후 Concurrency part를 제대로 다룰 때 소개하도록 하겠습니다. )
쓰레드는 거의 동시에 돌아가게 됩니다.
이 코드를 실행한 결과는 어떻게 될까요?
prompt> gcc -o thread thread.c -Wall -pthread
prompt> ./thread 1000
Initial value : 0
Final value : 2000
prompt> ./thread 100000
Initial value : 0
Final value : 143012 // huh??
prompt> ./thread 100000
Initial value : 0
Final value : 137298 // what the??
어째서 이런 결과가 나타나게 되는 것일까요? (사실 thread 1000 input도 2000이 나오지 않을 수 있다 "ㅅ")
추후 소개하겠지만, 이것이 바로 Thread의 Concurrency Issue 입니다.
이렇게 메모리 스택을 오염하는 행위 즉 그러니 thread 10000을 했을 때도 20000이 안정적으로 나오도록 돕는 것이 Operating System의 역할입니다.
(엄밀하게 말하면 OS는 도움을 주는 수준이긴 하지만.. 그것은 추후에 Context Switching에 대해 배우고 난 뒤에 알게 될 것!
Persistence
how to keep our volatile(휘발성) memory?
DRAM은 volatile 한 특성이 있습니다. 우리가 컴퓨터의 전원을 끄면 빵 하고 날아가버리는 것이죠

그런데 우리가 컴을 껐다 켜도 제대로 사용하려면 영구적으로 저장되어야하는데 이 부분을 유지시켜주는것이 바로 Persistence 입니다.
open(), write(), close()등의 System call을 통해 디스크에다가 저장을 해주는것이 그 예시입니다.
그 뿐 아니라 우리가 컴퓨터를 비정상 종료 했을때 그 이전에 실행되던 프로세서들의 기록이 남아있는 경우를 본 적도 있을 텐데, 그것이 바로 OS가 해주는 일이랍니다.
여기까지가 Operating System의 기본 Concept이며 추후 글에
이러한 Concept를 어떻게 구현할 것인지를 소개하겠습니다.
'컴퓨터 > 운영체제' 카테고리의 다른 글
Concurrency는 뭘까요? (0) | 2021.10.17 |
---|---|
Scheduling Policy는 어떻게 짜야 할까요? (0) | 2021.10.17 |
왜 Direct Execution을 하지 않을까? (0) | 2021.10.08 |
Process 란 무엇일까? (0) | 2021.09.28 |
Operating System : 운영체제 (0) | 2021.09.27 |