본문 바로가기

CS

Ch2. Operating System Overview (2/3)

OS Services for Efficient Operation

  • Resource Allocation: 자원: CPU 사이클, 메모리 공간, 메모리 대역폭, 파일 시스템 공간, 파일 입출력 대역폭
  • Accounting: 어떤 프로세스가 자원을 얼마나 사용했는지 추적
  • Protection and Security: Multi User 환경에서 시스템 자원으로의 모든 접근은 통제되어야한다. 동시에 Resource에 접근하는 프로세스들이 많을 수 있다. 

System Calls

시스템 호출(System call)은 운영체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 보통 C, C++와 같은 고급언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없기 때문에 고급 API를 통해 시스템 호출에 접근하게 하는 방법이다.

커널과 관련된 것은 Kernel모드로 전환후에 수행해야 작업을 수행할 권한이 생긴다. 커널 모드를 통한 이러한 작업은 반드시 시스템 콜을 수행하도록 설계되어있다. 만약 유저모드에서 시스템 콜을 호출한 경우 운영체제에서 불법적인 접근이라 여기고 trap을 발생시킨다.

 

System call은 다음과 같이 6개의 카테고리로 분류할 수 있다.

  • Process control (프로세스 제어) : fork, exec, exit, ...
  • File manipulation (파일 관리): create, open, close, read, write, lseek
  • Device manipulation (장치 관리): open, close, read, write, ioctl
  • Information maintenance (정보 유지): time, date, dump, pid
  • Communications (통신): open, close, connect, accept, read, write, send, recv, pipe, mmap, sendfile, ...
  • Protection (보호): chmod, umask, chown

 

사용자가 파일 하나를 열어서 다른 파일로 copy하는 작업을 생각해보자. 여기서는 다음과 같은 시스템 콜이 사용된다.

  1. 사용자로부터 파일 이름 입력받기: 시스템 콜을 반드시 사용. (키보드 입력, GUI에서도 마우스 입력, 창띄우기 등)
  2. 두 파일을 open한다. :  파일 열기, 에러나면 표시하기 등등 
  3. 데이터를 복사해서 Destination 파일에 적기: 어느 단위만큼 읽고 쓰고 반복, 에러 출력 등
  4. Close both files 
  5. 전송 완료 메시지 표시, 전송 끝, 프로그램 종료

위와 같이 시스템콜은 간단한 작업에도 엄청 많이 쓰인다. (1초에 몇 천개 나온다.) 프로그래머들은 API를 이용해서 시스템 콜을 간접적으로 사용한다. 시스템 콜을 직접 사용하는 것은 어렵기 때문이다. 유저의 프로그램에서는 다음과 같은 동작 과정을 통해 시스템 콜을 호출한다.

 

  1. User program(libc등도 포함)이 open()등 System call을 호출
  2. System Call Interface에서 핸들링. User Mode -> Kernel Mode
  3. System call function pointer에서 sys_open()등 함수 호출, 작업 수행
  4. 다시 System Call Inerface로 넘어가서 Kernel mode -> User mode로 전환

Dual Mode

현재 컴퓨터 환경은 여러 사람이 동시에 컴퓨터를 사용하는 경우가 많다. 그리고 그 이외에도 하나의 컴퓨터 내에서 여러 프로그램을 실행하는 것이 일반적이다. 이 때 특정 컴퓨터나 프로그램에서 잘못된 동작으로 다른 컴퓨터가 영향을 받으면 위험하다. 이러한 문제점을 해결하기 위해 일반 사용자가 치명적인 명령어들을 실행하는 것을 막을 필요가 생겼고 여기서 이중모드(Dual Mode)가 생겼다.

 

이중모드는 두가지 모드를 갖는다.

  • 사용자(User) 모드
  • 관리자(Supervisor) 모드 = 시스템(system) 모드 = 모니터(monitor) 모드 = 특권(priviledged)모드

특권 모드에서만 내릴 수 있는 명령을 특권 명령(priviliged instruction)이라고 하며 STOP, HALT, RESET, SET_TIMER등이 존재한다. 만약 사용자 모드에서 특권명령을 사용하려고 하면 CPU에서 내부 인터럽트를 발생시켜 해당 명령어 를 요청한 프로그램을 강제 종료시킨다.

 

다음은 하나의 애플리케이션을 실행하는 동안 모드의 변화이다.

 

  1. 컴퓨터 부팅과정 (관리자 모드)
  2. 애플리케이션 실행과정 (관리자 모드)
  3. 애플리케이션 실행중 (사용자 모드)
  4. 인터럽트 발생 후 처리과정 (관리자 모드)
  5. 인터럽트 처리 후 (사용자 모드)

