이번 챕터에서는 리눅스 시스템 프로그래밍에 대한 다양한 개념이 소개되어 있다.
운영체제란 단어는 두 가지의 뜻으로 크게 사용된다.
컴퓨터 리소스를 관리하는 중앙 소프트웨어와 명령줄 인터프리터, GUI, 파일 유틸리티 및 편집기와 같은 모든 표준 소프트웨어 도구로 구성된 전체 패키지
더 좁게 말하자면, 컴퓨터 리소스를 관리하고 할당하는 중앙 소프트웨어를 일컫는다
커널(Kernel)이라는 단어는 주로 두 번째 뜻으로 취급된다.
커널이 없어도 컴퓨터 상에서 프로그램을 실행할 수 있지만, 커널은 다른 프로그램의 작성 및 사용을 크게 단순화하고 프로그래머가 사용할 수 있는 기능을 더해준다.
요즘 CPU 설계는 일반적으로 CPU가 최소한 두 가지의 다른 모드로 작동하게끔 이루어진다.
CPU 뿐만 아니라, 가상 메모리 영역도 사용자 영역과 커널 영역으로 구분이 가능하다.
사용자 모드일때는, CPU는 오직 사용자 영역의 메모리만 사용 가능하다. 반대로 커널 모드일때는 사용자 영역 + 커널 영역의 메모리 전부 사용 가능함.
프로세스는 스스로가 위치한 공간이 메모리 상 어디에 있는지 알지 못하고, 자신이 다루고 있는 파일들이 디스크 상 어디에 위치해 있는지 알지 못한다. 프로세스는 완전히 isolated 된 상태로 작동하게 된다. 그렇기 때문에 다른 프로세스와 직접적으로 통신하지 못하게 된다. 또한 새로운 프로세스를 만들어내지 못하고, 스스로 종료하지도 못하고, 컴퓨터의 I/O 장치와도 직접적으로 통신하지 못한다.
시스템 상에 한 개의 커널이 모든 것을 컨트롤 하게 된다. 시스템 상의 모든 프로세스를 관리하고, CPU 스케쥴링을 하고, 실행중인 프로세스를 위해 데이터 구조 등을 유지하고, 프로세스를 생성, 종료 한다. 또한 프로세스간 통신도 커널을 거쳐야 한다.
Later in this book we'll say things such as "a process can create another process", "a process can create a pipe", "a process can write data to a file", and "a process can terminate by calling exit()." Remember, however, that the kernel mediates all such actions, and these statements are just shorthand for "a process can request that the kernel create another process," and so on.
이 책의 후반부에서 우리는 "프로세스가 다른 프로세스를 생성할 수 있다", "프로세스가 파이프를 생성할 수 있다", "프로세스가 파일에 데이터를 쓸 수 있다", "프로세스가 exit( )을 호출하여 종료될 수 있다." 라고 말할 것이다. 그러나 커널은 이러한 모든 작업을 중재하며 이러한 명령문은 "프로세스가 커널이 다른 프로세스를 생성하도록 요청할 수 있음" 등의 줄임말이라는 점을 기억해야 한다.