-> problem decompostion(divde and conquer)이다.
이는 추상화랑 비슷하다. 왜 비슷하냐? -> 추상화는 CPU,메모리,file 이라는 추상화 계층으로 문제를 나누어서 해결하기 때문이다.
shallow interface vs deep interface>
deepinterface가 더 좋은 인터페이스 디자인이다.
shallow 인터페이스의 한 종류는 자바이다. 예로 인터페이스 명이 body보다 길 경우가 있다. 차라리 바디를 직접 쓰는 것이 현명하다.
deep 인터페이스의 종류는 유닉스의 read,wirte,close 같은 시스템 콜이다. 이러한 시스템 콜에는 디스크 스케쥴링, 권한 매니징, 블락 스케줄링 등이 깊이 숨겨져 있으며 프로그래머는 이를 직접 다룰 일이 없다.
virtual address랑 physical address를 연결하는 것은?
페이지 테이블은 DRAM에 저장
페이징을 위한 OS의 역할 ? -> 페이징 테이블 관리
페이징을 위한 하드웨어의 역할? -> OS보다 DRAM이 빠르기 때문에 실제 메모리 translate을 MMU라는 하드웨어의 지원을 받아서 한다.
실제 페이지가 요청이 될 때, 메모리에 할당이 된다. OS가 세팅해준다
즉, 어플케이션이 할당되지 않은 물리 메모리로 처음 접근할 때 할당된다.
어떻게 file과 storage media를 매핑할까?
file은 block이라 불리는 small chunks(4kb)로 나누어 진다. 블록 address라고 불리는 스토리지 location에 각 블록을 매핑한다.
consistency를 유지하기 위해서는 atomicity와 durability를 만족해야한다.
즉, 데이터를 저장할거면 저장하고 , 아니면 말고, 그리고 데이터는 영구적으로 스토리지에 남아 있어야한다. 이를 위해서 저널링을 사용하며 fsync 시스템콜을 이용한다.
파일업데이트를 위해서 기존 데이터 롤백을 위해 기존데이터를 저장하고, 원자성을 보장하기 위해 fsync를 사용한다. 파일만 fsync를 write를 확인하는 것이 아니라, 디렉토리도 디스크에 안써질 경우도 있기 때문에 디렉토리에 대해서도 fsync로 저장을 확인하다.
하드웨어가 어플리케이션의 권한을 확인하여 시스템콜을 실행할지, 거부할지 정한다. (링레벨)
OS는 하나의 어플리케이션이 다른 어플리케이션의 메모리에 read/write 하는 것을 막아준다.
어플리케이션으로 부터 컨트롤을 반드시 얻을 수 있어야 한다. -> application이 cpu를 무한히 점유하는 상황 방지
shared memory - 속도가 빠르다. 하나의 캐시에서 데이터가 업데이트 되면 다른 코어의 캐시에서도 데이터가 업데이트 된다. cache coherence protocol을 통해 업데이트 된다. 이는 캐시의 일관성을 위한 하드웨어적인 프로토콜이다.
message passing
프로세스1의 데이터를 커널의 메시지 버퍼로 카피해서 커널의 pipe가 process 2번 메모리로 메시지를 전달한다.
CPU(single CPU)
스케쥴링을 통해 CPU의 시간을 sharing한다
Memory(single CPU)
page replacement등을 통해 메모리 공간을 Sharing한다.
Preemptive scheduler: 진행 중인 프로세스를 빼앗을 수 있다
그 안에서 또 work conserving과 none work conserving으로 나누는데, work conserving은 CPU idle time이 없도록 사용하는 것이다.
스케쥴링 알고리즘:
FIFO
SJF(shortest job first)
-빠른 Task부터 수행하기 때문에 response타임이 빠르다
Roundrobin
Paging Algorithm