[운영체제] 2. What is OS?
Reference - Operating Systems: Three Easy Pieces
https://pages.cs.wisc.edu/~remzi/OSTEP/
운영체제란?
컴퓨터의 자원(CPU, Memory, Disk..)을 할당하고 프로그램이 올바르게 실행되도록 돕는 프로그램.
운영체제는 메모리 내 커널 공간에 위치하며 부팅 시 실행된다. 나머지 공간은 사용자 공간이라 하며, 이때 운영체제는 사용자 공간의 프로그램에 자원을 할당한다. 자원에 접근가능한 커널 모드와 접근 불가능한 사용자 모드가 있는데, 사용자 모드의 프로그램이 시스템콜이라는 것을 요청하면 커널 모드로 전환하여 자원에 접근가능하게 한다. 시스템 콜은 일종의 인터럽트라 볼 수 있으며, 그 예시는 아래와 같다.
- 프로세스 제어: fork(), exit(), wait(),
- 파일 관리: open(), read(), write(), close()
- 장치 관리: ioctl(), read(), write()
- 정보 유지: getpid(), alarm(), sleep()
- 보안(Protection): chmod(),umask(), chown()
유저가 어떤 모드인지는 플래그 레지스터 속 슈퍼바이저 플래그로 알 수 있다. 1이면 커널 모드고 0이면 사용자 모드이다. 운영체제에는 Virtualization, Concurrency, Persistence라는 세가지 대주제가 있다. 앞으로 세 주제에 대해 자세히 다룰 것이다.
Virtualization
우리가 쓰는 컴퓨터의 CPU는 하나인데, 하나의 CPU로 많은 프로그램을 실행하려면 어떻게 해야할까? 그 답은 가상의 CPU를 만들어서 CPU가 여러개인 것처럼 행동하게 하는 것이다. 하나의 CPU가 모든 프로세스를 항상 사용하는 것이 아니기에, I/O 등을 수행할 때 다른 프로세스에게 CPU 권한을 넘긴다. 이에 대해선 프로세스 파트에서 더 자세히 다루겠다.
메모리 또한 프로세스 별로 각자의 고유한 가상 주소 공간을 주고, 운영체제가 가상 주소를 실제 주소로 매핑한다. 이를 통해 프로그램이 실제 주소에 대해 접근하는 것을 막음으로써 컴퓨터의 안정성을 보장하며, 각 프로세스는 다른 프로세스의 메모리에 영향을 주지 않게 된다.
Concurrency
프로세스와 달리 스레드는 각 스레드끼리 메모리를 공유한다. 스레드란 프로세스와 굉장히 유사하지만 프로세스 내에서 실행되는 high level의 흐름이며, 그렇기에 프로세스가 할당받은 자원을 공유하게 된다. 더 자세히 말하면, 각 프로세스 내에서 Stack은 따로 할당받고 Code, Data, Heap영역은 공유한다. 따라서 현대의 가상 메모리 공간을 공유하는 멀티스레드 프로그램은, 변수를 변경하는 작업이 끝나기 전에 다른 스레드로 context switch가 일어났을 때 같은 변수의 값이 꼬이는 문제가 발생한다.
Persistence
RAM 같은 메모리는 전원 공급이 끊기면 데이터가 손실되지만, HDD나 SDD는 전원 공급이 끊겨도 데이터가 휘발되지 않는다. 운영체제는 시스템 콜을 통한 I/O 시 데이터의 안정성을 보장한다. 따라서 디스크의 어느 부분에 데이터를 넣어야할지, 컴퓨터 크래시로 인한 데이터 손상을 어떻게 처리할지 등을 수행한다.