1. 운영체제란?
  2. 프로세스 vs 스레드
  3. 멀티프로세스 vs 멀티스레드
  4. 프로세스의 Context Switch
  5. System call

운영체제란?

[간단하게]

프로그램을 시행하기 쉽도록 만들어주고 프로그램들이 메모리를 공유할 수 있도록 도와줍니다. 또한 프로그램들이 외부 장치들과 정보를 주고받을 수 있도록 도와주는 시스템 소프트웨어를 의미합니다.

[구체적으로]

프로그램은 하드웨어를 직접 사용할 수 없습니다. 이를 도와주는 시스템 소프트웨어가 OS 입니다. 즉 OS가 physical resource(hardware)를 가상화함으로써 프로그램들은 하드웨어의 복잡한 동작 방식라던가 문제들을 고려하지 않고 편하게 하드웨어 리소스를 사용할 수 있게 됩니다. 이때 프로그램이 하드웨어 리소스를 요청할 때 사용하는 것이 system call 이라고 합니다. 또한 OS는 cpu, memory, disk를 관리하고 여러개의 프로그램이 동시에 돌아가는 것을 가능하게 해줍니다.

프로세스 vs 스레드

[간단하게]

프로세스는 프로그램을 메모리 상에서 실행중인 작업을 의미하며 스레드는 프로세스 안에서 실행되는 여러 흐름 단위를 의미합니다.

[구체적으로]

프로세스란 메모리에 올라와 실행되고 있는 프로그램의 독립적인 개체를 의미합니다. 운영체제로부터 시스템 자원을 할당받는 작업의 단위라고 말하기도하며 CPU시간이나 주소 공간, 독립된 메모리 영역등을 할당받습니다. 기본적으로 최소 1개의 스레드를 가지고 별도의 주소공간에서 실행되어 다른 프로세스의 메모리에 쉽게 접근할 수 없습니다.
또한 스레드란 프로스세의 특정한 수행 경로를 의미하며 프로세스가 할당받은 자원을 이용하는 실행의 단위를 나타냅니다. 스레드는 프로세스 내에서 별도의 레지스터와 Stack을 갖고있지만 다른 영역은 프로세스와 공유하며 같은 프로세스 안 여러 스레드들과는 힙 공간을 공유합니다. 따라서 한 스레드가 프로세스 자원을 변경하면 다른 이웃 스레드도 그 변경 결과를 즉시 확인할 수 있습니다. 추가로 자바 스레드는 일반 스레드와 거의 차이가 없는데 JVM이 운영체제의 역할을 하여 전적으로 JVM에 의해 스케줄되는 실행 단위 코드 블록을 의미합니다. 즉, 개발자는 자바 스레드로 작동할 스레드 코드를 작성하고, 실행을 시작하도록 JVM에 요청하는 일을 하는 것입니다.

멀티프로세스 vs 멀티스레드

[간단하게]

멀티 프로세스는 프로그램을 여러개 키는 것을 의미하고 멀티 스레드는 하나의 프로그램 안에서 여러 작업을 해결하는 것을 의미합니다. 멀티 스레드를 사용하면 자원의 효율성 증대, 처리 비용 감소 및 응답시간 단축과 같은 장점을 가질 수 있습니다. 반면 동일한 자원에 동시에 접근할 수 있기 때문에 이 부분을 신경써줘야 합니다.

[구체적으로]

멀티프로세스란 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것을 의미하며 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 끼치지 않고 메모리 침범 문제가 OS 차원에서 해결되어 안전성이 높다는 장점을 가지지만, 반면 독립된 메모리 영역을 가지고 있어, 작업량이 많을 수록 오버헤드가 발생하며 Context Switching(프로세스의 상태 정보를 저장하고 복원하는 일련의 과정)으로 인하여 성능이 저하될 수 있다는 단점이 존재합니다.
멀티스레드란 하나의 응용 프로그램 내에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것을 의미하며 프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우 메모리가 공유되어 메모리 공간과 시스템 자원 소모가 줄어든다는 장점이 있습니다. 또한 스레드의 context switch는 프로세스의 것과 달리 캐시 메모리를 비울 필요가 없기 때문에 더 빠릅니다. 하지만 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 단점과 공유 메모리에 동시 접근이 가능하기 때문에 신경써줘야한다는 단점이 있습니다. 이러한 단점을 해결하기 위하여 동기화 작업을 통해 작업 처리 순서를 컨트롤 하고 공유 자원에 대한 접근을 컨트롤 해줍니다. 하지만 이로 인해 병목현상이 발생하여 성능이 저하될 가능성이 존재하긴합니다.

프로세스의 Context Switch

[간단하게]

CPU가 하나의 프로세스에서 다른 프로세스로 상태 정보를 바꾸는 것을 의미합니다.

[구체적으로]

