02
01

운영체제

프로그램 실행에 필요한 자원을 할당하고 프로그램이 올바르게 실행될 수 있또록 돕는 프로그램.

운영체제도 프로그램이므로 메모리의 커널 영역에 항상 적재되어 실행된다.

cf)사용자 영역:  운영체제가 적재되어있지 않은, 사용자가 사용하는 영역

 

운영체제를 알아야 하는 이유

운영체제는 프로그램이 하드웨어 상에서 어떻게 실행되는지 잘 알고 있다.

이러한 운영체제를 잘 알고, 운영체제의 메세지를 잘 전달받을 수 있다면 훨씬 효과적으로 문제를 해결할 수 있을 것이다.

 

운영체제의 큰 그림

커널

운영체제의 심장. 운영체제의 핵심적인 서비스를 담당하는 부분.

자동차의 엔진과 같아서 어떤 커널을 사용하느냐에 따라 프로그램이 하드웨어를 이용하는 양상이 달라진다.

 

사용자 인터페이스

사용자가 컴퓨터와 상호작용할 수 있는 통로. ex)윈도우 바탕화면

  • 그래픽 유저 인터페이스

마우스를 이용해 다양한 프로그램을 실행하거나 스마트폰 터치로 앱을 실행할 수 있는 것은 그래픽 유저 인터페이스 덕분이다.

  • 커맨드라인 인터페이스

명령어를 기반으로 컴퓨터와 상호작용하는 인터페이스. 

 

이중모드와 시스템 호출 

이중모드

CPU가 명령어를 실행하는 모드를 사용자 모드와 커널 모드로 구분하는 방식.

응용프로그램이 하드디스크에 접근해 데이터를 저장하려면 운영체제의 도움을 요청해야한다. 그러면 운영체제는 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행해서 응용 프로그램의 작업을 대신 수행해준다.

  • 사용자모드

운영체제 서비스를 제공받을 수 없는 모드. 일반적으로 응용프로그램은 사용자 모드로 실행되나, 사용자모드로 실행되는 동안에는 하드웨어 자원에 접근하는 명령어를 실행할 수 없다.

  • 커널모드

운영체제 서비스를 받을 수 있는 모드. 자원에 접근하는 명령어를 비롯한 모든 명령어를 사용할 수 있다.

 

시스템콜(시스템 호출) 

사용자 모드로 실행되는 프로그램이 자원에 접근할 목적으로 운영체제 서비스를 제공받기 위해 보내는 요청. 소프트웨어 인터럽트.

시스템 호출을 통해 커널모드로 변경할 수 있다.

ex) 시스템 호출의 예시

  1. 하드디스크에 데이터를 저장하는 시스템 호출을 발생시켜 커널모드로 전환한다.
  2. 운영체제 내의 하드 디스크에 저장하는 코드를 실행해 하드 디스크에 접근한다.
  3. 하드 디스크에 접근이 끝나면 사용자 모드로 복귀해 실행한다.

운영체제의 핵심 서비스

프로세스(실행중인 프로그램) 관리

cpu는 한 번에 하나의 프로세스만 실행할 수 있다. 때문에 여러 프로세스를 번갈아가면서 실행하는데 이러한 프로세스를 관리하고 실행하도록 하는 것이 운영체제다.

 

자원 접근 및 할당

프로세스들이 사용할 자원에 접근하고 조작하면서 필요한 자원을 할당해준다.

 

CPU

프로세스들에 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 이용할 것인지, 얼마나 오래 이용하게 할 것인지와 같은 CPU 스케줄링을 맡는다.

 

메모리

메모리에 적재된 프로세스들은 각기 다른 메모리 주소를 가지고 있다. 심지어 실행될 때 마다 주소가 달라지기도 한다. 프로세스가 어떤 주소에 적재될 것인지를 결정한다.

 

입출력장치

입출력장치가 CPU에 하드웨어 인터럽트를 보내면 CPU는 백업을 한 뒤에 커널 영역에 있는 인터럽트 서비스 루틴을 실행한다. 운영체제는 인터럽트 서비스 루틴을 실행한다.

 

