운영체제는 프로그램 실행환경을 제공하고 프로그램과 사용자에게 특정 서비스를 제공한다.
사진과 같은 서비스는 프로그래머가 프로그래밍을 좀 더 쉽게 해줌
사용자가 운영체제와 접촉하는 방식에는 3가지가 있음
선택할 수 있는 여러 명령 인터프리터를 제공하는 시스템에서 이 해석기는 셸이라고 부름
사용자가 지정한 명령을 가져와서 그것을 수행하는 것
생성, 삭제, 리스트, 복사 등 수행함
데스크톱이나 아이콘 폴더 등을 통해서 파일에 접근하는 것, 가장 익숙한 것
또는 터치스크린 등
시스템 콜은 운영체제에 의해 사용 가능하게 된 서비스에 대한 인터페이스를 제공한다.
간단한 프로그램(파일 복사, 이동)의 경우도 많은 시스템 콜을 수행함
한 파일에서 다른 파일로 복사하는 것인데, 다양한 시스템 콜이 많이 발생한다.
C에서 코드를 작성하고, 복사하고 컴파일하다보면 밑단에서 다양한 시스템 콜이 발생해서 내가 원하는대로 수행함
대부분 프로그래머들은 시스템 콜이 어떻게 구현되고 어떤 작업을 하는지 알 필요 없음. 그냥 OS가 무엇을 하는지만 이해하자
운영체제 인터페이스에 대한 대부분의 자세한 내용은 API에 의해 숨겨지고, PTE (실행시간 환경)에 의해 관리됨
API에서 시스템 콜 함수를 사용했으면 인터페이스가 이를 인식해서 시스템 콜 함수를 리턴한 후 다시 인터페이스가 API에게 전달하는 것임
시스템 콜 함수의 인덱스가 있어서 테이블로 가서 해당 인덱스의 함수 사용
이때, 운영체제에 매개변수(인덱스)를 전달하는 방법 3가지가 있음
1. 매개변수를 레지스터 내에 전달
2. 레지스터보다 많으면, 매개변수는 블록이나 테이블에 저장, 블록의 주소가 매개변수
3. 매개변수를 블록이나 스택에 저장하는 법 (길이에 제한이 없다)
다양한 시스템 콜 함수들이 있는데, 무작정 외우기 보다는 쓰면서 필요할때마다 공부하는 것이 나아보임
메시지 전달모델은 소량의 데이터, 후자는 동기화 부분을 조심해야함
시스템 서비스 (시스템 유틸리티)는 프로그램 개발과 실행을 위해 더 편리한 환경을 제공한다.
링커는 재배치 가능한 obj 파일을 하나로 결합
로더는 파일을메모리에 적재
시스템 콜은 어느정도 같더라도 다른 장벽으로 인해 응용 프로그램을 다른 OS 실행하기 어렵다.
하지만 동일한 프로그램을 다른 OS에서 사용 가능함
방법이 3가지 있는데, 단점도 많고 잘 안됨. 할 일도 없을 거 같으니 생략
OS끼리 호환이 안되는 가장 큰 이유는 실행 파일 내의 특정 위치가 OS마다 다르기 때문. 시스템 콜 번호, 의미 등등 이런것도 달라서 호환이 안됨
일반적인 방법은 1개의 일관된 시스템보단 태스크를 작은 구성요소로 분할하는 것
분할한 모듈은 신중히 정의된 부분 (함수 느낌)
모놀리식 구조 : 구조가 아예 없는 것. 커널의 모든 기능을 단일 주소 공간에서 실행되는 단일 정적 이진 파일에 넣는 것
구현 및 확장이 어렵지만, 시스템 콜 인터페이스에서 오버헤드가 거의 없고, 커널 안의 통신 속도가 빠름
따라서 여전히 많이 쓰임
모놀리식 접근법은 시스템의 한 부분을 변경하면 다른 부분에 크게 영향이 가므로, 느슨하게 결합된 시스템을 생각해보자
특정 기능 및 한정된 기능을 가진 개별적이며 작은 구성요소로 나뉘고 이것들이 합쳐져서 커널을 만든다.
생성, 변경이 자유로워짐!
모듈화 되는 방식은 다양하다
계층적 접근 방식
이 방식은 운영체제가 여러 층으로 나뉘어진다.
밑으로 갈수록 하드웨어, 위로 갈수록 인터페이스이다.
오류가 나면 어느 층에서 오류가 났는지 알기 쉬워서 디버깅이 쉬워진다.
하지만 여러 계층을 통과해야하므로 오버헤드가 자주 일어난다.
모든 중요치 않은 구성요소를 커널로부터 제거하고, 제거한 것들을 별도의 주소 공간에 좋재하는 사용자 수준 프로그램으로 구현하는 것
(어느 것이 불필요한지는 애매)
주 기능은 다양한 서비스 간에 통신을 제공하는 것
또한, 운영체제의 확장이 용이하다. 커널을 변경할 필요 없다.
대신 가중된 시스템 기능 오버헤드 때문에 성능이 나빠진다.
최근 기술 중 가장 최선책인 적재가능 커널 모듈 기법이다.
커널은 핵심적인 구성요소의 집합을 가지고 있고 부팅 때 또는 실행 중에 부가적인 서비스들을 모듈을 통하여 링크할 수 있다.
설계의 핵심은 커널은 핵심 서비스를 제공하고 다른 서비스들은 커널이 실행되는 동안 동적으로 구현하는 것
동적으로 구현하면 수정사항이 생길때마다 커널을 다시 컴파일할 필요가 없다.
다양한 구조를 결합하여 성능, 보안 및 편리성 문제를 해결하려는 혼용구조로 구성
새로운 기능을 동적으로 추가할 수 있는 module을 사용한다.
또는 동적으로 적재 간으한 커널 모듈도 지원함
주 성능 문제인 병목현상을 제거해야함
문제가 발생한 오류정보를 로그 파일에 기록한다.
운영체제는 프로세스가 사용하던 메모리를 캡쳐한 코어 덤프를 취하고 차후 분석을 위해 파일로 저장한다.
커널 장애는 크래시 crash라고 불림, 크래쉬 덤프가 저장됨
운영체제는 카운터를 통해 호출된 시스템 콜 횟수, 디스크에 수행된 작업 수와 같은 시스템 활동을 기록함
윈도우에서는 작업관리자가 대표적
BCC는 리눅스를 위한 추적기능을 제공하는 도구