Context swtiching은 빠른 속도로 task를 바꿔가며 실행하여 사람의 눈으로 보기엔 실시간으로 처리되는 것처럼 보이게 해주기 때문에 필요합니다. 이때 실행중인 A 프로세스의 상태 정보를 기록하고 실행할 B의 상태 정보를 복구하는 작업이 필요합니다. A의 정보를 PCB에 저장하고 다음 실행할 프로세스B의 register 값을 PCB에 복구합니다. 이러한 Context Swith는 scheduler가 결정합니다. Context Switching으로 인한 오버헤드는 하드웨어에 따라 달라지지만 성능에 큰 영향을 미치게 됩니다. 비용은 Process보다 thread가 적게들어 multithread의 장점이 되기도 합니다.

+PCB
Process Control Block
운영체제 안에서 프로세스를 정의하는 data structure로 프로세스를 정의하기 위한 모든 정보가 PCB에 속한다.

+Process State Queues
운영체제에서는 현재 시스템에 있는 모든 프로세스의 상태를 추적/관리 할 필요가 있는데 따라서 모든 프로세스의 상태를 저장하고 있는 queue를 가지고 있다.
-ready queue(or run queue) : 제일 중요. ready 상태(CPU 할당 받기 전)에 있는 프로세스의 PCB가 다 queue에 연결돼있음.
-wait queue: 특정 이벤트를 기다리는 프로세스의 리스트.
운영체제는 ready queue에서 프로세스를 하나 선택헤서 cpu를 할당해준다.

System call

[간단하게]

사용자 프로세스가 제한된 명령어를 수행하고 싶을 때 운영체제에게 대신 부탁을 할 때 사용하는 것을 말합니다.

[구체적으로]

프로세스가 cpu에서 효율적으로 동작하기 위해서는 direct execution이 필요합니다. 이는 운영체제를 거치지 않고 바로 cpu에서 동작할 수 있기 때문에 성능상으로는 좋지만 운영체제가 프로그램이 main에서 return할 때까지 이 프로세스를 제어할 수 없다는 단점이 있습니다. 즉 하드웨어 자원들을 요청한다던가 하는 것들을 중간에 운영체제가 적절히 처리 및 제한해줘야합니다. 따라서 user mode와 kernel mode 두가지로 나눠서 작동을 시킵니다. 일반 사용자 applicaition은 user mode에서 동작하기 때문에 자원들을 요청하는 것을 마음대로 할 수 없습니다. 이럴 때 system call을 통해 운영체제에게 대신 부탁을 해서 처리하게됩니다. 즉 kernel mode는 사용자 프로그램에게 제공해야하는 핵심 기능들을 system call을 통해 제공하게 되는것입니다. 더 나아가 system call을 수행하기 위해서는 trap이라는 명령어를 사용합니다. trap이라는 명령이 발생하면 일시정지하고 kernel mode로 변경되어 system call로 요청한 동작이 수행됩니다.

+trap
-trap table : 운영체제 안에 어떤 코드를 수행할거냐를 기록하고 있는 것 -trap handler : 각 trap에 따라 수행되어야할 코드들


