운영체제

[운영체제(OS)] 4. 운영체제 개요 (Operating System Overview)

용성군 2021. 7. 25. 15:59
728x90
반응형

Operating System Structure(운영체제 구조)

Multiprogramming

  • Multiprogramming은 효율성을 위해서 필요하다. Multiprogramming을 쓰지 않는다면 CPU는 놀 것이다.
  • Multiprogramming은  job들을 구성해서 CPU가 항상 한가지를 실행 할 수 있도록 한다.
  • Job scheduling(CPU scheduling)을 통해 한개의 job이 선택되고 실행된다.
  • I/O가 발생해서 CPU가 기다려야 한다면 OS는 다른 job으로 switch 시킨다. 

여기서 job이란 cpu가 실행할 일들 이라고 생각하면 된다.

 

Timesharing(multitasking)

CPU가 실행하는 job들을 자주 바꾸면서 user들은 각각의 job들이 모두 실행중인것 처럼 느끼도록하는 것이다. 즉 CPU 사용시간을 나눠쓰면서 user는 job들과 상호작용있다고 하는 착각을 주는것이다. 

  • Response time는 충분히 작아야 user가 동시에 수행중이라 느낄것이다.
  • 메모리에서 최소 한개이상의 수행중인 프로그램을 가지고있으며 이 프로그램을 process라고 한다. 
  • 프로세스들이 메모리에서 꽉찼다면 프로세스들을 Disk로 내리기도하고 필요한 것을 올리기도 한다. 
  • job들이 동시에 실행할 준비가 되었다면 CPU scheduling에 의해 선택된다. 
  • Virtual memory는 메모리에 안에 모두 존재하지 않는 process들도 실행될 수 있도록 한다. 

Multiprogramming은 CPU가 놀지 않도록 하기 위해 program을 여러개 실행하는 것이고 multitasking은 cpu 사용시간을 공유하면서 사용자가 job들을 동시에 수행중이라고 느끼도록 실행하는것이다. 


Operating System Operations(운영체제의 작업)

  • Interrupt는 하드웨어에 의해 발생한다. 
  • Software error나 request가 들어오면 exception이나 trap들이 발생한다. ex) 0으로 나눴을 때
    • Exception과 trap들은 interrupt handler와 비슷하게 동작한다. 둘다 kernel mode로 이동해서 처리한다.
  • OS는 다른 system 요소와 자기자신을 보호하기 위해서(kernel 부분은 중요하기 때문에 아무나 접근해서는 안된다) Dual-mode를 사용한다.
    • Dual-mode에는 User mode와 kernel mode가 있다.
    • 하드웨어에 mode bit가 추가되었다.
      • system이 user code에서 실행되고 있는지 kernel code에서 실행되고 있는지 구별하기 위해 사용한다. 
      • 중요한 instruction들은 권한이 있으며 kernel mode에서만 실행될 수 있다.
      • System call이 발생하면 kernel 모드로 변경했다가 return 될 때 user모드로 돌아온다. 

System call이 발생하면 kernel mode로 바뀌는 동시에 mode bit 또한 0으로 바뀐다. kernel에서 system call을 모두 수행한 후 return 될 때 user mode로 바뀌고 mode bit도 1로 바뀐다. 


Process Management

프로세스란? 실행중인 프로그램으로 시스템 내의 일의 단위이다. 프로그램은 파일 시스템에 존재하는 실행파일이고 프로세스는 실행파일을 누르면 Memory에 올라가 실행되는 하나의 인스턴스라고 한다. 

예시
프로그램은 구글 크롬을 실행할 Chrome.exe 이고 크롬 창을 여러개 생성할 수 있는데 각각의 크롬 창이 process이다. 

 

  • 프로세스는 작업을 수행하기 위해서 자원(CPU, Memory, I/O, files)을 필요로 한다. 
  • 프로세스를 종료하면 재사용가능한 자원들을 회수해야한다. 
  • 단일 스레드 프로세스는 다음 실행할 instruction의 위치를 가르키는 program counter 한개를 가진다.
  • 다중 스레드는 스레드 하나당 program counter 한개를 가진다.

운영 체제는 프로세스 관리와 관련하여 다음 활동을 합니다.

  • 사용자 및 시스템 프로세스 생성 및 삭제
  • 프로세스 중단 및 재개
  • 프로세스 동기화(synchronization)를 위한 메커니즘 제공
  • 프로세스끼리 통신을 위한 메커니즘 제공(서로 정보를 주고받는 기능)
  • 교착 상태(Deadlock) 처리를 위한 메커니즘 제공

Memory Management

메모리 안에서 실행할 data와 instruction들을 OS가 관리한다. 

운영 체제는 메모리 관리와 관련하여 다음 활동을 한다.

  • 현재 사용 중인 메모리 부분과 어떤 사용자가 메모리를 사용하고 있는지 추적
  • 메모리 내부와 외부로 이동할 프로세스(또는 그 일부)와 데이터를 결정
  • 필요에 따라 메모리 공간 할당 및 할당 해제

Storage Management

