Monolithic Structure  Original UNIX

 

 

 

Original UNIX

 

 

 

 

 

Linux - Monolithic plus modular design

 

Linux

 

 

Microkernels - Moves as much from the kernel into user space

 

MicroKernel's Benefits and Detriments

 

 

 

Hybrid Systems

 

Hybrid Systems

 

여기서 mudule 이란?

 

mudule

 

Mac Os and IOS Structure

 

mac os structure

 

Android

 

 

Android

 

 

<운영체제의 간단한 역사>

 

 

 

2. 운영체제의 역사

-1950년대 *ENIAC, 첫 번째 컴퓨터이자, 운영체제가 없음. 1개의 응용 프로그램을 실행시키기도 힘든 수준이었고,  운영체제가 없어서 응용 프로그램이 시스템 자원을 제어하는 형태였다. -1960년대

analysis-flood.tistory.com

 

결국 1970년대 등장한 시분할시스템 os 의 조상격인

MIT의 ​CTSS(​Compatible Time-Sharing System), ​IBM의 ​TSS(​Time Sharing System) 등은 하드웨어가 다르다면 다른os를 적용해야하는 문제가 있었다.

 

1970년대의 os

그리고 혜성같이 등장한 UNIX os와 그의 아버지 데니스리치.

UNIX

 

모든 하드웨어를 통합해버렸다!

 

 

 

 

 

 

 

시분할시스템과 배치처리시스템

 

시분할시스템과 일괄처리시스템

 

과거 컴퓨터는 일괄처리 시스템으로써 프로그램 하나가 끝나면 다음프로그램을 실행하는, 그렇게되면 30분만 실행되면 끝나는 2번프로그램은 실행하기위해 12시간을 기다려야하는 비효율성이 발생한다.

이에비해 시분할시스템은 프로세스를 여러등분하여 정해진 시간동안 수행되고 다음프로세스로 넘어가는, 즉 다중 사용자를 지원하게 된다. 이를 ( Multitasking) 이라고 하는데 이는 단일CPU로 여러개의 프로세스들을 병렬실행하는것을 의미한다. -->결국 사용자입장에서는 여러프로그램이 동시실행되는것처럼 느끼게 된다.

 

 

 

os의 진화

 

현대의 컴퓨터 시스템 환경(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.파일관리

커널영역의 4대기능

 

 

본격적인 운영체제공부에 앞서 우리가 사용하는 응용프로그램과 운영체제, 그리고 하드웨어까지 이어지는

구조를 한번 살펴보자.

 

 

 

 

먼저 사용자와 하드웨어 사이에 많은 요소들이 존재하고있다.

운영체제는 사용자영역과 하드웨어사이에서 시스템을 제어해주는가장 핵심요소라 할 수있고, 

사용자는 응용프로그램(게임을 한다던지) 및 shell ( 사용자가 운영체제 기능을 이용하기위한 인터페이스 - 터미널환경인 CLI와 그리픽 인터페이스 GUI가 있다) 을 사용하기위해 운영체의 기능을 이용해야 한다.

 

 

여기서 API와 시스템 콜이란, 

사용자가 응용프로그램 또는 쉘을 이용해 어떠한 명령을 한다고 가정하면, 이러한 명령은 시스템콜을 통해 운영체제의 커널영역으로 들어가게 된다. 이를 시스템콜(System call) 이라고 한다. 다시말해 사용자 프로그램단에서 운영체제의 기능을 이용하기위해 호출하는함수이다.

하지만 시스템콜이란 이러한 과정을 담고있는 함수이기떄문에 사용이 번거롭다. 따라서 System call을 제공하는 어떠한 라이브러리 혹은 함수의 형태로 API를 응용프로그램에게 제공한다.이렇게되면 API를 통해 비교적 쉽게 OS의 기능을 이용할 수 있게된다. 

 

가령 우리가 자주쓰는 c언어의 printf문도 운영체제에 접근해, 모니터로 출력을 하기위한 일종의 시스템콜 API라고 할 수 있다. 

 

하지만 이러한 API를 제공함에 있어 윈도우가 가지고있는 API와 리눅스의 POSIX API등의 규격이 다르기에, 우리는 윈도우에서 돌아가는 프로그램을 리눅스에서는 사용할 수 없게된다.

API란 더 넓은 뜻으로 사용되기도 하지만 여기서는 이렇게만 알아두고 넘어가도록 하자.

 

윈도우와 리눅스의 시스템콜

 

 

 

 

자바의 표준입출력을 다루기에 앞서 스트림(stream)에 대해 공부해야하나 스트림은 보통 자바백서의 거의 끝자락에 나오는 내용이므로.. 간단히 다루고 뒤에서 공부하는 것으로하자.

 

표준입출력은 결국 키보드로 입력받아 모니터로 출력하는것이다.

자바에선 System클래스를 사용해 표준입출력을 관리하는데, 이는 자바jvm이 운영체제의 기능을 일부 쓸수있다는 것을 의미한다.

 

System.out : 표준출력

System.in : 표준입력

System.error : 표준에러

 

1.InputStream

스트림은 결국 사전용어로 흐름이다. 말그대로 입력이 들어오고 , 출력으로 나가는 것을 말하는데 자바에선 입출력 스트림이 같을수는 없다. 따라서 자바에서 가장 기초가 되는 입력방법은 InputStream 이다.

 

 

결과

?결과가 이상하다.

InputStream 은 바이트단위로 값을 읽기떄문에, 데이터를 저장하는 컴퓨터에는 바이트 단위로 데이터가 저장된다.

다만 100은 여기서 하나하나가 1바이트로 저장되기때문에  맨첫자리인 1이 아스키코드인 49로  출력되고,

a의 아스키코드인 97이 출력되는것을 볼 수 있다.

 

 

여기서 조금더 확자시키면, InputStreamReader라는것을 통해 문자입력까지 가능하다.

InputStreamReader

 

배열로써 입력되는 문자

 

 

 

조금 더 확장해보자 

BufferedReader를 통해 문자열까지 입력받을 수 있다.

결국 문자열 입력까지 inputstream을 통해 받을 수 있었다. 정리하자면

 

InputStream, InputStreamReader, BufferedReader

 

 

 

 

2.Scanner

 

앞으로 자바 입출력에는 inputsream이나 bufferedreader가 아닌 간단한 Scanner 클래스를 통해 입력을 받을

예정이다. 이는 2004년 JSE 5.0부터 추가되었다고하니 역사가 그리 깊진않다.

 

Scanner class

 

앞선 bufferdreader등과 비교해 훨씬 간단하게 표준입력을 수행한다.

scanner 클래스 method

 

next() : 문자열입력 (공백, 엔터전까지 입력)

nextLine()  : 문자열입력(엔터전까지 입력)

next.charAt(0) : 문자입력

nextInt() : 정수입력

nextDouble() : 실수입력 

 

 

 

 

 

 

3.결론

 

자바의 I/O

자바의 I/O에 관해 이번에는 여기까지만 다루고 뒤에서 스트림과 함께 입출력을 공부해보자.

아래는bufferedreader와 Scanner클래스의 차이에 관한 표인데 버퍼의 사이즈부터 문자열관련처리까지 사용법이 다르다. 속도는 bufferedreader가 훨씬 우세함을 보인다.

 

'Java' 카테고리의 다른 글

오버라이딩(Overriding)  (0) 2020.06.13
자바 String 클래스  (0) 2020.06.12