💻
ComputerScience
  • 목차
  • Operating System
    • 운영체제란
    • 프로세스 vs 스레드
    • 프로세스 주소 공간
    • 인터럽트(Interrupt)
    • 시스템 콜(System Call)
    • PCB와 Context Switching
    • IPC(Inter Process Communication)
    • CPU 스케줄링
    • 데드락(DeadLock)
    • Race Condition
    • 세마포어(Semaphore) & 뮤텍스(Mutex)
    • 페이징 & 세그먼테이션
    • 페이지 교체 알고리즘
    • 메모리(Memory)
    • 파일 시스템
  • Network
    • OSI 7 계층
    • TCP 3 way handshake & 4 way handshake
    • TCP/IP 흐름제어 & 혼잡제어
    • UDP
    • 대칭키 & 공개키
    • HTTP & HTTPS
    • TLS/SSL handshake
    • 로드 밸런싱(Load Balancing)
    • Blocking,Non-blocking & Synchronous,Asynchronous @LifesLike
    • Blocking & Non-Blocking I/O
  • Algorithm
    • 거품 정렬(Bubble Sort)
    • 선택 정렬(Selection Sort)
    • 삽입 정렬(Insertion Sort)
    • 퀵 정렬(Quick Sort) @mimwin
    • 병합 정렬(Merge Sort)
    • 힙 정렬(Heap Sort)
    • 기수 정렬(Radix Sort)
    • 계수 정렬(Count Sort)
    • 이분 탐색(Binary Search)
    • 해시 테이블 구현
    • DFS & BFS @sujin-kk
    • 최장 증가 수열(LIS)
    • 최소 공통 조상(LCA)
    • 동적 계획법(Dynamic Programming)
    • 다익스트라(Dijkstra) 알고리즘
    • 비트마스크(BitMask)
  • Database
    • 키(Key) 정리
    • SQL - JOIN
    • SQL Injection
    • SQL vs NoSQL
    • 정규화(Nomalization)
    • 이상(Anomaly)
    • 인덱스(INDEX)
    • 트랜잭션(Transaction)
    • 트랜잭션 격리 수준(Transaction Isolation Level)
    • 저장 프로시저(Stored PROCEDURE)
    • 레디스(Redis) @sujin-kk
  • Java
    • Java 컴파일 과정
    • Call by Value vs Call by Reference
    • String & StringBuffer & StringBuilder
    • 자바 가상 머신(Java Virtual Machine)
    • Casting(업캐스팅 & 다운캐스팅)
    • 오토 박싱 & 오토언박싱
    • Thread 활용
    • 고유 락(Intrinsic Lock)
    • 문자열 클래스
    • Garbage Collection
    • Promotion & Casting
    • Primitive type & Reference type
    • 직렬화(Serialization)
    • Error & Exception
    • Stream API
    • Record
    • Composition
Powered by GitBook
On this page
  • 요약
  • 임계 구역과 동기화
  • 뮤텍스
  • 세마포어
  • 문제점과 해결책
  • 구현
  1. Operating System

세마포어(Semaphore) & 뮤텍스(Mutex)


요약

  • 공유된 자원의 데이터 혹은 임계구역이 있을 때

    • 세마포어는 여러 프로세스가 진입할 수 있음, 다른 프로세스도 lock 해제 가능

    • 뮤텍스는 하나의 프로세스만 진입할 수 있음, 해당 프로세스만 lock 해제 가능

임계 구역과 동기화

  • 임계구역

    • 배타적으로 읽고 쓸 수 있도록 설정한 코드

    • 요구사항 3가지

      • 상호 배제 : 한 프로세스가 임계구역을 실행 중일 때, 다른 어떤 프로세스도 임계구역을 실행 불가능

      • 진행 : 임계구역을 실행하는 프로세스가 없고 여러 프로세스들이 임계구역에 들어오고자 할 때, 유한한 시간에 하나의 프로세스만을 선택하는 임계구역에 진입시키는 올바른 결정 기법이 존재

      • 제한된 대기 : 프로세스가 임계구역의 진입의 요청과 실제 요청하기 사이에 다른 프로세스가 임계구역을 실행할 수 있는 횟수에 제한이 있음

  • 동기화

    • 코드 상에 임계 구역을 설정하여 코드 상으로는 독립적이지만 진입과 진출을 순서화해서 실행 상황에서 선행제약을 만드는 것

