우선 메모리 관리를 알기 위해서 백그라운드와 포그라운드의 차이를 알고 지나갈 필요가 있ㅅ다.
먼저, 프로세스가 메모리에 가져야 프로그램이 실행이된다.
- input queue - 프로세스들의 집합이다. 메모리에 가서 프로그램이 되기를 꿈꾸며 기다리는....
- User program은 실행되기 전에 몇가지 절차를 거친다
근데 메모리에 프로세스를 갖다여을 때,
어딨는지 알아야 갖다 넣는다.
근데 어디 있는 지 어째 아는고 하니
주소를 참조하는데, 이게 부산시 해운대구 ~~로 이렇게 딱 정해져 있으면 손이 덜 갈텐데
얘네는 좀 다른 것이
가상주소(virtual address)와 물리주소(physical address)가 있다.
논리적 주소 공간 vs 물리적 주소공간
(Logical Address Space vs Physical Address Space).
일단 탑재하고 있어야 할 지식이 있다.
1. CPU가 접근 가능한 저장소는 CPU 내부 레지스터 와 주 메모리 이다.
(접근 속도)
레지스터 접근 >> 주 메모리 접근
레지스터 접근이 주 메모리 접근 속도보다 빠르다.
2. 프로그램은 원래 디스크에 이진 실행파일(기계어)로 저장되어 있음.
이것을 실행하기 위해서는 주 메모리에 프로세스가 올라가야함.
3. 바인딩이 뭔지 알아야함.
CPU가 프로세스 작업을 수행하기 위해서 프로세스의 논리적 주소를 참조함.
논리적 주소만으로는 실제 메모리의 주소를 알 수 없기 때문에 논리 주소를 물리적 메모리로 연결시키는 작업이 필요.
(근데 왜 바로 물리 주소를 참조하는 것이 아니라, 논리 주소를 참조하냐)
그 연결시키는 작업은 또 세가지로 나뉜다.
instruction과 data를 메모리 주소에 츠박아 합쳐야 하는데,
이것두 몇가지 과정(stage)이 있다.
컴파일하는 시간, 로딩하는 시간, 실행 시간.
- Compile time binding : 말 그대로 컴파일 할 때, 물리적 메모리 주소가 결정되는 주소 바인딩이다. 메모리 위치가 선험적으로 알고있다면 코드가 실행되면 된다. (단, 위치가 바뀌는 경우 코드를 recompile해야함)
- Load time binding : 프로그램이 실행될 때 결정되는 물리적 주소가 로더가 프로그램이 종료될 때까지 물리주소를 고정한다. 시작주소값이 바끠면 나머지 주소값도 자동적으로 주르르 밀려 바인딩 된다. 컴파일하는 시간 안에 메모리 위치를 모르면, 메모리 위치를 위치를 재설정 할 수 있는 코드여야한다.
- Execution time binding : 프로그램이 실행한 후에도 물리적 주소가 변경 될 수 있을 때 직이는 바인딩 방식이다. 프로 지금 실행되고 있는 메모리의 부분을 다른 넘(process)에게 줘야한다면 합쳐지는 시간이 미뤄질 수 있다. (단 하드웨어(MMU인듯요?)의 도움이 필요하다 매핑하려면)
이 시간들이 뭐쯔케 쓰이냐,
좀 중구난방인데,
Dynamic linking이란?
다이나믹 링킹
*dll(dinamic linked library)
: 컴파일 과정 중 링크 과정이 바로 런타임에 일어난다는 차이점을 가짐.
(대부분의 OS는 스태틱 링킹(static linking)이라는 랭귀지의 라이브러리들이 컴파일 시 합체되는 기법을 사용)
-> 메모리 공간을 효율적으로 사용키 위해.(사용되지 않는 루틴은 로드되지 않음)
-> 자주 사용하지 않는 거대한 양의 코드를 사용할때 자주 사용된다.
-> 다른 OS의 추가적인 도움이 필요하지 않다.
-> dll로 이미 컴파일 된 라이브러리들로 이루어짐.
스텁(stub)이라는 애가 라이브러리 루틴의 참조 대신 존재하다가,
런타임 시에 루틴이 불리면 그 스텁은 자신이 그 루틴이 들어있는 주소값과 바꾸어 바로 한몸이 되어 출동.
유저 프로그램은 logical address 다룬다. physical address절대 안본다.
그래서, 로직헐 어드레스 기반으로 피지컬 연결해줘야한다.
Logical address의 개념은 물리적 주소 공간을 적절하게 메모리 분배를 하는 중앙 집중형(CPU(Central processing unit))이라고 보면 좋것다.
Physical Address란?
: 메모리에 존재하는 장소로 메인 메모리에 존재하는 특정한 저장소에 접근하는것을 허용한다.
데이터 접근하는 데에는 하드웨어와 소프트웨어 둘 다에 사용된다.
하지만 소프트웨어는 physical addresses에 직접적으로 연결하지 않고 가상 주소(virtual address)에 사용된다.
Memory Management Unit(MMU)라고 불리는 하드웨어가 가상주소(virtual address)를 피지칼한 주소(physical address)로 번역해준다.
이제 여기에는 base addresses와 starting addresses가 있는데,
보통 OS에서는 base addresses를 사용한다.
base address가 메모리 블럭(memory block)의 starting addresss를 찾아준다.
글서 적혀진 프로그램에 CPU는 주소를 생산한다?
그럼 그 주소가 base address에 생산되고 여거서 physical address를 형성한다.
이 경우에 CPU에 의해 생산된 주소를 Logical address라고 부른다.
논리적인 주소공간과 물리적인 주소공간은 컴파일 시간 로딩시간 결합시간(address binding schemes)이 같다.
하지만 실행시간(execution-time은 다르다)
뭐 이렇게 저렇게 해서, 메모리에 프로세스를 담았다고 해도,
프로세스에 할당된 메모리보다 더 큰 양의 메모리가 필요할 때가 있다.
그럴 때, 사용되는것이 Overlay 이다.
ଲ Overlay
- 먼저 일단 이거 구식이다.
- 모듈 단위로 구성된 프로그램을 주기억장치에 필요한 모듈만 로딩하여 사용하고, 불필요한 모듈을 내리고 다시 새로운 모듈을 로딩하여 프로그램이 동작되도록 하는 기법이다.
- ex 만약 a,b,c,d 모듈이 존재한다면 e라는 상대적으로 작은 모듈, overlay driver를 생성하여 이 들아ㅣ버가 a,b,c,d,모듈을 올렸다 내렸다 하는 중재자 역할을 한다.
- 운영체제 자신을 다른 프로그램의 코드로 바꾸는 프로세스이다. (운영 체제에서는 exec()시스템 요청으로 수행된다.)
- 사용자에 의해 실행되고 OS의 다른 도움 필요 x
- needed when process is larger than amount of memeory allocated to it.
- 유닉스의 경우, 새로운 프로그램을 실행하는 유일한 방법은 실행중인 프로세스를 분기시킨 뒤에, 새로운 프로그램을 차일드 위에 오버레이 시키는 것이다. 이를 Fork-exec 기술이라고 한다.
- 요즘은 현대식 메모리 관리자를 OS가 담당한다.
ଲ stub
(스텁(stub)이라는 애가 라이브러리 루틴의 참조 대신 존재하다가,
런타임 시에 *루틴이 불리면 그 스텁은 자신이 그 루틴이 들어있는 주소값과 바꾸어 바로 한몸이 되어 출동.)
이라는데 뭔 말인지 잘 모르겠다.
*루틴 : 각자의 목적을 가지고있는 그냥 OS를 이루는 구성원
참고하세용.
쓰는 이유는 언제 쓰일 지 모르는 라이브러리 코드들을 내부에 포함하고 있지 않아서 프로그램 용량이 날씬해진다.
background vs foreground
일반적으로 foreground와 background 라고하면
사용자에게 보여지는 부분은 foreground이고 사용자에게 보여지지 않는 곳에서
일 하고 있는 넘들이 background이다.
내가 짬깐 IOS할때 안드로이드도 배운 바에 의하면 onCreate()된 이후에 화면에 보여지는 상태일때는 포그라운드 프로세스로 실행되구,
onStop()이나 onDestroy()메서드가 호출되면 그 이후에는 백그라운드 프로세스로 전환된다.
근데,
'Major > OS(Operating System)' 카테고리의 다른 글
멤올히 (0) | 2020.04.28 |
---|---|
Hashing 스완 (0) | 2020.04.25 |
CPU Scheduling ( CPU 스케줄링 ) (0) | 2020.04.15 |
(진입) - OS 용어정리 (0) | 2020.04.08 |
(3주차) - Process.. (0) | 2020.04.06 |