운영체제

1. Paging Paging이란 프로그램을 일정한 크기의 페이지 단위로 나눠서 실제 메모리에 불연속적으로 할당하는 방법을 말한다. 페이지는 4KB, 8KB, 16KB, 32KB 등으로 설정되지만 일반적으로는 페이즈의 크기를 4KB로 사용한다. 이 글에서도 4KB로 생각하면 된다. 페이지 크기가 줄어들수록 내부 조각이 적어지지만 페이지 테이블의 크기가 증가하고 반대로 페이지 크기가 크면, 내부 조각이 많이 생기지만 페이지 테이블의 크기는 줄어든다. 여기서 페이지(Page)와 프레임(Frame) 두 가지 용어를 먼저 알고 가자. 페이지(Page) : 논리적인 메모리(프로세스의 가상 주소)를 일정한 크기로 나눈 것 프레임(Frame) : 실제 물리적인 메모리(RAM)를 일정한 크기로 나눈 것 페이지는 가상 ..
Contiguous allocation 1. 고정 분할 방식 이름 그대로 메모리를 분할해놓고, 프로그램이 분할된 메모리의 크기와 맞으면 할당하고 크기가 안맞으면 크기가 맞는곳에 할당을 하는 방식이다. 프로그램 A를 보면 분할 1의 크기에 맞기 때문에 할당할 수 있다. 하지만 프로그램 B를 보면 분할 2의 사이즈보다 크다. 그렇기 때문에 분할 2를 건너뛰고 프로그램A와 크기가 맞는 분할 3 메모리에 할당되게 된다. 이때 분할2번은 건너 뛰게 되는데 이를 "외부 조각"이라고 부른다. 분할 3 내부에서도 프로그램 B가 분할 3메모리를 다 채우지 못했는데, 채우지 못한 부분을 "내부 조각"이라고 부른다 보면 알겠지만 상당히 비효율적이고, 내부 조각, 외부 조각이 발생할 수 있다. 2. 가변 분할 방식 가변 분할..
1. Address Binding? 하나의 프로그램이 실행되기 위해서는 프로그램 코드가 어셈블리어로 컴파일되고, 어셈블리어가 기계어로 변환되어 프로세스가 만들어져 메인 메모리에 적재되면 해당 프로세스의 명령어들은 Physical address를 가지게 된다. CPU가 메인 메모리에 적재된 프로세스 명령어를 실행하기 위해서는 Logical address를 알아야 하기 때문에 Physical address에 매핑된 Logical address를 알아내서 프로세스를 처리한다. 이때 Logical address와 Physical address를 매핑하는 과정이 바로 Address Binding이다. Symbolic address VSLogical address VS Physical address Symbolic..
1. Deadlock이란? 두개 이상의 프로세스나 스레드가 서로의 작업이 끝나기만을 기다리며 무한정 대기하며 자원을 얻지 못하는 상태. 2. Deadlock 해결 방법 Deadlock을 해결하는 방법은 간단히 아래와 같이 요약해볼 수 있다. 1. Deadlock 예방 : Deadlock이 발생하기 이전에 데드락 발생원인 중 하나를 제거함으로써 Deadlock을 예방하는 방법 2. Deadlock 회피 : 각 프로세스가 프로세스를 실행하는데 필요한 정보를 추가적으로 받아서 Deadlock을 일으키지않는다고 판단되면 자원을 할당해주는 방법 3. Deadlock 탐지 : 교착 상태가 발생했을 때마다 복구 기법을 활용하여 시스템을 회복시키는 방법. 4. Deadlock 무시 : 그냥 데드락이 일어날 때 까지 방..
1. Banker's Algorithm이란? Deadlock을 회피하는 방법 중 한가지로 자원의 갯수가 2개 이상인 사이클에서 데드락을 회피할 때 사용하는 알고리즘이다. 알고리즘이 Banker's인 이유는 은행에서 100만원을 대출하려면 은행이 먼저 100만원을 가지고 있어야 대출해줄 수 있다. 만약 100만원이 없다면 은행은 돈을 빌려줄 수 없다. 이처럼 할당해 줄 수 있는 자원이 충분한지를 먼저 검사하고 교착상태에 빠질 가능성이 없으면 자원을 할당해주는 방식이다. 아래의 그림을 예시로 Banker's Algorithm을 살펴보자 2. 그림으로 살펴보는 Banker's Algorithm 아래 그림은 은행원 알고리즘을 이해하는데 가장 쉬운 그림이다. 차례대로 사용되는 용어를 알아보자면 A, B, C : ..
1. Atomic이란? Atomic의 Atom은 원자라는 뜻이며, 원자란 물질을 구성하는 더 이상 쪼개질 수 없는 가장 작은 단위를 말한다. 프로그래밍에서의 Atomic한 실행이란 어떤 연산이 분할되지 않고 한번의 연산으로 실행되는 것을 의미한다. 설명에 앞서 이 글에서는 프로세스, 스레드를 합쳐서 프로세스 라고만 지칭할 것이다. 가장 대표적으로 Atomic한 연산이 필요한 곳은 Critical Section에 대한 연산이다. 멀티 프로세스 환경에서 여러개의 프로세스가 임계영역에 있는 임의의 count라는 데이터에 접근해서 연산을 할 때 프로그래밍 언어에서는 단지 count++;한줄로 끝나지만 코드가 컴파일 되면 기계어로 번역되어 아래와 같이 약 3단계로 구분된다. count = 1이라고 가정// mov..
1. 동기화 문제란? 여러 프로세스 또는 여러 스레드가 동시에 실행될 때 발생하는 데이터 일관성 문제를 동기화 문제라고 한다. 대표적으로 공유 메모리에 여러 스레드가 동시에 접근해서 값을 변경할 때 연산 결과 출력이 예상치 못한 값으로 나오는 공유 메모리 동기화 문제(Race condition)를 대표적인 동기화 문제로 볼 수 있다. 2. Race Condition / 경쟁 상태 여러개의 프로세스 또는 스레드가 하나의 공유 자원에 동시에 접근할 때 생기는 문제를 말한다. 아래 코드를 보면 스레드 두개를 선언하고 전역으로 선언한 sum이라는 변수에 스레드 두개가 동시에 접근하여 sum이라는 전역 변수에 값을 1씩 증가시키는 코드이다. 뇌버깅을 돌려보면 두개의 스레드에서 1씩 30000번씩 증가시키기 때문에..
1. CPU scheduling이란? CPU는 한번에 하나의 프로세스만을 수행할 수 있다. 여러개의 프로세스가 있어도 현재 CPU가 실행하고 있는 프로세스가 끝날때 까지 기다려야한다. 또한 I/O요청이 들어올 경우 CPU는 들어온 I/O요청이 끝날 때 까지 기다린 후 I/O가 끝나면 다시 실행된다. 즉, 다른 프로세스들을 실행하지 못하고 무한 대기하고 있기 때문에 대시 시간만큼 CPU를 낭비하는 것이다. 이를 해결하기 위해 멀티 프로그래밍 환경에서 CPU를 효율적으로 사용하기 위해 I/O요청이 오면 다른 프로세스한테 CPU를 양도하고 I/O가 끝나면 다시 Ready-queue에 들어가서 실행을 준비하고 실행하고 이런 CPU를 효율적으로 사용하기 위한 방법을 Scheduling이라고 한다. 2. CPU I..
1. Implicit Threading이란? 스레드를 개발자가 명시적으로 생성하거나 제어하지 않고 언어나 프레임워크에게 스레드의 생성과 관리 책임을 넘기는 것. 개발자는 따로 스레딩을 생성할 필요없이 병렬로 실행해야 할 프로그램을 걸러내어 함수형으로 실행만 시켜주면 된다. 2. Implicit Threading의 종류 2-1. Thread pool / 스레드 풀 프로세스 사용? 스레드 사용? 프로세스를 스케줄링 하는 것보다 스레드를 만들어 사용하는 게 자원 소비, 오버헤드 관점에서 훨씬 효율적인 방법이긴 하다. 이유는 프로세스 간 통신을 할 경우 shared-memory또는 Message passing같은 IPC방식을 사용해야 하기 때문에 오버헤드가 크고 context switch를 할 때 프로세스는 레..
1. 스레드란? 스레드의 정의는 프로세스 내부에서 실행되는 실행 흐름의 단위이다. 정의는 위와 같지만 어렵기 때문에 스레드는 한 프로세스 내부의 자원을 공유하면서 프로세스를 여러개로 쪼개서 실행시키는 것을 말한다. 프로세스끼리는 서로 자원 공유를 못하지만 스레드는 한 프로세스 내에 여러개가 존재하기 때문에 한 프로세스의 자원을 공유할 수 있다. 이처럼 한 프로세스 내에 여러개의 스레드가 존재하는 것을 멀티 스레드라고 한다. 싱글 스레드는 일반적인 프로세스 구조이기 때문에 이 포스팅에서는 멀티스레딩에 대해서 설명할 것이다. 2. 멀티 스레드(Multi Thread)란? 위에서 설명한 것과 같이 한 프로세스 내에서 여러개의 스레드가 존재하는 것을 멀티 스레드라고 한다. 스레드 입장에서 보면 프로세스는 스레드..
보글보글소다
'운영체제' 태그의 글 목록