뮤텍스

  • 두 프로세스가 임계구역에 동시에 접근하지 못하도록 막기 위해 사용하는 객체

  • 구성 - lock, unlock

    • lock : 현재 임계구역에 들어갈 권한을 얻어옴, 다른 프로세스가 임계구역을 실행 중이라면 종료할 때까지 대기

    • unlock : 현재 임계구역을 모두 사용했음을 알려서 대기 중인 프로세스가 임계구역에 진입할 수 있게 함

세마포어

  • 뮤텍스와 달리, 진입 불가능할 때 대기 상태로 전환되고 임계구역을 떠나는 프로세스가 대기 프로세스를 준비 상태로 깨워줌

  • 구성 - 정수값 S, P연산과 V연산

    • 임계구역에 들어가기 전에 P연산(try)과 임계구역에서 나올 때 V연산(increment)

    • S > 1이면 자원이 여러 개 있을 경우 자원과 대기자를 동시에 관리 가능

      • 프린트를 공유하는 여러 프로세스들

    • S == 1이면 공유변수에 대한 뮤텍스와 동일

      • 공유변수

    • S == 0이면 이벤트에 의한 다중 쓰레드 간의 serialization에 사용

      • 실제 공유자원은 없음

문제점과 해결책

  • Readers Writers Problem

    • 공유자원에 여러 프로세스가 읽고 쓸 경우, 한 프로세스가 읽거나 쓸 때 모든 프로세스가 대기하는 것은 비효율

    • Reader들은 lock을 공유, Writer들은 모두 배타적으로 실행하고 Reader 대기 큐와 Writer 대기 큐를 분리

    • 높은 우선순위를 가진 프로세스가 낮은 우선순위를 가진 프로세스가 공유자원 사용을 마칠 때까지 기다려야 하는 상황

      • 우선순위가 높은 프로세스가 우선순위가 낮은 프로세스가 실행 중인 임계구역에서 대기 중일 때, 실행 프로세스에 높은 우선순위를 상속시킴

구현

  • 뮤텍스

    • Peterson's solution : 상대방에게 한 번씩 양보해줌

    int turn = 0;
    boolean flag[] = [0,0};
    
    // P0						// P1
    enter_mutex {					enter_mutex {	
        flag[i] = TRUE;					    flag[j] = TRUE;
        turn = j;					    turn = i;
        while(flag[j] && turn == j);			    while(flag[j] && turn == j);
    }						}
    				    
    // 임계구역					// 임계구역
    				    
    exit_mutex {					exit_mutex {
        flag[i] = FALSE;					    flag[i] = FALSE;
    }						}
    • Bakery algorithm

    choosing[i] = true;
    number[i] = max(number[0],number[1],...number[n-1]) +1 ;		// 번호표 뽑기
    choosing[i] = false;
    for ( j = 0 , j < n-1, j++ ) {
        while ( choosing[j] );						// 번호표 뽑기 대기
        while ( number[j] != 0 && (number[j],j) < (number[i],i) ); 		// 먼저 번호를 뽑은 프로세스가 끝날 때 까지 대기
    }
    number[i] = 0;
  • 세마포어

    P(S) {
         S--;
         if S < 0
             // 이 프로세스를 대기 큐에 추가 (잠 듦)
     }
    
     V(S) {
         S++;
         if S <= 0
             // 대기 큐로부터 프로세스를 제거 (깨어남)
     }
PreviousRace ConditionNext페이징 & 세그먼테이션

Last updated 2 years ago

우선순위 역전 문제

우선순위 상속 프로토콜

image
image