#운영체제(Operating system)_ 운영체제도 interrupt 기반으로 되어있다.
- interrupts: event가 있을 수 있다. event란 처리해야 할 task(마우스클릭, 출력)
os가 이런것들에 대한 처리를 해 주어야 한다.
프로그램 A의 일을 하다가 event가 생기면 처리하고 다시 A를 실행하는 형식이다.
but, A 일을 하고 있을 때 한눈을 잘 못판다. 1) interrupts 2)polling의 두가지 처리방법이 있다.
1)interrupts: 통지를 해준다. A일을 하다가 알려주면 하고 논다. //신경안쓰다 문제생기면 알려준다.
2)polling: os가 A를 하다가 event가 발생할 만한 곳을 돌아다닌다.//여론조사? 뒤져보고 처리한다.
- interrupt vector: os code? 서비스 받을 만한 자격이 있는지 access할 권한이 있으면 루틴코드로 점프!
어디로 점프할 것인가를 vector가 정한다.
보통 1차원 배열//DB system도 1차원 배열이다.
# Storage Hierarchy (저장계층)
1)magnetic tapes 쪽으로 내려갈수록
: 가격이 싸다, 느리다, access 시간이 길다. 비휘발성이 많다(대부분).
2)Register 쪽으로 올라갈수록
: 가격이 비싸다, 빠르다, access 시간이 짧다. 휘발성이 많다.(대부분).
고로, 장단점을 가진 memory를 혼합하여 os가 잘 운영해야겠다.
고민- 어떤것을 위로 올리고(register) 내릴까? : 자주쓰인것, access가 빨리 되어야할것.
os가 얼마나 잘하냐에 따라 평균적인 코드, 시간이 나온다.
- volatile memeory(휘발성): 전원 off -> 사라진다.
no volatile memeory(비휘발성): 전원 off -> data가 계속 살아있다.
//느리면 update, 본사본 사용, os가 많이 신경써야 한다.
//컴퓨터는 인간이 많든것, 물리적인 태양, 바다, 땅 이런것이 아니기 때문에 컴퓨터 분야는
사람의 사고방식에서 벗어날 수 없다. 따라서 컴퓨터 IT는 그렇게 함부로 덤벼도 되는것이다.
그래도 어려워ㅠㅠ
# OS structure ;새로운 기능이 계속 추가되고 진화한다...
# Multiprograming(다중 프로그래밍)
(= Multiplayer / Multimedia(정보전달 매체를 다양하게; vedio, text, voice))
간단히 이해하면, Multiprogram은 job scheduling을 하기 위한 두개 이상의 프로그램을 동시에 실행한다.
여기서 동시에는 사람이 느끼기에 동시에 ㅋㅋ
# Timesharing(Multitasking) : cpu가 동시에 하지는 못하니까 시간분할을 한다.
시간분할해서(쪼개서) 동시에 cpu가 처리하는 것 처럼 보이게 한다.
멀티가 안될때, 동시처리가 안될때의 처리방식은
1) Batch: 한꺼번에 처리//모아놨다가 ex)천공카드
2) Interactive: 대화형// 서로서로가 active한 것에 사용자만 바쁜게 아니라 컴퓨터도 같이 바쁘다.
둘이 같이 일한다.
cf) Interview(서로서로 본다)
Internet, Internation..
//Interactive가 발전하여 지금이 Multitasking이 가능해졌다.
//개별 네트워크는 인터넷이 아니다.
계명대 LAN과 경북대 LAN을 서로 연결한것이 Internet이다. Internet에 연결/연동되었다.
//Response time, CPU scheduling, Swapping, Virtual memory etc..
# OS structure
- memory layout for Multiprogrammed system.
: 프로그램이 메인메모리에 저장되고 실행된다.(== 폰노이만 방식)
: 동시에 시작되기 위해서는 메인메모리가 두개이상 필요하다.
# OS opretation.
- Dual mode
1) User mode(사용자의 명령이나 운영이 실행되는 모드) //고객의 다양한 요구가 있을때.
2) Kernel mode(운영체제가 실행되는)
// 사서직원이 책 access하고 꽂아놓고 한다.
왜? 고객이 못 미덥다. 사용할 때도 사용후에도 제대로 안할 수 있으니까 가장 신뢰성 있는
운영체제 코드로 하여금 대신 실행해 주도록 한다.
kernerl mode = system mode = supervisor mode
ex) 1)Read 명령 -> 2)interrut -> 3)사용자모드에서 운영자 모드로.
(uer가 사용) (특권명령이 발생할때) (커널모드에서 처리한다.)
//특권명령. privileged instruction-> I/O, Register, Timer관련 명령들...
# Transition Form
process -실행하는 객체(실행하게 하는)
program -실행되는 객체
system call(= operation call) -OS를 호출(특권명령일 때 주로 호출)
# 운영체제의 역할
1) process 관리: 운영체제가 논리적으로 만든것.
관리란 프로그램을 실행하도록 하기 위해서 하는것.
프로세스를 생성/삭제/동기화
-동기화: 군인들이 행군할 때 다리, 발, 팔도 똑같이 하는것과 유사
일의 진척을 비슷한 속도로
2) memory 관리: 어떤 부분이 사용/미사용 되는지 관리, 어떤 data를 로드할 것인가.
어떤 메인메모리 어디에 집어넣을 것인가.
3) storage 관리: 보조기억 장치관리<-주로 파일, 디렉토리 만들고 없애고..
이것을 할 수 있는 '프리미티브 operation(기본명령어)'라 지칭함.
-프리미티브 operation: delete etc.
-복합 operation: ... sub디렉토리...sub디렉토리......file <-이것을 모든 sub를 한개의 명령이 거둔다.
(=복합명령어)
-second storage: 같은 파일이라도 위치를 표현하는 주소가 서로 다른데 몇지 번지라도
주소변환을 해야한다(주소 mapping).
-backup: stable storage ex)hard disk
cf) peer to peer: like as C2C.
web- based computing: 인터넷이 있는 computer를 이용해서..
#운영체제 구조
-프로그램실행(Execution): 프로그램 실행(프로세스관리)을 위해서 프로세스관리를 한다.
-File-system manipulation(파일시스템관리): 세번째 배웠던 메모리관리 같은..
-커널: 할일이 많다.
-non커널: user interface가 항상 속한다.
-Accounting
-Protection and security
-CommandLine Interpreter: 입력한 명령을 해석해서 실행
-GUI: icon을 가진다. //GUI는 원조가 제록시의 연구실;;;
스티븐잡슨이 매킨토시로 돈벌고 빌게이츠가 지적소유권가로채고 ㄷㄷ;;
-System calls(=Operating System call) : 운영체제 호출. 누가? 사용자가.
특권모드(특권명령)은 user에선 못 호출하니까 운영체제 모드로 바꿔줘야 된다.
uer모드에서->(인터럽트 발생)->운영체제 모드 //이때 user에서 운영체제모드로 바꾸기위해
system call이 필요하다.
system call 종류도 많다. 요즘은 system call 안쓰고 API 쓴다.
왜? 사용자가 이해하기도 쉽고 만들고 쓰기도 더 편해서이다(장점).
cf) POSIX- UNIX의 표준. 이거 말고도 표준이 여러개이다.
#Type of system calls
: precess control
File management
Device management(주로 I/O)
Information maintenance
communications
protection
cf) MS-DOS execution
System programs: file manipulation
Simple structure: 운영체제 구조_MS-DOS.
ROM Bios: 가장기본
cf) os를 통신 프로토콜처럼 계층을 만들고자 하는 운동이 일어남.
계층을 만들어 테스트해보았지만, 중복기능 등으로 인해 계층화하지는 못하였다.
UNIX의 두개의 계층? 계층이라 보기엔... 커널계층과 non커널계층으로 구성되어있다.
왜 os는 계층구조 못 만들까? 여러 테스트를 했지만 결과는 실패. 왜?
call 하는 것이 뒤죽박죽 섞여있으면 계층화하기 어렵기때문이다.
ex) hard disk에서 보조기억장치 호출-> m.m 호출-> cpu할당받으며 호출->스케줄링->
다시 m.m -> h/d로. 결국 서로가 서로를 물고 문다. 꼬리잡기ㅋㅋ
그래서 계층화 못한다. h/d~cpu를 묶어 한 계층으로 묶을 수 밖에 없다.
아... non폰노이만 안될려나?? -_-
#Microkernel
m.m-> cpu스케줄링 ->I/O장치관리->보조기억장치관리->m.m 계속돌고돈다.
가끔 통신계층 access,command.
: 통신계층화와 달리 OS는 계층조직으로 설계하고 운영하기 어렵다.
-계층조직의 장단점:
1) 독립적인 처리와 에러처리가 손쉽다. 즉, 설계하고 구현하기에 용이하다.
2) s/w 일부를 고칠 때 그 부분만 독립적으로 고칠 수 있고 그냥 side interface만 손보면 된다.
3) 독립적으로 분리되어 있어 가장 적합하다는 계층조차 중복처리가 있게 된다.
ex) error control // 한군데서 다하면 되는데 각 모듈마다 들어있어야 하니까.
-Microkernel system
사용자 수준으로 올려면 cpu할당 방법을 사용자가 지시 할 수 있다. OS를 통해서.
ex) file server: 직접 file server가서 control 할 수 있다.
but, communication cost가 들 수 있다.
-Modules: 모듈로 만들어서 OS관리(설계관리)
-Virtual Machines: 운영체제의 일종. s/w를 이야기하는 것이다.//3개의 OS 환경을 제공한다.
1개의 h/w에 VM을 올리고 그 위에 3개의 환경을 구현.
VM이 나중에는 효용성이 떨어져서.
(왜? h/w 값이 뚝. /m.m 용량이 떨어지니까 속도 뚝.메모리 뚝.)
요새는 h/w를 여러개 사고 VM이라는 운영체제 사용은 적어짐.
-JVM(Java virtual Machines): IBM VM과 개념이 약간 다르다. JVM을 핸드폰에 집어넣은 이유?
Java는 게이머가 만들었다. Anycall, sky, ever 이런 기종이 다른 핸드폰에 게임이
다운로드만 되면 바로 쓸 수 있으면 좋겠다고 생각함.
//어떤 운영체제가 platform을 가지고 있더라도 어떤 환경에서라도 java로 구현,
개발된 것을 다 돌릴수가 있다. 그래서 JVM이 탄생하게 된것. 호환성이 엄청높다.
-process는 실행하는 능동적 개체
program은 실행되어지는 수동적 개체.
<공용책 7edition_chapter3>
-running에서 ready, waiting 둘다 Interrupt가 발생한다.
#process concept
실행단위, 용어: Job > Program > Task, p/g, precess > Thread
스케줄링 (환경:Batch) (multiprogram) (Timesharing)
: 개인 메모리를 차지 하는 것이 점점 작아지고 일할 갯수는 늘어남.
즉, 똑같은 일에도 갈수록 사이즈가 줄고 갯수가 늘어남. 그 이유는? continue about the Thread.
//process가 돌면서 Task라는 것은 점점 사라졌다.
process와 Thread는 개념이 거의 비슷하다. 그냥 process라고 명칭한다.
- program counter: processr가 진행되기 위해서는 program이 필요하다.
한개의 아래 한글 프로그램이 있으면 여러개의 process가 동시에 한개의 코드를 실행하고 있다.
그래서 어디를 실행하고 있고 있는지 위치정보를 가져야 하는데,
이것을 program counter라고 한다.
-stack
-data selection
# Process State
new: 생성하는 것. 새로운 process를.
생성되자마자 ready상태로 간다. 스쳐지나간다.
ready: cpu만 할당되면 바로 실행할 수 있는 상태. 메인메모리에 다 올려놓음.
running: cpu 할당되면.
dispatch-ready 상태있는 것은 running 상태로 파견보낸다. cpu할당 상태에 있는것은 1개 이거나 0.
어느 순간을 Freezen해 보면 1개나 0개다. 왜냐면 cpu는 하나이니깐.
runnoing을 하니까 3가지 상태로 갈 수 있다. (ready / waiting/ terminated)
waiting: I/O장치가 주로.
Input를 기다린다.(cpu 반납하고 I/O가 끝나면 다시 ready 상태로)
다른 컴퓨터로 메세지를 기다린다.(cpu 반납하고 waiting, 기다리던 event가 발생하면 ready상태로)
왜 waiting하고 다시 running으로 가지 않나면, running에 다른 애 돌아가고 있으니까.
일단 줄에서 나갔으면 다시 줄서서 경쟁해서 와라. 치사하다!
#Process Control Block(PCB)
cpu는 의외로 멍청하다. cpu는 m.m의 특정영역에 있는 것만 실행한다.
cpu는 물레방아 뒤에 절구통같다. 팥넣으면 팥가루 만들고 콩넣으면 콩가루 만들고 ㅋㅋ
(=> cpu 할당)
//응용프로세스 끼리도 switching, 시스템 process, 커널 process switching
그러니까 프로세스의 switching은 엄청나게 일어난다. 여기서 control switching 시간이 발생하는데,
이를 context switching 시간을 줄이기 위해 엄청나게 노력한다.
그래서 고급언어(c, java)로 하는 것이 아니라 어셈블리어, 수준낮은 바이너리 코드로 작성한다. 왜?
컴퓨터가 알아먹기 좋아야 빨리 실행하며 UNIX의 90%는 고급언어 but, 나머지 10%로는 context switching코드.
#Process Scheduling Queses
Que: 줄서는거. 모든일어나는 시스템은 큐로 표현할 수 있고 시스템의 성능을 분석한다. 대기열.
자료구조로 얘기하면 stack que도 해당.
그중, 1)Job queue: system에 제출되기 위해 기다리는 대기열을 뜻함(batch 환경에서)
요새는 m.m에 가득하면 일단 받아서 h/d에 넣는다. 이제는 완전 밖에서 기다리진 않고 받아서
m.m에 빈공간 생기면
2)Ready queue: 에 넣어서 cpu 할당을 기다린다.
Device que: 출력, 프린트 할때 문서 나오는거 끝나면 기다려야지. 운영체제는 상당히 많은 I/O큐가 있다.
cf) 인터럽트의 정확한 개념은 속도가 느린 처리(일반적으로 I/O)가 실행하고 처리됐다고 response 해주는 것을
기다려준다는 의미.
- idle process는 OS가 끝나지 않고 영원히 끝나지 않는 프로세스. 이것이 idle의 진정한 의미.
- process는 계속 진행된다(off할때까지). response 이것의 응답을 메인 process(처리가 빠른)가 기다린다.
==>인터럽트 처리
#Process Creation
- UNIX에서 process creation을 만드는 두가지 방법.
1) Folk: 같은 프로그램에서 (=부보와 자식의 파생이 같다는 뜻).
2) exec: 다른 경로의 파일에서 실행하는 (=부모와 자식의 파생이 다르다).
-동기화에서 통신할 대 보내고 주고 받은 것의 종류.
1) Blocking send: 상대방이 잘 받았다는 연락이 올때까지 기다린다.
2) Blocking recerve: 상대방이 잘 받았다는 이하동문.
1) Non-blocking send: 그냥 보내기만 하고 다른일 한다.
2) Non-receive send: 그냥 보내기만 하고 다른일 한다.
//아랫 쪽에 명령문 실행하다 자동으로 interrupt 발생. 사전에 정의해 놓은 함수 실행.
//지금까는 Process간의 Com을 공부했는데, client-server 통신을 알아보자.
또다를 하나의 통신 방법이 socket이다.
#네트워크 프로그래밍
Sockets: 인터넷 프로그래밍을 보통 소켓을 이용한다.
네트워크 프로그래밍이 인터넷에서 많이 쓰여서 둘다 같은 개념으로 생각하면 될듯하다.
Remote Precedure Calls: 사용자 내부처리 신경쓰지 않고 응용 p/g의 호출처럼 문법을 사용해 c/s의
자료를 쉽게 가지고오도록 하기 위한 방법이다.
client의 요구가 있는지 OS가 모두 check하여 실행한다. 결과값으로 가져온다.
CPU 그리고 memory: 컴터가 가장 속도 빠르게 성장한것이 cpu와 memory이다.
display나 I/O 같은 경우,
사람과 관련되어 느리고 그릴 수 밖에 없다. 그래서 I/O나 display에 관한 일 하려고 cpu한테 갔다가
I/O갔다 오는것이 거의 안드로메다 수준;;
그러다보니 CPU가 많이 노는 시간이 늘게 됐다. CPU idleing time이 너무 아깝다.
그래서 cpu가 못 놀게 다른 process를 계속 할당해 주면 cpu가 못 노니까 속도가 빠르다.
Process 개체를 늘리는 것은
1) CPU가 못놀게 하여 속도가 빠르다.
2) 개체의 크기를 작게하여 이득을 본다.
: thread 사이의 Context Switching이 일어날 수 있는데 Register과 stack만 context switching 하면된다.
그래서 context swiching이 작아지면 속도가 빠르다.
적어도 한개의 process 안에 있는 thread의 경우, context switching 속도는 빠르다.
<chapter 5>
- Alternating Sequence of CPU and I/O Bursts.
- Burst: 한꺼번에 많은 자료, 정보가 쏟아지는거. CPU Burst Mode 구간이 있을 때가 있고 없을 때가 있으니까.
#CPU scheduler: ready 상태있는 process 중에서 어떤 process를 running 할 것인가를
결정하는것이 cpu scheduler. 그럼 언제 실행되는가? 4가지의 경우가 있다.
1) running-> waiting
2) running-> ready
3) waiting-> ready(이상하네? 일단 나중에...)
4) terminateing: 종료된 process를 밖으로 종료시키는 것도 cpu scheduler가.
#스케줄 방식 1)preemptive 방식: 더 좋은게 있으면 그 상태고 가버리는거. 선점방식.
//새롭게 ready 상태가 된 process가 더 목적에 가까운 거리면 기존의 것을 ready로 보내고
좋은 process를 running으로 보내버린다.
2)non preemptive 방식: 지금은 내가 하는것을 고수한다. 비선점방식.
-Scheduling Criteria: 보통 2~3가지 썩어서 알고리즘을 평가한다. waiting time을 얘기중.
-cpu 이용률(utilization): cpu를 얼마나 높게/일하게 했는지 표현. 일정한 시간내에 측정.
-Turnaround time(반환시간): 사용자의 Computer center에 맡기고 결과물 얻는시간.
batch 환경에서 많이 사용한 것을 알 수 있다.
-waiting time: ready que에서 기다린 시간을 말한다.
왜 ready qeue만 얘기했나면, 지금 말하는 환경이 cpu 스케줄링안에서의 얘기기때문.
다른데서는 waiting time이 모든 큐를 합산한 것과 같다.
-Response time: Timesharing에서는 response time이라한다. <= >batch
화면에 출력될 때 까지 걸리는 시간.
#First-come, First-Serverd Scheduling_ 비선점방식
FCFS 스케줄링은 비선점 방식이다.
- process와 Burst Time을 가지고 waiting time을 계산해보자!
// 뭐 간단하다. cpu 할당시간 - 도착시간 = waiting time이다.
가정: 반대로 하면? 근데 P1->P3->P1 순서로 하면 WT가 x값이 나온다.
어? 훨씬 빨라졌네?
FCFS 스케줄링방법은 평균 순서에 따라 이 평균 wt의 분산이 크다.
system의 입장에서 보면 분산은 작을 수록 좋다. 당연..
그 이유는 팀플전이니까?? ;;;;
맨 마지막 precess가 들어와야 도착으로 쳐준다.
분산이 크면 wt이 어떤대는 x, y이러니까 예측하기 어렵다.
그래서 os에서는 FCF를 많이 쓰지 않는다. 인간사회에서는 좋은 방법이지만..
but, FCF의 장점도 있다. 간단하다는것. Sooooo simple!!
#System: the simpler, the better.
1)설계용이
2)코딩이 간단
3)그러나 알고리즘 실행처리속도는 떨어진다.
OS의 활용면에서도 좋지 않다.
#FCTS scheduling: 대부분 간단하나 wt분산이 크다. 이는 system전체의 성능저하를 초래한다.
#SJF(shortest job first) scheduling
cpu burst의 가장 짧은 process를 먼저 cpu를 할당하는 스케줄링.
// wt이 가장 짧다. 이것보다 더 짧은 알고리즘이 존재 할 수 없다.
평균 wt에 대해서 optional.
but, 결정적 단점이 있다. os가 새로운 process를 보고 burst time을 정확하게 알 수 없다.
예측불가하다. 그래서 SJF사용이 사실상 어렵다.
SJF는 특수한 환경에서는 사용가능하다. ex) 공장자동화 system을 같은 process가 오기때문에
어느정도 예측하여 적용가능하다.
! FCT는 도착시간을 가지고 순서를 정한 것이지 Burst time을 순서로 고려한 것은 아니다.
그런데 SJF가 Burst time 예측 때문에 못쓰는건 좀 아깝다.
그러면 가급적으로 예측을 가깝게 할 수 있을까?
-Alternating Sequence of CPU and I/O Bursts: 예측알고리즘이다.
-Determining Length of Next and I/O Burst
: 실측치가 갑자기 변하지 않는다면 여측치도 실측치와 비슷한 곡선을 이룬다.
cf) exponential averaging은 어떻게 산출되었는가.
Q) 평균구하는 식을 다 더해서 나누면 되지 않는가?
A) 그건 나올, 일어날 확률이 똑같을 때 얘기다.
but, 일어날 확률이 서로 다른 평균을 구해야 한다면 확륙은 제로.
일어날 때, 얻을 값과 시간을 곱하는것 => averaging.
#SRTF




덧글