[중간정리] 9주차 - Multiprocess/Multithread, 데드락, Semaphore/Mutex, C언어(포인터, 할당 및 해제)

2025. 5. 13. 20:21·크래프톤 정글/CS기초(키워드, 개념정리)

Multiprocess/Multithread 선택 기준

안정성 vs 자원 사용

  • 시스템의 안정성이 매우 중요한 경우, 멀티프로세스가 선호
  • 리소스가 제한적인 환경에서는 멀티스레드가 더 효율적

구현의 복잡성

  • 스레드는 공유 메모리로 인해 동기화 문제가 복잡해질 수 있음
  • 때문에 개발자의 동시성 제어에 대한 이해도가 중요

응답 시간

  • 멀티스레드는 컨텍스트 스위칭이 빠르기 때문에 더 빠른 응답 시간을 요구하는 경우 유리함

플랫폼 및 언어 지원

  • 사용 중인 언어나 플랫폼이 멀티스레드 또는 멀티프로세스 중 어느 쪽을 더 잘 지원하는지도 중요한 요소

 

데드락 해결 전략

데드락 예방(Deadlock Prevention)

데드락이 발생하는 4가지 필수 조건(상호배제, 점유 및 대기, 비선점, 환형 순환) 중 적어도 하나를 제거함으로써 데드락 방지

ex) 비선점 조건 제거, 자원을 한꺼번에 할당, 자원을 순서에 따라서만 할당 가능하게 변경 등

 

데드락 회피(Deadlock Avoidance)

시스템이 데드락 상태로 진입하는 것을 회피하는 전략. 리소스 할당 시에 시스템이 데드락 가능성을 고려함으로써 실현됨.

가장 유명한 예는 뱅커스 알고리즘(Banker's Algorithm)으로, 프로세스에 리소스를 할당하기 전 안전 상태를 유지할 수 있는지를 확인한다. 만약 할당으로 인해 데드락이 발생할 위험이 있다면, 리소스를 할당하지 않게 된다.

 

데드락 탐지 및 회복(Deadlock Detection and Recovery)

시스템이 데드락이 일단 발생하면 이를 탐지하고, 해결하기 위한 조치를 취하는 전략. 데드락 탐지는 주기적으로 리소스 할당 그래프를 검사하여 순환 대기 조건을 찾는 것으로 이루어짐. 데드락이 탐지되면, 시스템은 프로세스를 중지하거나 리소스 할당을 롤백하여 데드락을 해결한다.

 

 

Semaphore와 Mutex

Semaphore

공유 자원의 접근 개수를 제어하는 동기화 도구로 카운트 값 기반으로 동작한다. 이 카운트 값은 동시에 해당 자원에 접근할 수 있는 스레드의 최대 수를 나타내며, Semaphore는 스레드가 자원을 사용할 때마다 이 값을 감소시키고, 자원을 해제할 때마다 증가시킨다.

 

Mutex(Mutual Exclusion)

한 번에 하나의 스레드만 임계 구역에 진입할 수 있도록 보장하는 동기화 도구. 주로 데이터의 무결성을 보호하기 위해 상호배제 용도로 사용된다. 또한 소유권 개념을 가지고 있어, 잠금을 건 스레드만이 잠금을 해제할 수 있다.

 

주요 차이점

두 가지 메커니즘 모두 동시성을 관리하고 데이터 무결성을 보장하는 데 필수적이지만, 사용되는 상황과 목적에 따라 달리 선택된다. Mutex는 보다 엄격한 제어가 필요할 때, Semaphore는 여러 자원에 대한 동시 접근을 허용할 때 사용하면 좋다. 특히 Counting Semaphore는 자원의 수량이 제한되어 있을 때 특히 유용하다.

 

 

C코드 (포인터) 문제 해결하기

#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; 
}

문제 요구사항

해당 코드의 출력 구하기

문제 해석

  • x는 값을 복사하고, py는 주소를, ppz는 주소의 주소를 복사하여 가지게 된다.
  • **ppz와 *py에 산술 연산을 하면 실제 역참조된 주소의 값이 바뀌지만, x에 대한 산술 연산은 x만 바뀐다.
  • c의 값은 각각 5, 7이 되며, 중간중간 y와 z에 각각의 값을 할당한다

정답 출력

19

 

 

C코드 (할당 및 해제) 문제 해결하기

#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; 
}

문제 요구사항

위 코드에서 메모리 누수(memory leark) 문제를 찾고, 해결 방안 제시하기

문제 찾기

  • new_item이라는 item 구조체를 동적 할당하면서, description 필드에도 동적 할당을 한 상태
  • 작업을 마친 후 myItem만 해제하고 있음
  • myItem의 description필드는 여전히 남아있는 상태 (메모리 해제 누락)

해결 방안

올바른 메모리 해제를 위해 free(myItem) 위에 free(myItem->description);을 추가해야 한다.

저작자표시 비영리 변경금지 (새창열림)

'크래프톤 정글 > CS기초(키워드, 개념정리)' 카테고리의 다른 글

[CS기초] User Mode vs Kernel Mode  (0) 2025.05.18
[CS기초] 만화로 보는 Iterative한 Tiny 서버가 동시에 실행될 수 있는 이유  (0) 2025.05.14
[CS기초] 9주차 개념정리  (0) 2025.05.13
[CS기초] Multi-Level Feedback Queue Scheduler (MLFQS)  (0) 2025.05.09
[CS기초] Context Switching(문맥 교환) 핵심 정리  (0) 2025.05.09
'크래프톤 정글/CS기초(키워드, 개념정리)' 카테고리의 다른 글
  • [CS기초] User Mode vs Kernel Mode
  • [CS기초] 만화로 보는 Iterative한 Tiny 서버가 동시에 실행될 수 있는 이유
  • [CS기초] 9주차 개념정리
  • [CS기초] Multi-Level Feedback Queue Scheduler (MLFQS)
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무) N
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[중간정리] 9주차 - Multiprocess/Multithread, 데드락, Semaphore/Mutex, C언어(포인터, 할당 및 해제)
상단으로

티스토리툴바