*본 포스팅은 2020학년 1학기 홍석인 교수님의 운영체제 수업을 두서없이 정리한 것임을 밝힙니다.
- 운영체제가 유저와 프로세스, 다른 시스템들에게 어떤 서비스를 제공하는 지
- 운영체제를 구성하는 것이는 무엇이 있는지 알아본다.
운영체제
: 운영체제는 기본적으로 프로그램을 실행할 수 있는 환경을 제공해준다.
유저를 위한 운영체제 서비스
- User Interface
a. CLI: Command-line interface
(리눅스 머신을 사용할 때 주로 터미널을 띄우고 커맨드를 입력해 컴퓨터를 사용하는 데 이를 CLI라 함)
b. GUI: Graphical user interface.
(윈도우 기반으로 컴퓨터를 사용하는 것이라 이해하면 됨)
c. Batch Interface.
(Computing system에 여러가지 task를 동시에 실행할 때, 예를 들어 슈퍼컴퓨터에 여러가지 시뮬레이션 인스턴스를 동시에 많이 수행해야 되는데 이때 사용된다고 함)
- Program Execution
프로그램 이미지는 기본적으로 스토리지에 저장되어 있음. 이를 실행하기 위해서는 메모리에 읽어와야 한다.
디스크 > 메모리 > 하나씩 실행시켜주어야 하는데 운영체제가 이를 가능하게 해줌
- I/O operations
프로그램은 실행할 때 I/O 기기를 사용하기 때문에 운영체제는 이를 사용하기 쉽게 만들어준다. 왜냐하면 사용자는 I/O 기기를 직접 조작할 수는 없기 때문이다. 만약 조작할 수 있다면 악의적인 목적을 가진 이용자가 어떤 정보를 다 가져갈 수도 있음
- File-system manipuation
파일을 읽고, 쓰고, 생성하고, 지우고, 찾고, 리스팅하는 동작들을 운영체제가 제공하고 도와준다.
- Communicatoins
어떤 하나의 태스크를 수행하기 위해서 여러개의 프로세스를 해야한다고 했을 때 운영체제가 이를 가능하게 해준다.
shared memory vs. message passing
- Error Detection
하드웨어나 소프트웨어 레벨에서의 에러를 탐지해준다.
하드웨어: memory error, power failure, connection failure
소프트웨어: arithmetic overflow, access an illegal memory location (프로세스별로 메모리 공간을 할당하는데 어떤 프로세스가 자신에게 할당되지 않은 메모리 공간에 액세스를 할 때 이를 탐지해줌) eg. segmentation fault
시스템을 잠깐 멈추거나 종료시켜줌
시스템을 위한 운영체제 서비스
- Resource Allocation
Resource: CPU time, memory space, memory bandwidth, file system space, file I/O bandwidth (시스템의 효율성을 높임)
- Acoounting (logging)
사용자가 얼마나 많은 리소스를 사용했는지 트래킹하는 것. 이런 정보를 알고 있으면 resource allocation할 때 사용 가능.
Cloud system에서 사용 금액을 청구할 때 사용할 수 있음.
에러가 발생했을 때 이것이 왜 발생했는지 디버깅할 때 사용가능
- Protection and Security
system resource에 대한 모든 접근들을 통제한다. 어떤 프로세스가 다른 프로세스를 방해하는 것을 방지하기 위함
eg) 어떤 프로세스가 I/O기기를 사용하고 있는데 다른 프로세스가 동일하게 사용하는 걸 막거나
어떤 프로세스에 할당된 메모리 공간에 다른 프로세스가 데이터를 읽거나 쓰는 것을 방지하기 위함
보안을 위해서 운영체제가 시스템 리소스에 대한 접근권한을 주고 인증절차를 거치도록 만들어줌
User Interface
- Command Interpreters (Command-line Interface: CLI)
쉘이 예시임: sh, ksh, csh, bash
eg. rm file.txt: 쉘은 rm이라는 프로그램을 파일 시스템의 path에서 어느 디렉토리에 저장돼있는지 찾고 메모리에 이를 카피하고 'file.txt'를 하나의 파라미터로 잡아 이를 실행함
GUI (Graphical User Interface)
마우스, 폴더, 아이콘, 터치스크린
System Calls
: 시스템/응용 프로그램이 운영체제 커널이 제공해주는 서비스를 사용하게끔 해주는 인터페이스를 'System Calls'이라고 한다.
이는 보통 하나의 함수로 구현이 됨
- 하드웨어(file, socket) 추상화를 사용하게끔 해주는 함수
(file은 디스크/디바이스에 대한 추상화 socket은 네트워크 기기나 채널에 대한 추상화)
- 운영체제가 지원해주는 소프트웨어(IPC, scheduling) 추상화를 사용하게끔 해주는 함수
- System calls은 커널 시스템을 이용하게 해주는 유일한 인터페이스, 모든 프로그램은 system call을 이용해서 운영체제가 제공해주는 서비스를 이용할 수 있음
왜 응용프로그램이 직접 접근하지 못하는가?
: 악의적인 프로그램으로부터 하드웨어나 운영체제를 보호하기 위해 직접 접근하지 못함
> 모든 응용 프로그램은 악의적이라는 가정을 깔고 있음
Kernel mode vs. User mode
CPU는 커널모드와 유저모드가 있음.
CPU가 유저모드에 있을 때는 일반적인 응용 프로그램을 사용할 수 있음, 커널모드(관리자모드라고 이해하면 편함)
유저 프로그램이 커널의 서비스를 이용하려고할 때 CPU모드는 유저모드에서 커널모드로 바뀌어야 함.
어떻게 바꾸냐?: Software Interrupt를 사용함 (Trap이라고도 부름)
- Privileged Instructions
주의없이 사용하면 시스템을 망가뜨릴 수 있는 명령어
eg. I/O, memory management, read/write control registers
Kernel mode에서만 이용할 수 있음
Mode bits
- Mode bit이 CPU에 없으면?
1. 응용프로그램이 운영체제에 데미지를 입히거나
2. 동시에 여러 응용 프로그램이 한 디바이스에 접근할 수 있음
- Mode violation이 언제 발생하냐?
a. Violation
1. 사용자 모드에서 privileged instructions을 실행하려고 하거나
2. 사용자 모드에서 감춰져 있는 메모리 주소에 접근하려고 할 때 발생함
b. Hardware traps to OS
c. Operating system handles such errors (violations)
1. 대개 프로세스를 졸료시키거나
2. 메모리 덤프를 일으킴 > segementation fault
Interrupt
: CPU가 어떤 프로세스를 실행하고 있을 때 다른 프로세스를 실행시키려 하는 걸 Interrupt라고 함 (interrupt handler)
- H/W interrupt
a. Timer, keyboard, mouse, DMA
b. delivered through system bus
- S/W interrupt = system call (interrupt handler가 kernel code이기 때문에 user > kernel mode로 바뀌어야 함)
- CPU관점에서 interrupt handler는 오버헤드기 때문에 가능한 빠르게 실행되어야 함
- interrupt handler를 실행하기 전에 interrupted instruction, the register state의 주소를 저장해야됨
왜? interrupt가 끝나고 난 뒤에는 원래 하던 걸 다시 돌려야 하니까..
그러면 어떻게 하면 interrupt handler를 찾을거냐?
1. 하드웨어가 interrupt type > interrupt number 매핑시켜줌
2. 운영체제가 boot time에 IDT(Interrupt Descriptor Table)를 만듬
3. IDT는 메모리에 저장됨
4. IDT의 각 원소는 interrupt handler의 주소를 갖고 있음
5. 운영체제는 IDT의 시작 주소를 CPU의 특정 레지스터에 저장해서 알고있음
Handler's address = IDT[intr_adress]
software interrupt는 어떻게 발생시키냐?
발생시키기 위해서 instruction을 이용함 > 인텔에서는 int라는 instruction을 제공해줌
eg. int<128> = interrupt number가 128인 interrupt를 발생시킴
System Call을 발생시키는 방법
- Initialization
1. 커널이 시스템콜 타입에 대해 시스템콜 넘버를 할당해줌
2. 커널은 시스템콜 넘버를 시스템콜을 실행시키는 함수에 매핑함으로써 시스템콜 테이블을 초기화시킴
시스템콜 타입 > 시스템콜 넘버 > 시스템콜 함수
- Invoking a system call
3. 유저 프로세스를 시스템콜 넘버와 아규먼트를 저장시켜둠
4. 유저 프로세스가 "int X" instruction을 실행시킴
5. 그러면 interrupt가 걸림 CPU모드가 유저모드에서 커널모드로 바뀜 X에 대한 interrupt handler 실행
6. 커널은 시스템콜 넘버를 이용해서 시스템콜 테이블을 봄
7. 커널은 대응되는 함수를 실행
프로그래머는 API를 통해 시스템 콜을 사용함 (Application Programming Interface: set of functions)
eg. Windows API for Windows system, POSIX API of POSIX-based systems (UNIX, Linux, and Mac OS X), ANSI C Standard
API function은 라이브러리 형태로 프로그래머에게 지원된다.
eg. standard C library (libc)
1. 응용프로그램이 printf() 호출
2. printf()가 실행
3. printf()가 write()을 실행
4. write()은 write system call을 호출
5. write() system call에 대한 system call number를 cpu레지스터에 저장하고 software interrupt를 발생
6. cpu mode가 user mode에서 kernel model로 바뀜
7. kernel 내부에 있는 write()이라는 system call이 실행
왜 system call을 직접 사용하지 않고 APIs를 사용하는가?
- system call을 직접 사용하는 것이 어려움
- Portability
'컴퓨터 > 운영체제' 카테고리의 다른 글
[OS] Thread (1) (0) | 2020.04.16 |
---|---|
[OS] Inter Process Communication (IPC) (1) | 2020.04.15 |
[OS] Context Switch와 레지스터 셋의 관계 (0) | 2020.04.15 |
[OS] Interrupt (0) | 2020.04.03 |
[OS] Operating System Structures (part2) (0) | 2020.03.25 |