파일 시스템 관리

파일을 열고 수정하고 삭제하거나 폴더로 관리하는 모든 파일 시스템을 운영체제가 관리한다.

 

프로세스와 스레드

프로세스

실행중인 프로그램. 보조기억장치에 저장된 프로그램을 적재하고 실행한 것. 

  • 포그라운드 프로세스 : 사용자가 보는 곳에서 실행되는 프로세스
  • 백그라운드 프로세스 : 사용자가 보지 못하는 곳에서 실행되는 프로세스

프로세스 제어 블록

프로세스와 관련된 정보를 저장하는 자료구조. 물건에 달려있는 태그와 같은 역할로 프로세스를 식별하기 위해 필요한 정보가 저장된다. 커널 영역에 생성됨. 프로세스 생성 시에 만들어지며 실행이 끝나면 폐기된다. 

CPU 자원은 한정되어 있기 때문에 프로세스는 차례대로 돌아가며 한정된 시간 만큼 CPU를 사용한다.

이러한 프로세스의 실행 순서를 관리하고, CPU를 비롯한 자원을 배분하기 위해 운영체제가 사용한 것을 프로세스 제어 블록(PCB)이라고 한다.

 

프로세스 ID

PID. 프로세스를 식별하기 위해 부여하는 고유한 번호. 같은 일을 수행하는 프로그램이라도 두 번 실행하면 PID가 다른 두 개의 프로세스가 생성된다.

 

레지스터 값

프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값을 모두 복원한다. 이전까지 진행했던 작업들을 그대로 이어 실행해야하기 때문이다. 

 

프로세스 상태

프로세스의 현재 상태가 기록된다. 현재 입출력 장치를 사용하기 위해 기다리고 있는 상태인지, CPU를 사용하기 위해 기다리고 있는 상태인지 등에 관련된 정보가 기록된다.

 

CPU스케줄링 정보

프로세스가 언제, 어떤 순서로 CPU를 할당받을 지에 대한 정보가 기록된다

 

메모리 관리 정보

프로세스가 어느 주소에 저장되어 있는지에 대한 정보가 기록된다. 베이스 레지스터, 한계 레지스터, 페이지 테이블 정보 등이 담긴다.

 

사용한 파일과 입출력 장치 목록

프로세스가 실행 과정에서 특정 입출력 장치나 파일을 사용하면 PCB에 해당 내용이 명시된다. 어떤 입출력 장치가 이 프로세스에 할당되었는지, 어떤 파일을 열었는지에 대한 정보가 PCB에 기록된다.

 

 

문맥교환

문맥 :  하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보. 

문맥 교환: 기존 프로세스의 문맥을 PCB에 저장하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로 복구해 새로운 프로세스를 실행하는 것.

 

*문맥 교환은 여러 프로세스가 끊임없이 빠르게 번갈아가면서 실행되는 원리다. 그러나 너무 자주 하면 오버헤드가 발생할 수 있으므로 교환이 자주 일어난다고 해서 반드시 좋다고는 할 수 없다.

프로세스의 메모리 영역

커널 영역
스택 영역
힙 영역
데이터 영역
코드 영역
.
.
.

코드 영역

정적 할당 영역(크기가 고정된 영역). 텍스트 영역. 실행할 수 있는 코드, 기계어로 이루어진 명령어가 저장된다. CPU가 실행할 수 있는 명령어가 저장되어 있는 곳으로 read-only공간이다.

데이터 영역

정적 할당 영역(크기가 고정된 영역). 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간. 전역변수(프로그램 전체에서 접근할 수 있는 변수)가 대표적이다.

힙 영역

동적 할당 영역(크기가 변하느 영역). 프로그래머가 직접 할당할 수 있는 저장 공간. 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환(= 더 이상 해당 메모리 공간을 사용하지 않겠다고 운영체제에 말해주는 것 ) 해야한다.

메모리 공간을 반환하지 않는다면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래한다. = 메모리 누수

메모리의 낮은 주소에서 높은 주소로 할당된다. 

스택 영역

