Chapter13. 교착 상태(데드락)

학습목표

  • 교착 상태가 무엇인지 이해합니다
  • 교착 상태는 어떤 상황에서 발생하는지 이해합니다
  • 교착 상태를 예방하고, 회피하고, 검출하는 방법을 학습합니다

**교착 상태(Deadlock)**란?

  • 여러 프로세스나 스레드가 서로 자원을 기다리며 무한정 대기 상태에 빠져 작업을 진행하지 못하는 상황

발생 상황

  • 상호 배제 상황일 때
  • 자원을 점유하고 대기할 때
  • 자원을 비선점 상태일때
  • 자원을 해제하지 않고 무한 대기할 때

예방 방법

  • 자원 할당 전에 모든 자원을 확보
  • 요청 순서를 정해 자원 할당

회피 방법

  • 자원 상태를 모니터링해 교착 상태가 발생하지 않도록 조정
  • 은행원 알고리즘을 사용

검출 방법

  • 시스템의 자원 그래프를 사용해 교착 상태를 검사
  • 주기적으로 검사하여 교착 상태를 해결
728x90

'코딩공부 > 운영체제' 카테고리의 다른 글

Chapter15. 파일 시스템  (1) 2024.10.25
Chapter14. 가상 메모리  (1) 2024.10.25
Chapter12. 프로세스 동기화  (0) 2024.10.24
Chapter10. 프로세스와 스레드  (2) 2024.10.24
Chapter09. 운영체제 시작하기  (0) 2024.10.24

Chapter12. 프로세스 동기화

학습목표

  • 동기화란 무엇인지 알아봅니다
  • 공유 자원과 임계 구역 문제를 이해합니다
  • 임계 구역 문제를 해결하기 위한 동기화 기법을 학습합니다

동기화의 의미

  • 프로세스 동기화: 프로세스들 사이의 수행 시기를 맞추는 것
    • 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기
    • 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
  • 즉, 동기화에는 실행 순서 제어를 위한 동기화가 있고, 상호 배제를 위한 동기화가 있다

공유자원과 임계 구역

  • 공유 자원: 프로세스들이 사용하는 공동의 자원
    • 동시에 실행하면 문제 발생
  • 임계 구역: 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
  • 운영체제는 임계 구역 문제를 아래 세 가지 원칙 하에 해결함
    • 상호배제
    • 진행
    • 유한 대기

동기화 기법

  1. 뮤텍스 락 (Mutex Lock):
    • 설명: 상호 배제를 통해 한 번에 하나의 스레드만 리소스에 접근할 수 있도록 하는 락.
    • 용도: 한 스레드가 작업을 끝낼 때까지 다른 스레드가 접근하지 못하게 막음.
    • 장점: 단순하고 직관적.
    • 단점: 데드락 발생 가능성.
  2. 세마포 (Semaphore):
    • 설명: 카운터를 이용해 특정 수의 스레드가 동시에 리소스에 접근할 수 있도록 하는 동기화 도구.
    • 용도: 리소스 접근 제한, 큐 크기 조절 등.
    • 장점: 다수의 스레드 동시 접근 허용.
    • 단점: 관리 복잡도 증가.
  3. 모니터 (Monitor):
    • 설명: 락과 조건 변수를 포함한 고수준의 동기화 매커니즘.
    • 용도: 객체의 상태를 보호하고, 조건에 따라 스레드 실행을 제어.
    • 장점: 코드가 더 간결하고 유지보수 쉬움.
    • 단점: 구현 복잡.
728x90

'코딩공부 > 운영체제' 카테고리의 다른 글

Chapter15. 파일 시스템  (1) 2024.10.25
Chapter14. 가상 메모리  (1) 2024.10.25
Chapter13. 교착 상태(데드락)  (0) 2024.10.24
Chapter10. 프로세스와 스레드  (2) 2024.10.24
Chapter09. 운영체제 시작하기  (0) 2024.10.24

Chapter09. 운영체제 시작하기

학습목표

  • 운영체제가 무엇인지 이해합니다
  • 커널이 무엇인지 학습합니다
  • 시스템 호출과 이중 모드에 대해 이해합니다
  • 운영체제가 제공하는 핵심 서비스의 종류를 학습합니다

운영체제란

  • 프로그램 실행에 필요한 자원을 시스템 자원 혹은 자원이라 함
  • 실행할 프로그램에 필요한 자원을 할당하고, 프로그램 실행을 돕는 프로그램이 운영체제
  • 커널 영역과 사용자 영역으로 나누어짐
  • 운영체제는 커널 영역에 적재되는 프로그램
  • 실행하는 프로그램의 메모리 영역을 적재적소에 할당하는 것은 운영체제의 역활

운영체제의 심장, 커널

  • 커널: 자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능 담당
  • 이중모드: CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 분리하는 방식
    • CPU는 명령어를 사용자 모드 또는 커널 모드로써 사용할 수 있음
    • 사용자 모드: 운영체제 서비스를 제공받을 수 없는 실행 모드 (커널X)
    • 커널 모드: 운영체제 서비스를 제공받을 수 있는 실행 모드 (커널O)
    • 시스템 호출: 운영체제 서비스를 제공받기 위해 커널 모드로 전환하는 방법

