카테고리 없음

[운영체제]

기술1 2025. 6. 12. 22:31

base와 base + limit를 도입해서 

read base + 20

read base + 10

 

이렇게 저장 되어있다가 프로세스로 변환되면 read ~ 되는 것입니다. 주소를 읽어와서 연산이 가능한 것입니다. 프로그램의 역할이 데이터를 읽어오고 데이터를 쓰는 것인데 이 주소가 필요한데 컴파일은 이것이 다 symbol로 저장됩니다. 

 

read base + 20

read base + 10

이런 상대주소로 되며 램에 적재해서 실행하게 되면 base에 그때 램의 상황에 따라서 바뀐 base를 받게 되는 것입니다. 실행을 하게 되면 base 값은 1024 번지야 그러면 이 안에 있는 것들이 1044 이렇게 바뀌는 것입니다.  

 

Logical address space : 프로그램에 의해서 생성된 logical addresses

 

Physical address space : 난장판이므로 이걸 조율해줘야 함

 

Memory-Management Unit (MMU) 

운영체제의 어떤 역할을 경감해주는 것입니다. relocation register라는 것이 있는데 이것이 중간에 더해줍니다. 현재의 프로세스가 어떤 위치 비슷하게 보면 base register인데 더해주는 것입니다. cpu가 가지고 오는 logical address에다가 실제 메모리에 있는 주소값의 데이터를 access하기 위해서 relocation register에 있는 값을 더해서 physical address에 access 할 수 있도록 도와주는 것입니다.

 

프로세스가 해당하는 프로세스가 메모리의 어디에 위치해있느냐에 따라서 relocation register는 바뀝니다. process가 ram에 적재되는 위치에 따라서 relocation register는 달라집니다.

 

해당 프로세스를 실행할 때 relocation register의 값을 읽어서 접근하는 것입니다. 이것을 지원해준다고 생각하시면 됩니다.

 

 

Dynamic Loading

동적으로 메인메모리에 적재를 한다는 뜻입니다.

 

논리 주소와 물리 주소입니다. 메인 메모리에 저장되는 공간에 physical memory라는 것이 존재합니다. 메모리에 시스템상 있는 주소입니다. 이 주소는 CPU 주소와 다릅니다. 

 

CPU에서 나오는 주소와 이건 다릅니다. Physical address 어쨋든 logical 주소입니다. 중간에 MMU라는 것이 존재합니다. CPU는 자기가 실행하고 있는 다음 명령어를 가져올 때 주소를 엑세스하기 위해서 논리주소를 메인메모리에 요청합니다. 

 

실제로 메인메모리에 있는 걸 Physical address라고 합니다. 

 

언제 어떻게 되느냐에 따라 주소가 동적으로 바뀝니다. 동적으로 적재되기 때문에 램에 적재될 때 어디에 적재될지 모릅니다. MMU가 하는 일은 CPU가 보는 Address와 물리적 Address를 분리시켜놓은 것입니다. 

 

태초에 CPU는 0번지부터 시작된다고 생각하는 것입니다.실제로 램에 적재되어있는지 상관없이 0번지부터 시작한다고 CPU는 생각합니다. 0번지부터 메모리부터 적재된다고 보고 MMU가 실제 세계와 매핑할때 바꿔주는 역할을 합니다. 

 

Dynamic Loading

태초에 모든 하나의 프로그램은 프로그램을 실행시키면 그것 전체가 램에 적재됩니다. 하지만 지금은 프로그램 사이즈가 너무 커졌기 때문에 이걸 다 적재해서 실행하기는 불가능합니다. 비효율적이기 때문입니다.

 

컴파일된 프로그램에게 CPU가 실행하고자 하는 부분만 램에 적재해주면 된다.

 

Dynamic Linking

 static linking은 두개의 파일을 붙여서 하나의 파일로 만드는 것입니다. 컴파일 할 때 사용하는 것이며 다른 컴퓨터에 카피도 가능하빈다. 

 

Dynamic linking은 하드디스크에 코드를 만들었으면 그것만 컴파일합니다. 그러면 컴파일해서 코드를 나오면 다른 PC에 보내면 다른 PC에 이미 그것이 있습니다. 공유 라이브러리가 이미 있는 것이며 stdlib.so 이렇게 된 것이 있습니다. 그러면 이 컴파일된 것을 실행을 할 때 shared library를 합친 것입니다. 

 

Static linking이라고 하는 것은 컴파일 타임에 shared library를 붙이는 것입니다. dynamic linking은 기존에 구현되어 있는 함수를 실행하기 위해서 compile time에 linking하는 것이 아니라 실행시간이 linking하는 것입니다. 실행될 때 Linking한다는 것입니다.  

 

실행을 할 때 printf를 컴파일해서 붙였으면 자기 프로그램 내에 있는걸 호출하면 되지만 사용자가 만든 것을 실행하면 shared object 라이브러리가 있는 디렉토리에 가서 이미지 파일을 찾아서 메모리에 올려서 실행하는 것입니다. 

 

Dynamic linking은 기존에 컴파일러가 제공하거나 시스템에서 제공한 라이브러리를 가지고와서 실행을 할 때 그 부분을 램에 적재해서 실행하는 것입니다.

 

장점 : 프로그램 크기가 작아짐

단점 : 파일에 stdlib 파일이 없다 (가정) 그러면 실행을 못함 shared library가 없다면 실행을 할 수 없음

 

 

Contiguous Allocation

운영체제는 low memory의 벡터에 적재되었습니다. 하드디스크에 있는 os가 부팅을 하게 되면 적재가 됐습니다. 사용자가 클릭을 하게 되면 프로세스를 전체 다 메인메모리에 적재를 했습니다. 

 

MMU가 Logical -> Physical로 변환

 

Relocation Register라는 것이 사용이 됐습니다.  

Variable Partition 

운영체제가 프로세스를 실행할 때 프로세스가 종료되어서 나갈 때, 다음번째의 유휴공간(Hole) 에 다음 프로세스가 위치할 것입니다.

이렇게 되면 느낌에는 메모리 공간이 작아짐을 느낄 것입니다. 운영체제가 하는 일은 이러한 빈 Hole을 찾아서 합쳐줍니다. 직관적으로 compaction이라고 합니다. 한 곳으로 모아놓는 것입니다. 

 

first-fit 처음 홀에 넣는 것

best-fit 홀이 가장 작은 곳에 넣는 것

worst-fit은 홀이 가장 큰 곳에 넣는 것입니다. 

 

External Fragmentation

외부 단편화, 새로운 fragmentation이 적재가 되었는데, 메모리 space가 존재하긴 합니다. 하지만 그 공간이 따로따로 떨어져있는 것입니다. 연속적으로 존재하지 않기 때문에 프로세스를 쪼개서 넣어야 하는 상황입니다. 

 

Paging

메모리의 공간이 다르기 때문에 유휴공간이 생겨납니다.

 

External Frag나 Internal Frag가 발생하고 이를 줄이기 위해서 paging을 사용합니다. 

 

paging은 프로그램을 페이지 단위로 나누는 것입니다. 그리고 램에 physical 주소를 frame 단위로 나눕니다. 프로그램을 page로 나눕니다. frame 크기와 page크기는 같은 것이고 이것을 적재하는 것을 페이징이라고 합니다. 

 

external fragmentation을 피하고 variable partition 문제점을 최소화하기 위한 것입니다. 사이즈는 2의 제곱으로 사이즈가 나뉩니다. 보통은 512바이트에서 16mb로 나뉘어집니다.