동적 할당 영역(크기가 변하느 영역). 데이터를 일시적으로 저장하는 공간. 잠깐 사용하다가 말 값들이 저장된다. 함수 실행이 끝나면 사라지는 매개변수, 지역변수가 대표적이다.

메모리의 높은 주소에서 낮은 주소로 할당된다.

 

프로세스 상태와 계층 구조

생성 상태

프로세스를 생성 중인 상태. 이제 막 메모리에 적재 되어 PCB를 할당받은 상태. 실행할 준비가 완료된 프로세스는 준비 상태가 되어 CPU의 할당을 기다린다

준비 상태

CPU를 할당받으면 실행할 수 있지만 차례가 오지 않아 기다리고 있는 상태. 차례가 오면 CPU를 할당받고 실행 상태가 된다

실행 상태

CPU를 할당 받아 실행 중인 상태. 할당된 일정 시간 동안만 CPU를 사용할 수 있다. 할당된 시간을 모두 사용하면(타이머 인터럽트가 발생하면) 다시 준비상태가 되고 실행 도중 입출력 장치를 사용해 입출력 장치의 작업이 끝날때 까지 기다려야한다면 대기 상태가 된다. 

대기 상태

입출력 작업은 CPU에 비해 처리 속도가 느려 입출력 작업을 요청한 프로세스는 입출력 장치가 입추력을 끝낼 때 까지(입출력 완료 인터럽트를 받을 때까지) 기다려야한다. 입출력 작업이 완료되면 다시 준비상태로 CPU 할당을 기다린다.

종료 상태

프로세스 종료 상태. 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

 

프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 이때 새 프로세스를 생성한 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 한다.

둘은 다른 PID를 가지며, 일부 운영체제에서는 자식 프로세스의 PCB에 부모프로세스의 PID인PPID가 기록되기도 한다. 

자식 프로세스는 또 다른 자식 프로세스를 생성할 수 있으며, 많은 운영체제는 프로세스가 프로세스를 낳는 계층적인 구조로 프로세스를 관리한다.

ex) 사용자가 컴퓨터를 켜고 로그인 창을 통해 성공적으로 로그인 해서 bash 셸(사용자 인터페이스)로 Vim이라는 문서 편집기 프로그램을 실행한 경우

  1. 사용자가 컴퓨터를 켠 순간에 생성된 최초 프로세스는 로그인을 담당하는 프로세스를 자식 프로세스로 생성한다.
  2. 로그인 프로세스는 사용자 인터페이스(bash 셸) 프로세스를 자식 프로세스로 생성한다.
  3. 사용자 인터페이스 프로세스는 Vim 프로세스를 생성한다.

프로세스 생성 기법

부모 프로세스를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행된다.

부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해내고 

자식 프로세스는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

fork: 자기 자신 프로세스의 복사본을 만드는 시스템 호출.  자식 프로세스는 부모 프로세스의 복사본으로 부모프로세스의 자원들(메모리 내용, 열린 파일 목록)을 상속한다.

exec: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출. 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고 나머지 영역은 초기화된다.

 

ex) 사용자가 bach 셸에서 Is라는 명령어를 친 경우

셸 프로세스는 fork를 통해 자신과 동일한 프로세스를 생성하고, 자식 프로세스(셸의 복제 프로세스)는 exec를 통해 Is명령어를 실행하기 위한 프로세스로 전환되어 실행된다. 메모리 공간에는 Is명령어를 실행하기 위한 내용이 채어진다.

 

그러나 부모 프로세스가 fork한 뒤에도 누구도 exec를 호출하지 않는 경우가 있는데 이 경우는 부모 프로세스와 자식 프로세스가 같은 코드를 병행하여 실행하는 프로세스가 된다.

 

스레드

프로세스를 구성하는 실행의 흐름 단위. 하나의 프로세스는 여러 실행단위를 가질 수 있고, 스레드를 통해 프로세스에서 여러 부분을 동시에 실행할 수 있다. 

 

프로세스와 스레드

단일 스레드 프로세스 :  하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스.