운영체제의 핵심 서비스

  • 프로세스 관리
    • 실행중인 프로그램을 프로세스라고 함
  • 자원 접근 및 할당
  • 파일시스템 관리
728x90

'코딩공부 > 운영체제' 카테고리의 다른 글

Chapter15. 파일 시스템  (1) 2024.10.25
Chapter14. 가상 메모리  (1) 2024.10.25
Chapter13. 교착 상태(데드락)  (0) 2024.10.24
Chapter12. 프로세스 동기화  (0) 2024.10.24
Chapter10. 프로세스와 스레드  (2) 2024.10.24

Chapter04. CPU의 작동 원리

  • ALU는 계산하는 부품으로 레지스터를 통해 피연산자를 받아들이고,
  • 제어장치로부터 수행할 연산을 알려주는 제어신호를 받아들입니다.
  • 오버플로우: 연산 결과가 연산 결과를 담을 레지스터보다 큰 상황
  • 플래그: 연산 결과에 대한 추가적인 상태 정보
  • 제어장치
    • 첫째, 제어장치는 클럭 신호를 받아들입니다 (클럭: 시간단위)
    • 둘째, 제어장치는 ‘해석해야 할 명령어’를 받아들입니다
    • 셋째, 제어장치는 플래그 레지스터 속 플래그 값을 받아들입니다
    • 넷째, 제어장치는 시스템 버스, 그중에서 제어 버스로 전달된 제어 신호를 받아들입니다
    → 제어장치는 클럭신호, 명령어, 플래그, 제어신호를 받아들입니다
    • 제어장치는 CPU 내부와 외부로 제어 신호를 보냅니다
  • 레지스터
    • 프로그램 카운터: 메모리에서 가져올 명령어의 주소(=명령어 포인트)
    • 명령어 레지스터: 해석할 명령어, 이를 받아 들이고 해석한 뒤 제어신호 보냄
    • 메모리 주소 레지스터: 메모리 주소를 저장하는 레지스터
    • 메모리 버퍼 레지스터: 메모리와 주고받을 값을 저장하는 레지스터
    • 범용 레지스터: 일반적인 상황에서 자유롭게 사용
    • 플래그 레지스터: 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장
  • 특정 레지스터를 이용한 주소 지정 방식
    • 스택 주소 지정 방식: 스택과 스택 포인터(스택의 최상단의 위치)를 이용한 주소 지정 방식
    • 변위 주소 지정 방식: 오퍼랜드 필드의 값과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식 (상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식)
  • 명령어 사이클: 하나의 명령어를 처리하는 정형화 된 흐름
    • 인출 사이클, 실행 사이클, 간접 사이클
  • 인터럽트: 흐름에 따라 처리하다 간혹 흐름이 끊어지는 상황
    • 동기 인터럽트: CPU에 의해 발생(예외적인 상황, 프로그래밍 오류 등)
    • 비동기 인터럽트: 입출력장치에서 발생(하드웨어 인터럽트)
728x90

'코딩공부 > 컴퓨터구조' 카테고리의 다른 글

Chapter06. 메모리와 캐시 메모리  (0) 2024.10.24
Chapter05. CPU 성능 향상 기법  (0) 2024.10.24
Chapter03. 명령어  (2) 2024.10.24
Chapter02. 데이터  (1) 2024.10.23
Chapter01. 컴퓨터 구조 시작하기  (1) 2024.10.23

Chapter03. 명령어

고급언어는 결국 저급언어로 변환되어 실행되는데 방법은 컴파일 방식과 인터프리터 방식이 존재함.

  • 컴파일 언어
    • 컴파일러에 의해 소드 코드 전체가 저급 언어로 변환되는 고급 언어 (예: C)
    • 코드 전체가 저급 언어로 변환되는 과정을 컴파일
    • 컴파일을 도와주는 도구를 컴파일러
    • 컴파일러를 통해 저급 언어로 변환 된 코드를 목적 코드
  • 인터프리터 언어
    • 인터프리터에 의해 1줄씩 실행되는 고급 언어 (예: 파이썬)
    • 한 줄씩 저급 언어로 변환하여 실행을 도와주는 도구를 인터프리터
    • 일반적으로 컴파일 언어가 더 빠름

목적파일과 실행파일은 같지 않음. 목적파일에 다른 파일을 연결짓는 링킹이라는 작업이 필요함.

  • 명령어: 연산코드 + 오퍼랜드
  • 연산코드: 명령어가수행할 연산 (연산자)
    • 데이터 전송
    • 산술/논리 연산
    • 제어 흐름 변경
    • 입출력 제어
  • 오퍼랜드: 연산에 사용할 데이터 (피연산자=주소필드)
  • 즉시 주소 지정 방식: 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방법
    • 표현할 수 있는 데이터의 크기는 작아지지만
    • 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기에 속도가 빠름
  • 직접 주소 지정 방식: 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
    • 표현할 수 있는 데이터의 크기는 커졌지만, 연산 코드의 비트 수 만큼 줄어듬
  • 간접 주소 지정 방식: 유효 주소의 주소
  • 레지스터 주소 지정 방식: 유효 주소 (레지스터 이름)
  • 레지스터 간접 주소 지정 방식: 유효 주소를 저장한 레지스터
  • 스택: 후입선출, LIFO(Last In First Out) 자료구조
  • 큐: 선입선출, FIFO (First In First Out) 자료구조
