os수업을 들으며 본인이 정리한 내용입니다.
사용교재 : Operationg System Concepts 10th edition (공룡책)
2단원 : system structure
OS services
1. 사용자 관점
- user interface : command-line-interface(CLI), GUI 등
- program 수행
- I/O operations : I/O device를 사용할 수 있게 한다.
- file-system 관리 : 파일 생성, 삭제, 읽기, 쓰기, 검색 등
- process간의 communications
- error detection
2. 시스템 관점
- resource allocation : 여러 job들이 resource들을 차지하기 위해 싸움-> 중재필요
- accounting: 통계자료 제공
- protection: kernel mode와 user mode의 구분을 통해 os만이 H/W에 접근할 수 있도록 한다.
- security
user interface
- batch interface: 일련의 명령어들을 file의 형태로 만들어 연속적으로 수행하도록 만든 것이다.
- command line interface(CLI)
shell: 명령어를 받아서 해석하고, 수행하는 프로그램
<두가지 방법>
1. shell 자체에 명령어들을 집어넣는 방법 -> 크기가 커진다는 단점이 있다.
2. 실행되는 파일들은 directory에 저장되어 있고, 그 파일을 찾아서 수행하는 방법
- graphical user interface (GUI)
- windows OS
- UNIX or LINUX : linux는 open source이다. (GNOME, KDE-> open source만드는 project명)
kernel mode로 진입할 수 있는 방법 2가지
1. hardware interrupt: 비동기적으로 진입 외부에서 interrupt가 일어났을 경우 무조건적으로 ISR 수행 -> ISR이 kernel내에 있으므로 kernel모드로 진입
2. trap:
- exception -> 프로그램의 오류
- system call
system call
application program이 os로 service를 요청할 수 있는 mechanism이다.
api를 통해 system call을 호출 -> kernel로 진입, 수행 후 user로 돌아옴.
- system call의 예시
만약 a.text에서 b.text로 copy를 한다고 하면,
prompt가 뜸-> display도 H/W이므로 system call
명령어를 치면 open -> file system에 접근하므로 system call
file의 read, write -> file에 접근하면 무조건 system call
이와 같이 system call이 계속해서 발생한다 -> OS가 service를 받을 수 있는 유일한 mechanism이기 때문.
api
indirectly 호출-> 응용프로그래머가 system call을 바로 호출하는 것이 아니라, library 함수를 호출하고, library 함수 안에서 간접적으로 system call을 호출한다.
- Win32 api : window 시스템을 위한 api
- posix api : poix기반 시스템의 표준 api (대부분의 UNIX, Linux, Mac OS 포함)
ex) posix api에 malloc()이라는 library가 있고, 해당 library가 sbrk()라는 system call을 호출
왜 간접호출을 할까?
portability-> 여러 개의 OS에서 다른 system call로 변환해 주는 것을 library내에서 하면 OS가 달라져도 동일한 api를 써서 호출할 수 있기 때문이다.
system call interface
= table 형태로 시스템 콜을 관리한다. -> system call number만 알고 있으면 system call 가능
system call은 커널에 있지만 user가 부른다 -> 커널과 유저는 엄격히 분리되어 있기 때문에 register를 사용하게 된다.(파라미터를 register를 통해 전달한다.)
- 방법1: register를 통해 system call number 전달
system call은 trap의 일종이기 때문에 interrupt로 관리한다.
library함수 호출 -> library에서 system call number를 register에 전달 -> interrupt description table(IDT) = interrupt vector -> system call table에서 number와 맞는 system call을 한다.
- 방법2: 매개변수는 메모리내의 블록이나 테이블에 저장하고, 저장된 주소를 register에 넣어서 OS로 전달, OS는 주소에 저장된 값을 넘겨받는다. -> Linux와 Solaris에서 사용되는 방법
Linux에서는 전달해야 할 parameter가 6이하일 때는 register를 사용하고, 6보다 클 때는 위의 방식을 사용한다.
-> register의 개수가 한정되어 있기 때문
system call의 타입
- 프로세스 제어 : end, create, terminate, wait event…
- file management : create, open, read, write…
- device management : read, write, get device attributes
- 정보 유지 : get time, date, process id,…
- 통신 : send/receive, create/delete communication connection
cf) 왜 시간과 날짜를 얻는게 system call일까?
H/W에 시간과 날짜를 담고 있는 것이 있어서 OS를 참조해야 하기 때문
OS design & implementation
policy의 변경에 민감하지 않은 메커니즘이 바람직함 -> ex) micro-kernel-based 접근
OS structure
1. simple structure
- 현재 OS에는 없음
- dual-mode가 안되고, H/W protection이 안됨
- ex) MS-DOS
2. Layered approach
- OS가 다수의 층으로 분할 됨
- bottom layer : H/W
- highest layer : user interface
- 각 계층은 오직 자신의 하위 층의 서비스와 기능만을 사용할 수 있다.
- 바로 위에 있는 layer에만 접근이 가능
- 남은 시스템에 대한 고려 없이 디버깅 가능
- 전통적인 UNIX
3. microkernels
- kernel을 마이크로화하여 userspace에 대부분의 기능이 있다.
- 큰 시스템에는 쓸 수 없다. -> 폴더폰 등에서 쓰임
- 확장이 용이하다, 새로운 서비스가 userspace에 추가되기 때문에 kernel의 변경 없이 확장이 가능하다.
- policy가 바뀌어도 쉽게 바꿀 수 있다.
- 단점: 사용자와 kernel간의 통신 overhead - massage passing 수행 시 overhead (IPC : inter-process communication)
<-> 반대 : monolithic kernel
- kernel에 대부분의 기능이 다 있다.
- Linux, Window등 우리가 대부분 사용한다.
- policy가 바뀔 경우 kernel을 바꿔야한다.
4. Modules
- 각각의 모듈은 커널 내에서 필요할 때마다 별도로 로딩 할 수 있다.
- Linux = layered approach + Modules(add)-> 모듈은 기능별로 별도의 모듈로 구분된다
- Linux는 모듈을 동적으로 loading하거나 unloading한다.
- insmod : 모듈을 추가한다.
- rmmod : 모듈을 삭제한다.
- monolithic kernel에는 kernel에 device driver가 존재한다. -> 이렇게 되면 새 device를 살 때마다 kernel을 바꿔야 한다. 예를 들면 프린터를 새로 사서 연결하려면 kernel을 바꿔야한다.
=> 이럴 때 모듈이 필요! insmod driver로 드라이버를 추가하고, rmmod driver로 드라이버를 삭제할 수 있다.
5. virtual machine
- 핵심: 동일한 H/W를 여러 다른 OS가 concurrently 수행할 수 있다.
- H/W위에 virtualization layer가 있고, 그 위에 virtual machine이 OS아래에 존재해서 실제 H/W는 하나인데 각각의 OS가 마치 자신의 machine을 가지고 있는 것처럼 착각을 하게 만듬.
- virtualization layer는 virtual machine들이 concurrently 동작할 수 있게 한다.
- 유지보수 비용을 매우 줄일 수 있다.
- virtual machine의 관점에서는 virtual machine위에 virtual kernel과 virtual user space가 있다고 보지만,
- virtualization layer의 관점에서는 자신이 kernel program이고, 각각의 virtual machine과 그 위에서 동작하는 kernel과 process를 전부 user program로 본다.
- Vmware -> 대표적인 virtual machine
- host OS : 원래 설치 되어있던 OS
- guest OS : 사용하고 싶은 다른 OS
System boot : 전원을 키는 것
-> 가장 처음 bootloader 수행
- bootloader(bootstrap loader)가 하는 일: kernel(OS)을 메모리에 로드하고, OS에게 제어권을 넘겨준다. = OS의 main함수의 첫번째 줄이 실행되도록 한다.
- bootloader는 rom에 있다.
- 두가지 방법으로 수행 가능
1. single-step : bootloader에서 OS를 로드한 후, OS의 main함수 실행까지 한다.
2. two-step : 처음에 bootblock을 로드하고, bootblock이 kernel을 로드한다. -> rom이 ram보다 느리고, 부팅과정을 rom에 다 넣기 힘들 수 있으므로 두단계로 나눔
cf ) system generation(SYSGEN) : 현재 H/W가 어떤 것이 있어서 OS를 어떻게 설치할 것이냐
SYSGEN program : 위의 일을 자동으로 해 줌
'전공과목 정리 > 오퍼레이팅 시스템 (OS)' 카테고리의 다른 글
OS(6) - process synchronization (0) | 2022.11.14 |
---|---|
OS(5) - process scheduling (1) | 2022.11.13 |
OS(4) - Tread & Concurrency (0) | 2022.11.13 |
OS(3) - Process (0) | 2021.05.12 |
OS(1) - OS의 전반적인 소개 (0) | 2021.05.02 |