-
OS란?
컴퓨터의 하드웨어와 소프트웨어를 제어하며, 사용자가 컴퓨터를 쓸 수 있게 만들어주는 프로그램
OS의 목표
- 어플리케이션을 위한 기본 실행 환경을 제공해 사용자의 프로그램을 정확하게 실행
- 컴퓨터 시스템을 편리하고 효율적이고 안전하게 사용할 수 있게 만듬
OS의 관점
- resouce allocator - 컴퓨터 시스템의 자원(소프트웨어, 하드웨어)를 할당해주고 이것들을 효율적으로 관리
- control program - 사용자 프로그램 실행과 I/o 장치 실행을 통제한다.
- kernel - 컴퓨터 운영체계의 가장 중요한 핵심으로서 운영체계의 다른 모든 부분에 여러 가지 기본적인 서비스를 제공한다.
- 멀티 프로세스/ 멀티 테스킹 : 여러 작업은 동 시간에 메인메모리 안에서 유지되고 이러한 프로세스들은 cpu time, I/o 장치, 다른 자원들을 공유한다.
컴퓨터 시스템의 구성요소
- 하드웨어 - CPU, Memory 등 기본 컴퓨팅 리소스
- 유저
- 어플리케이션
- OS
Interrupt
CPU는 데이터를 메인메모리 ↔로컬 버퍼 로 데이터를 이동시킨다.
I/o 디바이스
각 디바이스 컨트롤러는 로컬 버퍼를 가진다.
cpu와 I/o디바이스는 동시에, 독립적으로 실행된다.
cpu와 I/o디바이스 사이에 정보를 전달하는 의사소통이 필요하다.
디바이스 컨트롤러는 cpu에게 자신의 처리가 끝났다는 것을 알려야 한다.
-> Interrupt로 알려줌.
cpu, 다양한 device controller들이 공유하는 메모리에 접근하기 위해 공용버스를 통해 연결됨
cpu가 다른 일을 하고 있다가 interrupt가 걸리면 저장한 다음 멈추고 interrupt를 건 I/o디바이스를 처리한다.
인터럽트엔 h/w, s/w 가 있음.
하드웨어는 우리가 알고 있는 I/o 디바이스의 신호
소프트웨어에는 cpu 내부에서 0으로 나눴을 때와 같은 오류 인터럽트 (trap)
인터럽트 걸렸을 때, 과정
하던일 멈춤-> 고정 위치에 하던일 저장 -> 인터룹트 서비스 루틴 실행 -> 서비스 루틴 완료한 다음 다시 하던 일 시작
interrupt : 키보드에서 인터룹트 발생
exception: 0을 나눌 때,
듀얼모드
유저모드와 커널모드로 나눔 유저모드에 어플리케이션이 있고 커널모드에서 처리 이 두 사이에 통신을 위해 시스템 콜이 일어남.
function call : caller와 callee는 같은 프로세스 안에 있음
system call : 다른 프로세스에 있음
- 같은 액티비티를 수행하기 위해 os에게 요청 - 매우 비쌈
운영체제가 지원하는 서비스에 대한 프로그래밍 인터페이스
프로세스 관리
fork() : 부모에서 동일한 차일드 프로세스 생성
c에서 printf를 하는 행동은 유저모드에서 발생. prinf를 하면 c library call이 일어남. 다음 커널 모드에서 write()를 호출하고 write() system call이 불린 후 결과를 역순으로 전달.
system call의 종류
프로세스 컨트롤, 파일 관리, 디바이스 관리, 정보 유지,
ms-dos - simple structure 듀얼모드 없음
unix - layered 커널에서 모든 것을 관리, 기능이 확장됨에 따라 커널이 넘 커짐
텍스트 : PC(피시 카운터 - 다음번에 실행 될 명령어의 주소를 가지고 있는 레지스터), 프로그램 코드 저장
데이터: 글로벌 변수, 스태틱 변수 저장
힙 :메모리관리, 동적 메모리 할당(시스템 콜로 관리)
스택: 임시 데이터 저장- 로컬 변수, 리턴 어드레스
한 프로그램은 동시에 여러번 실행할 수 있다.
-> 비록 두 프로세스는 같은 프로그램이라도, 두 개의 분리된 실행 시퀀스로 간주됨
이것은 Text section (텍스트영역)은 공유할 수있지만, Data, Heap, Stack 영역은별도로갖음.
쓰레드는 스택을 제외하고 전부 공유
하나의 프로세스는 CPU에서 한번만 실행된다. 나머지는 준비상태나 대기상태의 큐에 존재한다.
각 프로세스는 등록되고 커널(OS)에 의해 관리된다.
각 프로세스는 PCB에 정보를 저장하고 표현된다.(프로세스 상태, CPU 레지스터, 정보 등)
Context switch
현재 cpu를 사용중인 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 이전에 cpu를 쓰던 상태로 복귀 다음 context 정보들을 pcb에 저장되고 불려짐.
멀티쓰레드
이전 웹서버는 많은 사용자의 요청이 들어올 경우, 사용자의 요청 당 프로세스 1개씩 생성했다. 문제로 프로세스간 데이터를 공유하기 위해 IPC가 필요했다.
이 문제를 멀티쓰레드로 가능하게 했다. 멀티 쓰레드는 스택영역을 제외하고 텍스트, 데이터, 힙을 공유해 한 프로세스안의 쓰레드 간 공유를 쉽게 할 수 있다.
쓰레드 VS 프로세스
새로운 프로세스를 생성해 fork()를 사용하는 것은 비싸다.(시간 & 메모리)
왜?
fork는 글로벌 변수, 코드, 스택 부분을 전부 복사해서 새로운 프로세스를 만든다.
thread는 stack만 따로 만든다.(나머지 공유)
멀티쓰레드 모델
many to one : 1개의 커널 쓰래드에 여러개의 유저쓰레드 연결
one to one : 유저 쓰레드 1개당 커널쓰레드 (각기 분리되어있음)
many to many : 여러 커널 쓰레드와 유저 쓰레드를 연결. 통로는 1개로 스케쥴링에 의해 커널 쓰레드를 결정함
스케쥴링
OS의 역할
시간 공유를 위한 자원
Preemptive: 현재 실행중인 프로세스에 인터룹트가 걸리면 레디상태로 이동한다.
non-Preemptive: cpu가 프로세스 하나에 전부 할당되어 일처리가 완료 될 때까지 자원을 놓지 않는다.
스케쥴링 알고리즘
FCFS
도착한 순서대로 실행, 논 프림티브에 적당, 다 끝나거나 I/O요구하기 전까지 자원을 놓지않음
SJF(shortest-job-first)
두가지 버전이 있다.
non-preemptive - 맨 처음은 들어온 순서대로 수행 후 맨 처음 프로세스가 수행 중 도착한 프로세스 중 burst time(수행시간)이 가장 짧은 순서대로 수행.
preemptive - 맨 처음 도착한 프로세스를 수행 중에 도착한 프로세스들과 burst time을 계속 비교해 가장 짧은 것을 수행한다.
장점 : 평균 waiting time이 가장 짧음, 반응이 빠름
단점 : starvation - burst time이 가장 긴 프로세스가 먼저 들어왔을 경우에 실행이 되지 않을 수도 있음. -> aging으로 해결가능 (시간에 따라 priority를 높힌다.)
Priority
우선순위에 따라 실행 순서를 결정.
문제점:
RR (round robin)
프림티브
time quantum을 사용자가 지정해 프로세스에 할당 시간을 준다.
(예, time quantum 시간을 10이라 잡으면 각 프로세스마다 10이란 시간을 사용하고 다시 큐에 들어가 대기)
(time quantum; 이하 g라 부름] g가 매우길면 fcfs가 되고 매우 짧으면 빈번하게 context switching이 벌어져 오버헤드가 매우 높아진다.)
Syncronize
Race Condition
일반적으로 Race Condition 이란 두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓸 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 달라지는 상황을 말한다. Race condition이 발생하게 되면 모든 프로세스에 원하는 결과가 발생하는 것을 보장할 수 없으므로 이러한 상황은 반드시 피해야 한다. 이를 피하는 방법은 크게 mutual exclusion과 critical section으로 나누어 볼 수 있다.
예를 들어 A와 B라는 사람이 같은 계좌에 0원이 들어있는 계좌에서 돈을 각각 입금, 출금을 동시에 한다고 했을 때, 이를 처리하는 순서에 따라서 B는 출금을 할 수도 있고 없을 수도 있다.Mutual Exclusion
Race condition을 해결하기 위해서는 두개 이상의 프로세스가 공용 데이터에 동시에 접근하는 것을 막아야 한다. 즉 한 프로세스가 공용 데이터를 사용하고 있으면 다른 프로세스가 그 자원을 사용하지 못하도록 막거나, 다른 프로세스가 이미 공용 자원을 사용하고 있으면 이 프로세스가 그 자원을 사용하지 못하도록 막으면 race condition을 피할 수 있다. 각각이 서로 공용자원의 사용을 막는다는 의미에서 이런 접근을 상호 배제(mutual exclusion)이라고 부른다.
Critical Section
프로세스의 입장에서 보면 프로세스의 어떤 부분은 자신만의 데이터를 가지고 열심히 계산만 하는 부분이 있고 공용데이터에 값을 저장하거나 읽어오는 부분이 있다. 공용 데이터에 접근하는 부분을 특별히 critical region 또는 critial section이라고 부른다. 따라서 프로세스란 측면에서 보았을 때 어떤 두 프로세스가 동시에 critical section에 들어가지 않도록 할 수 있다면 race condition을 피할 수 있다.
Syncronize 문제점
read와 write는 동시에 나올 수 없다.
read는 동시에 여러개가 가능하지만 write는 무조건 1개만 실행되어야 한다.