728x90

'코딩공부 > 컴퓨터구조' 카테고리의 다른 글

Chapter06. 메모리와 캐시 메모리  (0) 2024.10.24
Chapter05. CPU 성능 향상 기법  (0) 2024.10.24
Chapter04. CPU의 작동 원리  (0) 2024.10.24
Chapter02. 데이터  (1) 2024.10.23
Chapter01. 컴퓨터 구조 시작하기  (1) 2024.10.23

Chapter02. 데이터

컴퓨터는 0과 1밖에 이해하지 못하며 0과 1을 나타내는 가장 작은 단위를 비트(Bit)라고 함

바이트(Byte)는 8개의 비트를 묶은 단위

데이터는 이진수, 10진수, 16진수로 표현하는데,

이진수는 0b를 앞에 붙여서 이진수임을 표현할 수 있음 (0b1000)

16진수는 0x를 앞에 붙여 16진수임을 표현할 수 있음(0x15)

우리가 이해하기 편한 10진수 대신 16진수는 쓰는 이유는 “16진수와 2진수 변환하기 쉽기 때문”

16진수 : 1A2B

2진수 : 0001 1010 0010 1011

이진수를 십진수로 변환하는 것은 복잡하기에 이진수를 16진수로 표현함.

0과 1을 문자로 표현하는 방법

  • 문자 집합: 컴퓨터가 인식하고 표현할 수 있는 문자의모음
    • 예를 들어{a,b,c,d,e}인 경우 이해가능, 그외 불가능
  • 문자 인코딩: 문자를 0과 1로 변환하는 과정
  • 문자 디코딩: 0과 1로 이루어진 문자 코드를 사람이 이해하는 문자로 변환하는 과정
  • 아스키 코드: 초창기 문자 집합 중 하나로, 영어 알파벳과 아라비아 숫자, 일부 특수문자 포함
    • 총 128개의 문자를 표현(0~127)
728x90

'코딩공부 > 컴퓨터구조' 카테고리의 다른 글

Chapter06. 메모리와 캐시 메모리  (0) 2024.10.24
Chapter05. CPU 성능 향상 기법  (0) 2024.10.24
Chapter04. CPU의 작동 원리  (0) 2024.10.24
Chapter03. 명령어  (2) 2024.10.24
Chapter01. 컴퓨터 구조 시작하기  (1) 2024.10.23

Chapter01. 컴퓨터 구조 시작하기

명령어는 컴퓨터를 작동시키는 정보이고, 데이터는 명령어를 위해 존재하는 일종의 재료.

컴퓨터의 핵심부품은 중앙처리장치(CPU), 주기억장치(메모리), 보조기억장치, 입출력장치

  • 메모리: 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
    • 프로그램이 실행되기 위해서는 반드시 메모리에 저장되어야 한다
    • 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장한다
    • 메모리에 저장된 값의 위치로 주소를 알 수 있다
  • CPU: 메모리에 저장된 명령어를 읽어 들이고, 읽어 들인 명령어를 해석하고 실행하는 부품
    • 산술논리연산장치(ALU) - 계산기
    • 레지스터 - CPU 내부의 작은 임시 저장 장치
    • 제어장치 - 제어신호라는 전기신호를 보내고 명령어를 해석하는 장치
    • CPU는 메모리에 저장된 값을 읽어들이고, 해석하고, 실행하는 장치다
    • CPU 내부에는 ALU, 레지스터, 제어장치가 있다
    • ALU는 계산기, 레지스터는 임시 저장 장치, 제어장치는 제어신호 발생 및 명령어 해석
  • 보조기억장치: 메모리는 가격이 비싸고, 용량이 적고, 전원이 꺼지면 정보를 잃음 → 메모리보다 저렴하고, 용량이 크고, 전원이 꺼져도 정보를 보관하는 장치
  • 입출력장치: 모니터, 키보드, 마우스, 스피커, 마이크처럼 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치
  • 메인보드: 메인보드에 다양한 부품을 연결하여 서로 정보를 주고 받을 수 있고, 이는 메인보드 내부에 버스라는 통로를 통해 가능함.
  • 시스템 버스
    • 주소 버스
    • 데이터 버스
    • 제어 버스

출처: [서적] 혼자공부하는 컴퓨터구조와 운영체제

728x90

'코딩공부 > 컴퓨터구조' 카테고리의 다른 글

Chapter06. 메모리와 캐시 메모리  (0) 2024.10.24
Chapter05. CPU 성능 향상 기법  (0) 2024.10.24
Chapter04. CPU의 작동 원리  (0) 2024.10.24
Chapter03. 명령어  (2) 2024.10.24
Chapter02. 데이터  (1) 2024.10.23

+ Recent posts