inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

인프런 워밍업 클럽 2기 - CS 전공지식 스터디 2주차 발자국

하얀종이개발자
1

운영체제 2주차 학습 요약

 

CPU 스케쥴링 알고리즘


프로세스 동기화

여러 프로세스가 공유 자원에 동시에 접근할 때 순서를 정하여 데이터의 일관성을 유지하는 것

프로세스간 통신의 종류


공유자원과 임계영역

공유자원은 프로세스 혹은 스레드간 통신할 때 공동으로 이용하는 변수나 파일 같은 것들
공유자원은 여러 프로세스가 공유하고 있기 때문에 각 프로세스의 접근 순서에따라 결과가 달라질 수 있음

임계영역은 프로세스 혹은 스레드가 동시에 사용하면 안되는 영역 (접근 순서등의 이유로 결과가 달라지는 영역)

경쟁조건은 공유자원을 서로 사용하기 위해 경쟁하는 것


임계구역 문제를 해결하기 위한 조건


세마포어 & 모니터

뮤텍스는 공유자원을 lock()과 unlock()을 이용하여 프로세스의 접근을 제어하는 메커니즘
여러 프로세스의 접근을 관리할 수 있으면 세마포어 (뮤텍스는 동기화 대상이 오직 하나임)

세마포어는 잘못된 사용으로 임계영역을 보호받지 못할 수 있음 (세마포어를 사용하지 않고 임계구역에 들어간 경우)
이를 해결한 방식이 모니터

모니터는 공유자원을 숨기고 접근에 대한 인터페이스만 제공하여 공유자원에 안전하게 접근하게 하는 메커니즘

운영체제가 처리하는게 아니라 프로그래밍 언어차원에서 지원하는 방법임


교착상태 (데드락)

두개 이상의 프로세스들이 서로가 가진 자원을 기다리다 아무도 작업을 진행하지 못하는 상태


데드락 필요조건


은행원 알고리즘

총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안정 상태로 나누고, 교착상태가 발생하지 않는 수준이 되도록 자원을 할당하는 알고리즘


검출 & 회복

교착상태는 어떻게 검출하지?


메모리


메모리 할당방식

가변분할방식

고정분할방식

버디시스템

 

알고리즘 & 자료구조 2주차 학습 요약

 

재귀 & 재귀적으로 생각하기

재귀는 자기 자신을 다시 호출하는 함수를 말함

하노이탑 구현하기

자바코드

public class HanoiTop {

  void hanoi(int count, String from, String to, String temp){
    if(count == 0) return;
    hanoi(count - 1, from, temp, to);
    System.out.printf("원반 %d를 %s에서 %s로 이동\n", count, from, to);
    hanoi(count - 1, temp, to, from);
  }

  public static void main(String[] args) {
    HanoiTop hanoiTop = new HanoiTop();
    hanoiTop.hanoi(3, "A", "C", "B");
  }

}

버블정렬

자바코드

public class BubbleSort {

  void bubbleSort(int[] arr) {
    // 사이클 - 자리교체는 (배열의 갯수 - 1) 번 수행함
    for (int i = 0; i < arr.length - 1; i++) {
      // 횟수 - 정렬이 된 원소의 이전 원소보다 하나 이전의 원소까지 순회
      // 시작점이 (arr.length-i-1)번 임
      for (int j = 0; j < (arr.length - i - 1); j++) {
        // 앞의 데이터가 뒤에 데이터보다 더 크다면?
        if (arr[j] > arr[j + 1]) {
          // 데이터 자리변경
          int temp = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = temp;
        }
      }
    }
  }

  public static void main(String[] args) {
    int[] arr = {2, 3, 1, 4};

    // 정렬 전 - arr = [2, 3, 1, 4]
    System.out.println("정렬 전 - arr = " + Arrays.toString(arr));
    BubbleSort bubbleSort = new BubbleSort();
    bubbleSort.bubbleSort(arr);

    // 정렬 후 - arr = [1, 2, 3, 4]
    System.out.println("정렬 후 - arr = " + Arrays.toString(arr));
  }

}

선택정렬

자바코드

public class SelectionSort {

  void selectionSort(int[] arr) {
    // 1 사이클의 순회는(배열의 갯수 - 1) 번 수행됨
    for (int i = 0; i < arr.length - 1; i++) {
      int minValueIndex = i;

      // 가장 작은 값을 탐색하기위해 순회
      for (int j = i + 1; j < arr.length; j++) {
        if (arr[j] < arr[minValueIndex]) {
          // 작은값 저장
          minValueIndex = j;
        }
      }

      // 자리 변경
      int temp = arr[i];
      arr[i] = arr[minValueIndex];
      arr[minValueIndex] = temp;
    }
  }

  public static void main(String[] args) {
    int[] arr = {4, 2, 1, 3};

    // 정렬 전 - arr = [4, 2, 1, 3]
    System.out.println("정렬 전 - arr = " + Arrays.toString(arr));
    SelectionSort selectionSort = new SelectionSort();
    selectionSort.selectionSort(arr);

    // 정렬 후 - arr = [1, 2, 3, 4]
    System.out.println("정렬 후 - arr = " + Arrays.toString(arr));
  }
}

 

회고

2주차 스터디를 진행하면서 정해진 진도도 학습하면서, 스터디안에 발표스터디에 참여해서 복습도 하는 과정이었어요. 적어보였던 운영체제의 내용이 생각보다 많아서 정리하는데 은근 시간이 오래 걸리더라구요. 그래도 스터디안의 발표 스터디에 참여하여 정리내용을 발표하고 다른 스터디원들의 발표내용도 듣고 헷갈리는 부분도 토론해서 도움이 많이 되었던 한 주 였던것 같습니다.

image스터디 발표 정리 자료 캡쳐

그리고 이번 알고리즘 강의에서는 항상 어렵게 느꼈던 재귀에 대해 조금은 이해한게 너무 좋았습니다.

어떤 문제를 해결하기 위해 문제의 부분 문제를 같은 방식으로 분해하여 해결한다.!! 재귀함수 내에서 자기 자신을 호출할 때 이 함수가 벌써 구현이 되어있다고 가정하고 재귀함수를 구현한다.!! 많이 연습해봐야겠지만 그래도 재귀적으로 생각하는 방법을 느낄 수 있었던 것 같습니다.

마지막 1주가 남았는데, 끝까지 열심히 해서 끝까지 완주해야겠네요. 화이팅

백엔드 인프런워밍업클럽2기 CS전공지식 2주차 발자국 감자

답변 0