본문 바로가기

CS

Ch2. Operating System Overview (1/3)

Operating System

운영체제는 사용자가 컴퓨터를 사용하기 위해 필요한 소프트웨어이다. 우리가 일반적으로 컴퓨터를 사용하면서 실행한 모든 프로그램들은 운영체제에서 관리하고 제어한다. 

 

운영체제의 역할을 크게 2가지로 나눈다면 GUI(Graphical User Interface), Resource Utilization으로 나눌 수 있다.

 

  • A program that controls the execution of application programs
  • An interface between applications and hardware

 

Computer Hardware and Software Structure

OS는 프로그램과 하드웨어 사이에서, 프로그램의 실행을 위한 환경을 제공한다. 

 

운영체제의 목적

  • UI (User Interface)
  • Program execution: 시스템은 프로그램을 메모리에 로드하고, 실행하고, 실행을 끝낼 수 있어야한다.
  • Access I/O devices: OS는 효율과 보안을 위해 사용자가 직접 입출력 장치를 조작하지 않고, OS를 거치도록 한다.
  • File-System manipulation: 파일 읽기,쓰기,생성,삭제,검색 + 사용자가 특정 파일에 접근하는 것을 막기도 한다.
  • Communications: 프로세스끼리 정보를 교환. Shared Memory (여러 프로세스가 메모리의 한 부분을 공유), Message passing(프로세스 간에 message(정보)를 주고 받는 것) 
    • Message passing이 shared memory 보다 느림
  • Error detection and response: OS는 하드웨어 수준에서 발생하는 에러, 소프트웨어 수준에서 발생하는 에러를 탐지하고 적절하게 반응할 수 있어야한다.
  • Accounting: 여러 사용자의 사용량을 정확히 개산

 

운영체제의 주 목적은 컴퓨터의 하드웨어(CPU, 메모리, 디스크, 키보드, 마우스, 모니터, 네트워크)를 관리하는 것이다. 운영체제가 없다고 생각해보자. 컴퓨터의 하드웨어에서 발생하는 일을 사용자가 모두 관리해야한다. 말이안된다. 지금 현재 컴퓨터를 사용하는 시점에서 우리는 컴퓨터의 하드웨어와 관련된 내용을 아예 몰라도 된다. 티비를 킬 때 티비리모컨의 작동 구현을 몰라도 티비를 킬수 있다. 이 말은 운영체제는 일종의 인터페이스라고 해석할 수 있다.

 

운영체제의 발전

새로운 타입의 하드웨어의 등장, 하드웨어의 업그레이드, 새로운 서비스의등장 등으로 OS는 끊임없이 진화합니다. 

 

1. Serial Processing (1940 ~ 1950) 

  • 컴퓨터가 진공관으로 이루어져 있었다.
  • punched cards와 tape로 입력을 받았다.
  • 운영체제가 없었다. 즉 프로그램은 컴퓨터 하드웨어와 직접 소통했다. (사람이 카드를 로드하여 프로그램을 실행)
  • lights와 프린터로 display
  • 순차적으로만 처리 가능
  • 프로그램을 짜고 컴파일러를 올리고 (이 때 동안 하드웨어 wait).
  • 컴파일러 한번 올렸을 때 같은 프로그램들 다 컴파일 하고 싶음.  -> Batch processing 등장

2. Simple Batch Systems

  • 옛날에 컴퓨터는 매우 비쌌기 때문에 processor utilization을 높이는 것은 매우 중요했다.
  • 하드웨어의 waiting time을 적게하기위해 한 언어의 컴파일러를 올렸을 때 같은 언어의 프로그램 다 갔다가 올려서 한번에 실행함.
  • 속성이 유사한 작업을 batch 처리하여 Setup time을 단축시킴
  • Monitor 프로그램
    • 항상 메인 메모리에 상주하고 있어야한다. (Resident monitor)
    • tape boundary에서 한번에 하나씩 job을 읽을 수 있다. (queue)
    • 모니터를 위한 메모리 보호가 필요함 (프로그램이 실행되는 동안 다른 Job들이 모니터에 접근하지 못하게 보호)
    • 특권이 있는 명령어가 필요하다. (사용자 프로그램이 I/O를 수행하고자 할 경우, 모니터가 이에 대한 작업을 수행하도록 요청할 수 있는 명령어가 필요하다.)
    • 하나의 프로그램 시작과 하나의 프로그램 끝을 catch
  • 자동으로 작업 순서를 정해도 I/O디바이스가 프로세서와 비교했을 때 너무 느림
  • CPU is often Idle (Synchronous I/O와 CPU는 겹칠 수 없기 때문). single Job 처리만 가능해서 기다릴 수 밖에 없다.

 

3. Multiprogrammed Batch System

  • Uniprogramming에서는 프로세서는 I/O 과정을 기다린다 -> 이는 낭비다. 
  • Multiprogramming에서는 I/O과정이 필요하면 다른 Job으로 switch한다. 

