XV6 - OS 추천
투 트랙
자기계발이 중요하다 - 회사에서는 나를 대체 불가능한 사람으로 만들지 않음.
깃 허브 포트폴리오 - 코딩 실력을 검증하는 프로세스
데브시스터즈???
hardware의 가장 심플한 특징들만 모아서 데이터 스트럭쳐를 만들어서 정의
protection mechanisms에서 Ring3에 있는 어플리케이션이 ring0에 있는 커널 영역을 건드리지 못하도록, mode bit로 관리
DPL -> previleged level
Isolation boundary
c1, c2 -> webserver 존재
프로세스를 따로 커넥션해야 독립이 됨. 쓰레드로 할 경우 프로텍션이 안됨 성능 향상 가능
file이 커널에 있는 같은 페이지 캐시?????ㅂㅁㅇㄴㄹㅇㄹ
shared memory -> shneget 명시적으로 프로세스 두 개가 같은 물리 메모리 주소를 가르키도록 설정하는 것
페이지테이블도 다 바꿔줘야하니까 비용이 비쌈 컨텍스트 스위칭
web server <-> php
둘은 독립해야하지만 커뮤니케이션 할 수 있어야 함. shared memory(메모리를 공유), message passing(pipe, domain-c sockd, fofo)
대용량 - shared memory
작은걸 빠르게 - message passing
Isolation of file
메타데이터에 퍼미션이 존재함 요청은 user가
chmod
chown
user가 설정하고 퍼미션 정보가 inode에 존재함
metadata(e.g. inode)
file을 여는건 반드시 시스템 콜을 통해 커널을 거쳐야 함
api를 허용해줄지 결정하는 reference monitor가 존재
어떤 프로세스껀지
file은 메타데이터의 퍼미션 정보가 있고 이건 유저가 요청을하고 파일을 열면 reference monitor(kernel module)가 권한이 있는지 검사함.
App Amore, SeLin?
퍼미션 정보를 어떻게 저장할건지는 DAC and MAC and capability-based
IPC (Shared(데이터를 다 썼으니 읽어도 됩니다라고 알려줘야 함, 세마포어 or poling 사용(레이턴시가 짧은 경우)), message passing)
Pipe: process A의 데이터를 Pipe(kernel buffer)에 카피하고 process B에 전달
프로세스 용 세마포어가 따로 있음. 스레드 용 세마포어랑 별개인듯
sharing
CPU: scheduling
DRAM: virtual memory - swap
fork - 새로운 프로세스를 만드는 시스템 콜
waiting state(I/O, sleep, yield(다음 best candidate를 찾을때까지 wait))
선점(반응성이 좋아야 하는 곳에 사용, 문맥전환때문에 성능이 떨어짐)
waiting -> ready
running -> waiting
running -> ready
new/waiting -> ready
exit
비선점(성능이 좋음, context switching이 적기 때문에)
running -> ready
running -> waiting
exit
fifo
단점 - 굉장히 긴 task에 의해 짧은 task가 막혀있는 현상(convoy effect)
SJF
장점 - very good response time
단점 - starvation 발생
round robin
단점 - turnaround time이 안좋음
pro - no starvation, good response time
다 개선한 것 mlfq
Paging review
anonymous page(stack이나 heap에서 사용하는 페이지)
page 교체 알고리즘
FIFO, Clock, LRU, optimal, Belady's anomaly(메모리 사이즈가 증가하더라도 페이지 폴트 수가 증가하지 않는다)
LRU - linked list를 만들어서 메모리 접근(read, write)이 발생하면 앞으로 보내고, eviction한다하면 맨 뒤에꺼를 뽑는다.
접근을 판단하려면 특정 참조 시점을 알아야하는데 그때 비용이 비쌈(page fault 발생시킴 매 순간마다, present bit를 꺼버려서). 웹 캐시는 가능한데 커널에서는 안됨.
하드웨어 지원을 통해 accessed bit를 이용하여 LRU에 근사할 수 있음
How to design OS
pintos(Monolithic Kernel, 커널의 모든 기능들이 하나의 커널 스페이스에서 실행됨)
Microkernel(커널의 기능을 최소화하고 file system과 memory manage와 같은 subsystem을 user-level로 올려버림)
단점 - 성능이 너무 안좋아짐 proc에서 커널거쳐서 fs갔다가 커널 거쳐서 driver 가서 이런식으로 성능면에서 너무 부족함.
control flow integrity
LLVM + IR(analysis)
pyrint
graphviz
Huge page - 2MB
Rust - webserver, safety가 보장되는 webserver
안전성과 성능을 모두 잡은 웹서버
Web Assembly - 브라우저 플러그인?? 만드는거
key-value store
leveldb kv store - google에서 만든거
leveldb spdk
웹캐시나 데이터 스토리지를 key-value로 쓰는것??
redis - LRU part를 대체하는?? redis 성능을 향상시킨다. DB driver??
크롬 플러그인 개발????
-- Data structure를 무조건 알아야 함!
디버깅과 디펜시브, 인설션, 내 코드에 문제가 있을 때 얼마나 빨리 죽는지
코딩 실력 늘리는데 추천 해주실 것