< CPU 스케쥴링 개요 >
컴퓨터의 자원은 CPU,메모리와 같은 필수장치와 하드디스크,키보드,마우스 같은 주변장치로 나뉜다.
위의 두가지 고려사항이 컴퓨터 성능에 큰 영향을 미침.
요즘은 '시분할 방식' 이 쓰인다.
< 다중 큐 >
-프로세스가 실행상태에서 준비상태가 될 때 운영체제는 해당 프로세스의 우선순위를 보고, 그에 적합합 '준비 큐'에 넣는다.
그 다음 '다중 큐' 프로세스들 중 적당한 프로세스를 선택해 실행상태로 바꾼다.
I/O 작업은 HDD 큐/LAN 큐/키보드 큐처럼 각 대기 큐에 들어가서 완료되면 나온다.
=> 큐에 프로세스 정보를 가진 PCB가 들어간다.
(정리)
프로세스 정보를 가진 PCB는 준비 상태 다중 큐에 들어가 실행을 기다림.
-> CPU 스케쥴러에 의해 실행상태로 전환됨.
-> CPU 스케쥴러 준비상태 다중큐를 참조해서 어떤 프로세스를 실행시킬지 결정함(I/O 작업도 비슷함)
< 스케쥴링 목표 >
1.리소스 사용률: CPU 사용률 높이기. I/O device 사용률 높이기 등이 목표가 될 수 있음.
2.오버헤드 최소화
3.공평성: 모든 프로세스에게 공평하게 CPU가 할당되어야 함 => 시스템에 따라(각 프로세스 중요도에 따라) 공평의 의미가 달라질 수 있음.
4.처리량: 같은 시간 내에 더 많은 처리를 할 수 있는 방법을 목표로 함.
5.대기시간: 작업 요청하고 실제 작업 이루어지기 전까지 대기시간 짧은 것을 목표함.
6.응답시간: 응답시간이 짧은 것을 목표함.
=> 목표에 따라 응답시간, 처리량 조율해서 스케쥴링한다.
< FIFO 알고리즘 >
: 먼저 들어오면 먼저 나간다 -> 장점은 단순하고 직관적이다. 단점은 한 프로레스가 완전히 끝나야 다음 프로세스가 실행. 실행시간이 긴 프로그램이 앞에 있다면 실행시간 짧은 프로그램이 오래 대기해야 하고, I/O 작업이 있을 때에 CPU는 I/O 작업이 끝날 때까지 쉬어서 CPU사용률이 떨어진다.
< SJF 알고리즘 >
burst time이 짧은 프로세스를 먼저 실행하는 알고리즘.짧은 작업 먼저!
하지만 구현하려 할 때 2가지 문제점 발견
1.어떤 프로세스가 얼마나 실행될 지 예측이 힘듬.
2.burst time이 긴 프로세스는 아주 오랫동안 실행이 안될 수 있다는 점.
burst time이 짧은 프로세스가 중간에 계속 들어오면 실행순위가 뒤로 밀려남.
-> 이런 문제 때문에 SJF 알고리즘 사용 안됨.
< RR 알고리즘 >
FIFO 알고리즘의 단점을 해결한 방식. 한 프로세스에서 일정시간만큼만 CPU를 할당하고 시간이 지나면 다른프로세스에서 권한을 넘겨주는 식.
CPU를 뺏긴 프로세스는 큐의 맨 끝으로 이동하게 됨.
< MLFQ 알고리즘 >
RR 알고리즘의 업그레이드 버전.CPU bound process와 I/O bound process를 나누어 타임슬라이스를 다르게 지급하는 방식.
CPU bound process는 CPU작업을 주로하고 CPU 사용률과 처리량을 중요하게 생각함.
I/O bound process는 응답속도를 중요하게 생각함.
작은 타임슬라이스 크기를 기본으로 하며,CPU bound process에게는 타임슬라이스 크게 I/O bound process에게는 작게 줌.
운영체제는 CPU사용률을 보고 CPU bound와 I/O bound를 구분.
우선순위를 가진 큐를 여러개 준비해서 처음에는 타임슬라이스를 짧게 주고, 처리를 못하면 점차 타임슬라이스를 길게 줘서 마지막에는 연속적으로 작업을 할 수 있게 만듬.
오늘날 쓰이는 CPU 스케쥴링 알고리즘은 MLFQ가 주류이다.
< 프로세스 동기화 >
< 공유자원과 임계구역 >
< 세마포어 >
동기화에서 가장 중요한 개념으로 운영체제가 공유자원을 사용하려는 프로세스들에게 세마포어라는 권한을 줘서 공유자원을 순서대로 사용할 수 있게 만드는 것.
프로세스가 대기하는 곳을 대기큐라고 함.세마포어는 '정수형 변수'.
세마포어를 이용하면 공유자원에 여러 프로세스가 동시에 접근하지 못하기 때문에 동기화 문제가 발생하지 않음. 세마포어의 갯수는 공유자원의 갯수를 따른다.
세마포어의 단점은 세마포어 호출 함수의 순서를 이상하게 해서 세마포어를 잘못 사용할 수 있다는 점이 있다.
< 모니터 >
세마포어의 단점을 해결한 상호배제 매커니즘.모니터는 운영체제가 처리하는 것이 아니라 프로그래밍 언어 차원에서 지원하는 방법. 예시로 자바에서 지원.
모니터 구현이 완벽하다면 세마포어로 임계영역을 감싸지 않아도 되어서 모니터 덕분에 쉽게 코딩이 가능함.
< 교착상태(데드락) >
( 교착상태의 필요조건 )
1.상호배제: 어떤 프로세스가 한 리소스를 점유했다면 다른 프로세스에서 공유되면 안됨.
2.비선점: 한 프로세스가 점유한 리소스를 다른 프로세스가 뺏을 수 없음.
3.점유와 대기: 한 프로세스가 리소스A를 가지면서 리소스B를 원해야 하는 상태.
4. 원형 대기: 점유와 대기를 하는 프로세스들이 원형 대기하고 있어야 함.
4가지 중 한가지라도 해당 안되면 교착상태 안됨.
< 교착상태 해결 >
< 컴파일과 프로세스 >
< 컴파일 후 프로세스 변환과정 >
.c파일 => 전처리기 => .i파일 => 컴파일러(기계어에 가까운 어셈블리어로 변환시킴 ) => .s파일 => 어셈블러 => .o파일(이 오브젝트 파일안에는 코드영역과 데이터영역이 나뉘어져 있음) => 링커(링커에서 여러 오브젝트파일을 하나의 코드와 데이터영역으로 묶는다. 그리고 실제 실행될 주소를 매핑해줌) => 프로그램
-> 이 프로그램을 실행시키면 운영체제는 프로세스를 만들고 프로그램의 코드영역과 데이터영역을 가져와 프로세스에 넣어주고 빈 스택과 힙영역을 만든다. PCB를 만들고 프로그램 카운터 주소를 설정해준다.