컴퓨터기본/운영체제 기본

[OS] 3. 운영체제 구조

차가운오미자 2021. 6. 14. 22:28

 

* 아래의 강의 내용을 정리한 것임.

https://www.youtube.com/watch?v=ATAQnyOSuH0&list=PLl7a4hCkdyMCPNT-3U3fzyb6FEBCS0Ddm&index=4

 

 

Multiprogramming

멀티 프로그래밍을 통해서 CPU를 100% 사용하게 된다고 하더라도 여전히 사용자가 개입할 수 없다는 단점이 남아있음.

 

하나의 job만 돌아가면 공평성 측면에서 좋지 않음. 이 문제는 job scheduling을 잘한다고 해결되지 않는다.

* job scheduling: 여러 프로세스 중에 어떤 것을 선택해서 실행할 것이냐를 정함.

그래서 생긴 게 time sharing

 

Time sharing

어떤 job이 CPU를 사용하고 있음, 그럼 한 job이 CPU를 사용할 수 있는 시간을 정해놓고, 이 시간이 지나면 IO를 안하더라도 다른 job에게 CPU를 넘긴다. inviolent 한 것.

아무리 나중에 들어오거나, 중요하지 않은 프로세스라도 특정 시간이 지나면 실행할 수 있다는 것, 공평성이 보장된다는 것이 time sharing의 아이디어이다.

time slice라는 시간을 운영체제가 정해놓는다. time slice가 지나면 프로세스는 CPU를 뺏긴다. 이걸 컨트롤 하는 것이 OS 커널. 그리고 이러한 동작을 CPU switching이라고 함. 혹은 Context switching

 

time slice는 세월이 지나면서 점점 짧아짐. CPU가 빨라지니까

 

Multitasking

- job -> task, 거의 동의어로 봐도 무방.

- 여러 태스크들이 CPU같은 컴퓨터 자원을 공유하도록 하는 것.

- 이전까지는 concurrent하게 job/task들이 수행되었다.

- 사용자가 여러개의 프로그램을 사용하게 하며, 유휴상태일 때는 백그라운드를 실행하게 한다. 여러 task가 concurrent하게 수행되는 것을 multitasking이라고 한다.

- 같은 프로그램을 여러 개의 job으로 나누어 수행할 수 있다. (fork 등의 개념 생각)

- 메모리관리: 여러 프로그램이 메모리에 있어서 이를 관리하고, 보호할 필요가 있음. 다른 task가 다른 task를 공격하지 못하도록. 이걸 해내는 것이 핵심

- 적절한 응답시간을 보장해야

- 필요에 따라 orderly execution을 해야함.

ex) 메모장 사용시에 버전 관리를 잘못하면, 옛날 버전이 새 버전을 덮어쓰는 일이 발생한다.

그래서 순서를 잘 지키는 것이 중요하다. -> 동기화와 deadlock 처리

 

* multitasking과 multiprogramming의 차이?

>> multitasking은 multiprogramming을 의미할 수도 있고, time sharing을 뜻할 수도 있음. 굉장히 넓은 의미를 지닌 단어이다. 그래서 두 개를 엄밀히 나누기 어렵다. 일단 이렇게 이해하고 있는 것이 좋음.

multiprogramming은 time sharing 없이 수행하는 것으로 일단 이해.

time sharing은 multiprogramming에 time slice를 두는 것으로 이해. multiprogramming의 발전형

 

* time slice는 고정적인가?

>> 요즘에는 time quamtum을 상수로 두지 않고, os에 어떤 프로그램이 돌아가냐 등을 다 고려해서 바뀐다.

 

*  IO한 시간도 내가 사용한 time slice에 포함이 되는가?

예를 들어 time slice가 10ms 라 할때, 중간에 IO를 한다. 그럼 이 IO한 시간도 내가 사용한 time slice에 포함이 되는가? 다시 말해, 2ms 사용하고 IO해야해서 떠났다. 그럼 다시 CPU를 사용하고자 할 때 얘는 8ms 가 부여되는가 아니면 초기화되어서 10ms를 사용할 수 있는가?

