728x90
반응형
- 모든 프로그램은 실행시키려면 메모리 위에 존재해야한다.
- Input Queue를 통해 메모리로 올라온다. Input Queue에서 기다렸다가 올라옴
- 사용자는 몇 단계를 거쳐 프로그램을 실행시킨다.
- source 작성 -> compile -> object module, 한 가지의 module만 존재하는 것이 아니기 때문에 other object modules과 연결시키기 위해 linkage editor가 존재 -> 그 결과로 load module -> loader로 메모리 load -> System library와 함께 load하여 사용 -> CPU 할당 받아 실행
- Address binding : Instruction과 Data를 메모리 위로 올린다는 것
- Compile time : Compile 하기 전 실제 메모리에 몇 번지부터 시작될지 알고 있어야 함
- Load time : Loading하는 시기에 Address binding이 이뤄질 수 있는데 그 정보 없이 하게 된다면 relocatable code가 나옴 실제 바인딩은 밀림
- Execution time : Process가 실행되는 시점에야 Address binding이 이뤄짐 (base and limit register같은 하드웨어 지원이 있어야함)
- 메모리 관련 : logical(논리적) vs Physical(물리적)
- Logical Address - CPU에 의해서 발생한 주소 (virtual address)
- Physical Address - memory상에 할당된 주소
- compile-time or load-time에 address-binding이 이루어졌다면 논리적 주소와 물리적 주소가 같다고 함
- 반면 Execution-time에 binding이 일어나면 다르다고 함
- 실행 시 일어난다는 이야기는 메모리에 올라오는데 위치가 가변적이기 때문
- 위 그림에서 logical address [346]은 CPU가 할당한 것 - 임의의 값으로 설정
- 그리고 MMU에서 relocation register가 설정되면 해당 값 2개를 더해 physical address가 정해짐
- Address binding은 3개의 시점에서 일어날 수 있음
- Compile Time : Complie할 때(사전에) 메모리 어느 위치에 할당될지를 알고 있어야 가능함
- Load Time : Binding이 밀려서 Relocatable하게 어느 위치에 할당될지
- Execution Time
- Virtual Addr : 편의상 주소값이 가상으로 할당되는 것
- Symbolic Addr : 편의상 주소값이 할당될 수 있는데(위 Virtual Addr) 이를 관리하기 위해 상징적으로 설정해놓은 주소
- Physical(물리적으로) 할당된 Addr를 Absolute Code라고 함 -> Addrs binding이 끝난 후임
- Virtual Addr → Physical Addr로 변환시켜주는 하드웨어
- Relocation register를 가지고 있음, 전에서 가져온 logical Addr를 더해 Physical Addr
- Dynamic Relocation : 동적으로 재할당되는 것임
- Dynamic Loading : 동적으로 메모리 상에 업로드 시키는 것
- 실제 called되기 전에는 로딩 시키지 않음
- 사용되지 않는 것들은 로딩 조차 되지 않기 때문에 메모리 효율성 측면에서 좋음
- 자주 발생하지 않는 경우가 존재할 때 유용함
- Dynamic Linking : 라이브러리 같은 것들을 초기에 호출하고 연결시키는 것이 아닌 실행 직전까지 지연시키는 것
- Stub에 주소 정보를 저장하고 이를 이용하여 실행될 때 구현함
- Swapping : Memory 공간은 상당히 제한적이기 때문에 효율성 측면에서 더 나은 퍼포먼스를 위해 사용 중이던 프로세스를 하드디스크(Backing Store : BackUp)로 보내고 새로운 Process를 올림
- Memory -> Disk : Swap Out or Roll Out
- Disk -> Memory : Swap In or Roll In
- Transfer time에 비례관계 (데이터가 많을 수록 오래걸림)
- Contiguous Allocation : 연속적으로 빈 공간을 찾아 할당해주는 것
- OS 영역
- User Process 영역
- Single-partition Allocation : 연속적으로 붙어있는 한 공간을 할당
- Relocation-Register를 이용하여 OS / User Process영역을 구분 or 한 프로세스 영역 / 다른 사용자가 사용한 영역 구분
- Relocation(Base) Register 어느 한 프로세스가 할당된 곳의 시작지점
- Limit Register : 시작 지점부터 어느 위치까지 사용할 건지 나타내는 것
- CPU가 어느 주소값을 발생시킴 : logical addr
- MMU의 Relocation register 값과 더해서 physical addr를 발생
- 그것이 제일 큰 그림 첫 번째 Addr
- 그리고 Base(Physical)과 대소관계 비교
- Base보다는 크고 (Base + Limit)보다는 작아야 유효한 접근으로 처리
- 그것이 아니라면 Trap -> Error를 발생시킴
- 연속적으로 붙어있는 비어있는 한 공간(Hole)을 관리
- 만약 어떤 프로세스가 할당을 요청하면 Hole을 찾아야 함
- 운영체제 입장에서는 상태에 따라 이미 할당된 구역인지 아니면 할당가능한 구역인지 관리를 해줘야함
- 아래 그림 예시는 process8의 작업이 끝나고 나니 사용 중이던 Hole만큼 free구역이 생겨났고 그 뒤로 다른 프로세스들이 할당되는 그림
- 빈 공간(Hole)들을 할당해주는 알고리즘
- First Fit : 할당하고자 하는 크기보다 큰 공간을 처음 발견한 곳에 할당
- Best Fit : 요청한 부분보다 크면서 남는 곳은 가장 적은 가장 효율적인 공간에 할당 -> 전체 조회
- Worst Fit : 남아있는 곳 중 가장 큰 곳을 할당 -> 전체 조회
- First Fit은 빠르고, Best-Fit은 Worst Fit보다 속도와 효율측면에서 좋음
- External Frag : 요청한 만큼을 충족시키기 위해 존재하는 메모리 공간을 모아서 만듬 따라서 연속적이지 않음 -> 사용 x
- Internal Frag : 요청된 양의 Best만큼 주려고 하면 남는 공간이 너무 작아 아예 다른 프로세스에 할당하는 것이 불가능할 수 있음. 그럼 계속 할당되지 않은 채 관리해주어야 하는데 관리 Overhead가 증가할 수 있음. 그래서 그냥 남는 공간만큼 모두 할당하는 것
- Extrnal Fragmentation은 Compaction에 의해 줄여질 수 있음
- Compaction : Dynamic relocation으로 관리, 남아있는 공간 사이를 없애기 위해 그림으로 설명하자면 한 쪽으로 밀어버리고 공간을 창출하는 기법
- I/O 문제가 발생할 수 있음 : Writing해야하는 공간이 Compaction에 의해 달려져서 문제가 발생할 수 있음
- 해결기법 : 정해진 OS buffer로만 수행
- 요청된 공간을 한 번에 할당하는 것이 아닌 요청된 공간을 Paging기법으로 나누어 할당 가능한 곳에 할당시키는 기법
- Physical memory로 나누는 경우 frames이라고 함
- Logical memory로 나누는 경우 pages라고 함
- 같은 공간에 연속적으로 존재하는 것이 아니기 때문에 Page Table이 존재해야 함
- 각각의 프로세스는 자기 자신의 Page를 가지고 있음
- Internal Fragmentataion 존재
- 어떻게 Addr를 변환시킬까
- 앞 부분은 Page Number, 뒷 부분은 Page offset으로
- 그림으로 보면 앞 부분 p 값으로 page table에서 찾고 해당하는 Frame number를 찾고 그 값을 앞에 붙이고 displayment값은 그대로 하여 변환작업이 이루어짐
- 또 다른 예시
- Logical Memory 4개
- 자기 자신의 Page Table
- Page Number -> Frame Number로 변환한 예
- 또 다른 예
- logical memory값으로 page No를 page table로 관리하고 frame no로 할당
- 비어있는 frame 리스트
- page table을 이용해서 allocation
- Page Table은 메인 메모리 상에 존재해야 함
- 그리고 Page Table이 메모리 상 어디에 존재하는지 알아야 함 -> PTBR : Page Table 시작 위치 정보를 갖고 있음
- Page Table의 크기에 대한 정보 -> PRLR
- 모든 Data or Instruction 하나에 대한 읽기/쓰기 작업은 메모리 접근이 2번 요구됨
- 1) Page Table 접근
- 2) 실제 값을 위한 접근
- 두 번 접근이 비효율적인 측면이 존재하여 나온 것이 TLBs or Associative Memory
- 일종의 Cache 역할
- 한 테이블의 Parallel하게 관리하여 빠른 속도
- 만약 존재하지 않으면 TLB 단계
- TLB를 뒤져서 Frame Number가 존재하면 TLB hit로 한 번에 끝내고
- 없으면 Page Table에서 찾는 과정으로 넘어감
- Associative Lookup - £(t)
- 메모리 접근 - 1ms
- 찾을 수 있는 확률(Hit ratio) - a
- 찾지 못하는 확률 - (1-a)
- EAT = (1 + £)a + (2 + £)(1 - a) = 2 + £ - a
- 만약 £ 값이 작아지고 a값이 커진다면 1에 수렴
- Memory Protection을 위해 하나의 비트가 추가되어 "Valid" or "Invalid"로 나누어 저장
728x90
반응형
'CS > OS' 카테고리의 다른 글
[OS] Process Synchronization(1) - 프로세스 동기화 (0) | 2023.06.14 |
---|---|
[OS] Memory Management(2) - 메모리 관리 (2) | 2023.05.29 |
[OS] Deadlocks (2) - 교착상태 (0) | 2023.05.16 |
[OS] Deadlocks (1) - 교착상태 (0) | 2023.05.09 |
[OS] Process Synchronization (2) - 프로세스 동기화 (강의 내용) (0) | 2023.05.04 |