일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- O.S
- Compose
- JUnit
- 데드락
- kotlin
- spring
- design pattern
- 더티비트
- 리드미
- markdown
- Di
- coroutine flow
- LiveData
- Constraint Layout
- git
- android study jam
- Android
- SOLID
- JetPack
- OS
- readme
- github
- 운영체제
- 다단계 큐
- Class.class
- 마크다운
- Data Binding
- Spring Boot
- 깃허브
- test
- Today
- Total
목록Computer Science/O.S. (16)
차지
단편화 이전 글에서 언급한 내외부 단편화를 간단히 정리했습니다. 내부 단편화 1gb의 메모리 공간에 990mb의 프로세스가 적재된다고 가정하겠습니다. 10mb의 공간이 남으며 새로운 프로세스를 적재하기엔 좁은 공간입니다. 필요 없는 기억자료가 할당된 영역 내부에 있지만, 쓰이지 않는 것을 내부 단편화라 합니다. 외부 단편화 두 개의 1gb의 메모리 공간에 1.5gb의 프로세스가 적재된다고 가정하겠습니다. 두 공간의 공간을 합치면 1.5gb보다 큰 2gb지만, 1.5gb의 프로세스는 좁아서 적재될 수 없습니다. 사용할 수 없는 기억장소가 할당된 영역 밖에 있다는 것을 뜻하며 외부 단편화라 합니다.
가상기억 장치 시스템에서, 교체될 페이지의 내용이 변경되었는지를 표시하는 비트 페이징 앞선 글에서 페이징에 대해 언급했습니다. 페이징 기법은 데이터를 페이지 단위로 쪼개서 관리하는 기법입니다. 보조기억장치는 공간이 큰 대신 접근할 때 탐색이 어렵습니다. 때문에 자주 사용하는 데이터는 주기억장치에 두고 접근합니다. Dirty Bit write한 적 있는 data page 단위로 처리하는 데이터는 주로 주기억장치에서 읽고 씁니다. 보조기억장치로 가기전에 주기억장치가 종료된다면 데이터는 사라지게 됩니다. 이러한 문제를 막고자 변경된 page를 수시로 보조기억장치에 저장하는 작업을 진행합니다. Dirty Bit(Modify Bit)는 write한 데이터를 표시하기 위한 bit이며 데이터의 손실을 막아줍니다. R..
앞서 작성한 글에서 다중 프로그래밍을 실현하기 위한 이야기가 많이 등장했습니다. 다중 프로그래밍을 실현하기 위해 많은 프로세스를 동시에 메모리에 올려둬야 합니다. 가상 메모리는 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록하는 기법입니다. 프로그램이 물리 메모리보다 커도 된다는 장점이 있는 이 가상 메모리에 대해 작성해볼까 합니다. 가상메모리 프로그램 전체가 늘 메모리에 올라와 있어야 하는 것은 아닙니다. 만일을 대비한 코드는 만일의 상황에만 실행됩니다. arrays, lists 등은 필요 이상으로 많은 공간을 점유하기도 합니다. 프로그램의 일부만 메모리에 올릴 수 있다면 많은 이점이 존재합니다. 물리 메모리 크기에 제약받지 않아도 됩니다. 더 많은 프로그램을 동시에 실행시킬 수 있습니..
CPU 스케줄링의 결과로 CPU 이용률과 사용자에게 제공하는 컴퓨터 응답속도를 향상할 수 있습니다. 하지만 이러한 성능 향상을 위해 많은 프로세스를 메모리에 유지해야합니다. 이 글에서는 메모리를 관리하는 다양한 방법에 관해 설명합니다. 주소할당 메모리 주소공간에서 명령어와 데이터 바인딩은 그 바인딩이 이루어지는 시점에 따라 다음과 같이 구분됩니다. Compile time 바인딩 메모리 내에 들어갈 위치를 컴파일 시간에 알 수 있다면 컴파일러는 절대 코드를 생성할 수 있습니다. Load time 바인딩 메모리 적재 위치를 컴파일 시간에 알지 못한다면 이진 코드를 재배치 가능 코드(Relocatable Code)로 만들어야 합니다. 심볼과 진짜 번지수의 바인딩은 실제 적재되는 시간에 이루어집니다. 재배치 가..
이전 글에서 동기화에 대한 이야기를 하며 교착상태라는 이야기가 나왔습니다. Operating System - 동기화 Operating System - 동기화 예제 교착상태는 세마포가 Ready Queue 를 가지고 있고 둘 이상의 프로세스가 Critical Section 진입을 무한정 기다리고 있고 Critical Section 에서 실행되는 프로세스는 진입 대기 중인 프로세스가 실행되야만 빠져나올 수 있는 상황을 말합니다. 이전 글에서 예방에 대한 내용을 보충하기 위해 작성했습니다. 교착상태의 필요조건 상호 배제(mutual exclusion): 최소 하나의 자원이 비공유 모드로 점유되어야 합니다. 점유 대기(hold and wait): 최소 하나의 자원을 점유한 채 다른 점유된 자원을 얻기 위해 대기..
Operating System - 동기화 이전 글에서는 발생할 수 있는 문제에 대해 많이 언급했습니다. 또한 임계구역 문제, 경쟁조건이 없는 프로그램을 설계할 때 발생하는 문제, 교착상태, 라이브니스 위험 등을 언급했습니다. 이 글에서는 제시된 도구를 고전적인 동기화 문제에 적용합니다. 유한 버퍼 문제 먼저 유한 버퍼 문제가 존재합니다. // n개의 버퍼로 구성된 pool이 존재하며 각 버퍼는 한 item을 저장 val n: Int var mutext: Semaphore = 1 // 상호 배제 기능을 제공 var empty: Semaphore = n // 비어있는 버퍼 수 var full: Semaphore = 0 // 사용중인 버퍼 수 //===================================..
Multilevel Queue 여러개의 큐에 여러 스케줄링을 적용하는 기법 다단계 큐를 이해하기 앞서 다른 스케줄링 기법을 알 필요가 있습니다. 여기서 언급하는 기법은 FCFS, RR, Priority 세 기법입니다. 작업이 분류되고, Ready Queue에서는 우선순위에 맞게 작업이 스케줄링 됩니다. 시스템 작업, 대화형 작업, 일괄처리 작업 등으로 분류하는 것을 말합니다. 분류된 작업이 실행되며 Round Robin 기법에 따라 프로세스가 실행됩니다. 여기서 foreground queue와 background queue를 나눠서 생각합니다. foreground는 interactive, background는 batch 식입니다. foreground에서는 사용자가 느끼기에 끊김없이 진행되어야 하기 때문에..
Critical Section 문제를 해결하기 위해서는 3가지 조건이 충족해야 합니다. 세 가지 조건을 충족한 고전적인 방법으로 피터슨의 알고리즘이 존재합니다. 기본 개념 프로세스가 2개일 때만 가능하고, 3개일 때는 아직 연구중 자원을 공유하는 2개의 프로세스 간에는 Flag와 turn변수가 공유됩니다. turn은 PCB와 비슷한 개념입니다. 진입할 프로세스의 번호가 저장되어 있습니다. flag는 프로세스가 임계구역에 들어가 실행할 준비가 되었는지 판별하는 Boolean입니다. 2개의 프로세스가 동시에 접근한다면, turn의 값이 덮어씌워지기 때문에 문제가 생기지 않습니다. Mutual Exclution turn 변수는 다음에 올 프로세스의 번호입니다. turn 변수는 0 또는 1입니다. 0과 1의 값..