Operating System Structure
- Process Management
- Memory Management
- Storage Management
- Mass-Storage Management
Multiprogramming
- Cpu가 불필요한 대기를 하지 않기 위해서는 프로그램 하나만으로는 부족하다
- Cpu를 다른 프로그램을 실행하는데 사용할 수 있도록 함으로서 자원 활용의 효율을 높이는 목적으로 multiprogramming한다
- 동시에 Application 여러개를 실행할 수 있도록 운영체제가 관리한다
- 여러개의 프로그램들이 메모리에 다 올라와야한다
- 공간이 부족하여 virtual memory를 사용한다
- Process management 입장에서 여러개의 수행 가능한 프로그램이 있을 때 어떤 프로그램을 Cpu가 수행할 것인지 결정 해야한다
- cpu/process/job scheduling
- IO가 발생해 Cpu가 대기해야하는 상황이 생길때 운영체제가 다른 프로그램으로 Switch 해주는 기능이 필요하다
Multitasking (Timesharing)
- CPU는 모든 프로그램을 수행해야하지만 동시에 하지 못한다
- 따라서 CPU 사용 시간을 짧게 나눠서 모두 진도를 나간다
- 모든 프로그램이 동시에 실행되기 때문에 interacting computing이 가능하다
- Response time 응답시간이 작아야한다
- 메모리에 올라간 프로그램 (process)이 적어도 하나 필요하다
- 시간이 지나면 다른 프로그램으로 넘어가야 하기 때문에 Cpu scheduling이 필요하다
- 여러개의 process를 위한 memory 공간이 없다면 swapping이 필요하다
- swapping이란 실행되지 않는 프로그램을 disk로 보내고 실행되는 프로그램은 memory에 올려 공간은 확보하는 작업이다
- disk를 사용하면 느려진다 -> memory managment 필요
- swapping을 효과적으로 하기 위해 virtual memory 기술이 필요하다
- 프로그램에서 당장 실행해야하는 부분만 memory에 올리는 기술이다
- memory 사용 공간을 줄여 더 많은 프로그램을 동시에 메모리에 올릴 수 있다
Operating System Operations
Interrupt Driven By Hardware
- Cpu가 계속 IO 입력을 기다리며 루프를 도는것은 매우 비효율적이다
- 대신에 IO 입력이 들어왔을때 IO 장치가 Cpu에게 알려주면 Cpu를 더 효율적으로 사용할 수 있다
- 따라서 IO 장치가 interrupt를 발생시키면 Cpu가 해당 interrupt를 handling함으로서 하드웨어 입출력을 관리한다
Exception, Trap
- IO 장치 말고도 소프트웨어에서도 interrupt와 비슷하게 동작해야하는 경우가 있다
- divide by zero와 같은 에러는 에러 파급 효과를 줄이기 위해 먼저 처리해야한다
System Call
- 운영 체제의 커널이 제공하는 서비스에 대해 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다
- 유저는 library 함수를 호출하여 간접적으로 system call을 호출한다
application을 통해 화면에 출력하고 싶다 -> 하드웨어에 접근해야 한다 -> 하드웨어 접근은 OS가 통제한다 -> OS에 요청해야 한다 -> OS 요청은 system call으로 한다 -> system call을 편리하게 호출할 수 있도록 제공된 library 함수 printf를 사용한다 -> printf는 system call write를 호출한다
Dual-mode
- 유저가 직접 만든 코드를 실행하다가 OS의 system call을 실행하는 단계로 넘어가야한다
- 권한이 달라지기 때문에 application code와 OS code가 구분되어야 한다
- 하지만 cpu는 instruction을 memory에서 가져와 실행만 하기 때문에 구분하지 못한다
- 따라서 Program Status Register의 mode bit을 사용한다
- system call 호출 직전에 mode bit를 kernal mode로 세팅
Transition from User to Kernel Mode

