일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- BFS
- 스케줄링
- 프로세스
- BOJ
- Brute Force
- 삼성리서치
- paging
- 구현
- Memory Management
- Deadlock
- 운영체제
- 완전탐색
- exec
- 동기화문제
- fork
- segmentation
- 데드락
- pwnable.kr
- 삼성기출
- 백트래킹
- 가상메모리
- higunnew
- 컴공복전
- ascii_easy
- 백준
- 알고리즘
- 김건우
- samsung research
- 시뮬레이션
- dfs
- Today
- Total
목록Operating System (23)
gunnew의 잡설
1. Caching 캐싱은 한정된 빠른 공간에 요청된 데이터를 저장했다가 나중에 그 데이터를 요청할 때 바로 제공하는 것. 지금까지 배운 페이징 기법도 캐싱의 한 예이다. page fault는 cache miss인 것이다. paging system 말고도 cache memory, buffer caching, web caching(proxy server)에서도 사용하는 것이 바로 이 캐싱 기법이다. 그리고 캐시를 교체하는 알고리즘의 제약은 당연하게도 존재한다. Buffer caching이나 Web caching의 경우 삭제할 항목을 결정하는 것은 O(1)~O(logn) 안에 결정되어야 한다. 그러나 Paging system에서는 paging 기법을 통해 주소를 변환할 때, 그리고 그 page가 메모리에 이..
지난 강에서 배운 메모리 주소 변환은 운영체제가 관여하지 않는다고 했었다. 그러나 이 가상 메모리 기법은 전적으로 운영체제가 관여한다. 이번 강은 일단 메모리 관리 기법 중에서 Paging 기법을 사용한다고 가정한다. Demand Paging 요청이 있으면 그 페이지를 메모리에 올리겠다는 뜻이다. 메모리 관리 기법으로서 Paging을 사용하며 어떤 프로세스를 메모리에 올려야 한다고 하자. 이때 프로세스의 모든 페이지를 전부 올리는 것이 아니라 Demand Paging 기법을 사용한다. 이 Demand Paging은 해당 Page가 요청될 때 그 Page를 메모리에 올리는 것을 말한다. 프로그램에서 빈번히 사용되는 부분은 지극히 제한적이다. 잘 만들어진 대부분의 소프트웨어는 대체로 방어적인 코드들이 산재한..
- Segmentation 세그먼테이션 기법은 프로세스가 구성하는 주소 공간을 의미 단위로 (Code, Data, Stack,...)으로 쪼갠 것이다. 작게는 프로그램을 구성하는 함수 하나하나를 세그먼트로 정의할 수 있고 크게는 프로그램 전체를 하나의 세그먼트로 정의 가능하다. 일반적으로는 당연히 Code, Data, Stack 부분이 하나씩의 세그먼트로 정의된다. Segment는 다음과 같은 logical unit들이다. 즉, 다음과 같은 것들이 Segment가 될 수 있다는 것이다. ex) main(), function, global variables, stack, symbol table, arrays * Segmentation Architecture (세그먼테이션에서 주소 변환) * 이 기법에서 L..
물론 Page Table을 2단계만 사용할 수 있는 건 아니다. 다단계로 사용할 수 있다. 프로세스의 주소 공간은 매우 클 수 있기 때문에 Address Space가 더 커지면 다단계 페이지 테이블이 필요하다. 그것을 Multilevel Paging이라고 한다. 그렇지만 한 번 주소변환을 하려면 여러 개의 페이지 테이블을 거쳐야 하며, 4단계 페이지 테이블의 경우 5번의 메모리 접근이 필요하다(4번은 주소 변환, 1번은 실제 데이터 접근). 예를 들어 메모리 접근 시간이 100ns라면 500ns가 소요될 것이다. 하지만 전 시간에 배운 TLB(Translation Look-aside Buffer)를 이용하면, 대부분의 주소 변환 시간 동안 TLB에서 이루어지기 때문에 그 소요가 적다. TLB hit ra..
2. Noncontiguous allocation (불연속 할당) - Paging 프로세스가 구성하는 주소 공간을 같은 크기의 Page로 잘라서 Page 단위로 물리적인 메모리로 올려놓거나 Backing store에 내려 두거나 하는 것이다. 프로세스의 주소 공간을 자른 것처럼 물리적인 메모리에 사용자 프로세스가 들어갈 수 있는 공간들도 페이지와 똑같은 크기로 잘라 놓는데 이 물리적 공간을 Page Frame(페이지 프레임)이라고 한다. 이 Page Frame은 페이지 하나가 올라갈 수 있다. 이 기법을 사용하면 hole들의 크기가 균일하지 않아 발생하는 문제, 즉, External fragmentation(외부 조각 문제)가 발생하지 않는다. 물론 Internal fragmentation(내부 조각 문..
메모리에 접근하기 위해서는 주소가 필요하다. 주소에는 Logical address ( or Virtual address)와 Physical address가 있다. 프로세스가 만들어지면 독자적인 주소 공간 (Address space)가 만들어진다고 했는데 그때 사용되는 것이 논리적 주소이다. 또한 각 프로세스마다 0번지부터 시작하며 CPU는 이 주소를 활용한다. 반면 물리적 주소는 말 그대로 Memory에서 물리적으로 접근할 수 있는 주소로 메모리에 실제 올라가는 위치를 뜻한다. 결국 프로세스가 실행되기 위해서는 메모리에 프로세스가 올라가야 하고, 논리적 주소가 물리적 주소로 바뀌어 처리되어야 하는데 이것을 '주소 변환'이라 하며 '주소 바인딩'이라고도 한다. * Symbolic Address * 우리가 ..
2. Deadlock Avoidance 이 방법은 어떤 추가적인 정보를 이용하여 데드락을 막는 방법이다. 이 추가적인 정보라 함은, 프로세스마다 자기 평생에 자원을 최대로 쓰면 얼마나 쓸지(자원 사용의 최대치)에 대한 정보이다. Deadlock Avoidance Algorithm은 두 종류가 있다. 첫 번째는 자원당 instance가 하나인 경우이고, 두 번째는 자원당 instance가 여러 개인 경우이다. 먼저 instance가 하나인 경우부터 살펴보자. * Single instance per resource types (Resource Allocation Graph Algorithm) * Deadlock Avoidance에서는 위 그래프에서 실선뿐만 아니라 점선도 둔다. 점선은 프로세스에서 자원으로 ..
이미 Deadlock이 무엇인지는 앞선 7강 동기화 문제에서 살펴본 바가 있다. 이것을 좀 더 가시화한 그림이 다음이다. 앞으로만 갈 수 있는 도로에서 차들이 꽉 막혀 진행될 수 없는 상태이다. 시스템 안에서 Deadlock은 자원이 있는데 각 프로세스들이 어떤 자원은 절대 내놓지 않고 갖고 있으면서 다른 자원을 얻으려고 하는 상태를 뜻한다. * 자원의 사용 절차 및 Deadlock 발생의 4가지 조건* 즉, 데드락이 생기는 이유는 자기 것을 내놓지 않고 다른 자원을 얻으려는 일종의 욕심 때문에 발생한다. 그렇다면 프로세스가 자원을 어떤 절차로 사용하는가 먼저 살펴보자. 1. Request (요청) 2. Allocate (할당) 3. Use (사용) 4. Release (반납) 이러한 과정 속에서 데드락..
지금까지 Semaphore에 대한 얘기를 주구장창 했다. 그런데 Semaphore의 문제점은 있다. 구현도 어렵고, 실수 하면 시스템이 완전히 무너진다. 또한 Semaphore를 이용하여 프로그래밍 했을 때 어디에 P연산과 V연산이 들어가야 하는지 정확히 시스템이 작동되는지 검증하기가 굉장히 어렵다. 그러면 이러한 동기화 문제를 해결함에 있어서 조금 더 쉬운 방법은 없을까 고민하다가 나온 것이 Monitor라는 개념이다. Monitor Monitor는 High-level Language에서 제공하는 동기화 수단이다. Semaphore에서는 공유 데이터 접근을 Semaphore가 책임지지 않았고 실제로 동기화 문제는 프로그래머가 처리해야 했다. 공유 데이터에 접근하기 전에 Lock을 프로그래머가 걸어야 하..
Semaphore은 프로그래밍을 조금만 잘못해도 문제가 발생할 수 있다. 예를 들어 Semaphore 변수가 S와 Q로 두 개가 있다고 가정하자. 그리고 어떤 프로세스는 두 Semaphore를 모두 얻어야만 할 수 있는 작업이라고 하자. 예를 들면 A라는 Tape driver에 있는 내용을 B에 저장을 하는 것과 같은 작업이다. 그것들을 각각 P0와 P1이라고 하며 에 나타나 있다. 겉으로 보기엔 문제가 없어 보인다. 그러나 여기에는 심각한 문제가 발생할 수 있다. P0가 S를 얻고 CPU를 뺏겼다고 해보자. 그리고 CPU가 P1로 넘어가고 P1은 Q를 획득했다고 하자. P1이 이제 아랫부분을 실행하려고 해도 S를 P0가 가지고 있기 때문에 실행을 못하고, 반대로 P0가 Q를 얻으려고 해도 P1이 가지고..