๐Ÿ“’ 9์ฃผ์ฐจ | ํ€ด์ฆˆ | ๋ชจ๋ฒ” ๋‹ต์•ˆ

์ด์ˆœ๊ฐ„ยท2025๋…„ 5์›” 13์ผ
2

Preparing for the quiz

๋ชฉ๋ก ๋ณด๊ธฐ
9/12

๐Ÿ“ ์ด๋ฒˆ ์ฃผ ํ€ด์ฆˆ๋Š” ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค/๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์„ ํƒ ๊ธฐ์ค€, ๋ฐ๋“œ๋ฝ ํ•ด๊ฒฐ, ์„ธ๋งˆํฌ์–ด์™€ ๋ฎคํ…์Šค์˜ ์ฐจ์ด, C ์ฝ”๋“œ ๋ถ„์„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ ๊ฒ€ํ•˜๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.


โ“ 1. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•  ๋•Œ multiprocess์™€ multithread ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ๊ธฐ์ค€์€ ์–ด๋–ค ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๋ช‡ ๊ฐ€์ง€ ์ œ์‹œํ•˜์„ธ์š”. (1์ )

โœ… ๋ชจ๋ฒ” ๋‹ต์•ˆ:

  • ์ž์› ๊ฒฉ๋ฆฌ ํ•„์š” ์—ฌ๋ถ€
    โ†’ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ณด์•ˆ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ multiprocess๋ฅผ ์‚ฌ์šฉ
  • ์„ฑ๋Šฅ ๋ฐ ์ž์› ๊ณต์œ  ์š”๊ตฌ
    โ†’ ๊ฐ™์€ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๋Š” multithread๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ํšจ์œจ์ ์ด๋ฉฐ, context switching ๋น„์šฉ์ด ์ ์–ด ์„ฑ๋Šฅ์— ์œ ๋ฆฌ
  • ๋ณต์žก๋„
    โ†’ multithread๋Š” ๋™๊ธฐํ™” ์ด์Šˆ๊ฐ€ ๋งŽ์•„ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ณ , multiprocess๋Š” IPC ๋น„์šฉ์ด ํผ
  • ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ
    โ†’ ๋…๋ฆฝ์ ์ธ ์‹คํ–‰ ๋‹จ์œ„(์˜ˆ: ์›น ์„œ๋ฒ„์˜ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค)๋ฉด multiprocess, I/O ์ค‘์‹ฌ ๋ณ‘๋ ฌ์„ฑ์€ multithread ์ ํ•ฉ

โ“ 2. ๋ฐ๋“œ๋ฝ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์„ ๋‘ ๊ฐ€์ง€ ์ด์ƒ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค. (1์ )

โœ… ๋ชจ๋ฒ” ๋‹ต์•ˆ:

  • ๊ต์ฐฉ ์ƒํƒœ ์˜ˆ๋ฐฉ(Prevention)
    โ†’ ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์„ ์‚ฌ์ „์— ์ œ๊ฑฐ (์˜ˆ: ์ˆœํ™˜ ๋Œ€๊ธฐ ๋ฐฉ์ง€)

  • ํšŒํ”ผ(Avoidance)
    โ†’ ์ž์› ์š”์ฒญ ์‹œ ํ˜„์žฌ ์ƒํƒœ์—์„œ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€ ์‚ฌ์ „์— ๊ณ„์‚ฐ (์˜ˆ: Bankerโ€™s Algorithm)

  • ํƒ์ง€ ๋ฐ ํšŒ๋ณต(Detection & Recovery)
    โ†’ ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ์„ ํ—ˆ์šฉํ•˜๋˜, ์ฃผ๊ธฐ์ ์œผ๋กœ ํƒ์ง€ํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ๋“ฑ์œผ๋กœ ํšŒ๋ณต


โ“ 3. Semaphore์™€ Mutex์˜ ํŠน์ง•๊ณผ ์ฃผ์š” ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”? (1์ )