멀티스레드 프로세스: 여러 실행 흐름을 가지고 동시에 여러가지 일을 할 수 있는 프로세스.

 

스레드는 프로세스 내에서 각기 다른 스레드ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다. 각자 다른 레지스터 값, 스택을 가지고 있기 때문에 각기 다른 코드를 실행할 수 있다.

스레드는 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하면서 실행된다. (힙, 데이터, 코드 영역은 공유한다) 

 

멀티 프로세스와 멀티 스레드

멀티 프로세스: 여러 프로세스를 동시에 실행하는 것

멀티 스레드: 여러 스레드로 프로세스를 동시에 실행하는 것

 

멀티 프로세스와 멀티 스레드는 뭐가 다를까?

"hello, os"를 출력하는 프로그램을 3번 실행해도(멀티 프로세스), "hello,os"를 출력하는 스레드를 세 개 만들어 실행해도(멀티 스레드) 출력 결과는 동일하다

그러나 멀티 프로세스로 실행했을 때는 코드, 데이터, 힙 영역까지 모든 자원이 복제되어 메모리에 적재된다.

PID와 메모리 주소만 다른 프로세스 두개가 통채로 메모리에 적재되기 때문에 메모리 낭비를 부르기 쉽다.

반대로 스레드는 자원을 공유하기 때문에 메모리를 효율적으로 사용할 수 있어 협력과 통신에 유리하다. 그러나 자원을 공유하면 문제가 생겼을 때 다른 스레드도 영향을 받을 수 있다.

 

CPU스케줄링

운영체제가 프로세스들에게 공정하고 합리적으로 CPU자원을 배분하는 것.

 

프로세스 우선순위

프로세스는 일반적으로 CPU와 입출력 장치를 모두 사용하면서 실행된다. 때문에 실행상태와 입출력 완료까지 기다리는 대기 상태가 반복된다. 프로세스 종류마다 입출력장치와 CPU를 이용하는 시간이 다르기 때문에 프로세스를 두 종류로 나눈다

  • 입출력 집중 프로세스 : 입출력을 위한 대기 상태에 더 많이 머무른다
  • CPU 집중 프로세스 : 실행 상태에 더 많이 머무른다.

사용시간과 프로세스의 중요도에 맞게 운영체제는 프로세스 마다 우선순위를 부여한다. PCB에 적힌 우선순위를 기준으로 처리할 프로세스의 순서를 정한다.

 

스케쥴링 큐

CPU를 사용하고 싶은 프로세스, 메모리에 적재되고 싶은 프로세스, 특정 입출력장치를 사용하고 싶은 프로세스를 모두 줄세워 스케쥴링 큐로 구현하고 관리한다.

준비 큐: CPU를 이용하고 싶은 프로세스가 서는 줄

대기 큐 : 입출력 장치를 이용하기 위해 대기하는 프로세스가 서는 줄

 

준비상태에 있는 프로세스들의 PCB는 준비 큐의 마지막에 삽입되어 CPU를 사용할 차례를 기다린다. 운영체제는 큐에 삽입된 순서대로 프로세스를 하나씩 꺼내어 실행햐되, 그 중 우선순위가 높은 프로세스를 먼저 실행한다. 

 

선점형 /  비선점형 스케쥴링

선점형 스케쥴링 : 프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 빼앗아 다른 프로세스에 할당할 수 있는 스케쥴링 방식. 대부분의 운영체제는 선점형 스케쥴링을 차용한다. 한 프로세스의 자원 독점을 막고 배분할 수 있지만 문맥 교환 과정에서 오버헤드가 발생할 수 있다.

비선점형 스케쥴링: 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 대기 상태에 접어들기 전 까지는 다른 프로세스가 끼어들 수 없는 스케쥴링 방식. 문맥교환에서 오버헤드가 발생할 일이 적지만 모든 프로세스가 골고루 자원을 사용할 수 없다.

 

CPU 스케쥴링 알고리즘

선입 전처리 스케쥴링

