용어 설명
Program
프로그램 실행할 수 있는 파일 (executable file)
Application
응용프로그램 End user가 사용할 수 있는 프로그램
ex) game, Web 등
OS(Operating System)
운영체제 Application(User)이 Hardware와 소통할 수 있는 시스템 소프트웨어 (인터페이스 + 실행 환경 제공). Kernel, Shell, 그리고 Boot Loader로 이루어져 있다.
ex) 윈도우, 우분투, 안드로이드
Kernel
커널 프로세스에게 하드웨어의 자원을 할당하고 System Call을 수행하는 부분.
monolithic(모놀리식; 단일형) 커널과 microkernel(마이크로) 커널로 나뉜다.
ex) 리눅스 커널
Firmware
펌웨어 ROM에 기록된, 하드웨어를 제어하는 최소한의 프로그램들의 집합.
ex) 메인보드 BIOS, 신호등 제어프로그램 등
OS vs 커널 vs 펌웨어 펌웨어는 ROM에 기록되고, 한 가지 하드웨어를 동작하기 위한 작은 규모의 프로그램의 집합. 거의 수정되지 않는다.
OS는 RAM과 저장장치에 기록되고, 여러가지 하드웨어를 동작하기 위한 대규모의 프로그램의 집합. 자주 수정된다.
커널은 OS의 핵심적인 부분으로 CPU, 메모리, 입출력 등의 자원을 초기화하고 관리한다.
Shell
운영 체제의 일부분으로, 커널과 이용자 사이에서 이용자의 명령을 해석하고 그 처리 결과를 뿌려주는 시스템 프로그램. Shell-Terminal 관계는 인터프리터-IDE 느낌.
ex) bash, sh, Power shell, cmd, ...
Terminal
터미널 GUI 위에서 동작하는 CLI(Command Line Interface). 환경이라서 명령을 처리하는 것이 아닌 디스플레이만 해준다. IDE-인터프리터 관계에서 IDE(그래픽) 부분 느낌. 실제로 처리는 Shell이 한다. 말 그대로 터미널 역.
ex) Command Prompt
Console
콘솔 시스템을 물리적으로 조작할 수 있는 체계.
ex) Xbox, PlayStation 등
Boot loader
부트 로더 Boot(OS)를 메모리에 올려주는 프로그램. 부트스트랩 프로그램
Bootstrap
부트스트랩 BIOS가 부팅매체에서 MBR을 읽고 부트로더를 메모리에 올리는 과정
Interrupt CPU가 멈추고 Interrupt handler를 실행시키게 하는 이벤트
Interrupt handler 인터럽트를 접수하면 그에 맞는 함수를 실행시키는 루틴
Interrupt vector 인터럽트 루틴들의 주소 리스트
Interrupt 유의할 점 Interrupt가 끝나고 원래 수행하던 instruction으로 다시 돌아가기 위해
  1. PC(Program Counter)에 address를 저장하고
  2. 원래의 register state를 PCB(Process Control Block)에 저장해놓아야함 | | Von Neumann architecture 폰 노이만 아키텍쳐 | 1. Instruction과 data가 같은 메모리에 올라가있고
  3. 이 메모리는 CPU와 single link로 이어져있다. | | Cashe Memory 캐시 메모리 | Main Memory에서 주로 쓰이는 명령들을 기억해두는 메모리. 보통 SRAM으로 구성 | | SRAM(Static RAM) | 플립플롭으로 만들어서 전력공급이 있으면 refresh가 없어도 그 전의 상태를 그대로 기억한다. 캐시 메모리로 사용됨. | | DRAM(Dynamic RAM) | 커패시터로 만들어서 전력공급이 있어도 계속 refresh가 되어야함. 안해주면 데이터 사라짐. 메인 메모리로 사용됨. | | NVRAM | 원래 DRAM은 커패시터라서 휘발성인데 배터리 붙여서 비휘발성으로 만든 메모리. 근데 이제 배터리 안씀 | | | | | Device | 컴퓨터에 연결할 수 있는 장치 | | Device Controller | 데이터의 I/O를 책임지는 장치. CPU와 시스템 버스로 연결되어 있다. | | Device Driver | OS → Device Driver → Device controller 의 순으로 실행된다. | | | | | Asymmetric Multiprocessing 비대칭형 멀티프로세싱 | Master-slave 형태의 멀티 프로세스 구조 | | Symmetric Multiprocessing(SMP) 대칭형 멀티프로세싱 멀티 프로세서 시스템 | 프로세서(CPU)가 여러개 있고 서로 하나의 메모리를 공유함 | | Multicore System 멀티 코어 시스템 | 프로세서(CPU)가 하나만 있는데 코어가 여러개 있음. 프로세서가 하나니까 메모리도 하나. 대신 논리적으로 메모리를 배정받는다. | | Process 프로세스 | 메모리에 올라가서 실행되고 있는 프로그램의 인스턴스 (프로그램이 클래스라면 프로세스는 인스스. 여러개 생성 가능) | | | | | User mode Kernel mode | 유저가 시스템 중요한 부분에 함부로 접근하는 것을 막기위한 OS의 두가지 모드. 가벼운 명령어를 처리하는 User mode 함수와 크리티컬한 명령을 처리하는 Kernel mode 함수로 나뉜다. | | Trap | CPU 내부 interrupt. User modeKernel mode로 전환해준다. mode bit로 현재 모드를 확인한다(user가 1, kernel이 0) | | Privileged Instructions | 시스템에 영향을 줄 수 있는 instruction. Kernel mode에서만 사용가능. 쓰고싶으면 user mode → trap → kernel mode 에서 사용하자. | | System call 시스템 콜 | user가 OS 서비스(READ/WRITE, network...)를 요청하는 일종의 API. 보통 wrapper(라이브러리)를 통해 제공된다. 이 때, portability가 보장됨. | | | | | Command line Interface (CLI) | OS Interface. User로부터 명령을 실행시킨다. Shell(sh, ksh, csh, bash)이라고도 불림. | | OS service | User Interface(CLI, GUI, batch interface) Program execution(Load, run, end, execution) I/O operation(printing, scanning...) File System Manipulation(파일,디렉토리 CRUD) Communication(프로세스간 통신) Error detection(에러 났을 때 대처) Resource allocation(컴퓨터 자원 할당) Accounting(리소스를 얼마나 쓰는지 tracking : cloud billing의 기준) Protection and Security(접근제어,보안) | | 라이브러리 → 시스템 콜 | printf, write → write fread, read → read malloc → brk | | System call 동작과정 | 1. open() system call 실행
  4. PCB에 현재 레지스트리 값 저장
  5. 내부 interrupt (trap) 실행. User mode → Kernel mode로 전환.
  6. system calls function list에 가서 sys_open() 실행
  7. return 값과 함께 다시 user mode로 돌아옴.
  8. PCB에서 원래 레지스트리 가져오기.
  9. 원래 Instruction 수행 | | OS Design | 설계를 할 때 매커니즘이랑 정책을 분리하자 Mechanism : How (암호화 하는 기법들 ex : SHA-256, AES, ..) Policy : What (내가 선택한 암호화 기법 ex : SHA-256) | | OS Implementation | 어셈블리어 : 빠름 but 어려움 고급언어(C언어) : 쉬움, portable(compact)함. 디버깅이 쉬움 but 느림 | | OS 구조 : Monolithic | Monolithic(모놀리식) : 하나로 다 뭉쳐져있는거 Simple Structure : 흔히 알고있는 구조. user-syscall-kernel (대부분의 OS) Layered approach

