Kernels
운영체제의 커널은 특별한 소프트웨어입니다. 이 소프트웨어는 다른 모든 프로그램들보다 먼저 로드됩니다. 커널이 하는 일은 대략 다음과 같습니다.
- 운영체제는 ROM 또는 read only code를 실행합니다.
- 그 후에 boot_loader(최근에는 EFI extension)을 실행합니다.
- boot_loader가 kernel을 로드합니다.
- kernel은 init을 실행합니다.
- kernel이 start up script를 실행합니다.
- kernel이 userland scripts를 실행하면 컴퓨터를 사용할 수 있습니다.
여기 있는 부팅 과정에 대해 자세히 알 필요는 없습니다. 프로그램이 user space에서 동작할 때 kernel은 프로그램이 신경쓸 필요가 없도록 다음과 같은 중요한 operation들을 제공합니다.
- 프로세스와 쓰레드의 Scheduling, 동기화 기본 요소 처리
- write와 read같은 System call 제공
- 가상 메모리와 low level binary device(USB) 관리
- filesystem을 읽고 이해
- network 사이의 communication
- 다른 process들과의 communication
- Dynamic linking libraries(DLL)
Kernel은 kernel mode에서 일어나는 모든 일을 처리합니다 Kernel mode는 더 강한 권한을 가지고 있습니다. 예를 들어 추가적인 CPU instruction을 실행하는 일(하나의 실패가 컴퓨터 전체에 영향을 끼칠수 있는) 등을 할 수 있습니다.
File Descriptor
file descriptor의 익숙 한 예로는 text file을 open했을 때 커널이 file descriptor를 제공하는 경우입니다.
Kernel은 항상 file descriptor를 관리하여 그들이 무엇을 가리키고 있는지 알고 있습니다. 나중에 살펴보겠지만, file descriptor는 실제 file을 가리킬 필요가 없고 os가 그 파일들을 관리해줄 것입니다. 또한 각각의 프로세스는 file descriptor를 재사용 할 수 있지만 각각의 프로세스에서는 유일하게 존재합니다.
File descriptor는 위치에 대한 개념도 가지고 있습니다. OS가 파일 안에서의 위치를 가지고 있기 때문에 디스크에 있는 파일 전부를 읽을 수 있습니다.
Cool, what's a shell then?
Shell은 실제로 커널과 상호작용하기 위한 수단입니다. User friendly OS가 나오기 전에는 컴퓨터가 부팅되서 할 수 있는 모든 일은 shell로 이루어졌습니다. 즉, 모든 명령과 편집이 이런 방식으로 이루어졌습니다. 최근 컴퓨터는 desktop mode로 실행되지만, 아직도 terminal을 이용해 shell에 접근할 수 있습니다.
(Stuff) $
Shell을 열어 위와 같은 메세지를 본다면 다음 명령을 받을 준비가 되었다는 뜻입니다. 이 상태에서는 ls나 echo hello같은 unix utility를 사용하면 shell이 이를 실행해 결과를 반환해줄 것입니다. shell-builtin으로 알려진 이런 utility 중 일부는 shell program 자체에 깔려 있습니다. 이러한 프로그램 중 일부는 실행할 수 있는 컴파일된 프로그램입니다. Shell은 단지 이 프로그램들을 특별한 변수를 통해 볼 수 있어 실행하는 것입니다. path라고 불리는 이 특별한 변수는 :로 구분되는 다양한 경로를 가지고 있습니다. 이 경로에 있는 이름을 통해 실행이 가능합니다. 다음은 path의 예를 보여주고 있습니다.
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
즉, shell이 ls를 실행하면 shell은 이 path안에 모든 디렉토리를 살펴보며 /bin/ls를 찾은 후 이를 실행시킵니다.
$ ls
...
$ /bin/ls
ls 대신 /bin/ls와 같이 full path를 입력해 실행시킬수도 있습니다. 지금까지 프로그램을 실행시키기 위해 ./를 붙인 후 프로그램을 실행시킨 것은 일반적으로 현재 디렉토리가 PATH variable에 포함되어 있지 않기 때문입니다. .은 현재 작업중인 디렉토리를 의미합니다. 즉, ./exe는 <current_dir>/exe와 완전히 같습니다.
shell tricks and tips
- 위쪽 화살표로 최근 command를 얻을 수 있습니다.
- control-r을 통해 이전 실행시켰던 command를 찾을 수 있습니다.
- control-c를 통해 shell process를 interrupt할 수 있습니다.
Alright then what's a terminal
Terminal은 단지 shell의 output을 display해주는 application입니다. default terminal을 쓸 수도 있고, quake based terminal인 terminator를 쓸 수도 있습니다. 다양한 terminal이 존재합니다!
'Angrave System Programming > Processes' 카테고리의 다른 글
Process Control : Wait macros (0) | 2019.01.11 |
---|---|
Forking: Fork, Exec, Wait(2) (0) | 2019.01.11 |
Forking: Fork, Exec, Wait(1) (0) | 2019.01.11 |
Forking Introduction (0) | 2019.01.10 |
Process Introduction (0) | 2019.01.10 |