<Device Driver>_ 351~357 참고
kernel과의 communication을 위해 switch table을 이용
file_operations에 함수들(read, write, ioctl, open, release)의 시작주소가 들어있음
이런 함수들은 새로운 device driver를 구현할 때 반드시 필요하다!
[구조]
Interface for initialization: 초기화 함수로 device driver초기화 및 kernel에 등록
Interface for file system: file system과 interface하는 함수
Character driver: open, release, read, write, ioctl...
Block driver: open, release, ioctl...
Network driver: open, close, transmit, ioctl...
Interface for hardware: 하드웨어와 interface하는 함수
<RAID>-Redundant Array of Inexpensive(Independent) Disks
즉, 저렴한 디스크 여러개를 사용하는 효과이다. (359~368p 참고)
[RAID 0] - non redundant
연속된 저장단위 strip이 분산된 disk에 저장되며 1/disk개수로 나눠서 저장, 추측을 통한 일부복원이 가능
[RAID 1] - mirrored
RAID 0번 방법이 2번, 중복되게 사용하여 신뢰성을 높임 (but, disk가 2배로 필요하다.)
[RAID 2] - RAID 1번 방법에서 Disk 개수를 좀 줄여보자는 측면
Hamming code(오류탐지 및 수정)으로 계산대상 data bit조합을 다르게 해서 parity bit를 저장
but, 1bit가 아닌 문제발생 시 문제발생만 탐지, 어디서 문제발생인지 모름 (∵bit조합이기 때문)
[RAID 3] - Bit Interleaved Parity
연속된 bit들을 disk 여러개에 배치, 단! 같은 자리에 배치! (parity 1개만 사용)
예를 들어 1011이면 1, 0, 1, 1을 따로따로 나누어 동일한 disk의 상대적 위치에 배치하며
parity를 계산한 값도 같은 위치에 배정, parity를 이용해 복구가능, 문제발생위치도 알 수 있다!
[RAID 4] - block level parity
1011처럼 연속된 bit들을 한 뭉탱이로 disk에 넣으며 분리된 I/O를 병렬적으로 진행
parity에서 block 0~3이 모두 관련없는 정보라도 같은 위치로 읽어 parity를 계산
[RAID 5] - block level distributed parity
RAID 4와 비슷하지만 parity를 각 disk에 여러 disk에 분산시켜 저장한다.
[RAID 6] - dual redundancy (P와 Q에 짝수parity와 홀수parity를 분산한다.)
RAID 5와 비슷하며 신뢰성을 높이기 위해 같은 정보에 대해 parity를 2번 계산
[RAID 01, RAID 10] - RAID 0과 RAID 1을 조합하여 만든 것, (요즘 사용되는 RAID)
<Memory Management>- 메모리 할당과 보호역할을 함.
memory allocation: main memory를 subdivide하여 할당함
memory protection: process가 할당이 허용된 메모리 영역에만 접근하도록 하는 것
<Memory Management가 필요한 상황들>
Relocation: location 즉, 주소값을 다시 잡아주는 것으로 swapping과 compaction에서 필요
swapping: process가 우선순위높은 process실행을 위해 기존 process가 메인 보조간 이동하는 것
compaction: process간 빈 공간을 합치기 위해 process를 이동시 주소를 이동시켜야 하기에 필요
Sharing: 2개 이상의 process들이 같은 memory공간을 접근하도록 하는 것.
<Memory Partitioning: Fixed Partitioning (고정분할식 메모리 할당방법)>
한정된 메모리를 여러 process에 분배하는 것으로 다음 2가지가 있다.
Equal-size partitions: 일정한 크기로 분할해서 메모리에 들어있는 프로그램수 파악이 간단
단점: 메모리 이용효율↓ , process내부 fragment가 생기는 현상인 internal fragmentation현상이 발생한다. (활용되지 못하는 메모리공간)
Unequal-size partitions: 일정하지 않은 크기로 분할
단점: fragment를 줄일 뿐, internal fragmentation 발생을 없애지는 못하였다.
<Memory Partitioning: Dynamic Partitioning (가변동적 메모리 할당방법)>
process에게 필요한 만큼만 할당하는 방법으로 고정분할보다 메모리 활용도가 높다.
external fragmentation: process 외부에 fragment가 생기는 현상
(시작주소와 길이가 있는) 비어있는 메모리 table을 이용해 빈 메모리를 찾는다.
<Dynamic Partitioning Placement Algorithm>
First-fit algorithm: 처음에 맞는 공간 찾기.
Next-fit algorithm: first-fit과 비슷, 직전 알고리즘때 찾은 위치 다음부터 찾는 것 (작은 메모리 공간이 곳곳에 분산되게 하여 앞부분 한 곳에 몰리지 않기 때문에 first-fit보다 좋음)
Best-fit algorithm: index 0~끝까지 모두 조사, 필요한 크기에 제일 맞는 것 찾기
Worst-fit algorithm: best-fit과 정 반대, 크기가 가장 차이나는 것 사용 (남은 공간이 많아 다른 process의 활용 가능성이 커진다.)
<Buddy System> 요즘 사용되는 방식으로 internal fragmentation(고정)과 가변동적할당방법을 합친 방식 (고정+가변)
2^U만큼 빈 공간에 대해 재귀적으로 할당하는 방식 (buddy는 같은 것에서 쪼개진 같은크기 공간)
할당할 process의 크기를 s라 할 때, 2^(U-1) < s <= 2^U를 만족한다면 2^U를 모두 할당
즉, process크기가 할당할 공간의 크기의 절반을 초과하면 할당한다는 뜻
만약 2^U를 넘지 못한다면 조건식을 만족할 때 까지 U값을 줄이면서 재귀적 실행
free list의 길이가 길면 좋지 않기에 되도록 큰 메모리공간으로 남겨두자는 것이 핵심!
(internal fragmetation발생을 무시하고 속도를 높이는게 더 효율적이라는 마인드)
<Memory Address의 종류>
- Physical address: memory unit 하드웨어가 이용하는 주소
- Logical address: 논리적연산에 이용, program instruction(=process가 이용하는 주소)내에 등장하는 주소
- Virtual address: 가상메모리에서 사용하는 logical address
address translation: logical address -> physical address
relative address: 정해진 위치를 기준으로 “주소를 매기는 방식, logical은 process 시작지점기준
Logical = Physical인 경우: [compile-time / load-time] address binding
Logical ≠ Physical인 경우: execution time address binding
<Virtual Address Space (VAS)>
cpu는 main memory만 읽기 때문에 VAS를 main memory에 복사해줘야함.
VAS는 보조기억장치에 생성되며 process마다 하나씩 생성된다.
code, data, bss의 시작과 끝 주소는 process의 고유정보이기에 PCB에 저장된다.
0~3G-1(0xbfffffff)는 사용자가 사용하는 주소공간, user context (user mode)이다.
3G~4G-1(0xffffffff)는 kernel이 사용하는 주소공간, System context (kernel mode)이다.
이런 [user+system] context를 process context라 부른다
32bit address computer는 32bit 즉, 4Byte로 메모리 주소값을 표현한다.
실제로 disk공간을 차지하고 있는 것은 stack, data, (code)이다.
code는 실행파일과 공간을 공유(code가 바뀌지 않기 때문에) 실질적으로 disk공간은 stack과 data로
프로그램 실행시 계속 바뀌기 때문에 차지하고 있다.
clock interrupt로 인해 mode change가 발생 (user code ⇋ OS(kernel) code)
VAS는 new상태에서 main memory로 이동(physical address)하면서 실행가능한 ready상태가 되는 것이다.
'Computer System > 운영체제' 카테고리의 다른 글
this->OS.code(13) (0) | 2022.12.21 |
---|---|
this->OS.code(12) (0) | 2022.12.21 |
this->OS.code(10) (0) | 2022.12.21 |
this->OS.code(9) (0) | 2022.12.21 |
this->OS.code(8) (0) | 2022.10.31 |