FCFS스케줄링. 준비 큐에 삽입된 순서대로 프로세스를 처리하는 비선점형 스케줄링 방식. CPU를 먼저 요청한 프로세스부터 CPU를 할당하는 방식. 프로세스들이 기다리는 시간이 매우 길어질 수 있다는 부작용이 있다.

*호위 효과 :  17ms 프로세스 A / 5ms 프로세스 B / 2ms 프로세스 C 가 있을 경우 C는 2ms를 실행하기 위해 22ms를 기다려야한다

최단 작업 우선 스케쥴링

SJF스케줄링. 이용시간의 길이가 가장 짧은 프로세스부터 실행하는 방식. 일반적으로 비선점형 스케줄링으로 분류된다.

라운드로빈 스케쥴링

선입선처리 스케줄링+ 타임 슬라이스 : 정해진 타임 슬라이스 만큼의 시간동안 돌아가며 CPU를 이용하는 선점형 스케줄링. 타임슬라이스의 크기가 중요한 방법이다. 타임슬라이스가 지나치게 크면 호위 효과가 생길 수 있고, 지나치게 작으면 문맥교환에 발생하는 비용이 크다.

타임 슬라이스: 각 프로세스가 CPU를 사용할 수 있는 정해진 시간.

최소 잔여 시간 우선 스케줄링

SRT스케줄링. 최단작업 우선 스케줄링 + 라운드 로빈. 

작프로세스들은 정해진 타임 슬라이스 만큼 CPU를 사용하되, CPU를 사용할 다음 프로세스로는 남아있는 작업 시간이 가장 적은 프로세스가 선택된다.

우선순위 스케줄링

프로세스에 우선순위를 부여하고 가장 높은 우선순위를 가진 프로세스부터 실행하는 스케줄링. 

단점: 우선순위가 낮은 프로세스는 계속 연기될 수 있다 (기아 현상)

해결책: 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식(에이징)

다단계 큐 스케줄링

우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식. 

우선순위가 가장 높은 큐에 있는 프로세스들을 먼저 처리하고, 우선순위가 가장 높은 큐가 비어있으면 그 다음 우선순위 큐에 있는 프로세스를 처리한다.

큐별로 타임 슬라이스를 여러 개 지정할 수도 있고, 큐마다 다른 스케줄링 알고리즘을 사용할 수도 있다.

다단계 피드백 큐 스케줄링

다단계 큐 스케줄링 + ㅇ 프로세스들이 큐 사이를 이동할 수 있다.

다단계 큐 스케쥴링에서 발생할 수 있는 기아 현상을 보완할 수 있는 발전된 형태.

다단계 스케줄링에서 새로 준비 상태가 된 프로세스가 있다면 우선순위가 가장 높은 큐에 삽입되고 일정 시간(타임 슬라이스)동안 실행된다. 만약 프로세스가 해당 큐에서 실행이 끝나지 않는다면 다음 우선순위 큐에 삽입되어 실행된다. 

이런식으로 CPU를 오래 사용해야 하는 프로세스는 점차 우선순위가 낮아진다.

 

304p 1번
1. 생성상태
2.준비상태
3.실행상태
4.종료상태
5.대기상태

선택미션
준비 큐에 A(17ms /우선순위4)-B(5ms/우선순위3)-C(2ms/우선순위10)-D(13ms/우선순위3)순으로 삽입
타임 슬라이스 : 4ms
선입 선처리 : A-B-C-D
최단 작업 우선: C-B-D-A
라운드 로빈 : A(4ms/13ms) - B(완료)-C(완료)-D(4ms/9ms)
-A(4ms/9ms)-D(4ms/5ms)-A(4ms/5ms)-D(완료)-A(완료)
우선순위: B-D-A-C



 

후기
배포와 겹쳐서 초과근무도 많고... 너무너무 바쁜 일주일이었습니다. 한 번 읽고 이해하는 것에만 의의를 두고 쫓기듯이 해버려서 몇 번 더 정리를 해봐야 할 것 같네요...
크로플 주신 것은 얼마 없는 쉬는시간인 점심시간에 맛있게 잘 먹었습니다.
감사합니다. 우리 모두 힘냅시다.
COMMENT