MIT의CTSS(Compatible Time-Sharing System), IBM의TSS(Time Sharing System) 등은 하드웨어가 다르다면 다른os를 적용해야하는 문제가 있었다.
그리고 혜성같이 등장한 UNIX os와 그의 아버지 데니스리치.
모든 하드웨어를 통합해버렸다!
시분할시스템과 배치처리시스템
과거 컴퓨터는 일괄처리 시스템으로써 프로그램 하나가 끝나면 다음프로그램을 실행하는, 그렇게되면 30분만 실행되면 끝나는 2번프로그램은 실행하기위해 12시간을 기다려야하는 비효율성이 발생한다.
이에비해 시분할시스템은 프로세스를 여러등분하여 정해진 시간동안 수행되고 다음프로세스로 넘어가는, 즉 다중 사용자를 지원하게 된다. 이를 ( Multitasking) 이라고 하는데 이는 단일CPU로 여러개의 프로세스들을 병렬실행하는것을 의미한다. -->결국 사용자입장에서는 여러프로그램이 동시실행되는것처럼 느끼게 된다.
현대의 컴퓨터 시스템 환경(Modern OS)
- MicroKernal Acchitecture : 기존 모놀리식 커널에 비해 핵심적인 기능만 남겨둔 최소한의 커널이다. 커널의 크기가 작으므로 임베디드 시스템 등에 주로 사용된다.
- Multithreading :대화형 프로그램을 멀티스레드화하면, 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속되어, 사용자에 대한 응답성이 증가된다. 예를 들어, 멀티스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에 사용자와의 상호작용이 가능하다. 또한 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드 공유의 이점은, 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 활동성 스레드를 가질 수 있다는 점이다.
- Symmertic Multiprocessing : 상위 프로세서가 하위 프로세서에게 일을 배분해 작업하는것이 아닌,두 개이상의 프로세서가 하나의 메모리를 공유하며 사용한다.
-Object-oriented design : 시스템의 통합성을 파괴하지않고 os를 설정할수 있게 한다.
우리가 사용하는 컴퓨터의 운영체제는 사실상 컴퓨터의 하드웨어(기기) 와 사용자가 이용하는 응용프로그램까지에
있어 매우 중요한 역할을 한다.
실제로 운영체제가 없는 컴퓨터는 사용할 수 없다.
그렇다면 운영체제의 역할은 크게 무엇이 있을까
운영체제는 사용자가 알기힘든 각종 하드웨어를 직접 관리하며, 사용자에게는 편리한 인터페이스를 제공한다.
실제로 우리가 바탕화면에서 아이콘을 클릭하고, 창으통해 인터넷 서핑을 할수있다는것 또한 윈도우 운영체제가 제공하는 기능이라 할 수 있다.
이렇게 자원을 직접 관리하는 자원관리자(Resource Manager)의 역할과
사용자에게 편리한 인터페이스를 통해 파일을 손쉽게 저장하거나, 삭제 및 내용을 볼 수 있는 기능을 제공하는
자원 추상화(Resource Abstraction)의 역할을 한다고 볼 수 있다.
여기서 자원을 관리한다 라는것은 CPU 프로세스들이 잘 돌아가게하고, 그 프로세스들이 실행되는 메인메모리를
관리하며, 입출력 장치를 비롯한 하드웨어들을 관리하는것이라고 할 수 있다.
자원 추상화는 사용자들이 응용프로그램이 실행되는 커널영역(관리자영역)의 시스템동작을 몰라도, 사용자 인터페이스인CLI(Command Line Interface) 와 GUI(Graphicall User Interface) 및 모바일의 터치스크린 등을 제공해 편리하게
시스템을 이용할수 있게한다.
가령 응용프로그램단의 printf문이 어떤식으로 커널영역으로 들어가, 하드웨어를통해 모니터로 출력하기까지의 과정을 사용자는 알아야할 필요가 없어진다.
운영체제는 이러한 기능 이외에도 네트워크 보호및 보안의 기능도 수행한다.
운영체제의 커널영역이란
이렇듯 운영체제는 사용자에게 편리한 시스템인터페이스를 제공함과 동시에 컴퓨터시스템을 제어하는 역할도 수행한다.
이중에서 우리는 컴퓨터시스템을 제어하는 영역인 운영체제의 커널영역에 대해 공부할것이다.
다음은 커널영역의 대표적인 4가지기능이다.
1.메모리관리
2.프로세스관리
3.디바이스관리
4.파일관리
본격적인 운영체제공부에 앞서 우리가 사용하는 응용프로그램과 운영체제, 그리고 하드웨어까지 이어지는
구조를 한번 살펴보자.
먼저 사용자와 하드웨어 사이에 많은 요소들이 존재하고있다.
운영체제는 사용자영역과 하드웨어사이에서 시스템을 제어해주는가장 핵심요소라 할 수있고,
사용자는 응용프로그램(게임을 한다던지) 및 shell ( 사용자가 운영체제 기능을 이용하기위한 인터페이스 - 터미널환경인 CLI와 그리픽 인터페이스 GUI가 있다) 을 사용하기위해 운영체의 기능을 이용해야 한다.
여기서 API와 시스템 콜이란,
사용자가 응용프로그램 또는 쉘을 이용해 어떠한 명령을 한다고 가정하면, 이러한 명령은 시스템콜을 통해 운영체제의 커널영역으로 들어가게 된다. 이를 시스템콜(System call) 이라고 한다. 다시말해 사용자 프로그램단에서 운영체제의 기능을 이용하기위해 호출하는함수이다.
하지만 시스템콜이란 이러한 과정을 담고있는 함수이기떄문에 사용이 번거롭다. 따라서 System call을 제공하는 어떠한 라이브러리 혹은 함수의 형태로 API를 응용프로그램에게 제공한다.이렇게되면 API를 통해 비교적 쉽게 OS의 기능을 이용할 수 있게된다.
가령 우리가 자주쓰는 c언어의 printf문도 운영체제에 접근해, 모니터로 출력을 하기위한 일종의 시스템콜 API라고 할 수 있다.
하지만 이러한 API를 제공함에 있어 윈도우가 가지고있는 API와 리눅스의 POSIX API등의 규격이 다르기에, 우리는 윈도우에서 돌아가는 프로그램을 리눅스에서는 사용할 수 없게된다.