Skip to main content Link Search Menu Expand Document (external link)

OS basic concept

basic OS

운영체제란?

일반적으로 알고있는 운영체제로서의 의미는 하드웨어에 설치되어 사용자 및 다른 application들을 연결해주는 역할을 한다.

여기서 이 연결해주는 역할이란 컴퓨터의 자원관리(메모리 관리, 프로세스 관리), 입출력, 파일 관리 등을 말한다.

운영체제하면 주로 나오는 용어들이 몇 가지 있는데 그 중 내가 제일 헷갈렸던 두 가지가

multi programming과 multi tasking이다.

두 용어의 단순한 의미는 다음과 같다.

Multiprogramming

  • 메모리에 여러 프로그램이 동시에 올라가는 방식
  • 프로세서가 입출력 작업의 종료를 대기할 동안 하나의 프로세서에서 다른 프로그램을 수행할 수 있도록 하는 것

Multitasking

  • 하나의 프로그램이 끝나기 전에 다른 프로그램이 시작 가능
  • 여러 개의 task를 시간 분할하여 수행하여 동시에 여러 task가 수행되고 있는 것처럼 작업하는 것

이렇게 봐서는 사실 무슨 개념인지 정확하게 와닿지 않았다.

그 중에 아래 블로그의 예시를 보고 이해했다.

https://baked-corn.tistory.com/3

Multiprogramming의 예로 어떤 프로그램이 중간에 파일을 읽어야 다음 코드로 넘어갈 수 있다면 CPU는 연산을 하다가 파일을 읽어와야 하는데 이 때 읽어오는 시간이 오래걸리는 경우 CPU는 파일을 모두 읽을 때까지 할일이 없어진다.

그래서 이 때 CPU가 다른 프로그램을 연산하는데 이용할 수 있도록 하는 기법을 multiprogramming이라고 한다.


프로세스와 쓰레드의 차이

https://mangkyu.tistory.com/92?category=761303

Process

프로세스는 메모리에 올라가서 실행되고 있는 프로그램의 단위? 인스턴스 라고 한다.

각각의 프로세스는 운영체제로부터 독립된 메모리 영역을 할당받아 다른 프로세스 자원에 접근할 수 없고 프로세스끼리 통신하기 위해 IPC를 사용해야 한다.

  • IPC : Inter-Process Communication, 커널에서 제공하는 프로세스 간 통신 기술

Thread

위 블로그에 잘 그려진 multithread process에 대한 그림이 있다.

쓰레드는 프로세스 내에서 stack을 할당 받고 각각의 쓰레드는 code, data, heap 영역을 공유한다.

이 말은 쓰레드끼리는 통신이 쉽고 자원 관리하기에 용이하다는 장점이 있다.

하지만 하나의 쓰레드가 문제가 생기면 전체 프로세스가 영향을 받는다.

여러 쓰레드가 하나의 자원에 동시에 접근하는 경우 자원 공유의 문제가 발생할 수 있다.


code, data, heap, stack영역은 메모리 공간을 표현하는 용어로서

low memory 코드 영역 부터 high memory 스택 영역으로 불린다.

http://www.tcpschool.com/c/c_memory_structure

위 블로그에 관련 그림과 함께 각 영역에 대한 설명이 있다.

공부를 위해 다시 한번 정리하면..

코드 영역

실행할 프로그램의 코드가 저장(기계어)되는 영역이다. 컴파일 타임에 결정되며 중간에 코드가 수정될 수 없도록 read-only로 지정되어 있다.

데이터 영역

코드에서 선언한 전역 변수 혹은 정적 변수(static) 등이 저장되는 공간이다. 전역변수 또는 static 변수 값을 참조한 코드는 컴파일 하고 나면 데이터 영역의 주소값을 가르키도록 한다. 전역변수는 변경 될 수도 있으므로 이 영역은 read-write로 지정되어 있다.

heap 영역

runtime에 결정되는 영역으로 사용자가 동적할당(ex. malloc)을 통해 heap 영역의 메모리를 사용할 수 있다.

heap 영역은 사용자가 할당 및 해제하는 메모리 영역이기 때문에 memory leak이 발생하지 않도록 메모리 관리가 필요하다.

stack 영역

지역 변수와 매개 변수 리턴값 등이 저장되는 영역으로 컴파일 타임에 크기가 결정된다. 저장되는 것들을 보면 알 수 있듯이 함수 호출과 관련된 메모리 영역으로 함수의 호출과 함께 할당되고 함수의 호출이 완료되면 소멸한다.

함수 호출에 할당이 되지만 크기는 컴파일 타임에 결정되기 때문에 재귀함수가 너무 깊게 호출되거나 함수가 너무 많은 지역 변수를 가지고 있는 경우 stack overflow 에러가 발생할 수 있다.


여담으로 이 자원 공유의 문제에 대해서 LINE에서 만든 개발자 유튜브에서 흥미로운 영상을 본적이 있다.

함수형 언어에 대한 내용이었는데 본인도 회사에서 erlang이라는 함수형 언어를 사용하고 있어서 무슨 내용일지 궁금해서 보게 되었다.

함수형 언어는 어떤 값을 함수를 실행해서 변환된 결과 값이 나오고 이를 연쇄적으로 호출해서 최종 결과를 유도한다고 한다.

사실 erlang을 처음 배울 때도 비슷한 코드를 봤다. 리스트의 재귀를 통해 반복문처럼 사용하는…

그리고 함수형 언어의 특징으로 변수가 한번 바인드되면 변경이 불가능 하다는 것인데(Immutablility) 이를 이용해서 multithread 환경에서 위와 같이 자원 공유 문제를 원천적으로 배제할 수 있다는 장점이 있다는 얘기를 하셨다.

현재 회사 업무에서는 테스트 코드 작성을 할 때 erlang을 사용하는데 이런 변경이 불가하다는 포인트를 이용해서 테스트 코드를 erlang으로 구현하는 건가… 하는 생각이 들었다.