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์˜ ์ฐจ์ด์ 

  1. ๊ถŒํ•œ ์ˆ˜์ค€ (Privilege Level):

    • ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ: ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•œ ๊ถŒํ•œ ์ˆ˜์ค€(์˜ˆ: ์‚ฌ์šฉ์ž ๋ชจ๋“œ)์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋œ ํ”„๋กœ์‹œ์ €๋Š” ํ˜ธ์ถœํ•œ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋™์ผํ•œ ๊ถŒํ•œ ์ˆ˜์ค€์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • ์‹œ์Šคํ…œ ํ˜ธ์ถœ: ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๊ถŒํ•œ ์ˆ˜์ค€์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ํ˜ธ์ถœ๋œ OS ์ฝ”๋“œ๋Š” ๊ถŒํ•œ์ด ๋” ๋†’์€ ์ปค๋„ ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ์จ OS๋Š” ๋ณด๋‹ค ๋†’์€ ๊ถŒํ•œ ์ˆ˜์ค€์—์„œ ํ•˜๋“œ์›จ์–ด์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜์—ฌ ํŠน๊ถŒ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํ•˜๋“œ์›จ์–ด ์ ‘๊ทผ ๋ฐ ๋ณด์•ˆ:

    • ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ: ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์€ ํ˜ธ์ถœ๋œ ํ”„๋กœ์‹œ์ €๊ฐ€ ํ˜ธ์ถœํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๊ณผ ๋™์ผํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด๋Š” ํ˜ธ์ถœ๋œ ํ”„๋กœ์‹œ์ €๊ฐ€ ํ˜ธ์ถœํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฐ์ดํ„ฐ์— ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์‹œ์Šคํ…œ ํ˜ธ์ถœ: ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๊ถŒํ•œ ์ˆ˜์ค€์„ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ, ํ˜ธ์ถœ๋œ OS ์ฝ”๋“œ๋Š” ํ˜ธ์ถœํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ˜ธ์ถœ๋œ OS๊ฐ€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฐ์ดํ„ฐ์— ๋ฌด๋‹จ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. ์šด์˜ ์ฒด์ œ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ:

    • ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ: ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ๋˜๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ์‹œ์Šคํ…œ ํ˜ธ์ถœ: ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์ฃผ๋กœ ์šด์˜ ์ฒด์ œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ์‹œ์Šคํ…œ ์ž์› ํ• ๋‹น ๋“ฑ๊ณผ ๊ฐ™์€ ์šด์˜ ์ฒด์ œ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ๋Œ€

  • ๋ฏธ๋‹ˆ ์ปดํ“จํ„ฐ ์‹œ๋Œ€์— ์ด๋ฃจ์–ด ์กŒ๋‹ค๊ณ  ํ•œ๋‹ค.

  • ํšŒ์‚ฌ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ •๋„๋กœ ๋ณด๊ธ‰๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

  • ์ด๋•Œ๋ถ€ํ„ฐ ์šด์˜์ฒด์ œ๋Š” 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 ํ”„๋กœ์„ธ์Šค ์ƒํƒœ

  • ํ”„๋กœ์„ธ์Šค ์ƒํƒœ๋ฅผ ๋‹จ์ˆœํ™” ํ•˜๋ฉด ๋‹ค์Œ ์„ธ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. ์‹คํ–‰์ค‘(Running) : ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.(๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ)
  2. ๋Œ€๊ธฐ์ค‘(Ready) : ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ, ์–ธ์ œ๋“ ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.
  3. ๋Œ€๊ธฐ์ค‘(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; // ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ
  
};