[컴퓨터공학] 운영체제, 프로세스, 스레드

yooni·2022년 2월 21일
0
post-thumbnail

📌 Main References
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://zangzangs.tistory.com/128



1. 운영체제 (Operating System)

사용자가 하드웨어를 사용하기 위해 필요한 소프트웨어로. 컴퓨터로 실행하는 모든 프로그램들은 운영체제에서 관리하고 제어한다.
(Windows, Mac OS, Linux, Unix ...)


1-1. 운영체제 목적

✔️ 시스템 자원 관리

운영체제는 응용 프로그램이 하드웨어에게 일을 시킬 수 있도록 돕고, 자원을 효율적으로 사용할 수 있게 한다.

  • 프로세스 관리 (CPU)
  • 메모리 관리 (RAM)
  • I/O 관리 (디스크, 네트워크)

✔️ 응용 프로그램 관리

응용 프로그램이 실행되고, 시스템 자원을 사용할 수 있도록 권한과 사용자를 관리한다. 따라서 프로그램은 하드웨어 자원을 직접적으로 사용하지 않고 운영체제가 제공하는 자원만을 사용할 수 있다.


1-2. 운영체제 구성

크게 커널과 명령어 해석기로 나뉜다.

  • 커널
    운영체제가 수행하는 모든 것이 저장되어 있다.

  • 명령어 해석기
    사용자가 커널에 요청하는 명령어를 해석하여 커널에 요청하고 결과를 출력한다.
    (사용자는 GUI/CLI와 같은 방식으로 운영체제에 명령을 요청할 수 있다.)


2. 프로그램 (Program)

  • 운영체제를 통해 컴퓨터에게 어떤 일을 시키는 것
  • 운영체제로부터 컴퓨터를 조작할 수 있는 권한을 부여받은 후, 운영체제가 제공하는 기능을 이용할 수 있다.
  • 마치 server-client 관계 처럼, 운영체제 역시 응용프로그램을 위한 API(System Call)을 제공한다.

📞 시스템 콜 (System call)
응용 프로그램이 시스템 자원을 사용할 수 있도록, 운영체제 차원에서 다양한 함수를 제공하는 것


3. 프로세스 (Process)

  • 운영체제에서 실행중인 하나의 어플리케이션
  • 메모리에 올라와 실행되고 있는 컴퓨터 프로그램 / 운영체제로부터 시스템 자원을 할당받는 작업의 단위

  • 각 프로세스가 운영체제로부터 할당받는 시스템 자원
    ✔️ CPU 시간
    ✔️ 운영에 필요한 별도의 주소 공간
    ✔️ Code/Data/Stack/Heap 구조로 되어 있는 독립된 메모리 영역

  • 기본적으로 프로세스당 최소 1개의 메인 스레드를 가지고 있다.

  • 각 프로세스들은 다른 프로세스의 변수/자료구조에 접근할 수 없으며, 다른 프로세스의 자원에 접근하려면 IPC, inter-process-communication 등의 통신을 사용해야 한다.
    (Ex. 파이프, 파일 소켓 ...)


4. 스레드 (Thread)

  • 코드가 실행되는 하나의 흐름
  • 프로세스가 할당받은 자원을 이용하는 실행의 단위

  • 프로세스 내의 각각의 스레드는 각각의 Stack을 따로 할당받으며, Code/Data/Heap 영역을 공유한다.

  • 따라서 어떤 스레드가 프로세스 자원을 변경하면, 이웃 스레드들이 변경 결과를 볼 수 있다.


5. 멀티 태스킹

📚 멀티 태스킹
운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법이다. 쉽게 말해 두 가지 이상의 작업을 동시에 처리하는 것으로 멀티 프로세스 혹은 멀티 스레드를 의미한다.


5-1. Context Switching

🔁 Context Switching - CPU에서 여러 task(process, thread)를 돌아가며 작업을 처리하는 과정

  • 동작 중인 task는 대기로 넘어가면서 해당 task의 Context를 보관하고, 대기하고 있던 다음 task가 동작을 시작하면서 이전에 보관했던 Context를 복구한다.
  • multi process의 경우, Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 시간이 많이 소요되기 때문에 오버헤드가 발생하기 쉽다.

🔍 Concurrent (Single-Core) vs Parallel (Multi-Core)

멀티 스레드를 동작하는 두 가지 방식

  • Concurrent (동시성/병행성)
    싱글 코어 환경에서 여러 개의 스레드가 시분할 방식으로 동시에 수행되는 것 처럼 보인다. 이 때 Context Switching이 발생한다.

  • Parallelisma (병렬성)
    멀티 코어 환경에서 여러 개의 스레드가 실제로 동시에 수행된다.


5-2. 멀티 스레드 vs 멀티 프로세스

멀티 스레드
하나의 애플리케이션 내부에서의 멀티 태스킹

  • 하나의 응용프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리하도록 하는 것
  • 대표적 멀티 스레드 응용 프로그램 : 웹서버

멀티 프로세스로 처리하던 일을 멀티 스레드로 구현할 경우, 공유 자원(전역 변수, Heap)을 이용하기 때문에 멀티 프로세스처럼 프로세스마다 자원을 할당하는 시스템 콜을 자주 할 필요가 없어 자원을 효율적으로 관리할 수 있다. 또한 프로세스간 통신보다 스레드간 통신의 비용이 적고 응답 시간이 단축된다.

하지만, 자원을 공유한다는 점 때문에 동기화 문제와 충돌 문제가 발생할 수 있으며 하나의 스레드에 문제가 생기면 전체 프로세스에서 영향을 받는다.


5-3. DeadLock, Mutex, Semaphore

💢 DeadLock (교착상태)

두 개 이상의 스레드(혹은 프로세스)가 서로 끝나기를 기다리고 있는 상태, 각 스레드가 자원을 하나씩 hold하고 있으면서 상대방이 가진 자원을 원하며 기다리고 있어서 어떠한 작업도 실행되지 못하고 무한정 대기한다.

📌 식사하는 철학자 문제
https://namu.wiki/w/%EC%8B%9D%EC%82%AC%ED%95%98%EB%8A%94%20%EC%B2%A0%ED%95%99%EC%9E%90%20%EB%AC%B8%EC%A0%9C


🔍 교착 상태 발생 조건 (상호 배제 / 점유 대기 / 비선점 / 순환 대기)

  • 상호 배제 : 사용 중인 자원을 다른 스레드가 사용하기 위해서는 사용중인 자원에 해제될 때까지 기다려야 한다.
  • 점유 대기 : 자원을 최소한 하나 보유하고 다른 프로세스에 할당되어 사용중인 자원을 점유하기 위해 기다려야 한다.
  • 비선점 : 이미 할당되어 사용중인 자원을 다른 프로세스가 선점할 수 없다.
  • 순환 대기 : 대기 프로세스의 집합이 순환 형태로 자원을 사용하기 위해 대기하고 있어야 한다.

이 중 상호 배제 조건을 해결하기 위한 프로세스 동기화 기법으로 세마포어뮤텍스가 있다.


Mutex (뮤텍스)

자원에 대한 접근 제한을 강제하기 위한 동기화 매커니즘이다. Boolean 타입의 Lock 변수를 사용하여 자원에 대한 접근을 제한한다.


Semaphore (세마포어)

변수를 통해 접근 가능한 스레드를 제한한다. 뮤텍스는 1개의 스레드만 자원을 사용할 수 있으나 세마포어는 변수만큼 공유 자원에 접근할 수 있다.


profile
멋쟁이 코린이

0개의 댓글