오퍼레이팅 시스템

[OS] 자원 보호와 시스템 콜

유승혁 2022. 9. 13. 19:03

0. 용어 정리

 - 커널: 메모리에 상주하고 있는 OS의 일부이고, 주로 C로 쓰여져 있지만 레지스터를 많이 다루거나 자주 쓰이는 함수들은 어셈블러로 이루어져 있음. 시스템 콜을 통해 역할들을 수행해준다.

 

 - 유틸리티: 커널이 아니면 유틸리티라 생각하면 된다. 디스크에 상주해 있는 OS의 일부. 호출 시 메모리로 올라온다

 

 - shell: 유틸리티를 위한 유틸리티. 명령을 제어하는 역할을 함.

 

 - Dual-Mode: 커널 모드와 유저 모드가 동시에 존재하고 두 모드 사이에 HW적인 지원을 제공하는 모드. 주 기능으로는 다음과 같다.

     * 유저는 직접 I/O에 명령어를 내릴 방법이 없음. (단적으로도 read() 시스템 콜를을까본다 해도 어떤 명령어가 있는게 아니라 명령어 번호 같은 정보만 있음.

    * 메모리 상태를 관리하는 명령어들을 관리 한다.

    * 특별한 비트(mode bit)를 이용하여 kernel mode인지 user mode인지 구분할 수 있다.

    * 명령어를 중단 시킬 수 있다.

 

 - Mode switch: mode bit를 이용하여 kernel(0)인지 user(1)인지 구분 가능 한데, interrupt나 exception, system call이 일어날 경우 user mode에서 kernel mode로 이동하는 것을 말한다.

 반대로 kernel 작업 완료 후 user mode로 돌아갈 때에도 mode switch라고 부른다. PSW 레지스터에 현재 mode 상태를 기록해 둔다.

 

1. CPU protection

 어떤 task가 CPU를 독점하고 있는 상태를 막기 위한 것이다. 예를 들어, c++ code 잘못 짜서 무한 루프 돌고 있느라고 컴퓨터의 다른 task들이 무한 대기가 되어 버리면 꽤나 곤란하다. 이를 위해 System Timer라는 것을 만들어 일정 시간마다 지속적으로 interrupt를 발생시킨다. 이 timer에 대한 권한은 OS에게만 있다. 절대 시간을 기록하는데 사용 되기도 한다.

 timer interrupt는 현재 작업 중인 task의 시간을 기록하기도 하여 task에게 주어진 time slice를 소진 했을 때 다른 task에게 넘어간다. 즉, A 실행 하면서 자주자주 timer interrupt가 발생하여 time slice를 소진했는 지 검사하고 소진 했으면 B를 실행 시키게끔 하는 방식이다.

 

2. Memory Protection

 MMU(memory management unit)이라 불리는 녀석의 역할이다. MMU에 대해서도 다루게 되겠지만, 간략히 이야기 하면 메모리 주소에는 virtual memory가 도입 되면서 논리 주소와 물리 주소로 나뉘는데 이를 변환하는 역할을 한다. 또한 program A와 B가 동시에 메모리에 존재하는데 A를 실행하는 동안 B의 영역을 건드리지 못하도록 막는 역할을 하기도 한다. 

 

3. I/O Protection

 I/O 기능들은 결국 system call을 호출한다. system call을 수행하는 것은 kernel mode이기에 사용자가 접근하지 못하게 막아 두었다. 우리가 프린트를 할 때 과정들을 컴퓨터와 프린터에게 넘겨버려야 하지 프린터의 동작 방식을 사용자가 최적화 하겠다고 조작해버리면,, 기기가 고장날 수도 있다. 이런 상황을 막기 위해 생겨난 개념이다.

 

4. System call

 이전에 말한 Interrupt, exception, system call 모두 mode switch가 일어나 kernel mode에서 작동한다고 했다. 이때의 동작 중에는 H/W device와 직결 된 것들이 많다. 이렇게 함으로써 얻는 이점이 3가지 있다.

 - system 자원을 보호할 수 있다. 그래야만이 os의 신뢰성을 만족 할 수 있다.

 - reliability: 잘 작동하리라 믿을 수 있다.

 - security: 나쁜 user program이 kernel을 조작하지 못하게 막는다.

 system call 은 정말 다양하고 cout, printf, System.out.print... 뭐 이런 것들 전부 sytem call의 read 함수를 호출한다. 하지만 read 함수를 user level에서 직접 호출 하지는 않는다. 요런 녀석들을 wrapping API라고 부르는데 이렇게 하는 이유는 system call보다 사용하기 쉽다는 장점과 kernel mode를 좀 더 효율적으로 사용할 수 있기 때문이다. cout 내용을 한 글자 한 글자 마다 출력하는 것보다 버퍼를 이용해서 출력하는 것으로 이득을 볼 수 있다.

 

 

 

 

'오퍼레이팅 시스템' 카테고리의 다른 글

[OS] 동기화  (2) 2022.09.19
[OS] 스레드  (1) 2022.09.16
[OS] 스케줄링  (1) 2022.09.15
[OS] 프로세스  (0) 2022.09.14
[OS] os 개요  (0) 2022.09.13