Requirement를 만족하는가?

  1. Mutual Exclusion
  1. Progress
  1. Bounded waiting
  1. lock : Mutual-exclusion인데 빠른애만 돌 수 있음(Bounded-waiting X)
  2. waiting[i] : 자기한테 가까운 애들부터 들어갈 의사가 있는지 물어봄 a. 있으면 제일 가까운 애한테 넘겨주고 자기는 나감 b. 없으면 lock을 풀고 나감. 다음에 제일 빨리 오는 애가 잠금. 자신한테 돌아온다(%n)이라는 보장이 있기때문에 Bounded-waiting | | | | | Mutex Locks mutual exclusion locks | acquire lock : available하지 않는 동안 empty loop (busy waiting) release lock : available을 true로 만들어줌 (lock을 풀어줌) busy waiting : 아무일도 안하는데 running상태임. 응답을 빨리하기 위해서 사용 (context switch가 안일어나서). 짧은 lock에서 사용하기 좋음 | | Semaphore S with busy waiting | wait(S) : S≤0일 때 busy waiting이다가 S>0이면 S-1하고 나간다. signal(S) : S+1해준다. Binary Semaphore : S가 True,False. Mutex lock이랑 똑같음 Counting Semaphore : S가 integer. n개의 프로세스를 동시에 시작 가능. 실행 순서도 조정할 수 있다. | | Semaphore S with blocking | wait(S)
  3. semaphore의 (개념적인) waiting queue에 process를 넣는다.
  4. ready state → wait state로 스위치 signal(S)
  5. process를 wait state → ready state로 스위치
  6. waiting queue에서 꺼집어내서 ready queue에 process를 넣는다. | | Deadlock, Starvation | Deadlock : 한 쪽이 wait으로 잠그면 반대쪽이 signal로 풀어줘야 하는데 둘 다 wait이라서 멈춘 상태. Starvation : blocking이 끝나지 않는 상태 (wait queue에서 못나옴). 보통 LIFO(stack)을 쓸 때 발생한다. | | busy waiting vs blocking | 짧게 기다릴거면 busy waiting 길게 기다릴거면 blocking | | Bounded-buffer Problem | 자 그럼 Bounded-buffer Problem을 어떻게 해결할 것인가.

<producer> <consumer> while : while : produce item wait(full)
wait(empty) wait(mutex) wait(mutex) remove from buffer add to buffer signal(mutex) signal(mutex) signal(empty) signal(full) consume item |