운영체제

코승호딩·2022년 10월 17일
0

운영체제

목록 보기
1/10
post-thumbnail

📌운영체제란

세상의 모든 자원이 유한한 것과 같이 컴퓨터 또한 메모리라는 유한한 자원을 가지고 있다.
따라서 사용자가 사용하는 많은 개수의 프로세스들이 실행될 때에 이를 엉키지 않고 시스템 자원을 효율적으로 이용하도록 중앙에서 스케줄을 관리하는 역할을 하는 것이 운영체제이다.

이 외에도 운영체제는 컴퓨터를 쉽게 사용할 수 있도록 해준다.
다음과 같은 일을 하는 소프트웨어를 우리는 운영체제라고 부른다.

  • 프로그램을 쉽게 실행(HW 관리)
  • 프로그램간 메모리 공동 사용(자원공유/분배)
  • 장치와 상호작용 기능을 제공(입출력)

이처럼 운영체제는 프로그램과 하드웨어 사이에 존재한다
CPU 설계시 프로그램이 하드웨어를 사용할 때 반드시 운영체제를 통하도록 한다.

운영체제는 크게 세가지 역할을 수행하는데 가상화 병행성 영속성이다.


📌가상화(Virtualization)

가상화란 쉽게 말해 운영체제가 여러개의 가상 CPU가 존재한다고 믿게 만드는 것이다.
현재 실행되고 있는 프로그램인 프로세스가 자신이 전체 CPU를 독점하고 있다고 생각하게 된다.
실제로는 컴퓨터에서는 여러 개의 프로세스가 돌아가며 실행되지만, 프로세스는 슬프게도 자신만 사용하고 있다고 생각한다.


시스템 콜(System call)

시스템 콜이란 운영체제의 기능을 사용자가 직접 다루기 위한 함수이다.
CPU나 디스크와 같은 임의의 하드웨어를 다루는 것은 매우 어렵고 위험한 일이다.
따라서 컴퓨터에 조예가 깊고 매우 명석한 두뇌를 가진 엔지니어들이 운영체제를 직접 조작할 수 있도록 시스템 콜이라는 함수를 만들었다.
fopen이나 fscanf와 같이 매우 쉽게 사용할 수 있도록 제공하는 간단한 표준 API이다.
Windows의 PowerShell에서 사용자가 미리 약속한 명령어 API를 사용하면 API는 운영체제를 직접 제어하는 함수 시스템 콜 호출한다.


자원 관리자(Resource Manager)

운영체제는 여러 개의 프로그램을 동시에 실행할 때 자원의 효율적인 배분과 공유, 재사용을 담당한다.
이를 위해서 CPU에서 사용자 프로그램의 직접적인 자원 접근을 막는다.
따라서 사용자는 여러 개의 프로세스를 무리 없이 실행할 수 있다.


메모리 가상화

프로그램을 16번 실행하였을 때의 결과


다음과 같이 여러 개의 프로세스를 실행해보자
CPU는 하나, 코어는 네개지만 16개의 프로그램이 동시에 실행된다.
이와 같이 프로그램이 여러 개가 실행될 때 서로의 간섭을 가상화를 통해 피할 수 있다.
앞서 말했듯이 프로그램은 모든 메모리를 자신이 전부 사용한다는 착각속에 실행이 된다.
다른 프로그램의 메모리를 볼 수도 없다.

프로그램을 여러 개를 수행하였을 때의 실제 결과


다음 그림과 같이 똑같은 주소를 가지고 있는 똑같은 프로그램을 여러 개를 실행하였을 때 다른 주소임을 보여주고 있다
이유는 윈도우의 발전으로 프로그램을 실행할 때마다 해킹의 방지를 위해 운영체제는 프로세스마다 주소를 바꾸게 된다.
따라서 프로그램은 서로에게 영향을 끼치지 않고, 모든 실행중인 프로그램은 각자 고유의 메모리를 갖고 있다.
같은 주소를 읽고 쓰지만 프로그램이 다르면 다른 메모리인 것이다.

각 프로스세스는 각자의 가상 주소 공간을 갖는다.

  • 운영체제가 가상 주소를 실제 주소로 mapping 한다.
  • 실행중인 프로그램이 메모리를 건드릴 때 다른 프로세스의 메모리에는 영향이 없다.
  • 실제 물리적인 메모리는 운영체제의 관리를 받는 공유 자원이다.

📌병행성(Parallelism)

병행성이란 여러 개의 프로세스 또는 스레드가 동시에 실행되는 시스템의 특성이다.

그런데 다음과 같이 두 개의 프로세스를 돌려 loop의 값 만큼 value가 증가시킬 때, 1000일 경우에는 정상으로 작동 하지만 loop의 개수가 많아 지면 이상한 값을 보여준다. 이처럼 공유하는 value의 값이 증가한다면 메모리에서 value값을 읽어 레지스터로 보내고, 레지스터에서 값을 증가 시키고, 이 값을 다시 value로 보내는데 여기서 각각의 명령어들은 원자적으로 수행되지 않는다. 따라서 병행성의 문제를 일으켜 이러한 결과를 나타내는 것이다.


📌영속성(Persistence)

RAM은 휘발성 메모리이기 때문에 컴퓨터의 전원이 꺼지게 된다면 현재 메모리에 있는 모든 데이터를 잃게 된다. 영구적이지 않은 데이터를 가지고 있으며 따라서 이를 위해 전원이 꺼지더라도 사라지지 않는, 데이터가 보존되기 위한 데이터를 저장할 수 있는 하드웨어와 소프트 웨어가 필요하다.
이를 가능하게 해주는 것이 하드디스크나 SSD와 같은 비휘발성 하드웨어이다.
소프트 웨어는 사용자가 생성한 파일들을 관리하기 위한 파일 시스템이다. 이 파일 시스템의 모든 작업은 운영체제가 한다.

데이터를 디스크에 쓰거나 읽기 위해서는 운영체제에서 새 데이터가 들어갈 적절한 위치를 디스크에서 찾는다. 그리고 저장장치에 IO요청을 하고 사용자가 원하는 데이터를 디스크로부터 읽거나 디스크에 쓸 수 있게 한다. ex) open(), write()
이 과정에서 파일이 겹쳐지는 것을 막아야 하고, 안정성을 해결해줘야 한다. 예를 들어 전원이 나갔을 경우 데이터가 날라가거나 깨지는 것을 막아주는 것
이러한 일들은 운영체제가 저널링이나 쓰기 시 복사, 쓰기 순서 조정 등의 방법으로 해결해줘야 한다.


📌운영체제 설계 목표

운영체제는 지나친 가상화를 하면 안된다.
설계 시 오버헤드를 최소화 하여야 한다.
특정 프로그램의 오동작이 다른 프로그램이나 OS에 피해를 입히지 않도록 보호해야 한다.
OS는 죽지 않도록 신뢰성을 주어야 한다.
절전 모드나 기기에 따른 동작 등 에너지 효율성, 보안, 이동성 등을 제공해야 한다.
다음 장 부터는 가상화에 대하여 자세히 알아보자

profile
코딩 초보 승호입니다.

0개의 댓글