- calls system call
- system call 호출하는 순간 trap이 걸려 mode bit = 0 (kernel mode)로 세팅된다
- execute system call
- os code가 실행된다
- 완료가되면 mode bit = 1 (user mode)로 세팅하고 system call 수행 결과 값을 return한다
Process Management
Process
- 프로그램 실행을 위한 모든 정보를 담고있는 구조체 자료구조이다
- 이 자료구조가 메모리에 올라가면 Cpu가 접근하여 연산할 수 있게 된다
- 프로그램은 passive, 프로세스는 active entity다
Process Resources
- 프로그램을 실행시키기 위해서는 cpu, memory, IO, files, 사용 데이터가 필요하다
- 이것들을 하나로 묶어서 관리하고 묶기 위한 자료구조 (process)를 OS가 제공한다
Single/Multi-threaded Process
- single인 경우 program counter가 한개지만 multi인 경우 여러개다
사용자가 아이콘을 더블 클릭 -> Process라는 자료구조가 생성된다 -> 이 자료구조에 정보를 채우고 메모리에 올린다 -> Cpu scheduling 대상에 등록 -> Cpu가 해당 process를 실행한다 -> 프로그램이 종료되면 process 자료구조를 삭제한다
Process Management Activities
- OS가 process management를 위해 하는 일
- process 생성, 삭제
- process 일시중지, 재게
- process 동기화
- process간 통신
- deadlock handling
Memory Management
- 여러개의 프로그램이 동시에 실행되면 여러개의 process가 메모리에 올라간다
- OS는 어떤 process가 메모리 어디에 올라가있는지, 어떤 process를 swap in 혹은 out 할 것인지, 사용중이거나 비어있는 메모리 영역, 메모리 할당 및 해체 등 관리해야한다
Storage Management
- 하드디스크 공간 체계가 매우 복잡해 application에 그대로 노출할 수 없다
- 따라서 OS는 application이 하드디스크 공간을 쉽게 사용할 수 있도록 도와준다
- application은 하드디스크 공간에 대해 알필요없이 file이라는 개념만 알고 간접적으로 접근한다
- 유저는 file에 쓰고 OS가 대신 하드디스크에 반영한다
File-System Management
- directory란 file을 체계적으로 저장하는 방법이다
- OS가 file-system management를 위해 하는 일
- 파일과 디렉토리 생성, 삭제
- 파일 값 변경
- 파일을 secondary storage(hard,ssd)에 저장
- 파일 백업
Mass-Storage Management
- OS는 file을 하드에 저장하기 위해서 하드 저장 공간 구성 등에 대해 알고 있어야한다
- Free space management
- Storage allocation
- Disk scheduling
- IO가 느리기 때문에 IO 요청할 때 요청 순서를 적절히 조정하여 하드 헤드 움직임 최소화하는 방법
Migration from Disk to Register