Hard disk를 Application이 직접 관리하도록 하면 만드는 Application을 만드는 사용자마다 엄청난 시간을 소모하게 된다. 

따라서 OS는 모두에게 동일하고 논리적인 storage를 제공한다. 

  • 물리적인 속성을 논리적인 저장장치 단위(이를 file이라고 한다)로 추상화시킨다. 

File-System management

파일들은 일반적으로 directory들로 관리되어진다.

누가 접근하는지 결정하기 위해서 대부분의 시스템들에서 접근을 제어한다.

 

운영 체제는 파일 시스템과 관련하여 다음 활동을 한다.

  • 파일 및 디렉토리 생성 및 삭제
  • 보조 스토리지에 파일 매핑
  • 안정적인(비휘발성) 저장 매체에 파일 백업

Mass-Stroage Management

일반적으로 Main memory에 올라 갈 수 없는 데이터 또는 오랜 기간 동안 보관해야 하는 데이터를 저장하는 데 디스크가 사용된다.

그리고 컴퓨터 작동의 속도는 디스크 및 해당 알고리즘에 달려 있다.

운영 체제는 대용량 저장장치와 관련하여 다음 활동을 한다.

  • 디스크의 여유 공간 관리
  • 저장 공간 할당
  • 디스크 스케줄링

Disk에서 Register로 Data 이동

멀티태스킹 환경은 저장장치 계층 구조 상에서 어디에 저장되어 있든 가장 최근의 값을 사용하도록 주의해야 한다.

예를 들어 A의 process가 register 값을 0에서 1로 바꾸었을 때 B의 process는 register의 값 1을 이용해서 써야한다. 0을 쓰면 최신 값을 사용하는 것이 아니다.

다중 프로세서 환경은 모든 CPU가 캐시에서 가장 최근 값을 갖도록 하드웨어에서 캐시 일관성(coherency)을 제공해야 한다.


I/O Subsystem

OS의 목적 중 하나는 하드웨어 장치의 특성을 사용자에게 숨기는 것이다. 즉 OS는 사용자가 수많은 하드웨어 장치를 사용할 수 있도록 해야한다. 

I/O subsystem 역할

  • 버퍼링(전송되는 동안 데이터를 일시적으로 저장), 캐싱(성능을 위해 데이터의 일부를 더 빠른 저장소에 저장), 스풀링(한 작업의 출력을 다른 작업의 입력으로 올려놓는 것)을 포함한 I/O의 메모리 관리

여기서 스풀링(Spooling)은 print를 예로 생각하면 된다. print는 느린 장치이기 때문에 OS의 spool 영역에 출력하고자 하는 data를 놓고 print에게 보내주는 것이다. 

  • 일반적인 장치 드라이버 인터페이스(일반적인 마우스, 키보드, 모니터등을 본체에 연결하여 사용하도록 하는 기능)
  • 특정 하드웨어 장치용 드라이버(좋은 기능을 제공하는 I/O 장치 회사들은 자기의 장치들을 잘 사용하도록 driver 제공)  ex) 로지텍 

Protection and Security

Protection – OS에서 정의한 자원들에 대해서 프로세스나 사용자의 접근을 제어하기 위한 모든 메커니즘으로 권한이 없는 user나 process가 자기 권한 밖의 내용을 접근하려고 할때 막아주는 메커니즘이다.

  • 모든 사용자에게 ID를 부여하고 권한을 부여해 접근 할 수 있는 file들에 제한을 둔다.
  • 만약 자신이 만든 파일이라면 많은 권한을 부여받게 된다.

Security – 내부와 외부 공격에 대한 시스템 방어

 

 

시스템들은 일반적으로 사용자를 구별하여 누가 무엇을 할 수 있는지 결정합니다.

  • 사용자 식별자(identities)(user ID, security ID)에는 사용자당 하나씩 이름과 관련 번호가 있다.
  • 그런 다음 사용자 ID는 모든 파일, 해당 사용자의 프로세스와 연결되어 접근을 제어한다.
  • 그룹 식별자(group ID)를 사용하면 사용자 집합을 정의하고 제어할 수 있으며 각 프로세스, 파일과도 연관시킬 수 있다. 위의 사용자 ID와는 다르게 사용자들을 그룹으로 묶어서 관리함.
  • 권한 조정(Privilege escalation)을 통해 사용자는 더 많은 권한을 가진 유효 ID로 변경할 수 있다(예: setuid).
print를 할 때 우리는 OS 영역 spool에 접근해야하지만 user들은 그런 권한을 갖고있지 않다. 따라서 privilege escalation을 통해 권한을 잠시 상승시켜 spool 영역에 data를 놓을 수 있도록 도와준다. 

OS가 제공하는 서비스들(Operating System Services)