study 준비

  • 소켓에 대해 설명하시오
  • 가상 메모리에 대해 설명하시오
    가상의 메모리로 하나의 메모리를 여러 개의 application이 동시에 사용할 수 있게 해주거나 물리 메모리보다 큰 프로그램을 실행 가능하게 해준다. 프로세스는 자신만의 private virtual address를 가지게 되는데 운영체제가 이를 중간에서 physical address로 바꿔준다. 이에 따라 응답시간은 유지되고, CPU 이용률과 처리율은 높아진다.
  • 힙 영역과 스택영역의 차이점
  • 프로세스 상태의 종류
    ready(프로세스가 실행될 준비를 모두 끝냈지만 cpu를 아직 할당받지 못한 상태), running(프로세스가 실행되고 있는 상태), blocked(다른 이유로 실행을 잠시 중단하고 있는 상태)
  • RAID란?

  • 교착상태(deadlock)의 개념과 교착상태가 일어나는 조건
    두 개 이상의 프로세스나 스레드가 서로 자원을 얻지 못해서 다음 처리를 하지 못하는 상태로 무한히 다음 자원을 기다리게 되는 상태를 말한다. 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생한다. 데드락이 발생하기 위해선 자원은 한번에 한 프로세스만 사용할 수 있으며, 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재해야한다. 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없고 프로세스의 집합에서 순환형태로 자원을 대기하고 있어야한다.
  • 선점 비선점 스케쥴링을 설명하고 각각 어떤것이 있는지
    선점 스케줄링은 OS가 CPU의 사용권을 선점할 수 있는 경우 강제로 회수하는것으로 Priority Scheduling, Round Robin, Multilevel-Queue와 같은것이 이에 해당한다. 비선점 스케줄링은 프로세스가 종료되거나 I/O등의 이벤트가 발생할때까지 실행을 보장해주고 기다린다. FCFS, SJF, HRN이 여기에 속한다.
  • 인터럽트가 무엇인지? 처리과정
    프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행중인 작업을 즉시 중단하고, 발생된 상황에 대한 우선 처리가 필요함을 CPU.에게 알리는 것을 의미한다. 인터럽트가 발생하면 현재 수행 중인 프로그램을 멈추고, 정보를 잠시 저장한 후 인터럽트 서비스 루틴으로 가서 처리한 뒤 다시 원래 작업으로 돌아오면된다.
  • ciritical section의 정의와 해결책
    여러 프로세스가 데이터를 공유하며 수행할 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 부분을 의미한다.

  • 메모리 단편화(Fragmentation)?
    프로세스들이 메모리에 적재되고 제거되는 일이 반복되다보면 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼의 작은 자유 공간들이 늘어나게 되는데 이것을 단편화라고한다. 외부 단편화는 물리 메모리에서 남은 공간들을 모두 합치면 충분한 공간이 되는 부분들이 분산되어 있을 때 발생하고 이것을 해소하기 위해 사용하는 공간을 한쪽으로 모아 자유 공간을 확보하는 압축하는 방법이 존재한다. 하지만 이는 작업효율이 좋지 않다. 내부 단편화는 프로세스가 사용하는 메모리 공간에 포함된 남은 부분이 존재하고, 이 현상을 내부 단편화라고 한다.
  • 스택을 스레드마다 독립적으로 할당하는 이유?
    스택은 함수호출 시 전달되는 인자, 되돌아갈 주소 값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당하는 것이다.
  • 자바) PC Registre를 스레드마다 독립적으로 할당하는 이유?
    PC값은 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다. 스레드는 CPU값을 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다.
  • 뮤텍스와 세마포어란?
    뮤텍스와 세마포어는 critical section 문제의 해결책으로 mutex lock은 동시에 공유 자원에 접근하는 것을 막기 위해 critical section에 진입하는 프로세스는 lock을 획득하고 critical section을 빠져나올 때, lock을 방출함으로써 동시에 접근이 되지 않도록 하는것을 말한다. 다중처리가 어려운 환경에서는 시간적인 효율성 측면에서 적용할 수 없다. 세마포어는 소프트웨어상에서 critical section 문제를 해결하기 위한 동기화 도구이다. counting/ binary semaphore가 존재하고 일반적으로 semaphore에서 cirtical section에 진입을 시도했지만 실패한 프로세스에 대해 block 시킨 후 critical section에 자리가 날 때 다시 깨우는 방식을 사용한다.

  • 동기 vs 비동기
    메소드를 실행시킴과 동시에 반환 값이 기대되는 경우를 동기라고 표현하고 그렇지 않은 경우를 비동기라고 표현한다. 동시에라는 말은 실행되었을 때 값이 반환되기 전까지는 blocking 되어있다는 것을 의미한다. 비동기의 경우, blocking 되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task를 위임하고 바로 다음 코드를 실행하기 때문에 기대된느 값이 바로 반환되지 않는다.
  • 페이지 폴트가 무엇인지? 어떻게 해야하는지
    현재 physical memory에 없는 page에 접근할 때 발생하는 exception이다. OS가 memory를 다시 읽어와 해결한다.
  • 요구 페이징(Demand) 무엇인지?
    프로그램 실행 시작 시에 프로그램 전체를 디스크에서 물리 메모리에 적재하는 대신, 초기에 필요한 것들만 적재하는 전력을 말하며 가상 메모리 시스템에서 많이 사용됨. 페이저가 프로세스 내의 개별 페이지를 관리하는데 페이저는 프로세스 실행에 실제 필요한 메모리로 읽어 옮으로써 사용되지 않을 페이지를 가져오는 시간과 메모리의 낭비를 줄일 수 있다.
  • starvation이란 무엇인지
    cpu가 계속
  • aging이란 무엇인지

  • 캐시의 지역성
    캐시 메모리는 속도가 빠른 장치와 느린 장치간의 속도 차에 따른 병목 현상을 줄이기 위한 범용 메모리이다. 이러한 역할을 수행하기 위해선 CPU가 어떤 데이터를 원할것인가를 어느 정도 예측할 수 있어야한다. 이때 적중률을 극대화하기 위해서 직역성의 원리를 사용하는데, 지역성은 대표적으로 시간 지역성과 공간 지역성으로 나뉜다. 시간지역성은 최근에 참조된 주소의 내용은 곧 다음에 다시 참조된다는 특성을 의미하고, 공간 지역성은 대부분의 실제 프로그램이 참조된 주소와 인접한 주소의 내용이 다시 참조되는 특성을 의미한다.
  • 사용자수준 스레드와 커널 수준 스레드에 대한 개념
    OS가 thread와 process를 관리하는 것이 kernel-level thread이고 OS는 thread의 개념을 모르고 user library에서 thread를 관리하는 것을 user-level thread라고 한다.