โœ… ๋ชจ๋ฒ” ๋‹ต์•ˆ:

ํ•ญ๋ชฉSemaphoreMutex
๊ฐœ๋…์ •์ˆ˜๊ฐ’์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๋™๊ธฐํ™” ๋„๊ตฌ์ƒํ˜ธ๋ฐฐ์ œ๋ฅผ ์œ„ํ•œ ๋ฝ ๋„๊ตฌ
์ž์› ๊ฐœ์ˆ˜0๊ฐœ ์ด์ƒ ์ž์› ์ œ์–ด ๊ฐ€๋Šฅ๋‹จ์ผ ์ž์› ์ œ์–ด์— ์‚ฌ์šฉ๋จ
์†Œ์œ ๊ถŒ์†Œ์œ  ๊ฐœ๋… ์—†์ŒํŠน์ • ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฝ์„ ์†Œ์œ 
์‚ฌ์šฉ ํ•จ์ˆ˜sema_down(), sema_up()lock_acquire(), lock_release()

โ“ 4. ๋‹ค์Œ ANSI C ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ถœ๋ ฅ๋˜๋Š” ๋‚ด์šฉ์€ ๋ฌด์—‡์ธ๊ฐ€์š”? (1์ )

#include <stdio.h>

int f(int x, int *py, int **ppz) {
  int y, z;
  **ppz += 1;
  z = **ppz;
  *py += 2;
  y = *py;
  x += 3;
  return x + y + z;
}

int main() {
  int c, *b, **a;
  c = 4;
  b = &c;
  a = &b;
  printf("%d\n", f(c, b, a));
  return 0;
}

โœ… ๋ชจ๋ฒ” ๋‹ต์•ˆ:

  • c = 4
  • **ppz += 1 โ†’ c = 5
  • *py += 2 โ†’ c = 7
  • x += 3 โ†’ x = 7

โ†’ x + y + z = 7 + 7 + 5 = 19

๐ŸŸข ์ •๋‹ต: 19


โ“ 5. ๋‹ค์Œ C ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak)๋ฅผ ์ฐพ๊ณ , ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ œ์‹œํ•˜์„ธ์š”. (1์ )

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int data;
    char *description;
} item;

item* create_item(int data, const char *desc) {
    item *new_item = (item *)malloc(sizeof(item));
    if (new_item == NULL) {
        return NULL;
    }

    new_item->data = data;
    new_item->description = (char *)malloc(strlen(desc) + 1);
    strcpy(new_item->description, desc);

    return new_item;
}

int main() {
    item *myItem = create_item(5, "Test Item");
    printf("Item: %d, Description: %s\n", myItem->data, myItem->description);

    // ๋‹ค๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰

    free(myItem); // ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
    return 0;
}

โœ… ๋ชจ๋ฒ” ๋‹ต์•ˆ:

  • ๋ฌธ์ œ์ : description ํ•„๋“œ์— ํ• ๋‹นํ•œ malloc ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์Œ
    โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ

  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ:

free(myItem->description); // description ํ•ด์ œ
free(myItem);              // ๊ตฌ์กฐ์ฒด ํ•ด์ œ
  • ์ˆ˜์ •๋œ main ํ•จ์ˆ˜:
free(myItem->description);
free(myItem);

๐ŸŸจ Tip: ๊ตฌ์กฐ์ฒด ์•ˆ์— ํฌ์ธํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ๊ตฌ์กฐ์ฒด ์ž์ฒด๋ฅผ freeํ•˜๊ธฐ ์ „์— ๋‚ด๋ถ€ ๋™์  ํ• ๋‹น ์˜์—ญ๋„ freeํ•ด์ค˜์•ผ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

profile
์„œํˆด์ง€์–ธ์ • ๋Š˜ ํ–‰๋™์ด ๋จผ์ €์ด๊ธฐ๋ฅผ

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 5์›” 13์ผ

์ด ์ •๋„๋ฉด ์ •๊ธ€ ์šด์˜์ง„์ž„

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