Multitasking Issue
- 여러 프로그램이 동시에 돌고있다
- 어떤 데이터가 cache 혹은 main memory에 올라와있다
- 모든 프로그램은 그 데이터의 최신값을 기반으로 동작해야한다
- 따라서 OS는 접근하는 데이터가 최신값이라는 것을 보장해야한다
Multiprocessor Issue
- cpu 혹은 core가 여러개인 경우 cache가 여러개라서 더 복잡해진다
- 1번과 2번 cpu에서 main memory의 데이터를 접근하면 각각의 cache에 올라간다
- 1번과 2번에서 operation을 하다보면 각각의 cache에 값을 업데이트하게 된다
- 1번에서 업데이트한 값은 2번에 반영이 안되는 문제가 발생한다 (cache coherence problem)
- 따라서 OS는 어떤 데이터가 여러 cache에 올라가 있으면 cache 값을 일치하도록 만들어야한다
Distributed System Issue
- 분산 시스템에서는 여러대의 컴퓨터가 똑같은 일을 나눠서 한다
- 똑같은 데이터를 대상으로 하기 때문에 컴퓨터마다 가지고 있는 데이터 값이 달라질 수 있다
- cache coherence problem와 비슷하고 더 큰 규모로 문제가 발생한다
I/O Subsystem
- IO 장치는 종류가 많고 제조사도 많다
- OS는 사용자가 다양한 IO 장치를 다 구분해서 사용할 필요없도록 만든다
- block device, character device로만 구분
- OS는 IO 장치가 느리기 때문에 소프트웨어적 기능을 제공한다
- buffering: 임시 저장 공간
- caching: 자주 접근되는 하드 데이터를 memory에 올리기
- spooling: 어떤 작업이 생성해낸 output을 다른 작업에 보낼때 직접 보내지않고 중간 임시 공간 spool에 보낸다. 그리고 다른 작업이 spool에서 읽어간다. ex) printer의 느린 속도를 만회해준다
Protection and Security
- Protection은 유저가 권한 밖에 있는 자원에 접근하려 할 때 막아주는 작업이다
- OS는 ID를 기준을 권한을 체크한다
- 모든 유저에게 ID를 부여하고 권한을 부여한다
- file을 만든 유저가 다른 유저에 대한 권한을 설정할 수 있다
- 내가 실행한 processs는 내가 가진 권한을 승계 받는다
- 그룹 ID는 유저를 묶어서 권한을 줄 때 사용된다
Privilege Escaltion
- Printer를 예시로 보자
- OS가 관리하는 spool 영역은 사용자 영역이 아니기 때문에 유저 ID 권한으로 접근 못하는게 맞다
- HWP를 실행할 때 유저 ID 권한으로 시작하지만 중간에 잠시 권한을 상승시킨다
- spool 영역에 다 쓰면 권한을 회수한다
- 즉 OS는 동작 과정에서 권한을 상승시키는 기능을 제공한다
Operating System Services

-
User interface
-
Program execution
-
IO operations
-
File system manipulation
-
Communication: 프로세스들간 통신
-
Error detection
-
Resource allocation: process 메모리 할당 공간
-
Accounting : 어떤 사용자가 얼마나 많은 자원을 사용하는지
-
Protection and security
-
상위 application은 하위 OS 서비스를 사용하기 위해 system call을 호출해야한다
-
직접 system call을 호출하지않고 라이브러리 함수를 사용하거나 GUI를 사용한다
- ex) GUI: 더블 클릭하면 fork 시스템콜을 호출하고 program execution 서비스도 호출한다
System Call
- System call은 OS 서비스를 호출하는 인터페이스다
- 사용자는 high level API를 통해 system call을 사용한다
- ex) printf 안에 형식에 맞게 write 시스템콜이 여러번 호출된다
- OS마다 system call이 다르기 때문에 API를 사용해야 편리하다
- 유저가 OS dependent한 system call을 호출하지 않고 하나의 API로 여러 OS에서 실행할 수 있는 소스코드를 만들 수 있다
- 이식성, 편리함
Portability
- programming language api > os 계열 api 순으로 이식성이 좋아진다
- Win32 api, Posix api for UNIX Linux Mac os, Java api for JVM
- ex) printf는 c programming lanauge에서 제공하기 때문에 계열이 다른 OS에서 알아서 compile한다
Example Execution

- file을 다른 file로 copy하는 상황
- copy라는 system call은 system call 여러개의 조합이다
Implementation
- system call마다 테이블 인덱스를 붙인다
- 호출하면 해당 인덱스를 찾아가 system call가 존재하는 메모리 주소를 PC에 넣고 jump한다
- 메모리상의 위치를 알아야 실행할 수 있다!
- 사용자는 API만 알면 된다
Direct System Call

- 유저가 직접 open system call을 호출한다
- open에 할당된 인덱스 번호 i로 테이블을 찾아간다
- 이곳에는 open의 메모리 주소를 저장하고있다
- open이 실행되고 user 프로그램이 리턴값을 받는다
API System Call

- 유저는 c의 printf() API를 호출한다
- printf 내부에서 write system call을 호출한다
- 호출되는 순간 kernel mode에서 write를 실행한다
- printf는 write의 리턴값을 받는다
Types of System Calls