사용자가 하드웨어의 자원에 접근하는 것은 매우 위험한 동작이기 때문에 모두 관리자모드로 운영체제에서 처리하도록 한다. (프로그램에서  소프트웨어 인터럽트를 발생시켜 운영체제에 위임)

 

ISR(Interrupt Service Routine)

ISR

프로그램은 CPU의 program counter(PC)에 의해 명령어(instruction)을 처리하게 된다. 이렇게 명령어를 하나씩 메모리에서 가져와서 실행하다가 인터럽트가 발생하면 현재 수행하던 프로그램과 프로세서의 상태를 저장하고 Interrupt handler라고 하는 인터럽트 처리기로 점프하게 되고, 이 인터럽트 처리기가 Interrupt Service Routine(ISR)이라는 인터럽트 처리 동작을 수행하게 되고, 이 인터럽트 처리 동작이 완료되면 인터럽트 처리기가 다시 원래 수행하던 프로그램으로 Return하여 이전 상태로 프로그램과 프로세서 상태를 가져와서 수행하게 된다. 

 

Hardware Protection

운영체제가 보호할 대상은 입출력 장치, 메모리, CPU 총 세가지이다.

 

입출력 장치 보호

컴퓨터를 혼자 사용하는게 아니고 같이 사용하기 때문에 입출력이 엉킬 수 있다. 이를 해결하기 위해 in, out과 같은 입출력 명령을 특권명령으로 설정한다. 즉 사용자 애플리케이션에서 입출력을 사용하려면 운영체제를 통해서 수행해야한다.(소프트웨어 인터럽트) 여러 프로그램이 동시에 입출력을 사용하려고 하면 운영체제 내부에서 순서를 정해 혼선을 막는다.

 

메모리 보호

메모리는 운영체제뿐만 아니라 다양한 어플리케이션이 존재한다. 한 어플리케이션이 자신의 메모리 영역이 아닌 다른 메모리 영역에 침범하면 매우 위험하다. 

CPU는 address bus를 통해 메모리 주소에 접근하게 되는데, user1프로그램이 실행되는 동안에는 user1이 할당되어있는 메모리 주소 범위 안인 경우에만 접근하면 된다. 이를 address bus에서 검사하는 것이 가장 효율적이다. 이 생각으로 나온것이 MMU(Memory Management Unit)이다. MMU는 아래 그림처럼 address bus 중간에 설치된 하드웨어 칩으로서 두개의 레지스터 통해 프로그램의 주소 범위를 저장한다.

 

예를 들어, User1의 시작 주소는 1024, 끝 주소는 4048이라고 하자. User1이 수행되는 동안 운영체제는 해당 프로그램의 주소 범위를 MMU에 설정(특권 명령)하는데, base는 1024, limit는 4048이 될 것이다. 결과적으로 user1이 수행되는 동안에는 이 범위 안의 주소값인 경우에만 address bus를 통과시킨다.

 

만약 해당 프로그램의 주소 범위 밖의 주소값이 MMU에 들어온다면, MMU에서 내부 인터럽트 를 발생시켜 CPU에 신호를 준다. 그러면 CPU는 그에 맞는 ISR로 이동하여 해당 프로그램을 강제로 종료시킨다. 이과 같은 잘못된 메모리 접근을 Segment violation 이라 한다.

 

CPU 보호

CPU보호는 사용자의 실수 또는 고의로 인한 CPU독점을 방지해야한다. 하나의 프로그램이 CPU를 독점한다면 다른 프로그램은 수행되지 못한다. CPU를 독점하는 가장 대표적인 예는 무한 반복문이다. 이를 해결하는 방법은 timer를 두어 일정 시간이 지나면 타이머 인터럽트를 발생시킨다. 인터럽트가 발생하면 반드시 운영체제 내의 ISR로 이동하므로 해당 ISR에서 각 프로그램의 CPU점유 시간을 측정하여 적절히 분배되도록 조정한다. 

 

'CS' 카테고리의 다른 글

Ch12. File Management  (0) 2022.06.09
Ch2. Operating System Overview (3/3)  (0) 2022.06.07
Ch2. Operating System Overview (1/3)  (0) 2022.06.04
Ch1. Computer System Overview  (0) 2022.06.04
RAID  (0) 2022.05.30