Quiz
CPU operates in ( ) and ( ).
( ) allows to distinguish on which mode system is running.
Some ( ) are only excutable in the kernel mode.
May generate an ( ) if and application tries to run a privileged instruction in user mode.
Exception : ( )= expected, intended ( ) = unexpected
( ) : Programming interface to the services provided by the OS.
Mostly accessed by programs via a high-level ( ) rather than direct system call use.
어떻게 운영 체제가 시스템과 어플리케이션을 보호할 것이냐
어떤 컴퓨터에 HLT의 instruction이 있다고 생각해보자. (HLT = halt : CPU를 정지시키는 명령어)
그럼 CPU가 딱 처리하는 순간 컴퓨터가 꺼진다.
그런데 생각해봐라.
컴퓨터가 수많은 사람들이 쓴다고 생각해 보아라.
PAsubmit에 HLT를 돌리면 컴퓨터가 꺼진다.
그러면 내가 다른사람의 동작을 방해하거나 이런 나쁜 역할을 할 수 있다.
이처럼 시스템을 운영체제가 잘 보호하지 못하면 큰 일이 일어난다.
User mode & Kernel mode
어떻게 하면 시스템이 효과적으로 잘 보호될 것이냐?
현존하는 시스템은 멀티 모드를 이용해서 동작한다. (한가지 동작 이상)
일반적으로 크게 배울 것은 user mode와 kernel mode이다.
일단 두가지가 있다라고만 알아두자.
user mode ⊂ kernel mode : 포함관계에 있다.
instruction이 있는데 커널모드에서만 도는 게 있고 유저 모드에서만 도는게 있다.
대부분은 user 모드에서 동작한다.
privileged instruction 들은 kernel 모드에서만 동작이 된다.
Mode bit을 읽어보면 내가 유저모드인지 커널모드인지 알 수 있다.
Privileged instruction
조심조심 해야되는 것들은 privileged instruction에서 돌아간다.
저장 하거나 그런것들.
마우스에서 입력을 하거나 처리하는 것.
레지스터 중에서 시스템 인터럽트 서비스 루틴 테이블이 존재하는데
이걸 고친다던지, 바꾼다던지, 리셋한다던지
이런것들은 커널 모드에서만 실행이 된다.
그래서 CPU는 커널모드에서 돌던지 유저모드에서 돌던지 둘 중 하나에서 돈다.
유저모드에서 만약에 previleged instruction을 실행하려고 하면 CPU가 exception이라는 것을 날려준다
인터럽트랑 마찬가지로 CPU가 커널모드로 변경되고 (익셉션은 커널모드로 진입을 하게 된다) 실행이 운영체제로 넘어간다.
잠깐 진행에 앞서서 설명해보면 컴퓨터에는 exception, interrupt가 있는데
인터럽트는 하드웨어 장치가 만들어내는 신호이다.
그리고 이것은 아무때나 발생할 수 있다.
근데 이렇게 뭔가 일이 발생했을때 모드를 바꿔주고 잠깐 나에게 관심을 가져줘 같은 instruction 상황을 exception이라고 한다
따라서 소프트웨어 interrupt라고도 불린다.
인터럽트랑 다르게 instruction을 딱 수행하려는 시점에만 발생한다.
Trap : 의도적으로 한 것
fault : 잘못돼서 발생한 것
컴퓨터는 인터럽트 기반으로 디자인이 되어있는데
( 인터럽트 : 하드웨어가 아무때나 시도때도 없이 만드는 시그널, 발생하면 인터럽트 서비스 루틴으로 가서 뭔가 일을 처리하는 것 )
반면 소프트웨어로 이런 인터럽트 비슷한것을 만들어내는 것을 exception이라 한다.
instruction을 수행하다가 Synchronous 하게 발생하고 = 동시에 발생
만약에 의도를 했으면 Trap
이건 이상하게 예상치못하게 발생하면 fault 라고 한다.
이 관계들만 좀 이해해라
타이머가 인터럽트가 걸리면 알아서 유저모드에 있던 어플리케이션을 다 저장하고 알아서 커널모드로 바뀌고
커널모드에서 상태를 살펴보고 이런 애들을 처리한다.
처리가 끝나면 다시 유저모드로 바꾼다.
타이머도 하드웨어에서 중요한 컴포넌트라 타이머를 건드리는 instruction도 privilleged instruction이다.
다시 말하지만 privileged instruction은 커널모드에서 돌아간다.
커널모드의 타이머가 5분뒤에 알람을 울려줘 해놓으면
내 일을 유저모드로 한다.
그러다가 5분이 지나면 인터럽트를 만들면
유저모드에서 알아서 커널모드로 바뀐다.
그리고 컨트롤이 운영체제로 넘어온다.
이게 반복된다.
정리하자면 모드 전환이 일어나는 것은, CPU는 컴퓨터를 안전하게 동작시키기 위해서
운영체제는 muti-mode operation을 지원하고, user mode, kernel mode가 있고, mode bit가 있고, privileged instruction이 있고
그래서 user mode가 돌고 있다가 interrupt가 발생을 하면 interrupt handler를 이용해서 user mode들어오는 것이다.
모드가 user mode에서 kernel mode로 바뀌는 또 한가지 방법이 system call이다.
System Call
우리가 저기요 하면 주방에서 일하는 사람이 뭘 도와드릴까요? 하는 거라고 이해하면 된다.
주방장이 kernel mode에서 요리를 하다가
system call의 요청을 받고
여러분의 응답을 처리해주기 위해서
user mode로 바뀐 것이다.
user mode에서 kernel mode로 들어오는 방법
- interrupt
- System Call
유저모드에서 돌고 있다가 system call을 통해서 야 나 뭐좀 해줘 하면
kernel 모드로 들어와서 운영체제가 할 수 있는 privileged instruction을 처리하고 다시 유저에게 반환해준다.
그리고 유저는 유저모드에서 다시 자기 할 일을 처리한다
그래서 정리하자면!
System Call은 운영체제가 제공하는 서비스를 부르기 위한 프로그래밍 인터페이스다!
일반적으로 system call 은 C나 C++에서 지원하고
더 복잡한 프로그램은 API를 이용해서 운영체제에 요청한다.
제일 많이 쓰이는게 system call 모양 구조에 따라서 나눌 수 있다.
- Windows
- X system
- Java
이렇게 세개 있다.
서로서로 호환이 안된다.
Win32로 짠 프로그램은 POSIX에서 안 돌아간다.
되게 당연한 질문인거 같은데
안돌아가는 이유가 비록 하드웨어는 같을지언정
API가 다르게 구현이 되어있기 때문이다.
정리해보자!!
컴퓨터는 인터럽트 기반으로 동작을 한다.
인터럽트를 I/O하는 데에만 쓰는게 아니라 저걸 확장해서 사용하는게 컴퓨터를 보호해야 하는 역할에도 사용된다.
어떻게 보호하냐? CPU를 user mode, kernel mode로 나눠서
user mode에서는 일반적인 일을 수행하고,
privileged instruction은 시스템에 굉장히 중요한 역할을 해서 user mode에서 privileged instruction 역할을 하지 못하게 하고
kernel mode는 운영체제가 관리하고 있는 상태이다.
만약 프로그램을 돌리다가 privileged instruction을 내가 허용치 않은 것을 user mode에서 실행하려다 보면
하드웨어에서 알아서 kernel mode로 바꿔주고
운영체제에서 나 이런 상황이 발생했어 ,아 얘 하지말란거 하고있네 하면서 프로그램 죽이고, 보호 해주고
운영체제는 이 중요한 privileged instruction을 수행할 수 있으니까 이게 뚫리면 큰일이 난다.
소프트웨어에서 하는 걸 System Call 이라고 한다.
System call 이라는 것은 운영체제가 제공하는 서비스에 대한 API이다.
이걸 하기 위해서 3개 정도가 있다.
Program execution : 프로그램을 실행시켜 주는 것
익스플로러를 더블 클릭 하면 익스폴로러가 띄워주는게 아니라 사용자 intention을 system call을 통해서 전달해주면 운영체제 윈도우 운영체제가 보고, "아 얘 익스플로러 띄울려고 하네?" 하면서 익스플로러 프로그램을 메모리에 올리고 실행 시켜준다.
I/O operation : 파일 뿐만 아니라 키보드에서, 마우스에서, 터치패드로부터 입력을 받고 처리해주는 것
다 운영체제가 제공하는 서비스이다.
File-system manipulation : 읽고 쓰고 하는거
Communication : 다른 외부에 있는 거랑 네트웤을 통해서 내보내고 하는 것
Erro detection : 에러잡아주는 것, 디버깅
Resource allocation : 리소스를 할당받고 다른 곳에 주고
Accounting : 얼마나 썼고 누가 썼고 관리
Protection and security : 유저 모드인데 얘 뻘짓하네 이런거 관리
이 8가지 서비스에 대해서 각각 대응되는 System Call들이 있다.
여러분 리눅스에 System Call이 몇개나 있을 것 같냐? 350개 넘게 있다.
여러분이 운영체제에 요청해서 처리하는 서비스가 350개가 있다는 것이다. 매우 많다는 것이다.
다 ! System Call을 이용해서 하고있다. 다 외울 필요는 없다.
대충 어떤 역할을 운영체제가 해줘야 겠구나. 거기에 맞는 System call이 뭐가 있나 알고있으면 된다.
System Call을 라이브러리가 다 불러주고 있다.
화면에 뭔가 출력해주는 거도 System Call이다.
모든게 다 System call 이다.
윈도우와 유닉스의 시스템 콜이 다르다.
우리는 이번 학기에는 유닉스만 가지고 할 것이다.
이것은 굉장히 익숙해져야할 환경이다.
리눅스 쉘에서 man 메뉴얼에 대해서 read 보여줘
이 페이지에 가서 많이 봐라.
유저모드에서 동작을 하다가 system call interface를 통해서 처리한다.
운영체제랑 system call interface 를 통해서
운영체제가 제공하는 서비스를 요청을 하고 ex) open() ...
이것을 운영체제가 서비스에서 반환하는 역할을 하고
유저모드에서 운영체제에 요청하는 메커니즘은 사실 인터럽트와 동일하다.
printf()는 시스템 콜은 아니다.
printf()를 하면 standard C 라이브러러리에서 wirte라는 시스템콜을 날리고 처리해서 알려주고
- user mode, kernel mode
- interrupt
- System Call
- 소프트웨어 인터럽트
- Exception
- 언제모드가 전환하는지
이게 중요하다
system call은 소프트웨어 인터럽트이다.
어? 유저 프로그램을 하다가 운영체제에 요청을 해야하네? 어떻게 하지?
소프트웨어에서 진입하는 거고 소프트웨어에서 발생한 인터럽트
인터럽트가 하나밖에없다.
유저모드 -> 커널모드 -> 해당 인터럽트핸들러 ->끝나면 다시 유저모드로
'🚦 Server > Operating System' 카테고리의 다른 글
04. Operating System Structures (2) (0) | 2020.03.30 |
---|---|
03. Operating System Structures (1) (0) | 2020.03.25 |
Programming Assignment 0 (0) | 2020.03.18 |
01. Introduction to OS (0) | 2020.03.18 |
00. Welcome aboard ICT332 (0) | 2020.03.16 |