문제는 다수의 job들이 메모리에 올라와서 프로그램의 시작위치가 바뀐다는 것이다. 우리는 실제로 어떤 다른 프로그램이 메인 메모리에 상주할지 모르는데, 프로세서의 활용을 극대화하려면 swap area를 통해 프로세서의 utilization을 극대화해야한다.

 

4. Time Sharing System

 

여러 사용자들에게 CPU를 나눠준다.

  • Multiple users simultaneously access the system through terminals, with the OS interleaving the execution of each user program in a short burst or quantum of computation
  • processor time을 multi user가 공유
  • Batch Multiprogramming의 목적은 프로세서의 사용을 극대화하고 JCL을 사용하는 것이지만 Time Sharing은 응답시간을 줄이고 터미널을 사용하는 것이다.
  • data를 지키기 위해 file system 등장

 

Process

In computing, a process is the instance of a computer program that is being executed by one or many threads.

 

각 프로세스는 최소 1개의 스레드를 갖는다.

 

우리가 흔히 말하는 프로그램이 실행되면 프로세스 인스턴스가 생성된다. 인스턴스가 생성된다는 의미는 프로그램 실행에 필요한 내용이 컴퓨터 메모리(Ram)에 적재된다는 뜻이다. 

 

멀티태스킹이란 OS를 통해 CPU가 작업하는데 필요한 자원(시간)을 프로세스 또는 스레드간에 나누는 행위를 말한다. 이를 통해 여러 응용 프로그램을 동시에 열고 작업 할 수 있다는 장점이 있다.

 

 

Context Switching: Context Switching이란 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다.

 

PCB와 프로세스 상태

프로세스 제어 블록(Process Control Block)은 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영체제 커널의 자료 구조이다. 

 

실행중인 프로세스를 Context Switching할 때 기존 상태를 저장할 필요가 있는데 이를 PCB에 저장한다. PCB에 저장하는 정보는 다음과 같다.

  • 프로세스 식별자(PID)
  • 프로세스 상태(Process State)
  • 프로그램 계수기(Program Counter)
  • CPU 레지스터 및 일반 레지스터
  • CPU 스케줄링 정보
  • 메모리 관리 정보
  • 프로세스 계정 정보
  • 입출력 상태 정보

 

 

프로세스는 다음과 같은 생명 주기를 갖는다.

 

  • new: 프로세스가 생성되는 상태
  • ready: 프로세스가 CPU에 할당되어, 처리되기를 기다리는 상태
  • running: 프로세스가 CPU에 할당되어, 명령어들이 실행되는 상태
  • waiting: 어떤 이벤트의 발생으로 인해 프로세스가 기다리는 상태
  • terminated: 프로세스가 종료되는 상태

 

Context Switching 또한 메모리에 I/O를 하는 작업이기 때문에 실행되는 프로세스의 수가 많거나, Context Switching의 빈번한 발생은 Overhead를 발생시켜 성능 저하의 결과를 가져온다.

 

한 프로세스에는 각각의 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다. 

 

  • Code 영역: 실행할 프로그램의 코드 및 매크로 상수가 기계어로 저장되는 영역이다. CPU는 코드영역에 저장된 명령어를 하나씩 처리한다.
  • Data 영역: 데이터 영역은 코드에서 선언한 전역 변수와 정적(static)변수가 저장되는 영역이다. 데이터 영역은 프로그램의 시작과 함께 할당되어 종료될 때 소멸된다.
  • Stack영역: 스택 영역은 함수 안에서 선언된 지역변수, 매개변수, 리턴값등이 저장되고 함수 호출시 기록하고 종료되면 제거된다. 스택이라는 자료구조 명칭에서도 알 수 있듯이 후위선출(LIFO)메커니즘을 따른다. 흔히 재귀함수를 통해 많은 함수를 호출하면 스택 영역이 초과하면서 Stack Overflow에러가 발생한다.
  • Heap영역: 힙 영역은 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 공간(Free Space)이다. 이 공간은 동적 메모리 할당 공간이므로 사용이 끝나면 운영체제가 쓸 수 있도록 반납해야한다. 프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 데이터 또는 스택과 같은 정적 메모리 할당과는 대조적이다. 동적 메모리 할당은 어느 시점에 어느 정도의 공간을 할당할 수 있을지 정확하게 예측할 수 없으므로, 런타임에 확인가능하다.

각 프로세스는 별도의 공간에서 실행되기 때문에, 한프로세스에서 다른 프로세스의 메모리 영역에 접근할 수 없다. 만약 프로세스가 다른 프로세스 자원에 접근하려면 IPC(Inter-Process Communication)을 사용해야한다.

 

IPC란 운영체제 상에서 실행중인 프로세스 간에 정보를 주고 받는 것을 말한다. 프로세스는 자신에게 할당된 메모리 내의 정보만 접근할 수 있는데, 이는 안전성을 위해 운영체제에서 자기 프로세스의 메모리만 접근하도록 강제하고 있다는 것이다.

 

IPC의 종류로는 메일슬롯, 파이스, 소켓, 시그널, 공유메모리등이있다. 

 

Thread