운영 체제는 사용자에게 다음과 같은 유용한 기능을 제공한다.

  • 사용자 인터페이스(User Interface) - 거의 모든 운영 체제에는 사용자 인터페이스(UI)가 있다.
    • 명령줄 인터페이스(CLI), 그래픽 사용자 인터페이스(GUI), 배치 인터페이스(Batch Interface)등으로 다양하다.
  • 프로그램 실행(Program Execution) - 운영체제는 프로그램을 메모리에 올리고 실행할 수 있어야 하며  실행을 종료할 수 있어야 한다(종료시에 정상적으로 종료됐는지 비정상적으로(오류 표시) 종료됐는지 알려주어야 한다).
  • I/O 작업(I/O operations) - 실행 중인 프로그램에는 파일이나 I/O 장치에 접근할 수 있는 I/O가 발생할 수 있기 때문에 이를 제공해야 한다.
  • 파일 시스템 조작(File-System manipulation) - 프로그램은 파일과 디렉토리를 읽고 쓰고, 만들고 삭제하고, 검색하고, 파일 정보를 나열하고, 권한을 관리 해야 한다.
  • 통신(Communication) – 프로세스는 동일한 컴퓨터에서나 네트워크를 통한 컴퓨터끼리 정보를 교환할 수 있다. 프로세스 간 통신은 공유 메모리에서 컴퓨터끼리의 통신은 메시지 전달(OS에 의해 이동된 패킷)을 통해 이루어질 수 있다.
  • 오류 감지(Error Detection) – OS는 오류가 발생했는지 계속해서 체크 해야한다. 오류는 CPU 및 메모리 하드웨어, I/O 장치, 사용자 프로그램에서 발생할 수 있으며 각 오류 대해 OS는 정확하고 일관된 컴퓨팅(연산)을 보장하기 위해 적절한 조치를 취해야 한다.

다음은 운영체제가 담당하고 있는 것들을 그림을 통해 보여주고 있다. 파란부분은 OS를 가르키며 User Interface들은 system call을 통해 운영체제가 제공하는 서비스들을 사용할 수 있다.


System call

OS에서 제공하는 서비스를 사용하기 위한 프로그래밍 인터페이스. 쉽게 이야기하면 어떤 프로그램 함수(System call)를 호출하여 OS가 제공하는 서비스를 수행할 수 있도록 해주는 것이다.

예시
fork라는 system call 함수가 있는데 fork를 호출하면 OS가 제공하는 program execution을 사용할 수 있다. 


System call은 일반적으로 고급 언어(C 또는 C++)로 작성

직접 System call을 사용하는 대신 상위 수준 API(응용 프로그램 인터페이스)를 통해 프로그램에서 접근한다.

일반적인 세 가지 API:

  • Windows용 Win32 API
  • POSIX 기반 시스템용 POSIX API(UNIX, Linux 및 Mac OS X)
  • JVM(Java Virtual Machine)용 Java API

System call보다 API를 사용하는 이유는 사용하기 쉽기 때문이다. System call은 윈도우와 리눅스 등 운영체제 별로 다를 때가 많다. 따라서 API인 printf(programming language) 함수를 사용하면 윈도우나 리눅스에 상관없이 모니터에 내가 원하는 글씨를 출력하게 된다.


System Call Implementation(시스템 콜 구현) 

일반적으로 각가의 System call에 번호가 매겨진다. OS는 번호를 이용해 해당 메모리 위치로 이동한다.

  • System call interface는 숫자에 따라 번호를 붙여 테이블을 유지한다.

System call interface는 OS 커널에서 우리가 수행하려는 System call을 호출하고 System call의 상태와 반환 값을 반환한다.

Caller는 System call이 구현되는 방식에 대해 알 필요가 없다.

  • API를 준수하고 OS가 수행할 작업을 이해하기만 하면 된다.
  • OS 인터페이스의 대부분의 세부 사항은 숨겨져 있다.

API인 printf를 사용하면 kernel에서 write() system call이 실행된다.


Virtual Machine

Virtual Machine은 하드웨어와 운영 체제의 커널을 모두 하드웨어인 것처럼 취급한다. Virtual Machine은 아무것도 없는 하드웨어와 동일한 인터페이스를 제공한다.

 

호스트 운영 체제(ex VMware 실행하는 운영체제)는 프로세스(ex VMware)에 자체 프로세서와 가상 메모리가 있다는 환상을 만든다.

오른쪽의 그림은 Virtual machine을 사용한 그림이다. virtual-machine implementation은 Hypervisor라고도 불리며 VMware를 예시로 생각하면 된다. 

 

이 기술은 Cloud에서 많이 사용되고 있다. 여러개의 Virtual machine을 제공하고 사람들이 원하는 OS를 골라서 쓰도록 할 수 있기 때문이다.


Java Virtual Machine

사람들은 Web을 active하게 만들고 싶어했고 실행파일을 사용자에게 보내면 된다고 생각했다. 하지만 사용자마다 OS가 달라서 보낸 실행파일이 실행되지 않는 문제가 발생하였다. 

어떤 OS던 실행할 수 있도록 만들면 어떨까 하는 고민에서 나온것이 Java Virtual Machine이다. 

Java virtual machine(JVM)은 해당 OS에서 compile을 하는 개념으로 .class 파일을 해당 OS의 JVM에 전달하고 Java interpreter를 거쳐서 실행시킨다. 

 

JVM을 운영체제에 맞게 다운받아서 compile시킨다.

728x90
반응형