01 ์ฅ - ์ด ์ฑ ์ ๋ํ ๋ํ
-
์์ฃผ ๊ฐ๋จํ ์ด ์ฑ ์ ๋ํ ์๊ฐ๋ฅผ ํ๋ ์ฑํฐ์ด๋ค.
-
๋ ์ฅ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ด ์ฑ ์์ ์์ฃผ ๋์ค๊ฒ ๋๋ ๊ต์์ ํ์์ ๋ํ ํ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
-
ํต์ฌ์ ์ธ ์์ด๋์ด๋ฅผ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ฆฌ์ฒ๋ ํ์ธ๋ง์ ๋ฌผ๋ฆฌํ ์์ฃผ ์ฌ์ด 6๊ฐ์ง ์ด์ผ๊ธฐ๋ผ๋ ๊ฐ์ ๋ ธํธ๊ฐ ์๋ค.
- ๋ฌผ๋ฆฌํ์ด 6๋งํผ ์ด๋ ค์ฐ๋ฉด, ์ด์์ฒด์ ๋ 3๋งํผ ์ด๋ ต๊ธฐ ๋๋ฌธ์, ์ด ์ฑ ์ ์ ๋ชฉ์ด “์ด์์ฒด์ ์์ฃผ ์ฌ์ด ์ธ ๊ฐ์ง ์ด์ผ๊ธฐ"์ด๋ค.
- ์ด ์ฑ
์ ์ด์์ฒด์ ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ 3๊ฐ์ง๋ก ๋๋์ด์ ์ค๋ช
ํ๋ค.
๊ฐ์ํ
,๋ณํ์ฑ
,์์์ฑ
02 ์ฅ - ์ด์์ฒด์ ๊ฐ์
์ด ์ฑ ์์ ๋ค๋ฃจ๊ฒ ๋ ๋ด์ฉ์ด์ง๋ง ์์ฃผ ๊ฐ๋จํ๊ฒ ์ฝ์์ผ๋ก ์ค๋ช ํ๋ ๊ธ์ด ์์ด ๊ฐ์ ธ์๋ค. c/cpp๋ฅผ ๊ณต๋ถํ ๋ ์ด๋ถ์ ๋ธ๋ก๊ทธ์ ๊ฐ์์๋ฃ๋ฅผ ๋ค์๋๋ฐ ์๋์ ์ผ๋ก ์ต๊ทผ์ ์ ๋ก๋๋ ๋ฌธ์์ด๋ค. ๋ด๊ฐ c์ธ์ด๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์์๋ค๋ฉด ์ข์์ ๊ฒ๋ค
-
ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ์์ฃผ ๋จ์ํ ์ผ์ ํ๋ค.
-
ํ๋ก์ธ์๋ ๋ช ๋ ์ด๋ฅผ ๋ฐ์ (fetch)ํ๊ณ , ๋์ฝ๋ฉ(decoding)ํ๊ณ , ์คํ(execute)ํ๋ ์ผ์ ํ๋ค.
-
๊ทธ๋ฆฌ๊ณ ํ๋ก๊ทธ๋จ์ ์ฝ๊ฒ ์คํํ๊ณ , ํ๋ก๊ทธ๋จ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ฅผ ๊ฐ๋ฅ์ผ ํ๊ณ , ์ฅ์น์ ์ํธ์์ฉ์ ๊ฐ๋ฅ์ผํ๊ณ , ๋ค์ํ ํฅ๋ฏธ๋ก์ด ์ผ์ ํ ์ ์๋
์ํํธ์จ์ด
๊ฐ์ด์์ฒด์
์ด๋ค. -
์ด์์ฒด์ ๋ ์์์ ์ธ๊ธํ ์ผ์ ํ๊ธฐ ์ํด์
Virtualization
์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค. -
์ค์ ํ๋ก์ธ์, ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์ธ ์์์ ์ด์ฉํด์ ์ผ๋ฐ์ ์ด๊ณ , ๊ฐ๋ ฅํ๊ณ , ์ฌ์ฉ์ด ํธ๋ฆฌํ ๊ฐ์ ํํ์ ์์์ ์์ฑํ๋ค.
-
๊ทธ๋์ ์ด์์ฒด์ ๋ฅผ ๊ฐ์๋จธ์ ์ด๋ผ๊ณ ํ๊ธฐ๋ ํ๋ค.
-
๊ฐ์ํ๋ฅผ ์ด์ฉํด์ ์ค์ ์ฌ์ฉ์๋ค์ด ํด๋น ์์์ ์ ๊ทผ ํ ์ ์๋ API๋ฅผ ์ ๊ณตํ๋ฉฐ, Application์ด ์ฌ์ฉ ํ ์ ์๋ ์์คํ ์ฝ์ ์ ๊ณตํ๋ค.
02.1 CPU ๊ฐ์ํ
ํต์ฌ ์ง๋ฌธ : ์์์ ์ด๋ป๊ฒ ๊ฐ์ํ ์ํค๋๊ฐ?
-
์ด์์ฒด์ ๊ฐ ์์์ ๊ฐ์ํ ์์ผ์ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ๊ฑด ๋๋ฌด ๋น์ฐํ๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ๋ฌธ์ ๋ ์ง๋ฌธ์ด ๋ ์ ์๋ค.
-
์ด๊ฒ์ ์ด๋ป๊ฒ, ์ด๋ ํ ๊ธฐ๋ฒ๊ณผ ์ ์ฑ ์ผ๋ก, ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก, ์ด๋ ํ ํ๋์จ์ด ์ง์์ด ํ์ํ์ง ์ ๊ฐ์ ์ง๋ฌธ์ด ์ค์ํ๋ค.
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
void Spin(int howlong) {
double t = GetTime();
while ((GetTime() - t) < (double)howlong)
; // do nothing in loop
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: CPU <string>\n");
exit(-1);
}
char *str = argv[1];
while (1) {
Spin(1);
printf("%s\n", str);
}
return 0;
}
- ์ ์ฝ๋๋ CPU๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ด๋ค. ์ด ํ๋ก๊ทธ๋จ์ ์ธ์๋ก ๋ฐ์ ๋ฌธ์์ด์ 1์ด์ ํ ๋ฒ ์์ํ ์ถ๋ ฅํ๋ค.
$ gcc -o CPU CPU.c
$ ./CPU A & ; ./CPU B & ; ./CPU C & ;
-
์ด๋ ๊ฒ ์คํ์ํค๋ฉด ๋ง์น CPU๊ฐ ์ธ ๊ฐ์ธ ๊ฒ ์ฒ๋ผ ABC๊ฐ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์ถ๋ ฅ๋๋ค.
-
์ด๋ ๊ฒ CPU๋ฅผ ๊ฐ์ํ ์ํค๋ ๊ฒ์ ์ ์ฉํ์ง๋ง, ์๋ก์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค์ด ๋์ผํ ์์ ์ ์คํ๋์ด์ผ ํ๋ ํ๋ก๊ทธ๋จ์ด ๋ง์์ง๋ฉด, ์ด๋ ํ ํ๋ก๊ทธ๋จ์ด ์คํ๋์ด์ผ ํ๋๊ฐ ์ ๊ฐ์ ์ด์๊ฐ ์๊ธด๋ค.
-
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ํ์ํ ์ ์ฑ ๊ฐ์ ๊ฒ๋ค์ด ์๋๋ฐ, ์ด๋ฒ ์ฅ์์๋ ์ด๋ฌํ ์ ์ฑ ๋ค์ ๋ค๋ฃจ๊ฒ ๋๋ค.(์ฆ ์์ ๊ด๋ฆฌ์๋ก์์ ์ด์์ฒด์ ์ญํ ์ ๋ํด ๋ค๋ฃฌ๋ค.)
02.2 ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ํ
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
double GetTime() {
struct timeval t;
int rc = gettimeofday(&t, NULL);
assert(rc == 0);
return (double)t.tv_sec + (double)t.tv_usec / 1e6;
}
void Spin(int howlong) {
double t = GetTime();
while ((GetTime() - t) < (double)howlong)
; // do nothing in loop
}
int main(int argc, char *argv[]) {
int *p = malloc(sizeof(int)); // ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋น ๋ฐ๋๋ค.
assert(p != NULL);
printf("(%d) address pointed to by p: %p\n", getpid(), p); // process์ id๋ฅผ ์ถ๋ ฅํ๋ค.
*p = 0; // ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ์ 0์ ๋ฃ๋๋ค.
while (1) {
Spin(1);
*p = *p + 1;
printf("(%d) p: %d\n", getpid(), *p); // process์ id์ p์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
}
}
-
์ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ด๋ค. ์ด ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ๊ณ , 1์ด์ ํ ๋ฒ์ฉ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๊ฐ์ 1์ฉ ์ฆ๊ฐ์ํจ๋ค.
-
๊ทธ๋ฌ๋ฉด์ ์ฃผ์์ ์๋ ๋ด์ฉ์ฒ๋ผ process์ id์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ถ๋ ฅํ๋ค.
๋ค์์ ํ๋ก๊ทธ๋จ์ ๋์์ ์คํ์ํจ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
$ gcc -o MEM MEM.c
$ ./MEM & ; ./MEM & ; ./MEM & ;
[1] 7890
[2] 7891
[3] 7892
(7890) memory address of p: 0x200000000
(7891) memory address of p: 0x200000000
(7892) memory address of p: 0x200000000
(7890) p: 0
(7891) p: 0
(7892) p: 0
(7890) p: 1
(7891) p: 1
(7892) p: 1
(7890) p: 2
(7891) p: 2
(7892) p: 2
(7890) p: 3
(7891) p: 3
(7892) p: 3
...
-
์ฃผ๋ชฉํด์ผ ํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ด๋ค. ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๋ชจ๋ ๊ฐ๋ค.
-
์ด ์ญ์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ํ์ ๊ฒฐ๊ณผ์ด๋ค. ํ๋ก๊ทธ๋จ์ ์์ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ์ค์ ๋ก๋ ์ด์์ฒด์ ๊ฐ ์ ๊ณตํ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
-
์ด์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ํ ์ญ์ ์ด ์ฑ ์์ ๋ค๋ฃจ๊ฒ ๋๋ค.
02.3 ๋ณํ์ฑ (Concurrency)
-
ํ๋ก๊ทธ๋จ์ด ํ ๋ฒ์ ๋ง์ ์ผ์ ํ๋ ค ํ ๋ (๋์์) ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๋ค๋ฃฌ๋ค.
-
์ฌ์ค ์ด์์ฒด์ ๋ ํ ํ๋ก์ธ์ค ์คํ, ๋ค์ ํ๋ก์ธ์ค ์คํ, ๋ค์ ํ๋ก์ธ์ค ์คํ, … ์ด๋ฐ์์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํํ๋๋ฐ ์ด ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ค์ด ์๊ธด๋ค.
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
volatile int counter = 0;
int loops;
// loop ํ์๋งํผ counter๋ฅผ ์ฆ๊ฐ์ํค๋ ํจ์
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]); // ์ธ์๋ก ๋ฐ์ ๊ฐ์ loops์ ์ ์ฅํ๋ค.
pthread_t p1, p2;
printf("Initial value : %d\n", counter);
double t1 = GetTime();
pthread_create(&p1, NULL, worker, NULL); // thread p1 worker ํจ์ ์คํ
pthread_create(&p2, NULL, worker, NULL); // thread p2 worker ํจ์ ์คํ
pthread_join(p1, NULL);
pthread_join(p2, NULL);
double t2 = GetTime();
printf("Final value : %d\n", counter);
printf("Time : %f\n", t2 - t1);
return 0;
}
-
์ด ์ฝ๋๋ ๋ณต์กํด๋ณด์ด์ง๋ง ์ ํ ๊ทธ๋ ์ง ์๋ค. thread 2๊ฐ๋ฅผ ์์ฑํ๊ณ , ๊ฐ๊ฐ์ thread์์ worker ํจ์๋ฅผ ์คํํ๋ค.
-
worker ํจ์๋ ์ธ์๋ก ๋ฐ์ loop ํ์๋งํผ counter๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
-
์ค์ ์คํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
$ gcc -o THREAD THREAD.c -lpthread
$ ./THREAD 1000
Initial value : 0
Final value : 2000
Time : 0.000000
-
์ผ๋จ ๊ฐ์ด 2000์ด ๋์๋ค. ์ด๋ 2๊ฐ์ thread๊ฐ ๊ฐ๊ฐ 1000๋ฒ์ฉ counter๋ฅผ ์ฆ๊ฐ์์ผฐ๊ธฐ ๋๋ฌธ์ด๋ค.
-
๋ ๋ง์ ํ์๋ก ์คํํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
$ ./THREAD 100000
Initial value : 0
Final value : 143012
Time : 0.000000
-
์ด๋ฒ์๋ 143012๊ฐ ๋์๋ค. ์ธ์ * ์ค๋ ๋์ ๊ฐ์ ๋งํผ counter๊ฐ ์ฆ๊ฐํด์ผ ํ๋๋ฐ ๊ทธ๋ ์ง ์์ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
-
์ค์ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํค๋ ์ฝ๋์ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
- counter๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ง์คํฐ๋ก ๋ถ๋ฌ์จ๋ค.
- ๋ ์ง์คํฐ์ 1์ ๋ํ๋ค.
- ๋ ์ง์คํฐ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ค.
-
์ด ์ธ๊ฐ์ง ์์ ์ด ์์์ฑ์ ๊ฐ์ง์ง ์๋๋ค. ์ฆ, ๋ค๋ฅธ ์ค๋ ๋๊ฐ counter๋ฅผ ์ฝ์ด๊ฐ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ counter๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์๋ค.
-
์ด๋ฌํ ๋ฌธ์ ๊ฐ Concurrency ๋ฌธ์ ์ด๋ฉฐ, ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ๋ค์ ์ด ์ฑ ์์ ๋ค๋ฃฌ๋ค.
๋ณํ์ฑ์ ํต์ฌ ์ง๋ฌธ : ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ ๋ณํ ํ๋ก๊ทธ๋จ์ ์ด๋ป๊ฒ ์์ฑํด์ผ ํ๋๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ค์์ ์ฐ๋ ๋๊ฐ ๋์์ ์คํ๋จ๋ค๊ณ ํ ๋, ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ ํ๋ก๊ทธ๋จ์ ์ด๋ป๊ฒ ์์ฑ ํ ์ ์๋๊ฐ? ์ด์์ฒด์ ๋ ์ด๋ ํ ๊ธฐ๋ณธ ๊ธฐ๋ฒ์ ์ ๊ณตํ๋๊ฐ, ํ๋์จ์ด๋ ์ด๋ ํ ์ง์์ ์ ๊ณตํ๋๊ฐ? ๋ณํ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ธฐ๋ณธ ๊ธฐ๋ฒ๋ค๊ณผ ํ๋์จ์ด ๊ธฐ๋ฅ์์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋๊ฐ?
02.4 ์์์ฑ (Persistence)
- RAM์ ์ฝ๊ณ ์ฐ๊ธฐ๊ฐ ๋ ์ง์คํฐ, ์บ์์ ๋นํด์๋ ๋๋ฆฌ์ง๋ง, ๊ทธ๋๋ ์ถฉ๋ถํ ๋น ๋ฅด๋ค.
์์ | ์๊ฐ (ํ์ค ์๊ฐ์ผ๋ก ํ์ฐ) |
---|---|
CPU ์ฌ์ดํด | 1์ด |
L1 ์บ์ ์ ๊ทผ | 2์ด |
L2 ์บ์ ์ ๊ทผ | 7์ด |
L3 ์บ์ ์ ๊ทผ | 1๋ถ |
RAM ์ ๊ทผ | 4๋ถ |
NVMe SSD ์ ๊ทผ | 17์๊ฐ |
์ผ๋ฐ SSD ์ ๊ทผ | 1.5์ผ ~ 4์ผ |
์ผ๋ฐ ํ๋๋์คํฌ ์ ๊ทผ | 1 ~ 9๋ฌ |
์์ธ - ์ํ๋์์ค์ฝ ํจํท ์ ์ก ์๊ฐ | 14๋ |
์ถ์ฒ : ๋ด๊ฐ c์ธ์ด๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์์๋ค๋ฉด ์ข์์ ๊ฒ๋ค |
-
๊ทธ๋ฌ๋ RAM์ ์ ์์ด ๊บผ์ง๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ค.
-
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ ์ ์๋ ์์์ฑ์ ๊ตฌํํ๊ธฐ ์ํด ํ๋์จ์ด์ ์ํํธ์จ์ด๊ฐ ํ์ํ๋ค.
-
๋ง์ด๋ค ์๊ณ ์๊ฒ ์ง๋ง, ํ๋์จ์ด๋ I/O ์ฅ์น ํํ๋ก ์ ๊ณต๋๋ฉฐ, ์์ฆ์ ์ฃผ๋ก SSD๋ฅผ ์ฌ์ฉํ๋ค.
-
๋์คํฌ๋ฅผ ๊ด๋ฆฌํ๋ ์ด์์ฒด์ ์ํํธ์จ์ด๋ ํ์ผ ์์คํ ์ด๋ผ๊ณ ํ๋ค. (ํ์ผ์์คํ ์ ์ฌ์ฉ์๊ฐ ์์ฑํ ํ์ผ์ ์์คํ ์ ๋์คํฌ์ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ์ ์ฅํ
์ฑ ์
์ด ์๋ค.) -
์์์ฑ๊ณผ ๊ด๋ จํ ํต์ฌ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ๋ค.
์์์ฑ์ ํต์ฌ ์ง๋ฌธ : ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ๊ฐ ํ์ผ ์์คํ ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์ด์์ฒด์ ์ ์ผ๋ถ๋ถ์ธ๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๊ธฐ ์ํด์๋ ์ด๋ค ๊ธฐ๋ฒ์ด ํ์ํ ๊น? ์ด๋ฌํ ์์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด์ ์ด๋ค ๊ธฐ๋ฒ๊ณผ ์ ์ฑ ์ด ํ์ํ ๊น? ํ๋์จ์ด์ ์ํํธ์จ์ด๊ฐ ์คํจํ๋๋ผ๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
#include <unistd.h>
#include <assert.h>
#include <fcnt1.h>
#include <sys/file.h>
int main(int argc, char *argv[])
{
int fd = open("tmp/file", O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU); // ํ๋ก๊ทธ๋จ์ ์ด์์ฒด์ ์ฒซ ๋ฒ์งธ ํธ์ถ(call)
assert(fd > -1);
int rc = write(fd, "hello world\n", 13); // ํ๋ก๊ทธ๋จ์ ์ด์์ฒด์ ๋ ๋ฒ์งธ ํธ์ถ(call)
close(fd); // ํ๋ก๊ทธ๋จ์ ์ด์์ฒด์ ์ธ ๋ฒ์งธ ํธ์ถ(call)
assert(rc == 13);
/**
* ์ด ์ฒ๋ผ ํ์ผ ์์คํ
์ ์์คํ
์ฝ์ ์ฌ์ฉํ๋ค.
*/
return 0;
}
-
์ด ์ฝ๋๋ ํ์ผ ์์คํ ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ด๋ค. ํ์ผ์ ์ด๊ณ , ์ฐ๊ณ , ๋ซ๋ ์์ ์ ํ๋ค.
-
๋์คํฌ๋ฅผ ์ ๊ทผํด์ ํ์ผ์์คํ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์์คํ ์ฝ์ ํตํด ํ์ผ์ ์์ฑํ๊ณ , ์ฐ๊ณ , ๋ซ์์์๋ค.
-
์ด๋ฌํ ์์คํ ์ฝ์ ํ์คํ ๋์ด์์ด์ ๋ง์น ์ธ์ด์ STL๋ก ์ ๊ณต๋ฐ๋ ๊ฒ์ฒ๋ผ ํธ๋ฆฌํ์ง๋ง,
-
์ค์ ๋ก ๋ด๋ถ์์ ์ผ์ด๋๋ ์ผ์ ๋งค์ฐ ๋ณต์กํ๋ค.
-
์๋ฅผ ๋ค์ด ์ฐ๊ธฐ ์ง์ฐ์๊ฐ๋์ ์ ์ ์ด ๋์๊ฑฐ๋ ๊ณ ์ฅ์ด ๋ฌ์ ๋, ๊ธฐ๋ก ์์๊ฐ ๋ค๋ฐ๋ ์ ์๊ณ , ์ฐ๋ ค๊ณ ๋ชจ์๋ ๋ฐ์ดํฐ๋ ์ด๋ฏธ ์ฐ์์ ์๋ ์๋ค.
-
์ด๋ฐ ๊ฒ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ์ด์์ฒด์ ๋
journaling
,copy-on-write
,checksums
๋ฑ์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋๋ฐ, ์ด๋ฌํ ๊ฒ๋ค๋ ๊ฐ์ด ๋ค๋ฃจ๊ฒ ๋๋ค.
02.5 ์ค๊ณ ๋ชฉํ
์ค๊ณ ๋ชฉํ๋ผ๊ณ ๋์ด ์์ด์ ํ๋ฆ์ ์ ๋งคํ์ง๋ง, ์์ ์์ฃผ์ ์์ ์ธ๊ฐ์ง๋ฅผ ๋ณด๋ฉด์(๊ฐ์ํ, ๋ณํ์ฑ, ์์์ฑ) ์ด์์ฒด์ ๊ฐ ํด์ผํ๋, ํ๊ณ ์๋, ํด์ผํ ์ผ์ ์๊ฒ ๋์์ผ๋, ๊ทธ๊ฒ๋ค์ ์ด๋ป๊ฒ ์ ์ํํ ์ ์์์ง์ ๋ํ ์ค๊ณ ๋ชฉํ๋ฅผ ๋ค๋ฃฌ๋ค๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
-
์ฒซ ๋ฒ์งธ๋ก, ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ชฉํ๋
์์คํ ์ ํธ๋ฆฌํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ํ์ํ ๊ฐ๋ ๋ค์ ์ ์ํ๋ ๊ฒ ์ฆ ์ถ์ํ
์ด๋ค.- ์ด ์ถ์ํ๋ ์ปดํจํฐ ๊ณผํ์ ์์ด์ ๋ชจ๋ ์ผ์ ๋ํ ๊ทผ๊ฐ์ด๋ค.
- ์ถ์ํ๋ก ๊ฐ๋ ์ ์ ์ํด๊ฐ๋ฉฐ ํฐ ํ๋ก๊ทธ๋จ์ ์ดํดํ๊ธฐ ์ฌ์ด ์์ ์ฌ๋ฌ๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด ๋ ผ๋ฆฌ ๊ฒ์ดํธ๋ฅผ ๋ชฐ๋ผ๋ ์ด์ ๋ธ๋ฆฌ์ด๋ก ํ๋ก๊ทธ๋จ์ ์์ฑ ํ ์ ์๊ณ , ์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ๋ชฐ๋ผ๋ C์ ๊ฐ์ high level ์ธ์ด๋ก ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๋ค.
-
๋ ๋ฒ์งธ๋ก, ์ด์์ฒด์ ์ ๊ฐ์ฅ ์ค์ํ ๋ชฉํ๋
์ฑ๋ฅ
์ด๋ค. (minimize the overhead)overhead
๋ ์์คํ ์ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ ์์์ด๋ฉฐ, ์๊ฐ(๋ ๋ง์ ๋ช ๋ น์ด)๊ณผ ๊ณต๊ฐ(๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ)์ ์ธ ์์๋ก ๋๋๋ค.- ์ด ์๊ฐ๊ณผ ๊ณต๊ฐ์ ๋ญ๋น๋ฅผ ์ต์ํ ํ๋ฉด์๋, ์ ์ถฉํ ๋ถ๋ถ์ ์ ์ถฉํ๋ฉด์, ์ฑ๋ฅ์ ์ต๋ํ ํ๋ ๊ฒ์ด ์ด์์ฒด์ ์ ๋ชฉํ์ด๋ค.
-
์ธ ๋ฒ์งธ๋ก,
๋ณดํธ
์ด๋ค.- ์ด์์ฒด์ ์ ํ๋ก๊ทธ๋จ, ํ๋ก๊ทธ๋จ๊ฐ์ ๋ณดํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด๋ค.
- ํ ํ๋ก๊ทธ๋จ์ ์ ์์ ์ธ ๋๋ ์๋์น ์์ ํ๋์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด๋ ์ด์์ฒด์ ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ๋ ๊ฒ์ด ํ์ํ๋ค.
- ๋ณดํธ๋ ์ด์์ฒด์ ์ ์์น ์ค ํ๋์ธ isolation ์์น์ ํต์ฌ์ด๋ค.
-
๋ง์ง๋ง์ผ๋ก
์ ๋ขฐ์ฑ
์ด๋ค.- ์ด์์ฒด์ ๋ ํญ์, ์ง์์ ์ผ๋ก ์คํ๋๊ณ ์์ด์ผ ํ๋ค.
- ์ด์์ฒด์ ๊ฐ ์คํจํ๋ฉด, ๊ทธ ์์์ ๋์๊ฐ๋ ํ๋ก๊ทธ๋จ๋ค๋ ์คํจํ๊ฒ ๋๋ค.
- ์ด๋ฌํ ์ข ์์ฑ ๋๋ฌธ์ ์ด์์ฒด์ ๋ ๋งค์ฐ ๋์ ์ ๋ขฐ์ฑ์ ์๊ตฌ๋ฐ๋๋ค.
-
์ด๋ฌํ ๋ชฉํ๋ค์ ์ด์์ฒด์ ์ ์ค๊ณ์ ๊ตฌํ์ ์์ด์ ์ค์ํ ์์์ด๋ฉฐ, ์ด ์ฑ ์์๋ ์ด๋ฌํ ๋ชฉํ๋ค์ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ธฐ๋ฒ๊ณผ ์ ์ฑ ๋ค์ ๋ค๋ฃฌ๋ค.
์ถ๊ฐ์ ์ผ๋ก ์๋์ง ํจ์จ์ฑ๊ณผ ๋ณด์, ์ด์์ฑ๋ฑ์ ์ธ๊ธํ์ง๋ง, ์ด ์ฑ ์์์ ์ง์ ์ ์ผ๋ก ๋ค๋ฃจ์ง ์๊ณ , ์ค์ ๋ก๋ ์์ ๋ค๊ฐ์ง๊ฐ ์กฐ๊ธ ๋ ์ด์์ฒด์ ์ ํต์ฌ ๋ชฉํ์ด๋ค.
02.6 ๋ฐฐ๊ฒฝ ์๊ฐ (๋ผ๊ณ ๋์ด์์ง๋ง ์ฌ์ค ๊ทธ๋ฅ ์ด์์ฒด์ ์ ์ญ์ฌ)
์ด์ฐฝ๊ธฐ ์ด์์ฒด์ : ๋จ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
-
์ด์ฐฝ๊ธฐ์๋ ์ด์์ฒด์ ๊ฐ ๋ง์ ์ผ์ ํ์ง ์์๋ค, ์์ฃผ ์ฌ์ฉ๋๋ ์ ์์ค์ ์ ์ถ๋ ฅ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ํจ์ํ ํ์ฌ ๋ชจ์๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋์๋ค.
-
์์ ์ ๋ชจ์๋๊ณ ์ผ๊ด์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์
batch processing
์ด๋ผ๊ณ ํ๋๋ฐ, ์ด๋ฌํ ์์ ์ ์ปดํจํฐ ๊ด๋ฆฌ์๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ด : ๋ณดํธ
-
์ด์์ฒด์ ๋ ๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ด ์ปดํจํฐ ‘๊ด๋ฆฌ’ ์ธก๋ฉด์์ ์ค์ํ ์ญํ ์ ํ๊ธฐ ์์ํ๋ค.
-
์ด์์ฒด์ ๊ฐ ์คํํ๋ ์ฝ๋๋ ์ผ๋ฐ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฝ๋์๋ ๋ค๋ฅด๊ฒ, ์ค์ ํ๋์จ์ด ์ฅ์น์ ์ ์ด๋ฅผ ๋ด๋นํ๊ณ ์๊ธฐ์, ๋ค๋ฅด๊ฒ ์ทจ๊ธ๋์ด์ผ ํ๋ค๋ ํ์์ฑ์ด ๋๋๋์๋ค.
-
์๋ฅผ๋ค์ด ๋ชจ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ํ๋๋์คํฌ์ ์ ๊ทผํ๋ฉด, ์์ฉ ํ๋ก๊ทธ๋จ๋ผ๋ฆฌ ์๋ก์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๊ฒ ๋์ด ๋ณด์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
-
๊ฒฐ๋ก ์ ์ผ๋ก ์๋ฅผ๋ค
file system
๊ณผ ๊ฐ์ ๊ฒ๋ค์ ์ผ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ ์ ๊ณตํ๊ณ ์ด์ํ๋ฉด, ์๋ฃ์ ๊ธฐ๋ก๊ณผ ๋ณดํธ๋ผ๋ ์๋ ์๋ํ ์ญํ ์ ์ํํ ์ ์๊ฒ ๋๋ค.
์ฌ๊ธฐ์ Atlas Computing System์ ์ํด System Call
์ด๋ผ๋ ์์ด๋์ด๊ฐ ๋ฐ๋ช
๋์๋ค.
-
๊ธฐ๋ณธ์ ์ผ๋ก Atlas Computing System์ ์์ด๋์ด๋ OS routine์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์์ผ๋ก ์ ๊ณตํ๋ ๋์ ,
-
OS๋ฅผ ๋ ๊ณต์์ ์ด๊ณ ์ ์ด๋ ํ๋ก์ธ์ค๋ก ์ ํํ๊ธฐ์ํด ํ๋์จ์ด ๋ช ๋ น์ด์ ํ๋์จ์ด ์ํ๋ผ๋ ํน๋ณํ ํ์ด๋ฅผ ์ถ๊ฐํ๋ ์์ด๋์ด์ด๋ค.
-
System Call
๊ณผProcedure Call
์ ์ฐจ์ด์ ์System Call
์์๋ OS๋ก ์ ์ด๊ถ์ด ๋์ด๊ฐ๋ ์์ ์ ํ๋์จ์ด ์ ์ด ๊ถํ(์ ํํ ๋ฒ์ญ์ ํ๋์จ์ด ํน๊ถ ์์ค : Hardware Privilege level ์ผ๋ก ๋์ด์๋ค)์ ๊ฒฉ์์ํค๋ ๊ฒ์ด๋ค. -
์ผ๋จ ์ผ๋ฐ์ ์ธ ์์ฉํ๋ก๊ทธ๋จ์
user mode
์์ ์คํ๋๋๋ฐ, ์ด๋๋ ํ๋์จ์ด์ ๋ํ ์ ๊ทผ์ด ์ ํ๋๋ค. -
ํ์ง๋ง
System Call
์ ํธ์ถํ๋ฉด, OS๋ก ์ ์ด๊ถ์ด ๋์ด๊ฐ๊ณ , OS๋kernel mode
์์ ์คํ๋๋ฉฐ, ์ด๋๋ ํ๋์จ์ด์ ๋ํ ์ ๊ทผ์ด ํ์ฉ๋๋ค. -
๊ตฌ์ฒด์ ์ผ๋ก๋
trap
์ด๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌSystem Call
์ ํธ์ถํ๊ณ , ์ด๋trap
์kernel mode
๋ก ์ ํํ๋ ์ญํ ์ ํ๋ค. -
๋ํ ํ๋์จ์ด๋
trap
์ผ๋ก ์ธํดSystem Call
์ด ํธ์ถ๋์์ ๋, ๋ฏธ๋ฆฌ ์ง์ ๋trap handler
ํจ์์๊ฒ ์ ์ด๊ถ์ ๋๊ธด๋ค. -
์ด ์ํ์์๋ ๋ชจ๋ ํ๋์จ์ด์ ๋ํ ์ ๊ทผ์ด ํ์ฉ๋๋ฉฐ, ์ด๋ฅผ ํตํด OS๋ ํ์ํ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์ ์ด๊ถ์ ๋ค์ user์๊ฒ ๋๊ฒจ์ค๋ค.
-
์ด๋ฌํ
System Call
์ ํตํด OS๋ ํ๋์จ์ด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๊ณ , ์ด๋ฅผ ํตํด ๋ณดํธ์ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค์ ์ํํ ์ ์๊ฒ ๋์๋ค.
์ฐธ๊ณ : System call๊ณผ Procedure call์ ์ฐจ์ด์
-
๊ถํ ์์ค (Privilege Level):
- ํ๋ก์์ ํธ์ถ: ํ๋ก์์ ํธ์ถ์ ์ผ๋ฐ์ ์ผ๋ก ๋์ผํ ๊ถํ ์์ค(์: ์ฌ์ฉ์ ๋ชจ๋)์์ ๋ฐ์ํฉ๋๋ค. ํธ์ถ๋ ํ๋ก์์ ๋ ํธ์ถํ ํ๋ก๊ทธ๋จ๊ณผ ๋์ผํ ๊ถํ ์์ค์์ ์คํ๋ฉ๋๋ค.
- ์์คํ ํธ์ถ: ์์คํ ํธ์ถ์ ๊ถํ ์์ค์ ๋ณ๊ฒฝํ์ฌ ์คํ๋ฉ๋๋ค. ์์คํ ํธ์ถ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ ๋ชจ๋์์ ์ด๋ฃจ์ด์ง๋ฉฐ, ํธ์ถ๋ OS ์ฝ๋๋ ๊ถํ์ด ๋ ๋์ ์ปค๋ ๋ชจ๋์์ ์คํ๋ฉ๋๋ค. ์ด๋ก์จ OS๋ ๋ณด๋ค ๋์ ๊ถํ ์์ค์์ ํ๋์จ์ด์ ์ํธ ์์ฉํ์ฌ ํน๊ถ ๋ช ๋ น์ ์คํํ ์ ์์ต๋๋ค.
-
ํ๋์จ์ด ์ ๊ทผ ๋ฐ ๋ณด์:
- ํ๋ก์์ ํธ์ถ: ํ๋ก์์ ํธ์ถ์ ํธ์ถ๋ ํ๋ก์์ ๊ฐ ํธ์ถํ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๊ณผ ๋์ผํ ์ ๊ทผ ๊ถํ์ ๊ฐ์ง๋๋ค. ์ด๋ ํธ์ถ๋ ํ๋ก์์ ๊ฐ ํธ์ถํ ํ๋ก๊ทธ๋จ์ ๋ฐ์ดํฐ์ ์์ ๋กญ๊ฒ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค.
- ์์คํ ํธ์ถ: ์์คํ ํธ์ถ์ ๊ถํ ์์ค์ ๋ณ๊ฒฝํ๋ฏ๋ก, ํธ์ถ๋ OS ์ฝ๋๋ ํธ์ถํ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด๋ ์์คํ ํธ์ถ์ ํตํด ํธ์ถ๋ OS๊ฐ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ๋ฐ์ดํฐ์ ๋ฌด๋จ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
-
์ด์ ์ฒด์ ์์ ์ํธ ์์ฉ:
- ํ๋ก์์ ํธ์ถ: ํ๋ก์์ ํธ์ถ์ ์ผ๋ฐ์ ์ผ๋ก ๋์ผํ ์์ฉ ํ๋ก๊ทธ๋จ ๋ด์์ ๋ค๋ฅธ ํจ์ ๋๋ ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์์คํ ํธ์ถ: ์์คํ ํธ์ถ์ ์ฃผ๋ก ์ด์ ์ฒด์ ์ ์ํธ ์์ฉํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ผ ์์คํ ์ ๊ทผ, ๋คํธ์ํฌ ํต์ , ์์คํ ์์ ํ ๋น ๋ฑ๊ณผ ๊ฐ์ ์ด์ ์ฒด์ ์๋น์ค์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
๋ฉํฐ ํ๋ก๊ทธ๋๋ฐ ์๋
-
๋ฏธ๋ ์ปดํจํฐ ์๋์ ์ด๋ฃจ์ด ์ก๋ค๊ณ ํ๋ค.
-
ํ์ฌ๋ง๋ค ํ๋์ ์ปดํจํฐ๋ฅผ ์ฌ์ฉํ๋ ์ ๋๋ก ๋ณด๊ธ๋์๋ค๊ณ ํ๋ค.
-
์ด๋๋ถํฐ ์ด์์ฒด์ ๋
multiprogramming
์ด๋ผ๋ ๊ฐ๋ ์ ๋์ ํ๊ฒ ๋๋ค. -
์๋ํ๋ฉด ํ๋์ ์ปดํจํฐ์์ ์ฌ๋ฌ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด์, CPU๊ฐ ๋์ง ์๋๋ก ์ผ์ ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
-
๊ทธ๋์ ์ธํฐ๋ฝํธ๋ฅผ ํตํ
context switch
๋ผ๋ ์์ด๋์ด๊ฐ ๋ฑ์ฅํ๋๋ฐ, ์ด์์ฒด์ ์ญ์ฌ์์ ํ์ ์ด๋ผ ๋ถ๋ฅผ ๋ง ํ ์์ด๋์ด์ด๋ค. -
๋ฌผ๋ก ์ด๋ฌํ ์ํฉ์์
๋ฉ๋ชจ๋ฆฌ ๋ณดํธ
,๋ณํ์ฑ
์ ๋ํ ์ฒ๋ฆฌ๋ ํ์ํด์ก๋ค. -
๊ทธ ์ธ์ ์ญ์ฌ์ ์ผ๋ก๋ UNIX ์ด์์ฒด์ ๊ฐ ๋ฑ์ฅํ๊ณ , ์ด ์ญ์ ๊ฐ์ฅ ์ค์ํ ์ฌ๊ฑด ์ค ํ๋๋ก ๊ผฝํ๋ค.
ํ๋ (๊ฐ์ธ์ฉ ์ปดํจํฐ ์๋)
-
์ด์ ๋ ๊ฐ์ธ์ฉ ์ปดํจํฐ๊ฐ ๋ณด๊ธ๋์๊ณ , ์ด์ ๋ฐ๋ผ ์ด์์ฒด์ ๋ ๋ณํํ๊ฒ ๋๋ค.
-
๋๋๊ฒ๋ ์ ์๋ ํด๋ณด๋ฅผ ์ธ๊ธํ๋ค, ๋ฏธ๋ ์ปดํจํฐ ์๋๊ฐ ์ด์์ฒด์ ์ ์ ์ฑ๊ธฐ์์ผ๋ฉฐ ์ด์ฐฝ๊ธฐ pc๋ค์ os๋ค์ ๊ทธ ์๋์ ์์ด๋์ด๋ ๊ธฐ์ ์ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ์ฌ์ง์ด๋ ์ ๋ชฐ๋๋ค๊ณ ํ๋ค.
-
์์๋ก DOS๋ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ๋ฅผ ์ ํ ์๊ฐํ์ง ์๊ณ ๋์์ธ ๋์๊ณ , MacOS๋ ์๋ชป๋ ์ค์ผ์ค๋ง์ ์ฑํํ์ฌ, ์ฐ๋ ๋ ํ๋๊ฐ ๋ฌดํ๋ฃจํ์ ๋น ์ง๋ฉด, ์ ์ฒด ์์คํ ์ด ๋ฉ์ถ๋ ๋ฒ๊ทธ๊ฐ ์์๋ค.
-
์ด ๋น์๊ฐ ์ํ๊ธฐ๋ผ๊ณ ํ๋ฉฐ 1980๋ ๋๊ฐ ์ง๋๊ฐ๋ฉด์ ๋ค์ ์ด์์ฒด์ ๋ 1970๋ ๋ ๋ฏธ๋์ปดํจํฐ ์๋์ ์์ด๋์ด์ ๊ธฐ์ ์ ์ฐพ์๊ฐ๊ธฐ ์์ํ๋ค๊ณ ํ๋ค.
03์ฅ - ๊ฐ์ํ์ ๋ํ ๋ํ
-
๊ฐ์ํ์ ๋ํ ๋ํ๋ฅผ ํตํด ๊ฐ์ํ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ์ดํดํ๋ค.
-
๊ฐ์ํ๋ฅผ ๋ณต์ญ์์ ๋น์ ํ์ฌ ์ค๋ช ํ๋ค.
-
๋ณต์ญ์๋ฅผ ๋จน๊ณ ์ถ์ ์ฌ๋์ด ์ฌ๋ฟ ์๊ณ ๋ณต์ญ์๋ ๋จ ํ๋๋ผ๊ณ ์ด์ผ๊ธฐํ๋ค.
-
๋จผ์ ๊ฐ์ ๋ณต์ญ์๋ฅผ ๋จน๊ณ ์ถ์ ๋ชจ๋์๊ฒ ๋๋ ์ค๋ค.
-
์ฌ์ค ๊ทธ ์ฌ๋๋ค์ ๋งค ์๊ฐ ๋ณต์ญ์๋ฅผ ๋จน๊ณ ์๋๊ฒ ์๋๋ผ, ๋๋ถ๋ถ์ ์๊ฐ์ ๋ฎ์ ์ ์๊ฑฐ๋ ํด์์ ์ทจํ๊ณ ์๋ค.
-
๊ทธ๋์ ์ค์ ๋ก ๋ณต์ญ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์์ ๋, ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ค์ ๋ณต์ญ์๋ฅผ ๊ฐ์ ธ๋ค ์ค๋ค๋ ๊ฒ์ด๋ค.
-
์ด ๋น์ ์์ ๋ณต์ญ์๋
์์
์ด๊ณ , ์ฌ๋๋ค์ํ๋ก์ธ์ค
์ด๋ค. -
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ณต์ญ์๋ฅผ ์ฎ๊ธฐ๋ ์ฌ๋์
์ด์์ฒด์
์ด๋ค. -
๋ณต์ญ์๋ฅผ CPU๋ก ๋ฐ๊พธ๋ฉด CPU ๊ฐ์ํ๊ฐ ๋๊ณ , ๋ณต์ญ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ๊พธ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ํ๊ฐ ๋๋ค.
04์ฅ - ํ๋ก์ธ์ค
-
ํ๋ก์ธ์ค๋ ์ผ๋ฐ์ ์ผ๋ก ์คํ์ค์ธ ํ๋ก๊ทธ๋จ์ด๋ผ๊ณ ์ ์ํ๋ค.
-
ํ๋ก๊ทธ๋จ์ ๋์คํฌ ์์ ์กด์ฌํ๋ ์คํ์ ์ํ ๋ช ๋ น์ด์ ์ ์ ๋ฐ์ดํฐ์ ๋ฌถ์์ด๋ค.
ํต์ฌ ์ง๋ฌธ : CPU๊ฐ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ค๋ ํ์์ ์ด๋ป๊ฒ ์ ๊ณตํ๋๊ฐ?
-
์ด์์ฒด์ ๋ CPU๋ฅผ ๊ฐ์ํํ์ฌ ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ค.
-
ํ๋์ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ณ , ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ณ , ๋ค์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ค.
-
์ด๋ฌํ ๊ธฐ๋ฒ์
time sharing
์ด๋ผ๊ณ ๋ถ๋ฆฌ๋๋ฐ, ์ํ๋ ์ ๋งํผ์ ํ๋ก์ธ์ค๋ฅผ ๋์์ ์คํ ํ ์ ์๋ค.(๋ฌผ๋ก CPU๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ ํ๋ก์ธ์ค์ ์ฑ๋ฅ์ ๋จ์ด์ง๋ค.) -
CPU ๊ฐ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ํด์๋ ๋๊ตฌ(mechanism)์ ์ง๋ฅ(policy)์ด ํ์ํ๋ค.
-
์ฌ๊ธฐ์์ ๋๊ตฌ๋
context switch
์interrupt
์ด๋ฉฐ, ์ง๋ฅ์scheduler
์ธ๋ฐ ์ง๊ธ๋ถํฐ ์ด๊ฒ๋ค์ ๋ค๋ฃฌ๋ค.
04.1 ํ๋ก์ธ์ค์ ๊ฐ๋ (ํ๋ก์ธ์ค ์ถ์ํ)
-
ํ๋ก์ธ์ค๋ฅผ ์คํ์ค์ธ ํ๋ก๊ทธ๋จ์ผ๋ก ์ธ๊ธํ๋ค.
-
ํ๋ก์ธ์ค ์ธ์คํด์ค๋ฅผ ์์ฝํ๋ ค๋ฉด, ํ๋ก์ธ์ค๊ฐ ์คํ๊ฐ์ ์ ๊ทผํ๊ฑฐ๋ ์ํฅ์ ๋ฏธ์น ๊ฒ๋ค์ ๋ํ ๋ชฉ๋ก์ ํตํด ์์๋ณผ ์ ์๋ค.
-
์ด๋ฌํ ๊ด์ ์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์์๋ณด๊ธฐ ์ํด์ ์ผ๋จ ํ๋์จ์ด ์ํ(machine state)์ ๋ํด์ ์ดํด๋ฅผ ํด์ผ ํ๋ค.
machine state๋ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ์ฝ๊ฑฐ๋ ์ธ ์ ์๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ๋ค.
-
machine state์ ๊ฐ์ฅ ์ค์ํ ์ปดํฌ๋ํธ๋ memory์ด๋ค. ๋ช ๋ น์ด์ ์ฝ๊ณ ์ฐ๋ ๋ฐ์ดํฐ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์๊ณ , ํ๋ก์ธ์ค๊ฐ ์ ๊ทผ ํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ(์ฃผ์๊ณต๊ฐ)๋ ํ๋ก์ธ์ค์ machine state์ ์ผ๋ถ์ด๋ค.
-
๋ ๋ฒ ์งธ ์ปดํฌ๋ํธ๋ก ๋ ์ง์คํฐ๊ฐ ์๋๋ฐ, ๋ ์ง์คํฐ๋ CPU์ ์๋ ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค. ๋ ์ง์คํฐ๋ CPU๊ฐ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ๋์ ์ฌ์ฉ๋๋ฉฐ, ํ๋ก์ธ์ค์ machine state์ ์ผ๋ถ์ด๋ค.
-
๋ ์ง์คํฐ์ค ํ๋๋ก
program counter
๊ฐ ์๋๋ฐ, ํ๋ก๊ทธ๋จ์ ์ด๋ ๋ช ๋ น์ด๊ฐ ์คํ ์ค ์ธ์ง๋ฅผ ์๋ ค์ฃผ๋ ์ปดํฌ๋ํธ์ด๋ค.(๋ช ๋ น์ด ํฌ์ธํฐ : Intruction Pointer ๋ก๋ ๋ถ๋ฆฐ๋ค.) -
๋ํ
stack pointer
์frame pointer
๊ฐ ์๋๋ฐ, ์ด๊ฒ๋ค์ ํ๋ก์ธ์ค์ ์คํ ์ค์ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ด๋ค. -
๊ทธ๋ฆฌ๊ณ ์๊ตฌ ์ ์ฅ์ฅ์์ ์ ๊ทผํ๊ธฐ ์ํ ๊ฒ๋ค๋ ์๋ค.
์์ฝํ์๋ฉด, ํ๋ก์ธ์ค๋ ์คํ์ค์ธ ํ๋ก๊ทธ๋จ์ด๋ฉฐ, ํ๋ก์ธ์ค๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ํ๋ก์ธ์ค์ machine state๋ฅผ ์ดํดํด์ผ ํ๋๋ฐ, machine state๋ ๋ฉ๋ชจ๋ฆฌ, ๋ ์ง์คํฐ, ํ๋ก๊ทธ๋จ ์นด์ดํฐ, ์คํ ํฌ์ธํฐ, ํ๋ ์ ํฌ์ธํฐ ๋ฑ์ด ์๋ค.
04.2 ํ๋ก์ธ์ค API
-
์ค์ ํ๋ก์ธ์ค API๋ ๋ค์์ฅ์์ ๋์ค์ง๋ง, ์ด์์ฒด์ ๊ฐ ๋ฐ๋์ API๋ก ์ ๊ณตํด์ผํ๋ ๊ธฐ๋ฅ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
-
์์ฑ(Create) : ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๋ฅผ ์์ฑ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํ๋ค.
-
์ ๊ฑฐ(Destory) : ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ์ ๊ฑฐ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํ๋ค.
-
๋๊ธฐ(Wait) : ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ข ๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํ๋ค.
-
๊ฐ์ข ์ ์ด(Miscellaneous Control) : ํ๋ก์ธ์ค์ ์ฐ์ ์์๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋, ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฑ์ ์ ์ด๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.
-
์ํ (Status) : ํ๋ก์ธ์ค์ ์ํ๋ฅผ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํ๋ค.
04.3 ํ๋ก์ธ์ค ์์ฑ: ์กฐ๊ธ ๋ ์์ธํ
- ํ๋ก์ธ์ค์ ์์ฑ์ ์ฒซ ๋จ๊ณ๋ ๋์คํฌ์ ์๋ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๊ฒ์ด๋ค.
- ํ๋์ ์ด์์ฒด์ ๋ ์ด ๊ณผ์ ์์ paging๊ณผ swapping๊ฐ์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ค์ ์ง๊ธ ํ์ํ ๋ถ๋ถ๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋๋ฐ ์ง๊ธ ์ฃผ์ ์ ๊ด๋ จ์ด ์์ผ๋ฏ๋ก ์ธ๊ธ๋ง ํ๋ค.
- ํ์ฌ ์ดํ ํ๋ก์ธ์ค๋ฅผ ์คํ์ํค๊ธฐ ์ ์ ์ด์์ฒด์ ๊ฐ ํด์ผํ ์ผ์ด ์๋ค. ๋ฐ๋ก ํน์ ํ ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ
Stack
,Heap
์ฉ๋๋ก ๋๋ ์ ํ ๋นํ๋ ๊ฒ์ด๋ค. - ๋ํ ์ ์ถ๋ ฅ๊ณผ ๊ด๋ จ๋ ๊ฒ๋ค๋ ์ด๊ธฐํ ํด์ผ ํ๋ค.
- ๊ทธ ๋ค์์ main() ํจ์๋ฅผ ์คํ์ํค๋ ๊ฒ์ด๋ค.
04.4 ํ๋ก์ธ์ค ์ํ
- ํ๋ก์ธ์ค ์ํ๋ฅผ ๋จ์ํ ํ๋ฉด ๋ค์ ์ธ๊ฐ์ง๋ก ๊ตฌ๋ถ ํ ์ ์๋ค.
- ์คํ์ค(Running) : ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ํ์ด๋ค.(๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ์๋ ์ํ)
- ๋๊ธฐ์ค(Ready) : ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์์ง๋ง, ์ธ์ ๋ ์ง ์ฌ์ฉํ ์ ์๋ ์ํ์ด๋ค.
- ๋๊ธฐ์ค(Waiting) : ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์๊ณ , ์ด๋ค ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ํ์ด๋ค.
-
ํ๋ก์ธ์ค๋ ์ด์์ฒด์ ์ ์ค์ผ์ฅด๋ง ์ ์ฑ ์ ๋ฐ๋ผ ์ค์ผ์ค์ด ๋๋ฉด, ์ค๋น์ํ์์ ์คํ์ํ๋ก ๋ฐ๋๊ฒ ๋๋ค.
-
ํ๋ก์ธ์ค๊ฐ ์ ์ถ๋ ฅ๋ฑ์ ์๋ฃ ์ด๋ฒคํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ๋๊ธฐ์ํ๋ก ๋ฐ๋๊ฒ ๋๋ค.
-
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ ์ถ๋ ฅ์ ํฌํจํ ๋ ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋์ ํ์ ๊ฐ์ด ๋ํ๋ผ ์ ์๋ค.
์๊ฐ | ํ๋ก์ธ์ค0 | ํ๋ก์ธ์ค1 | ๋น๊ณ |
---|---|---|---|
1 | ์ค๋น | ์คํ | |
2 | ์คํ | ์ค๋น | |
3 | ์คํ | ์ค๋น | Process0์ด ์ ์ถ๋ ฅ์ ์์ |
4 | ๋๊ธฐ | ์คํ | Process0 ๋๊ธฐ ์ํ |
5 | ๋๊ธฐ | ์คํ | Process1 ์คํ |
6 | ๋๊ธฐ | ์คํ | |
7 | ์ค๋น | ์คํ | Process0 ์ ์ถ๋ ฅ ์ข ๋ฃ |
8 | ์ค๋น | ์คํ | Process1 ์ข ๋ฃ |
9 | ์คํ | ||
10 | ์คํ | Process0 ์ข ๋ฃ |
- ์ด๋ฌํ ๋ฐฉ์ (1 ํ๋ก์ธ์ค๊ฐ ์คํ์ค์ด๊ณ , 0 ํ๋ก์ธ์ค๊ฐ ๋๊ธฐ์ํ์ผ ๋ 1์ ๋ง๋ฌด๋ฆฌํ๊ฒ ํจ์จ์ ์ด์๋?) ๋ฑ์ ๊ณ ๋ฏผํ๋๊ฑด ์ด์์ฒด์ ์ ์ค์ผ์ค๋ฌ๊ฐ ๋ด๋นํ๊ณ ์ด๋ถ๋ถ์ ๋ค์์ฅ์์ ๋ค๋ฃฌ๋ค.
04.5 ์๋ฃ ๊ตฌ์กฐ
์ด์์ฒด์ ๋ ํ๋ก๊ทธ๋จ์ด๊ณ ํ๋ก์ธ์ค๋ ์ด์์ฒด์ ๊ฐ ๊ด๋ฆฌํด์ผ ํ๋ ์ ๋ณด๋ค. ๊ทธ๋์ ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ๊ฐ ํ์ํ๋ค.
-
์๋ฅผ ๋ค์ด ํ๋ก์ธ์ค์ ์ํ๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ๊ฐ ํ์๊ณ , ํ๋ก์ธ์ค ๋ฆฌ์คํธ์ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
-
๋ํ ํ์ ์คํ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ๋ ํ์ํ๋ค.
-
์ด๋ฌํ ์์๋ก ์ฑ ์์๋ register context๋ฅผ ๋ณด์ฌ์ค๋ค.
// ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ๊ณ ์ดํ์ ๋ค์ ์์ํ ์ ์๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ตฌ์กฐ์ฒด
struct context {
int eax;
int ebx;
int ecx;
int edx;
int esi;
int edi;
int eip;
int esp;
int ebp;
};
enum proc_state {
UNUSED,
USED,
ZOMBIE,
SLEEPING,
RUNNABLE,
RUNNING
};
struct proc {
char *mem; // ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์
struct context context; // ํ๋ก์ธ์ค์ ๋ ์ง์คํฐ ์ํ
enum proc_state state; // ํ๋ก์ธ์ค์ ์ํ
char *kstack; // ์ปค๋ ์คํ๋ฐ๋ฅ์ฃผ์
int pid; // ํ๋ก์ธ์ค์ ๊ณ ์ ์๋ณ์
struct proc *parent; // ๋ถ๋ชจ ํ๋ก์ธ์ค
struct proc *children; // ์์ ํ๋ก์ธ์ค
void *chan // 0์ด ์๋ ๊ฒฝ์ฐ, ํ๋ก์ธ์ค๊ฐ ๋๊ธฐ์ค์ธ ์ด๋ฒคํธ
int killed; // 0์ด ์๋ ๊ฒฝ์ฐ, ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์์์ ๋ํ๋
struct file *ofile[NOFILE]; // ์ด๋ฆฐ ํ์ผ
struct inode *cwd; // ํ์ฌ ๋๋ ํ ๋ฆฌ
};