https://friendshipkim97.tistory.com/41?category=1035110
[Mentoring] 청년고민해결단 온라인 멘토링 회고록
2022.04.02 청년고민해결단 온라인 2차 멘토링을 받았다! 사실 2주 전에 1차 멘토링이 있었지만,, 불가피하게도 코로나에 걸려 참여하지 못했다.. 그래서! 이번 2차 멘토링에 열정가득한 마음으로 참
friendshipkim97.tistory.com
저번 청년고민해결단 온라인 멘토링에서 멘토님이 KOCW 반효경 교수님의 운영체제강의를 추천해주셨었다!
평소에 CS지식에 대한 부족함을 많이느껴 들어야겠지라는 막연한 생각만 가지고 있었는데, 방학을 맞이해 반효경 교수님의 강의를 통해 제대로 정리해보고자 한다!
먼저! 운영체제란 컴퓨터 하드웨어 바로 위에 설치되어 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층이다.
운영체제는 컴퓨터 시스템의 자원을 효율적으로 관리한다.
실행중인 프로그램들에게 짧은 시간씩 CPU를 번갈아 할당한다.
어떤 방식으로 먼저 CPU를 줄 것이며 얼마만큼의 시간을 할당할 것인지?
실행중인 프로그램들에 메모리 공간을 적절히 분배한다.(모든 프로그램들에 대해 공평하게 메모리를 나눠서 주는 게 아니다.)
메모리도 다들 내 프로그램이 올라가야 한다고 주장하겠지만 메모리는 한정적이기 때문에 어떻게 메모리를 분배할 것인지? 고려해야 할 부분이다.
좁은 의미의 운영체제? → 커널
운영체제의 핵심 부분으로 메모리에 상주하는 부분
컴퓨터를 키고 부팅이 일어난 다음에 항상 메모리에 상주하는 부분이다!
넓은 의미의 운영체제? → 커널을 포함해 각종 주변 시스템 유틸리티를 포함한 개념이다.
윈도우라면 커널뿐만 아니라 다른 부가적인 프로그램이 설치가된다. ex) 파일을 복사하는 소프트웨어
전공자 입장에서 보통 운영체제라고 한다면 커널만을 이야기한다.
운영체제는 컴퓨터 시스템의 자원을 효율적으로 관리함을 알아볼 수 있었다.
그렇다면 자원이란 무엇일까?
자원이란 프로세서, 기억장치, 입출력 장치 등이 될 수 있다. 하드웨어 자원뿐만 아니라, 프로세스, 파일, 메세지 등도 소프트웨어 자원이 될 수 있다.
<운영체제의 목적>
- 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공하기 위해(운영체제는 동시 사용자/프로그램이 각각 독자적 컴퓨터에서 수행되는 것 같은 환상을 제공, 하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행)
- 주어진 자원을 효율적으로 관리하기 위해(프로세서, 기억장치, 입출력 장치 등의 효율적 관리 → 사용자간의 형평성 있는 자원 분배, 주어진 자원으로 최대한의 성능을 내도록, 사용자 및 운영체제 자신의 보호, 프로세스, 파일 메세지 등을 관리한다.)
<운영체제의 분류>
동시 작업 가능 여부?
단일 작업(Single Tasking)
- 한 번에 하나의 작업만 처리 ex) MS-DOS 프롬프트 상에서는 한 명령의 수행을 끝내기 전에 다른 명령을 수행시킬 수 없음
다중 작업(Multi Tasking)
- 동시에 두 개 이상의 작업 처리 ex) UNIX, MS Windows 등에서는 한 명령의 수행이 끝나기 전에 다른 명령이나 프로그램을 수행할 수 있음
특수목적을 위해 제작된, 엘리베이터 같은 기계를 위한 운영체제는 단일작업만 지원해주고 있긴 하지만
스마트폰, 스마트 TV같은 것들에는 요즘 거의다 다중 작업을 지원하는 운영체제가 들어간다.
사용자의 수??
단일 사용자(Single User)
ex) MS-DOS, MS Windows
단일 작업만 지원하는 운영체제는 당연히 단일 사용자만 지원한다.
다중 사용자(Multi User)
ex) UNIX, NT Server
한 대의 컴퓨터를 여러 사용자가 동시에 접속할 수 있다.
처리 방식??
일괄 처리(Batch Processing)
- 작업 요청의 일정량 모아서 한꺼번에 처리
- 작업이 완전 종료될 때까지 기다려야 함
역사 속의 시스템이다.. Interactive하지가 않다!
ex) 카드에 마킹을 하고 전산소에 제출을하면 그걸 다 받아서 컴퓨터에 집어 넣어서 이게 정상적으로 컴파일이 되는지 확인을 한 다음, 다음날 가면 확인이 가능한 것처럼.. 바로바로 처리가 되는게 아니라 작업들을 모아서 처리한다.
→ 오류가 나면 하루가 늦어지니까 정확하게 프로그래밍하는게 중요하다.
시분할 방식(Time Sharing)
- 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용
- 일괄 처리 시스템에 비해 짧은 응답 시간을 가짐 ex) UNIX
- Interactive한 방식이다.(Interactive라는 건 운영체제에 명령어를 입력했을 때 화면에 바로 나오는 것을 의미한다. → 만약, 명령어를 입력했는데 1분뒤에 결과가 나온다면..??, Interactive하지 않은 운영체제인 것!)
→ 시분할 방식은 예를 들어 3명의 사용자가 있을 때 A에 1,4,7 B에 2,5,8 C에 3,6,9를 할당한다. 여기서 숫자는 각 사용자가 컴퓨터로부터 서비스를 제공 받는 시간을 의미한다.
→ 사용자가 많아진다면 0.01초에서 0.1초가 되는 등 당연히 느려진다.
→ 사용자가 느끼기에 빠르게 해주면서 동시에 주어진 자원을 최대한 효율적으로 활용하는게 목적이기 때문에 정확한 시간을 지켜주진 않는다.
실시간(RealTime OS)
- 정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야 하는 실시간시스템을 위한 OS
- ex) 원자로/공장 제어, 미사일 제어, 반도체 장비, 로보트 제어
→ 실시간 시스템의 개념 확장
- Hard RealTime System(경성 실시간 시스템)
- 데드라인을 정확히 지키지 않으면 치명적인 결과가 나옴 ex) 한 공정이 하루가 늦어지면 다른 것들이 영향을 받게 된다. 정전이 한 번 나면 중간공정에 있던 것들은 꺼내서 버려야 되는 것,
- Soft RealTime System(연성 실시간 시스템)
- 데드라인을 지키지 않았다고 해서 큰 문제가 나지 않음 ex) 멀티 미디어 스트리밍, 영화가 끊겼다고 해서 기분이 나쁘지 큰 문제가 일어나지 않는다.
주로 우리는 시분할 방식을 활용한 일반 시스템 운영체제를 배운다. 리눅스, 윈도우, 안드로이드와 ios 등등..
만약 스마트폰으로 블랙박스를 찍어야 하는데 데드라인을 못지켜, 0.5초로 놓쳐서 못찍었다? → 있으나 마나 한 애플리케이션이 될 수 있다. 따라서, 점점 실시간 os를 필요로 하는 운영체제의 수요가 늘어나고 있다.
컴퓨터에서 여러 작업을 동시에 수행하는 몇 가지 용어!
Multitasking
- 여러작업이 동시에 실행되는 것, 엄밀히 말하면 CPU는 매 순간에 하나의 작업만 실행되는데 짧은 시간동안 분할해서 동시에 실행되는 것처럼 보이게 한다.(일반적인 용어)
Multiprogramming
- Multiprogramming은 여러 프로그램이 메모리에 올라가 있음을 강조한다.. 물론! Multitasking이 되려면 여러 프로그램이 메모리에 올라가 있어야 된다. 특별히 메모리 측면을 강조한 용어이다.
Time sharing
- 동시에 실행되는 걸 Time Sharing이라고 한다. 물론 위의 용어들과 유사한 언어이다. CPU의 시간을 분할하여 나누어 쓴다는 의미를 강조한다.
Multiprocess
- 마찬가지로 위와 유사한 용어이다.
하지만 Multiprocessor는 위의 용어들과 다르다. 하나의 컴퓨터에 CPU(processor)가 여러 개 붙어있음을 의미한다. 하드웨어 적으로 다른 시스템.. 기본적으로 운영체제에서는 CPU가 하나 달린 범용 운영체제에 대해서 배운다. 여러개 달린 CPU는 병렬적으로 프로그램을 실행시키는지에 대해서 배운다.
운영체제의 예
UNIX
- 코드의 대부분을 C언어로 작성
- 유닉스 운영체제를 만들기 위해 아예 프로그램 언어를 새로 만들었는데 이게 바로 C언어(고급언어, 사람이 이해하기 편리한 언어)이다! C언어는 주로 유닉스를 만들 때 사용하고 지금은 시스템 소프트웨어를 만들 때 C언어를 사용한다.
- C언어는 고급언어이지만 기계어랑 가깝기도 하다. 1대1 매핑은 안되지만 하드웨어를 다루는게 기존의 고급언어와는 다르다.
- 높은 이식성
- 이식성이라는건 포터블리티하다, 하나의 컴퓨터에서 돌아가는 유닉스를 기계어 집합이 전혀 다른 컴퓨터에 이식하기가 쉽다는 것이다. 이식하기가 어려운 운영체제는? 그 컴퓨터 기계어에만 국한되게 만든 운영체제이다.
- 유닉스라는 운영체제는 대부분의 코드가 C언어로 작성되어있고 기계어와 독립적인 언어라 하나의 컴퓨터에서 돌아가는 유닉스를 다른 컴퓨터에서 돌리려면 C언어로 작성되어있어서 다른 컴퓨터에서 컴파일을 하면 되는 것이다.
- 최소한의 커널 구조
- 운영체제에 이런 기능 저런 기능 전부 다 집어넣어놓으면 기본적으로 메모리에 상당히 많은 부분을 차지할텐데, 그렇게 하지 않고 웬만한 기능들은 밖에 빼고 핵심적인 기능들만 커널에 넣은 구조라서 확장성이 높다.
- 복잡한 시스템에 맞게 확장 용이
- 소스 코드 공개
- 소스 코드가 공개되어 있어서 학술적으로 사용하기 좋다.
- 프로그램 개발에 용이
- 다양한 버전, ex) System V, FreeBSD, SunOS, Solaris, Linux
- Linux는 지금도 소스코드가 공개되어 있고 누구나 가져다가 자유롭게 사용할 수 있는 운영체제이다.
UNIX는 대형 컴퓨터, 여러 사용자들이 이용하기 위한 서버를 위한 운영체제이지만 Linux는 이것도 가능하지만 개인용 pc에설치해서 쓰기에도 상당히 좋다는 특징이 있다. 안드로이드에 기반한 스마트폰도 운영체제 커널은 리눅스 커널을 사용하고 있다.
DOS(Disk Operating System)
- MS사에서 1981년 IBM-PC를 위해 개발
- 단일 사용자용 운영체제, 메모리 관리 능력의 한계(주 기억 장치 : 640KB)
→ 누더기 같은 코드들로 만들어져서 DOS위에 윈도우를 실행하는게 가능해졌지만 윈도우가 독자적으로 만들어졌다..
Windows
- MS사의 다중 작업용 GUI 기반 운영 체제
- Plug and Play, 네트워크 환경 강화
- DOS용 응용 프로그램과 호환성 제공
- 불안정성(초창기엔 불안했음)
- 풍부한 지원 소프트웨어
Handheld device를 위한 OS
- PalmOS, Pocket PC, Tiny OS
운영체제의 구조..??
CPU ↔ Memory ↔ Disk, I/O Device
누구한테 CPU를 줄지? CPU 스케쥴링
우리가 일반적으로 생각하는 스케쥴링은 먼저온건 먼저처리하는 것이지만 이건 효율적이지 않다. 시간 차이를 완충해주면서 주어진 자원의 특성을 최대한 활용하는 관리방식이 필요하다.
ex) 은행에가서 번호표를 뽑으면 먼저 온 순서대로 처리해준다. 만약 업무가 한 시간씩 걸리는 업무라면 그 뒤에 번호표를 뽑은 사람은 굉장히 오래 기다려야 한다. 물론 직원들이 여러 명 있다면 괜찮겠지만 직원이 한 명이라면, CPU가 1개라면 아무리 키보드를 두들겨도 결과가 나오지 않는 것이다! → 굉장히 비효율적
CPU자체는 굉장히 빠른데, 빠른 자원을 효율적으로 사용해야 한다. 따라서, 짧은 시간동안 CPU를 줫다 뺏다 하는 반복과정이 필요하다. 이론적으로 CPU를 짧게 사용할 프로그램에게 주는게 효율적이다..
전체가 행복해질 수 있기 때문에!
CPU를 길게 쓰려는 프로그램에 주려면 응답 시간이 뒤에 기다리는 프로그램들은 오래 기다려야 함…
한정된 메모리를 어떻게 쪼개어 쓰지? 메모리 관리
메모리 공간은 한정되어 있는데 어떤 프로그램에 메모리를 어떻게 할당할 건지,, N분의 1로 나누는게 공평해보이지만 그렇지 않다. 메모리를 많이 쓰는 프로그램에 주는게 효율적이다.
프로그램이 많아지면 각각의 프로그램들이 갖는 메모리 공간들이 작아지기 때문에, 이렇게 되면 프로그램이 원활하게 실행이 안된다. CPU에서 어떤 프로그램이 실행이되려면, 최소한 실행에 필요한 부분은 메모리에 올라와 있어야 되는데 프로그램이 너무 많아서 메모리를 지나치게 조금씩 가지고 있으면 CPU에서 실행하려고 하면 메모리에 없고, 디스크에서 읽어와야 되는데 전체 시스템이 원할하게 실행이 안된다. 메모리에 너무 많은 프로그램을 동시에 올려놓는 것 보다는 CPU에서 원활하게 실행되게 하기 위해서 필요한 메모리 용량이 있다. 그 부분 만큼은 프로그램 하나가 그정도 메모리는 받을 수 있도록 지원해주자! → 워킹 셋 모델
일부 프로그램만 메모리 할당해주고 나머지 디스크로 쫓아내버려서 이미 올라가있는 프로그램만이라도 CPU에서 원활하게 실행되게 함.. 경우에 따라서 디스크 I/O를 하는 경우 쫓겨났던 친구들이 메모리에 올라가게.. 무조건 N분의 1로 나누는 것보다 그때그때 특정 프로그램에 몰아주는 것이다!
→ 항상 N분의 1로 쪼개는 것 만이 좋은 방법은 아니다!
어떤 걸 쫓아내야 하느냐? CPU에서 다시 사용할 확률이 높은 것들..은 쫓아내면 안된다. 미래에 사용할 것이 무엇인지 미리 알 수 있는 방법은 없고 미래를 예측하는 것이 필요하다.
ex) 과거에 도둑질을 한 경험이 있으면 미래에 도둑질을 할 확률이 높다..
메모리 관리도 마찬가지로 어떤 데이터가 메모리에 올라온 이후로 메모리에서 많이 사용이 됐으면 미래에도 많이 사용될 확률이 높겠구나 하고 메모리에서 쫓아내지 않는다. 사용횟수가 1번밖에 없으면 쫓아내면 되는 것이다.
디스크에 파일을 어떻게 보관하지? 파일 관리
조각조각 나눠 저장할지, 연속적으로 저장할지
디스크안에 있는 헤드가 움직이면서 데이터를 읽어야 해서 메모리와는 또 다르다. 디스크의 특성에 맞게 파일을 관리해야 함. 디스크도 스케쥴링이 필요하다! 디스크에 들어온 요청들을 먼저 들어온 순서대로 처리할 수도 있지만 헤드에 가까운 요청이 있다면 비록 나중에 들어왔더라도 먼저 처리하면서 헤드의 이동을 줄이면서 전체적인 성능을 높인다.
→ 엘리베이터 스케쥴링과 거의 유사하다. 100층 건물이 있는데 1층에 있는 사용자가 버튼을 누르고 100층사용자가 버튼을 누르고 2층에 있는 사용자가 버튼을 누르고, 99층에 있는 사용자가 버튼을 누르고… 먼저 누른사람 순으로 처리하지 않는다 1→100→2→99 로 처리하면 비효율적이다.
→ 디스크도 헤드가 이동하면서 중간에 요청이 들어온게 있으면 처리하면서 진행한다던지.. 이게 효율적이다. 스케쥴링이라는게 필요하다!!
CPU 스케쥴링/ Disk스케쥴링은 특징이 다르다.
CPU는 너무 빠르기 때문에 이걸 어떻게 관리해야 될 것인가? Disk는 헤드 자체가 움직이면서 처리해야 하기 때문에 움직임을 최소화하면서 어떻게 빨리 처리할 것인가?
우체부가 매일 배달을 하는데 담당 기사님이 꺼내보는 물건 순서대로 배달을 하는게 아닌, 매일 이동하는 순서를 정해놓고 움직인다. 적게 움직이면서 많이 배송할 수 있는.. 컴퓨터도 마찬가지이다.
각기 다른 입출력장치와 컴퓨터 간에 어떻게 정보를 주고 받게 하지? I/O Device
I/O Deivce를 어떻게 관리할 것인가? 이 장치들은 워낙 느리다.. CPU, 메모리에 비해.. 컴퓨터내부(CPU, Memory)와 I/O Device가 교신을 하면서 처리를 해야 하는데 워낙 장치들이 느려 정보를 주고 받는 건 어떻게 할 것이냐?!
→ 이를 입출력관리라고 한다. 기본적으로 인터럽트에 기반해서 관리하는데 인터럽트란 CPU는 워낙빠른장치이기 때문에 항상 자기 할 일을 하고 있다. I/O Device는 뭐하는지 관여하지 않음. 그러다가 I/O장치가 CPU에게 보고할 일이 있으면 인터럽트를 걸어서 CPU에게 알려주면 CPU는 다음 작업을 하기 전에 I/O Device가 나에게 요청한게 있구나..를 알고 CPU가 최대한 방해받지 않고 처리한다.
하드웨어뿐만 아니라 소프트웨어를 어떻게 관리할 것인가??
운영체제를 이해하는 가장 좋은 방법은 본인이 직접 운영체제라고 생각하고! 하드웨어를 어떻게 관리해야 할지 마치 한 나라의 대통령이 되서 모든 것을 통치하는 것처럼 생각하는 것이 중요하다! → 인간의 신체가 뇌의 통제를 받듯 컴퓨터 하드웨어는 운영체제의 통제를 받으며 그 운영체제는 사람이 프로그래밍 하는 것이다.

'Dev > OS' 카테고리의 다른 글
[OS] 운영체제 완전타파 - (2-2) (0) | 2022.06.20 |
---|---|
[OS] 운영체제 완전타파 - (2-1) (0) | 2022.06.18 |