운영체제 개요
운영체제란 무엇인가
Operating System, OS
컴퓨터 하드웨어 바로 위에 설치되어 사용자 및 다른 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층
- 운영 체제의 목적 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공
-
운영체제는 동시 사용자/프로그램들이 각각 독자적 컴퓨터에서 수행되는 것 같은 환상을 제공
-
하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행
*컴퓨터 시스템의 자원을 효율적으로 관리 ***
-
CPU, 메모리, I/O 장치 등의 효율적 관리
- 실행중인 프로그램들에게 짧은 시간씩 CPU를 번갈아 할당
- 실행중인 프로그램들에 메모리 공간을 적절히 분배$
- 주어진 자원으로 최대한의 성능을 내도록 → 효율성
- 특성 사용자/프로그램의 지나친 불이익이 발생하지 않도록 → 형평성
-
사용자 및 운영체제 자신의 보호
- 컴퓨터 시스템의 구조
- 운영체제의 기능
어떤 프로그램에게 CPU 사용권을 줄까? → CPU 스케줄링
디스크에 들어온 요청을 어떤 순서로 처리할까? → 디스크 스케줄링
한정된 메모리를 어떻게 쪼개어 쓰지? → 메모리관리
빠른 CPU와 느린 I/O 장치간 속도차를 어떻게 극복하지? → 인터럽트, 캐싱
CPU 스케줄링
-
FCFS(First-Come First-Served)
- 먼저 온 사람 먼저 보내기
→ 먼저 온 사람이 소요 시간이 길면, 효율적이지 않다고 느낌 → 그래서 CPU를 짧게 쓰는 사람에게 준다
-
SJF(Shortest-Job-First)
- 금번 CPU 사용시간이 가장 짧은 프로세스를 제일 먼저 스케줄
- minimum average waiting time 보장
→ 효율성은 좋지만, 형평성이 좋지 않음 → Srarvation(기아 현상) 발생 가능 (CPU 사용시간이 긴 프로세스는 실행되지 않을 수도 있음)
-
RR(Round Robin)
- 각 프로세스는 동일 크기의 CPU 할당시간을 가짐
- 할당 시간이 끝난 프로세스는 CPU를 빼앗기고 CPU 큐의 제일 뒤에 줄을 섬(라운드 로빈 알고리즘?)
- n개의 프로세스 → (n-1)*할당시간 이상 기다리지 않음(효율성) / 대기시간이 프로세스의 CPU 사용시간에 비례(형평성)
메모리 관리
프로그램을 실행시키면 메모리에 올라가는 주소가 매겨지고, 본인만의 메모리 공간을 형성 후(가상 메모리) → 물리적인 메모리에는 당장 필요한 부분만 올라가게 됨.
→ 물리적인 메모리가 모두 차버리면 필요없는 부분은 디스크의 스왑영역으로 보내고 관리함(전원 꺼지면 스왑영역 비워버림)
미래를 모른다는 가정하에 효율적으로 사용해야 함. 사용할 가능성이 높거나 자주 사용된걸 우선으로 메모리에 남겨둠.
- LRU(가장 오래 전에 사용한 것 삭제)
- LFU(가장 덜 사용한 것 삭제)
디스크 스케줄링
- 디스크 접근시간의 구성
- 탐색 시간(Seek Time) *가장 많은 시간 소요→ 헤드를 해당 트랙(실린더)으로 움직이는데 걸리는 시간
- 회전 지연(Rotatinal Latency) →헤드가 원하는 섹터에 도달하기 까지 걸리는 시간
- 전송시간(Transfer Time) → 실제 데이터의 전송시간
- SCAN
- 헤드가 디스크의 한쪽 끝에서 다른쪽 끝으로 이동하며 가는 길목에 있는 모든 요청을 처리
- 다른 한쪽 끝에 도달하면 역방향으로 이동, 오는 길목에 있는 모든 요청을 처리하며 다시 반대쪽 끝으로 이동한다.
저장장치 계층구조와 캐싱(caching)
가격, 휘발성, 속도 등으로 구분. 초록색은 가격이 비싼 대신 빠르고, 휘발성임. 컴퓨터 내부 / 빨강은 반대.
-
플래시 메모리 → 모바일장치에 쓰기 좋음, 전력소모 작고 충격에 강하고 가볍고 작고 …
- 반도체장치(↔ 하드디스크 : 마그네틱)
- NAND형(스토리지), NOR형(임베디드 코드 저장용)
메모리 스틱, SD카드, SSD 등등 …
컴퓨터시스템의 구조
운영체제의 분류
- 동시 작업 가능 여부
- 단일 작업(single tasking) → 한 번에 하나의 작업만 처리
- 다중 작업(multi tasking) → 동시에 두 개 이상의 작업 처리
- 사용자의 수
- 단일 사용자(single user)
- 다중 사용자(multi user)
- 처리 방식
- 일괄 처리(batch processing)
- 작업 요청의 일정량 모아서 한꺼번에 처리
- 작업이 완전 종료될 때까지 기다려야 함
- 시분할(time sharing)
- 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용
- 일괄 처리 시스템에 비해 짧은 응답시간을 가짐
- interactive한 방식
- 실시간(Realtime OS)
- 정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야 하는 실시간시스템을 위한 OS (미사일, 원자로 등등 큰일 나는 애들)
→ 실시간 시스템의 개념 확장 : Hard realtime, Soft realtime
운영체제의 예
유닉스(UNIX)
- 코드의 대부분을 C언어로 작성
- 높은 이식성
- 최소한의 커널 구조
- 복잡한 시스템에 맞게 확장 용이
- 소스 코드 공개
- 프로그램 개발에 용이
- 다양한 버전(System V, FreeBSD, SunOS, Solaris, Linux)
DOS(Disk Operating System)
- MS 사에서 1981년 IBM-PC를 위해 개발
- 단일 사용자용 운영체제, 메모리 관리 능력의 한계
MS Windows
- MS사의 다중 작업용 GUI 기반 운영 ㅊ제
- Plug and Play, 네트워크 환경 강화
- DOS용 응용 프로그램과 호환성 제공
- 불안정성
- 풍부한 자원 소프트웨어
컴퓨터 시스템 구조
- Mode bit 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치 필요 Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원 1 : 사용자 모드 → 사용자 프로그램 수행
0 : 모니터 모드 → OS 코드 수행(시스템 모드, 커널 모드) 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 ‘특권명령’으로 규정 Interrupt나 Exception 발생시 하드웨어가 mode bit을 0으로 바꿈
사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 세팅
- Timer(CPU의 독점을 막기 위해 사용) 타이머
-
정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴
-
타이머는 매 틀릭 틱 때마다 1씩 감소
-
타이머 값이 0이 되면 타이머 인터럽트 발생
-
CPU를 특정 프로그램이 독점하는 것으로부터 보호
타이머는 time sharing을 구현하기 위해 널리 이용됨
타이머는 현재 시간을 계산하기 위해서도 사용
- 인터럽트(Interrupt)
- 현대의 운영체제는 인터럽트에 의해 구동됨
- 인터럽트 당한 시점의 레지스터와 program counter를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다
- 넓은 의미 - 하드웨어 인터럽트, 트랩(Trap, 소프트웨어 인터럽트 : Exception, System call)
- 시스템콜(System Call)
- 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것
- Device Controller
-
I/O device controller
- 해당 I/O 장치 유형을 관리하는 일종의 작은 CPU
- 제어 정보를 위해 control register, status register를 가짐
- local buffer를 가짐(일종의 data register)
-
I/O는 실제 device와 local buffer 사이에서 일어남
-
Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림
** device driver(장치 구동기) : OS 코드 중 각 장치별 처리루틴 → software
** device controller(장치 제어기) : 각 장치를 통제하는 일종의 작은 CPU → hardware
- 동기식 입출력과 비동기식 입출력 두 경우 모두 I/O의 완료는 인터럽트로 알려줌
-
동기식 입출력(synchronous I/O)
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
- 구현방법 1
- I/O가 끝날 때까지 CPU를 낭비시킴
- 매시점 하나의 I/O만 일어날 수 있음
- 구현방법 2
- I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음
- I/O 처리를 기다리는 줄에 그 프로그램을 줄세움
- 다른 프로그램에게 CPU줌
-
비동기식 입출력(asynchronous I/O)
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
- DMA(Direct Memory Access)
-
빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
-
CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
-
바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴
프로그램의 실행(메모리 load)
- 커널 주소 공간의 내용
-
사용자 프로그램이 사용하는 함수
- 함수(function)
- 사용자 정의 함수 : 자신의 프로그램에서 정의한 함수
- 라이브러리 함수 : 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수 / 자신의 프로그램의 실행 파일에 포함되어 있음
- 커널 함수 : 운영체제 프로그램의 함수 / 커널 함수의 호출 = 시스템 콜
-
프로그램의 실행
프로세스 관리
프로세스의 개념
Process is a program in execution
-
프로세스의 문맥(context)
CPU 수행 상태를 나타내는 하드웨어 문맥 : Program Counter, 각종 register
각종 프로세스의 주소 공간 : code, data, stack
프로세스 관련 커널 자료구조 : PCB(Process Control Block), Kernel stack
-
프로세스의 상태(Process State)
프로세스는 상태가 변경되며 수행된다.
-
Running : CPU를 잡고 instruction을 수행중인 상태
-
Ready : CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
-
Blocked(wait, sleep) : CPU를 주어도 당장 instruction을 수행할 수 없는 상태, Process 자신이 요청한 event(ex> I/O) 가 즉시 만족되지 않아 이를 기다리는 상태
-
New : 프로세스가 생성중인 상태 / Terminated : 수행(execution)이 끝난 상태
-
Suspended(stopped) : 외부적인 이유로 프로세스의 수행이 정지된 상태 / 프로세스는 통쨰로 디스크에 swap out 된다.
Blocked :자신이 요청한 evend가 만족되면 Ready
Suspended : 외부에서 resume 해주어야 Active
프로세스 상태도
-
PCB(Process Control Block)
운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
- OS가 관리상 사용하는 정보
- Process state, Process ID
- scheduling information, priority
- CPU 수행 관련 하드웨어 값
- Program counter, registers
- 메모리 관련
- Code, data, stack의 위치 정보
- 파일 관련
- Open file descriptors..
-
문맥 교환(Context Switch)
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
-
CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
-
CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
** System call이나 Interrupt 발생시 반드시 context switch가 일어나는 것은 아님
-
프로세스를 스케줄링 하기 위한 큐
-
Job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
-
Ready queue : 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
-
Device queues : I/O device의 처리를 기다리는 프로세스의 집합
→ 프로세스들은 각 큐를 오가며 수행된다
스케줄러 (Scheduler)
- Long-term scheduler(장기 스케줄러 or job scheduler)
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- 프로세스에 memory(및 각종 자원)을 주는 문제
- degree of Multiprogramming을 제어
- time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)
- Short-term scheduler(단기 스케줄러 or CPU scheduler)
- 어떤 프로세스를 다음번에 running 시킬지 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야 함(milisecond단위)
- Medium-term scheduler(중기 스케줄러 or Swapper)
- 여유공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 프로세스에게서 memory를 뺏는 문제
- degree of Multiprogramming을 제어
프로세스 상태도
Thread
A thread (of lightweight process) is a basic unit of CPU utilization
- Thread의 구성 program counter
register set
stack space
- Thread가 동료 thread와 공유하는 부분(=task) code section
data section
OS resources
→ 전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.
→ 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리 할 수 있다.
→ 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.
→ 스레드를 사용하면 병렬성을 높일 수 있다
- Benefits of Threads(스레드 장점)
- Responsiveness(응답성)
- Resource Sharing
- Economy
- Utilization of MP Architectures(병렬성 추구 ~)
프로세스 생성(Process Creation)
- 부모 프로세스가 자식 프로세스 생성
- 프로세스의 트리(계층 구조) 형성
- 프로세스는 자원을 필요로 함
- 운영체제로부터 받는다
- 부모와 공유한다
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델
- 수행(Execution)
- 부모와 자식은 공존하며 수행되는 모델
- 자식이 종료될 때 까지 부모가 기다리는 모델
- 주소공간 (Address space)
- 자식은 부모의 공간을 복사함(binary and OS data)
- 자식은 그 공간에 새로운 프로그램을 올림
- 유닉스의 예
- fork() 시스템 콜이 새로운 프로세스를 생성
- 부모를 그대로 복사(OS data except PID + binary)
- 주소공간 할당
- fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
프로세스 종료(Process Termination)
- 프로세스가 마지막 명령을 수행한 후 운영체제에 이를 알려줌(exit)
- 자식이 부모에게 output data를 보냄(via wait)
- 프로세스의 각종 자원들이 운영체제에게 반납됨
- 부모 프로세스가 자식의 수행을 종료시킴(abort)
- 자식이 할당 자원의 한계치를 넘어섬
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 부모가 종료(exit)하는 경우
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.
- 단계적인 종료