목차
프로세스 메모리 영역(사용자 영역)
- 프로세스는 실행중인 프로그램을 의미합니다. (메모리에 올라와 있는 프로그램)
- 하나의 프로세스는 메모리의 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됩니다.
- 코드 영역과 데이터 영역은 정적 할당 영역(크기가 고정된 영역)
- 힙 영역과 스택 영역은 동적 할당 영역(프로세스 실행 과정에서 그 크기가 변할 수 있는 영역)
코드 영역
- 코드 영역(code segment)은 텍스트 영역(text segment)이라고도 부릅니다.
- 이곳에는 말 그대로 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장됩니다.
- 코드 영역에는 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어 있습니다.
- 즉, 코드 영역은 읽기 전용(read-only) 공간입니다.
- 프로그램 실행 중 코드가 변할 일은 없으니까 정적 할당 영역입니다.
데이터 영역
- 데이터 영역(data segment)은 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간입니다.
- 이런 데이터로는 전역 변수(global variable)가 대표적입니다.
- 프로그램 전체에서 접근할 수 있는 변수
- 이런 데이터로는 전역 변수(global variable)가 대표적입니다.
- 변수에 저장되는 값이 바뀔 수 있지만, 변수 자체를 위한 메모리 공간(주소)은 고정되어 있으므로 정적 할당 영역입니다.
힙 영역
- 힙 영역(heap segment)은 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장 공간입니다.
- 대표적인 예시로 객체를 생성하는 경우입니다. 객체를 생성하면 메모리를 할당받고, 사용하지 않을 경우에는 직접 메모리 공간을 반환해줘야 합니다.
- 배열, 연결 리스트, 트리, 해시 테이블과 같은 가변 크기의 데이터 구조도 힙 영역에 할당됩니다.
- 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 합니다.
- 메모리 공간을 반환하지 않는다면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래합니다.
- 이런 문제를 메모리 누수(memory leak)라고 합니다. (많은 개발자가 자주 마주치는 문제 중 하나) (힙 오버플로우를 초래할 수 있는 원인 중 하나)
- 과도한 힙 영역 메모리 공간을 할당 받으려고 할 경우에도 힙 오버플로우가 발생할 수 있습니다.
- 파이썬과 같은 고수준 언어에서는 가비지 컬렉션을 통해 사용하지 않는 메모리를 자동으로 해제합니다.
- 참고 : 파이썬 메모리 관리(가비지 컬렉션)
- 메모리 공간을 반환하지 않는다면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래합니다.
- 공간을 할당했다 반환했다 하므로 동적 할당 영역입니다.
스택 영역
- 스택 영역(stack segment)은 데이터를 일시적으로 저장하는 공간입니다.
- 데이터 영역에 담기는 값과 달리 잠깐 쓰다가 말 값들이 저장되는 공간입니다.
- 이런 데이터로는 매개 변수, 지역 변수가 대표적입니다.
- 함수 호출시 메모리가 할당되고, 함수가 반환되면 메모리가 해제됩니다.
- 재귀가 깊어지게 될 경우, 스택 오버플로우가 발생할 수 있습니다.
- 스택은 높은 주소에서 낮은 주소로 할당되고, 힙은 낮은 주소에서 높은 주소로 할당됩니다.
- 이는 힙 영역과 스택 영역에 데이터가 쌓여도 새롭게 할당되는 주소가 겹칠 일이 없게 만들기 위함입니다.
힙 영역과 스택 영역의 차이
- 힙 영역의 데이터는 프로그램이 명시적으로 메모리를 해제하거나 프로그램이 종료될 때까지 남아 있지만, 스택 영역의 데이터는 함수 호출이 끝나면 소멸합니다.
- 이러한 이유로 스택 영역은 자동으로 메모리가 관리되지만, 힙은 개발자가 직접 관리해야 합니다.
프로세스 관리(커널 영역)
- 모든 프로세스는 실행을 위해 CPU를 필요로 하지만, CPU 자원은 한정되어 있습니다. 즉, 모든 프로세스가 CPU를 번갈아가며 사용해야 합니다. 이를 위해서는 프로세스 관리가 필요합니다.
프로세스 제어 블록(PCB : Process Control Block)
- 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분합니다. 이를 위해 운영체제는 프로세스 제어 블록(PCB)을 이용합니다.
- CPU가 다시 해당 프로세스를 실행하려면, 기존 값들을 복원하기 위한 정보가 필요합니다. (이 정보가 PCB에 담깁니다.)
- 프로세스 제어 블록
- PCB는 프로세스와 관련된 정보를 저장하는 자료 구조입니다. (해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장)
- PCB는 커널 영역에 생성됩니다. (운영체제가 프로세스를 식별하고 관리하기 위한 정보이기 때문에 커널 영역에 존재)
- PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기됩니다.
- 새로운 프로세스 생성 → 운영체제가 PCB를 생성
- 프로세스 종료 → 운영체제가 해당 PCB를 폐기
- PCB에 담기는 대표적인 정보
- 프로세스 ID (PID)
- 특정 프로세스를 식별하기 위한 번호
- 레지스터 값
- 프로세스는 자신의 실행 차례가 돌아오면 이어서 실행하기 위해 CPU에서 이전까지 사용했던 레지스터의 중간값들을 모두 복원해야 합니다. 따라서 PCB 안에는 해당 프로세스가 실행하며 사용했던 CPU 레지스터 값들이 저장됩니다.
- 프로세스 상태
- 현재 프로세스가 입출력장치를 사용하기 위해 기다리고 있는 상태인지, CPU를 사용하기 위해 기다리고 있는 상태인지 등의 프로세스 상태 정보도 저장됩니다.
- CPU 스케줄링 정보
- 프로세스가 언제 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록됩니다.
- 메모리 관리 정보(메모리 주소 관련 정보)
- 프로세스마다 메모리에 저장된 위치가 다릅니다. 따라서 PCB에는 베이스 레지스터, 한계 레지스터 값과 같은 주소와 관련된 정보들이 저장됩니다.
- 프로세스의 주소를 알기 위한 또 다른 중요 정보 중 하나인 페이지 테이블 정보도 PCB에 담깁니다.
- 사용한 파일과 입출력장치 목록
- 프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시됩니다.
- 프로세스 ID (PID)
문맥 교환(컨텍스트 스위칭, Context Switching)
- CPU는 많은 프로세스들을 번갈아가며 실행합니다. 이때 다시 자기 차례가 와서 정상적으로 프로세스가 그전 작업 시점부터 진행하려면 해당 시점을 기억해두어야 합니다.
- 프로세스의 해당 시점에 대한 정보를 문맥(Context)이라고 합니다.
- 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있습니다. (PCB에 기록되는 정보 = 문맥(Context))
- 실행 문맥을 기억해 두면 언제든 해당 프로세스의 실행을 재개할 수 있습니다.
- 재개하기 위해서는 CPU 사용권한을 넘길 때, 항상 해당 프로세스의 PCB에 문맥(Context)을 백업해줘야 합니다.
- 이처럼 CPU 사용권한을 넘길 때 기존 프로세스의 문맥을 백업하고, 다음 프로세스의 문맥을 다시 가져오는 과정을 문맥 교환(Context Switching)이라고 합니다.
- 기존 프로세스 문맥(Context) PCB에 백업
- 다음 프로세스 문맥(Context) PCB로부터 가져오기
- 컨텍스트 스위칭 예시 (프로세스 A, B 두 개가 실행되고 있는 경우)
- 기존에 CPU가 프로그램 A를 실행하고 있을 경우에는 프로그램 A의 문맥을 PCB에 백업한 뒤, 프로그램 B의 문맥을 PCB에서 불러옵니다.
- 추후에 다시 CPU를 프로그램 A가 가져와야 하는 경우에는 프로그램 B의 문맥을 PCB에 백업한 뒤, 프로그램 A의 문맥을 PCB에서 가져옵니다.
- 위와 같은 과정을 반복하면서 CPU를 번갈아가면서 사용합니다.
프로세스 상태
- 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리합니다. (PCB 안에 프로세스 상태가 기록되어 있습니다.)
- 프로세스의 상태를 표현하는 방식은 운영체제마다 조금씩 차이가 있지만, 프로세스가 가질 수 있는 대표적인 상태는 아래와 같습니다.
- 생성 상태(new)
- 이제 막 메모리에 적재되어 PCB를 할당받은 상태입니다.
- 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 곧바로 실행되지 않고 준비 상태가 되어 CPU의 할당을 기다립니다.
- 준비 상태(ready)
- 준비 상태는 당장이라도 CPU를 할당받아 실행할 수 있지만, 아직 자신의 차례가 아니기에 기다리고 있는 상태입니다.
- 준비 상태 프로세스는 차례가 되면 CPU를 할당받아 실행 상태가 됩니다.
- 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치(dispatch)라고 합니다.
- 실행 상태(running)
- 실행 상태는 CPU를 할당받아 실행 중인 상태를 의미합니다. 할당된 일정 시간 동안만 CPU를 사용할 수 있습니다.
- 프로세스가 할당된 시간을 모두 사용한다면(타이머 인터럽트가 발생하면) 다시 준비 상태가 되고, 실행 도중 입출력장치를 사용하여 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 됩니다.
- 할당된 시간을 다 쓰면 준비 상태
- 할당된 시간 중간에 입출력 장치를 사용하게 되어 해당 입출력 장치를 기다려야 하면 대기상태
- 대기 상태(blocked)
- 입출력 작업은 CPU에 비해 처리속도가 느리기에, 입출력 작업을 요청한 프로세스는 입출력장치가 입출력을 끝날 때까지(입출력 완료 인터럽트를 받을 때까지) 기다려야 합니다. 이렇게 입출력장치의 작업을 기다리는 상태를 대기 상태라고 합니다.
- 입출력 작업이 완료되면 해당 프로세스는 다시 준비 상태로 CPU 할당을 기다립니다.
- 참고로 특정 이벤트가 일어나길 기다릴 때도 프로세스는 대기 상태가 됩니다. 다만 일반적으로 입출력 작업일 때 대기 상태가 되는 경우가 많기 때문에 프로세스가 입출력 작업을 하면 대기 상태가 된다고 생각해도 무방합니다.
- 종료 상태(terminated)
- 프로세스가 종료된 상태입니다.
- 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리합니다.
- 생성 상태(new)
프로세스 계층 구조
- 프로세스는 실행 도중 시스템 콜을 통해 다른 프로세스를 생성할 수 있습니다.
- 새 프로세스를 생성한 프로세스를 부모 프로세스(parent process)
- 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스(child process)
- 부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이므로 각기 다른 PID를 가집니다.
- 일부 운영체제에서는 자식 프로세스의 PCB에 부모프로세스의 PID인 PPID(Parent PID)가 기록되기도 합니다.
- 많은 운영체제는 이처럼 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리합니다.
- 컴퓨터가 부팅될 때 실행되는 최초의 프로세스가 자식 프로세스들을 생성하고, 생성된 자식 프로세스들이 새로운 프로세스들을 낳는 형식으로 여러 프로세스가 동시에 실행되는 것입니다.
- 이러한 트리 구조를 프로세스 계층 구조라고 합니다.
- 프로세스 계층 구조 예시
- 사용자가 컴퓨터를 켜고, 로그인 창을 통해 성공적으로 로그인해서 bash 셸로 Vim이라는 문서 편집기 실행하는 과정
- 컴퓨터를 켜고 확인해 보면 우리가 실행한 프로세스 외에도 여러 프로세스가 실행되고 있습니다.
- 이 중 사용자가 볼 수 있는 공간에서 실행되는 프로세스는 포그라운드 프로세스(foreground process)
- 보이지 않는 공간에서 실행되는 프로세스는 백그라운드 프로세스(background process)
- 백그라운드 프로세스 중에서 사용자와 직접 상호작용할 수 있는 백그라운드 프로세스도 있지만, 사용자와 상호작용하지 않고 그저 자기에게 정해진 일만 수행하는 백그라운드 포로세스도 있습니다.
- 상호작용하지 않는 프로세스를 유닉스 체계의 운영체제에서는 데몬(demon)이라고 부르고, 윈도우 체제에서는 서비스(service)라고 부릅니다.
- 백그라운드 프로세스 중에서 사용자와 직접 상호작용할 수 있는 백그라운드 프로세스도 있지만, 사용자와 상호작용하지 않고 그저 자기에게 정해진 일만 수행하는 백그라운드 포로세스도 있습니다.
- 컴퓨터를 켜고 확인해 보면 우리가 실행한 프로세스 외에도 여러 프로세스가 실행되고 있습니다.
- 프로세스별 모든 프로세스의 가장 위에 있는 최초의 프로세스
- 유닉스와 유사한 시스템 (예: Linux): 이 시스템에서는 init (System V 유닉스 계열) 또는 systemd (최근의 많은 Linux 배포판에서 사용) 같은 프로세스가 최초의 프로세스로 실행됩니다. 이 프로세스들은 시스템의 다른 모든 프로세스의 조상입니다.
- macOS: macOS에서는 launchd 프로세스가 시스템 부팅 시 시작되는 최초의 프로세스로, 시스템 및 애플리케이션 서비스를 관리합니다.
- Windows: Windows에서는 시스템 프로세스(System Process와 smss.exe, csrss.exe, wininit.exe, services.exe 등)가 최초로 시작되며, 이들은 시스템 및 사용자 세션을 초기화하고 관리하는 역할을 합니다. explorer.exe 같은 사용자 레벨의 애플리케이션은 이러한 시스템 프로세스에 의해 간접적으로 시작됩니다.
프로세스 생성 기법
아래 내용은 윈도우 운영체제와는 관련이 없으나 다른 수많은 운영체제의 핵심 개념입니다.
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해내고, 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체합니다.
- fork와 exec는 시스템 콜입니다.
- fork
- fork는 자기 자신 프로세스의 복사본을 만드는 시스템 콜입니다.
- 자식 프로세스는 부모 프로세스의 복사본이기 때문에 부모 프로세스의 자원들, 이를테면 메모리 내의 내용, 열린 파일의 목록(메모리 내용, PCB 내용) 등이 자식 프로세스에 상속됩니다.
- 단, 복사되었다고 하더라도 저장된 메모리 위치나, PID 값은 다릅니다.
- exec
- fork를 통해 복사본이 만들어진 뒤에 자식 프로세스는 exec 시스템 콜을 통해 해당 복사본을 새로운 프로그램으로 전환합니다. (exec는 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 콜)
- 새로운 프로그램 내용으로 덮어쓰이기 때문에 exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램 내용으로 바뀌고, 나머지 영역은 초기화됩니다.
스레드
- 기본적으로 하나의 프로세스는 한 번에 하나의 일만을 처리했습니다. 하지만 스레드라는 개념이 도입되면서 하나의 프로세스가 여러개의 실행 흐름을 가질 수 있어, 하나의 프로세스 안에서 여러 명령어를 동시에 실행할 수 있게 됐습니다.
- 스레드(thread)란 프로세스를 구성하는 실행의 흐름 단위입니다. (소프트웨어 측면에서의 스레드)
- 참고 : 하드웨어 측면에서의 스레드
-
더보기1코어 2스레드, 4코어 8스레드 처럼 하나의 코어가 2개 이상의 스레드를 가진 경우가 있습니다. 하드웨어 측면에서의 멀티스레드는 실제로 병렬성을 키워주는 것이 아닌 더 효율적인 동시성을 키워주는 것입니다. 1코어 2스레드라고 하더라도 실제로는 한순간에 하나의 스레드만이 CPU 계산이 적용됩니다.
(병렬성을 키우기 위해서는 코어수를 늘려주어야합니다.)
000000, 111111작업 두 개를 처리해야 할때 1코어 1스레드의 경우 000000111111 으로 처리하지만 1코어 2스레드의 경우 010101010101으로 처리하기 때문에 마치 코어가 2개로 처리되는 것처럼 보이게 됩니다. 전체 시간은 똑같은거 아니냐 할 수 있지만, 111111 작업을 처리하기 원하는 사용자 입장에서는 000000 이 다 끝날때까지 기다리지 않아도 되기때문에 사용자가 느끼는 체감을 훨씬 빠르게 느껴집니다.(스레드 지연시간 단축)
그러면 CPU 스케줄링으로 각 작업이 어차피 번갈아가면서 실행될텐데 왜 굳이 1코어 1스레드보다 1코어 2스레드를 쓸까라는 생각을 할 수도 있습니다. 이는 컨텍스트 스위칭 비용때문입니다.
CPU 작업을 1코어 1스레드를 CPU 스케줄링을 통해서 000000, 111111 작업을 번갈아가면서 처리한다고 할 경우 0 작업을 하고 1 작업쪽으로 넘어갈 경우 컨텍스트 스위칭 비용이 발생하게 됩니다. 마찬가지로 0작업에서 1작업으로 넘어갈 경우에도 컨텍스트 스위칭 비용이 발생하게 됩니다.
반면, 1코어 2스레드의 경우는 각 하드웨어 스레드마다 독립적인 레지스터 값들이 저장되어져 있기때문에 한번 두 작업이 2개의 하드웨어 스레드에 올라가 있게 되면 별다른 컨텍스트 스위칭 없이 각 하드웨어 스레드에 있는 작업을 번갈아가며 실행할 수 있습니다.
하지만 1코어 2스레드의 경우에도 체감상 빨라졌을뿐이지 실제로 전체 시간은 그대로입니다. 그렇다면 전체 시간을 향상시켜주려면 어떻게 해야할까요? 이는 이제 코어수를 늘려주면 됩니다. 만약에 2코어 2스레드의 경우라고 한다면 010101010101처럼 번갈아가며 처리하는 것이 아닌 0이 처리되면서 1도 동시에 처리가 됩니다.( 하나의 작업을 처리하는 시간만에 두개의 작업이 처리되는 것입니다. ) 즉, 번갈아가면서 동시에 처리되는 것처럼 느끼게 하는 것이 아닌 실제로 동시에 실행되게 하려면 코어수를 늘려주어야합니다.
(실제 속도 향상을 위해서는 코어수 늘려주기)
밥을 먹는 예시(숟가락을 이용해서 국을 먹고, 젓가락을 이용해 반찬을 집어야합니다.)를 통해 코어와 스레드를 완전히 이해해보도록 하겠습니다. 우선 코어는 사람 수라고 생각하면 됩니다. 스레드는 사람이 사용하는 팔의 수라고 볼 수 있습니다.
(1코어 1스레드)
1코어 1스레드일때는 손이 한개이므로 숟가락을 이용해 국을 다 먹고, 젓가락을 이용해 반찬을 다먹을 것입니다.
(1코어 2스레드)
1코어 2스레드일때는 손이 두개이므로 한손에는 젓가락, 한손에는 숟가락을 들고 번갈아가면서 먹을 수 있습니다. (번갈아가면서 먹으면 반찬이나 국이 식지않았을때 바로 먹을수 있는 장점이 있습니다. = 스레드 지연시간 단축)
(1코어 1스레드, CPU 스케줄링이 있을때)
손이 한개지만 국하고 반찬을 번갈아가며 먹을수도 있습니다. 이경우에는 이제 숟가락을 놓고, 젓가락을 드는 시간, 다시 젓가락을 놓고 숟가락을 드는 시간(컨텍스트 스위칭 비용)이 소요될 것입니다.
(2코어 2스레드)
두 사람이 각자 손으로 한사람을 국만, 한사람은 반찬만 먹는다면 음식을 씹는 속도가 두배가 되므로 훨씬 빠르게 밥을 다 먹을 것입니다.
속도 : 2코어 2스레드 > 1코어 2스레드 = 1코어 1스레드 > 1코어 1스레드(CPU스케줄링)
식은 반찬을 먹지 않을 가능성 : 2코어 2스레드 > 1코어 2스레드 > 1코어 1스레드(CPU스케줄링) > 1코어 1스레드
정리하면 하드웨어 측면에서의 스레드는 병렬성을 키우기 위한 것이 아닌, 더 효율적인 동시성을 키워주기 위함이라고 생각하면 됩니다. 병렬성을 키우기 위해서는 반드시 코어수가 늘어나야 합니다.
병렬성 : 실제로 동시에 진행되고 있는 것
동시성 : 번갈아가면서 실행되어 동시에 진행되는 것 처럼 보이는것
-
- 참고 : 하드웨어 측면에서의 스레드
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다.
- 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있습니다. (단, 코어가 여러개일 경우에만 병렬성을 가집니다. 코어가 1개일 경우는 병렬성을 가지지 못하고 동시성을 가집니다.)
- 예를 들어 워드 프로세스 프로그램을 개발한다고 했을 때, 아래 기능을 여러 개의 스레드를 이용해 동시에 수행할 수 있습니다.
- 사용자로부터 입력받은 내용을 화면에 보여주는 기능
- 사용자가 입력한 내용이 맞춤법에 맞는지 검사하는 기능
- 사용자가 입력한 내용을 수시로 저장하는 기능
- 즉, 스레드는 프로세스를 구성하는 실행 단위 입니다.
- 프로세스내의 스레드가 공유하는 자원과 스레드마다 따로 가지는 자원 (스레드는 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행)
- 스레드가 공유하는 자원
- 코드, 데이터, 힙, 열린 파일
- 스레드마다 따로 가지는 자원
- 스레드 ID, 프로그램 카운터값을 비롯한 레지스터, 스택
- 이러한 정보는 PCB가 아닌 TCB(Thread Control Block)에 따로 저장이 됩니다. (스레드의 프로그램 카운터, 레지스터 집합 ,스택 포인터 등)
- 스레드가 공유하는 자원
- 멀티 스레드 환경에서의 PCB와 TCB
- 멀티 스레드 환경에서는 기존에 PCB에만 저장되는 정보와 다소 차이가 존재합니다. 스레드 별로 실행이 되기때문에 TCB(Thread Control Block)에 별도로 저장해주어야합니다.
- 멀티 스레드 환경에서 PCB에 저장되는 정보
- PID, 프로세스 상태, 메모리 관리 정보, 사용한 파일, 사용한 입출력장치
- 멀티 스레드 환경에서 TCB에 저장되는 정보
- 스레드 ID, CPU 스케줄링 정보, 프로그램 카운터(PC)를 포함한 레지스터 값, 스레드 상태, 스택 포인터
- 멀티 스레드 환경에서는 스레드 단위로 스케줄링 되기때문에 CPU 스케줄링 정보와 레지스터 값 등 이 TCB에 저장됩니다.
출처
'Computer Science > 운영체제(Operating System)' 카테고리의 다른 글
CPU 스케줄링 (1) | 2024.04.03 |
---|---|
멀티프로세스와 멀티스레드 (0) | 2024.04.02 |
운영체제(OS, Operation System)란? (0) | 2024.03.29 |
Bound | Blocking(Non-Blocking) | Multiprocessing vs Multithreading vs Asynchronous Programming (1) | 2023.12.15 |
동시성(Concurrency) vs 병렬성(Parallelism) (1) | 2023.12.08 |