
커널
- 프로세스 관리 , 메모리 관리 , 저장장치와 같은 운영체제의 핵심적인 기능을 모아놓은 곳
유저 인터페이스
- 커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려줌
system calls
- CPU에게 자원을 이용하겠다고 알리는 일종의 알림
- 시스템 호출은 커널이 제공하는 시스템 자원의 사용과 연관된 함수
- 협소의 의미로는 커널만 운영체제라고 일컫지만 요즘에는 사용자 인터페이스, 시스템 콜 까지 모두 합쳐 운영체제 라고함.

User Interface (CLI)
- 예를들면 윈도우의 cmd, 유닉스 계열에서의 shell
- shell이라고 불리는 이유는 소라껍질 처럼 커널에 접근하기 전에 한 층의 껍질을 통해 들어가야 한다는 의미.
- 운영체제 서비스를 실제로 이용할 수 있게 하는게 shell
- Bourne shell 를 리뉴얼 해서 리눅스 에서 bash 만듦 => born again shell 을 의미

system Programs
- 사용자가 개발자라는 전제한에 제공됨
- 유닉스 운영체제가 설치되어있는 시스템을 사용하는 사람-> 개발자
- 컴파일러 -> 유닉스와 맥OS는 기본적으로 운영체제 설치시 컴파일러 가지고 있음.
- GCC컴파일러 를 기본적으로 가지고있음 (리눅스)
- General purpose OS (맥, 윈도우) -> 사용자가 무슨 응용프로그램을 사용하느냐에 따라 컴퓨터의 순간적인 용도가 달라짐. (게임, 문서편집등)
- 리눅스는 주로 개발을 위한 용도

<컴파일 과정>
컴파일: 인간이 이해할 수 있는 언어로 작성된 소스코드를 CPU가 이해할 수 있는 언어로 변환하는 작업
1. 전처리 과정
- 전처리기(Preprocessor)를 통해 소스코드 파일 (.c)를 전처리된 소스코드 파일 (.i)로 변환
-> 이 과정에 주석제거 , 헤더파일삽입(#include), 매크로 치환 및 적용(#define) 의 과정 수행
2. 컴파일 과정
- 컴파일러 과정은 컴파일러를 통해 전처리된 소스코드 파일(.i) 을 어셈블리어(*.s) 파일로 변환 하는것
- 이 과정에서 우리가 흔히 문법검사 라고 하는걸 수행
( + static 영역 메모리 할당)
3. 어셈블리 과정
- 어셈블리 과정은 어셈블러를 통해 어셈블리어 파일은 오브젝트 파일로 변경
오브젝트 파일
- 어셈블리어 코드는 사람이 알아 볼 수 없는 기계어로 번역되는데 이것은 오브젝트 코드라고함
- 오브젝트 코드로 구성된 파일을 오브젝트 파일이라고 함
- 오브젝트 파일을 실행시키기 위해서 예를들어 printf함수를 사용하는 오브젝트 파일과 printf 함수를 구현한 오브젝트 파일 (라이브러리) 를 연결시키는 작업 필요. -> linking
4. 링킹(linking) 과정
- 링커를 통해 오브젝트 파일을 묶어 실행 파일로 만듦
- 이 과정에서 오브젝트 파일들을 프로그램에서 사용하는 라이브러리들과 연결시켜 하나의 실행파일 생성
Static vs Dynamic linking
- 정적 라이브러리는 정적 링킹(Static Linking) 과정에서 링커가 프로그램에 필요로 하는 부분을 라이브러리에서 찾아 실행 파일에 복사.
정적 라이브러리 확장자는 윈도우 환경에서는 .lib, 리눅스 환경에서는 .a
- 동적 라이브러리는 동적 링킹(Dynamic Linking) 과정에서 링커가 라이브러리 내용을 복사하지 않고 해당 내용의 주소만 가지고 있다가 런타임에 실행 파일과 라이브러리가 메모리에 위치할 때 해당 주소로 가서 필요한 내용을 가져오는 방식.
동적 라이브러리 확장자는 윈도우 환경에서는 .dll, 리눅스 환경에서는 .so.
참조 : https://bradbury.tistory.com/224



- Function call
-> 웹서버에서 요청 들어옴
-> read 수행시 trap 걸려서 CPU 위로 운여체제가 올라감
- Handling in os
-> open 요청해서 시스템콜이 운영체제에 일어나면 I/O 관련 시스템콜 단계 1. 파일 open 2. read , 3.write, 4. close 수행
-> 시스템콜 호출시 핸들러가 어떤것부터 동작시켜야 하는지 넘버링을 해 고유번호를 만들어 활용 (벡터테이블 만들어서 효율적으로 수행)
-> 트랩 메커니즘 발생시 테이블참조해서 트랩 핸들러 선정해서 동작 수행시킴
-> 시스템 콜 다른말로 - > software interrupt
-> 인터룹트 발생시 운영체제 실행됨
-> 인터룹트도 테이블이 있음 ( 0번: timer interrupt , 1번: 키보드 , 2번: 마우스 기타등등..)
-> 인터룹트 발생시 벡터값이 실행돼고 해당 벡터값에 맞는 벡터테이블 명령 수행
- Parameter passing
-> 특정 레지스터 통해서 인자값 전달.
- 시스템콜 발생시 시스템 라이브러리들을 이용해 운영체제가 실행시킴

- 모놀리틱 커널
-> 운영체제를 개발 하는 관점에서 봄
-> 운영체제 모든 기능을 구현해 하나의 이미지로 만듦 (동작시 빠름 , 별도의 추가 메커니즘 없이 운영체제 자체적으로 가진 능력 활용 가능 , 단점은 하드웨어가 업그레이드 할 시 유지보수 어려움) , 의존성이 큼 -> 절차지향 프로그래밍 단점을 고스란히 가지고 있음
- 마이크로 커널
-> 기능을 분리시킴 (인디펜던트)

- 마이크로 커널
-> 핵심만 커널로 만듬
-> 필요한 서비스를 에플리케이션으로 만들어 에플리케이션의 우선순위를 높여서 동작 필요한것만 동작시킴
-> 속도가 느림
-> 커널은 무겁지 않으므로 최적화 가능

- 커널의 오버헤드가 커지니 modular approach -> 커널을 만들어 그 외 서비스들을 add on 시켜서 모듈러 방식으로 구동 (모듈화 해서 선택적으로 가져와서 필요한것만 컴파일)
-> 유지 보수 비용 줄어듬