>> 디자인의 문제. 공평성의 측면에서 8ms를 사용해야 다른 애들이랑 공평하지 않을까 할 수 있지만, 만약 그 공평성이라는 것을 얘가 IO가 끝난 후 시점부터 판단한다면 10ms를 주는 것이 공평할 수도 있다.

 

* OS 발전 과정/종류

  • 멀틱스 - 실제 구현에 실패함.
  • 유닉스(1970's, Bell lab) 실제 구현된 OS. > Linux / Mac
  • BSD: unix가 기업에서 만든 os인데, 라이센스 문제가 생기면서 BSD라는 것을 만들어서, 이를 무료로 배포하기 시작한다. Berkeley Software Distribution의 약자.
  • Windows: MSDOS 라고 처음에 PC에 들어가던 윈도우가 생겨남.
  • VMS: DEC이라는 컴퓨터 회사에서 만든 VAX컴퓨터용 운영체제

아래 사이트에 운영체제의 역사에 대해 꽤 자세히 다루고 있다.

https://smsinfo.tistory.com/512

 

* LAN 과 Bus의 차이 (순전히 내 생각임!)
  • LAN: 가까운 지역을 네트워크로 이어 하나로 묶은 근거리 통신망. LAN의 구성방식으로 star, bust, ring,혀 읃ㅇ이 존재한다.
  • Bus: 네트워크 혹은 연결 방식 중의 하나로 이해해야 할듯. 하나의 회선에 여러 대를 연결한 것. 예를 들어 컴퓨터 안에서 IO디바이스, CPU, 메모리 같은게 bus로 연결되어 있거나 네트워크를 구성할 때 여러 대의 컴퓨터를 한 회선 안에 연결해서 그 회선을 이용해 서로 통신할 수 있게 해주는 것 같은?

운영체제의 구조

운영체제의 코드량은 어마어마하기 때문에 comment 를 많이 넣어주고, 변수명도 최대한 자세하게 지정해줘야 함. 그리고 설계를 잘해야함 (다른 코드짤 때도 마찬가지)

 

운영체제의 abstraction 에 중요한 것: mechanism & policy

- mechanism: 어떻게 할 것이냐를 정의

- policy: 무엇을 할 것이냐를 정의

- 이 두 가지를 분리시키는 것도 중요

 

Layering

프로그램을 정의가 잘 되어 있는 함수들로 구분하는 것

- layer a, b, c 가 각각 뭘 하는지를 잘 정의하는 것이 중요하고, 레이어가 어떻게 데이터를 주고 받는 지(input과 out에 대한 정의) 그리고 인접한 레이어끼리만 접근할 수 있도록 하기.

- 이렇게 함으로써 예를 들어 b를 살짝 바꿨을 때도 a와 c 레이어는 영향받지 않도록 한다. 즉, 전역변수를 사용하지 않는다. 각 레이어별로 지역변수를 사용해야 함.

- 디버깅이 용이해짐

- 대표적인 예시: 네트워크 (TCP/IP)

- 커널도 일정 부분 레이어링이 되어 있음.

- overhead 발생: a -> c로 바로 가도 될텐데, 꼭 b를 거쳐야 하네? (performance와의 trade-off)

- modularity: overhead를 고려해서, 적당히 layering에서 타협을 본 것. 레이어링을 모듈 두 개를 독립적으로 만들어 놓은 것이라고 생각하면 됨. 그리고 레이어를 좀더 수직적이고 순차적인 것으로 이해하면 됨. 모듈은 그냥 아예 하나를 걷어내고 다른 모듈을 넣어도 되느냐? 하면 세모. 중간 정도.

 

'컴퓨터기본 > 운영체제 기본' 카테고리의 다른 글

[OS] 4. 운영체제 구조(2)  (0) 2021.06.14
[OS] 2. OS란? ~ 컴퓨터 역사  (0) 2021.06.14
[OS] 1. 개요  (0) 2021.06.14