In computer science, a thread of execution is the smallest sequence of prgrammed instructions that can be managed independently by a scheduler, which is typically a part of the operating system.

 

컴퓨터 분야에서 실행되는 스레드는 일반적으로 운영체제의 일부인 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 시퀀스이다.

 

스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 하나의 애플리케이션(프로그램)은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다. 즉 프로세스를 생성하면 기본적으로 하나의 (메인)스레드가 생성되는 셈이다.

 

Process와 Thread 비교

 

프로세스는 실행될 때 운영체제로부터 각각 독립된 메모리 영역을 할당 받는다. 스레드는 한 프로세스 내에서 동작되는 흐름으로 프로세스 내에서 Stack영역만 별도로 할당을 받고, 부모 프로세스의 Code, Data, Heap영역은 공유한다. 즉, 프로세스내에서 자식 스레드들은 주소 공간이나 자원들을 공유하면서 실행된다. 

 

Multi Process, Multi Thread

먼저 Multi Process란, 

 

  • 하나의 응용 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업(Task)을 처리하도록 하는 것이다.
  • 대표적으로 크롬 브라우저를 들 수 있다.
  • 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용된다.
  • 독립된 구조로 안정성이 매우 높다.
  • 독립된 구조이다보니 작업량이 많을 시 오버헤드가 발생해 시스템 성능에 영향을 끼칠 가능성이 있다.
  • 프로세스간 통신으로 IPC를 사용한다.
  • 스케줄링에 따른 Context Switching이 많아진다.

 

Multi Process

 

 

멀티 스레드란,

 

  • 하나의 프로세스에 여러개의 스레드로 자원을 공유하며 작업을 나누어 수행하는 것이다.
  • 시스템 자원 소모 감소, 시스템 처리율 향상, 프로그램 응답 시간 단축의 장점이 있다.
  • 하지만 자원 공유 시 동기화 문제 발생 가능성이 있고, 설계와 디버깅이 난해하다. 또한 하나의 프로세스에 문제가 생기면 전체가 영향을 받는다는 단점이 있다.
  • 응답성이 좋다. 프로그램의 일부분 (자식 스레드)이 오류 또는 긴 작업으로 중단되어도 프로그램이 계속 수행
  • 자원 공유가 쉽다. 스레드들은 부모 프로세스의 자원과 메모리를 공유한다.
  • 프로세스 할당보다 스레드 할당이 비용이 더 적다.
  • 교착상태 발생 가능성에 주의
  • 자식 스레드 중 하나에 문제가 생긴 경우 전체 프로세스에 영향을 줄 수 있다.

 

일반적으로 멀티스레드르 사용하는 이유는 사용자와 상호작용하는 애플리케이션에서 단일 스레드로 Network 또는 DB 와 같은 긴 작업(Long-running task) 을 수행하는 경우 해당 작업을 처리하는 동안 사용자와 상호작용이 불능인 상태가 될 수 있기 때문이다.

 

 

멀티 스레드는 멀티 프로세스에 비해 상당한 이점을 가지는 반면 위험 부담도 따른다. 

  • 자원의 효율성 증대: 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우 프로세스를 생성하여 자원을 할당하는 비용이 적고, 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
  • 응답 처리 시간 단축 및 처리 비용 감소: 프로세스간 IPC를 사용하여 통신하는 것은 상대적으로 비용이 크다. 하지만 스레드는 프로세스의 메모리 영역을 공유하여 스레드 간의 통신 비용이 적게 든다. 또한 프로세스간의 Context Switching은 느린 반면 쓰레드간의 Context Switching 은 빠른데, 그 이유는 Context Switching 시 스레드는 Stack 영역만 처리하면 되기 때문이다.
  • 멀티 스레드의 안정성 문제: 여러 개의 스레드가 동일한 데이터 공간(Critical Section)을 공유하면서 이들을 수정한다는 점에 필연적으로 생기는 문제이다. 멀티 프로세스의 프로그램은 문제가 생기면 해당 프로세스가 중단되거나 중단 시키고 다시 시작 하면된다. 하지만 멀티 스레드 방식의 프로그램에서는 하나의 스레드가 자신이 사용하던 데이터 공간을 망가뜨린다면, 해당 데이터 공간을 공유하는 모든 스레드를 망가뜨릴 수 있다.

Critical Section: 임계 구역(critical section) 또는 공유변수 영역은 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부를 말한다.

 

 

교수님 Talk.

  • 멀티 프로그래밍 기법이 등장하면서 Memory Management가 중요해졌다. 
  • 메모리에 여러개의 프로세스가 올라가게되고 그 프로세스들이 위치하는 메모리를 잘 관리하는. 이게 OS의 핵심 아이디어이다. 
  • OS의 핵심아이디어는 Process Management, Memory Management에 있다.

'CS' 카테고리의 다른 글

Ch12. File Management  (0) 2022.06.09
Ch2. Operating System Overview (3/3)  (0) 2022.06.07
Ch2. Operating System Overview (2/3)  (0) 2022.06.05
Ch1. Computer System Overview  (0) 2022.06.04
RAID  (0) 2022.05.30