[운영체제] 3. 프로세스와 프로세스 관리

2025. 1. 14. 16:27·운영체제

3 -1. 프로그램과 프로세스

이제 프로그램과 프로세스에 대해서 본격적으로 알아볼 때 가 된 것 같다.

이 전에도 말했겠지만 

 

프로그램은 하드디스크, USB등 저장 장치에 저장된 실행 가능한 파일을 말한다. 

프로그램이 메모리에 적재되어 실행중일 때 이를 프로세스라고 부른다. 

여기서 실행중이라는 것은 CPU에 의해 실행되거나, 준비 상태이거나, 실행 대기 상태이거나. 이 모든 상태를 실행 중이라고 말한다. 

 

즉 OS는 응용프로그램을 메모리에 적재하고 ,이때 부터 프로세스라고 부를 수 있는 것이다. 

 

프로세스의 특징을 알아보자.

  • OS는 프로르램을 메모리에 적재하고 이를 프로세스라고 한다. 
  • OS는 프로세스에게 필요한 메모리를 할당하고 코드와 데이터들을 적재한다.
  • 프로세스는 서로 독립적인 메모리 공간을 갖는다(가상 메모리)
  • OS는 프로세스마다 고유한 PID(프로세스 아이디)를 할당한다.
  • 프로세스 정보는 커널이 관리한다.
  • 실행 - 대기 - 잠자기 - 실행 종료등의 실행주기를 갖는다.

 

OS는 프로세스의 생성부터 종료까지 관리하는 역할을 수행한다. 

간단히 살펴보면 

유저 공간에 메모리를 할당하고, 프로세스에 PID를 부여하고, 커널 영역에 프로세스 테이블을 생성한다. 프로세스 테이블을 통해 프로세스 정보를 관리하게 된다. 

 

하나의 프로그램이 여러번 실행될 경우네는 프로그램이 실행될 때 마다 독립적인 프로세스를 생성한다. 

이 프로세스들을 프로그램의 다중 인스턴스라고 부른다. 이들은 프로그램의 코드를 공유한다. 

 

CPU의 주소 공간이라고 하면, 컴퓨터 내에 CPU가 접근 가능한 전체 메모리 공간을 의미한다. 이 전체 메모리 공간은 CPU의 주소선에 의해 결정됨을 앞선 포스팅에서 알아보았었다. 32bit 주소선에서는 4GB의 주소 공간을 갖는다. 

 

프로세스 메모리 구성 

그리고 프로세스의 메모리 구성은 

프로세스의 메모리 영역

이렇게 코드 - 데이터 - 힙 - 스택 영역으로 이루어져 있다. 

 

  • 코드 영역은 사용자가 작성한 코드와 라이브러리 함수가 저장된다.
  • 데이터 영역은 사용자가 선언한 전역변수와 그 라이브러리에 선언된 전역 변수가 저장된다.
  • 힙 영역은 프로세스 실행 중 동적 할당 받는 공간이다. 
  • 스택 영역은 프로세스 실행 시 사용되는 스택이다. 

코드영역과 데이터 영역은 실행중 바뀌지 않는다. 

이를 다시 말하면 힙 영역과 스택 영역은 실행 중 바뀐다. 

 

프로세스의 주소 공간은 프로세스가 실행 중 접근할 수 있도록 허용된 주소의 최대 범위이다. 

그리고 이 주소 공간은 가상 공간으로 사용자 공간과 커널 공간 전체를 의미한다. 

커널 공간에 접근할 수 있는 것은 시스템 호출 덕분이다. 

따라서 CPU 주소 공간과 같다고 할 수 있다. 커널 함수를 실행하는건 프로세스임을 잊지말자.

 

32bit CPU의 프로세스 메모리 구성

 

프로세스가 실행중일 때 프로세스의 메모리이다. 

힙과 스택 영역은 실행중 바뀌기 때문에 크기가 정해져 있지 않다. 

코드와 데이터 영역을 뺀 공간을 힙과 스택 영역이 사용하는데, 힙은 데이터 영역 끝에서 아래쪽으로 그리고 스택은 사용자 주소 공간 끝에서 위로 자란다. 

 

여기서 혼동하기 쉬운 것이 프로세스 크기와 프로세스 주소 공간의 크기이다. 

프로세스 크기는 프로세스가 주소 공간 내에서 현재 사용하고 있는 코드-데이터-힙-스택 영역을 합친 크기이다. 즉 프로세스의 크기는 계속 변한다. 

주소 공간의 크기는 프로세스가 접근할 수 있는 전체 영역을 의미한다. 

 

다시 말하지만 프로세스 주소 공간은 가상 공간이다. 물리 메모리의 주소공간으로 매핑되어 사용된다. 그리고 이 과정에는 매핑 테이블이 사용되며 매핑 테이블은 프로세스 생성시 한개 씩 만들어진다. 프로세스 실행시 매칭 테입르을 통해 물리 메모리에 엑세스 하게 되는데. 이와 관련해서는 뒤에서 더 배우게 될 것이다. 

 

위 그림을 보면 커널코드 역시 가상 주소로 컴파일되어 있음을 확인할 수 있다. 매핑 테이블에 존재하는 커널의 물리 주소로 시스템 호출 시 커널 함수를 사용하게 된다. 

 

OS는 매핑 테이블을 프로세스마다 따로 만들기 때문에 각 프로세스의 사용자 주소 공간을 물리 메모리에 나눠서 배치하고 충돌이 일어나지 않게 된다.

 

실행중인 프로세스 크기의 합이 물리 메모리보다 크다면 OS는 프로세스의 실행에 당장 필요한 부분만 물리 메모리에 적재하고 나머지는 디스크 특정 영역(스왑 영역)에 저장해두고 필요할 때 가저오는 가상 메모리 기법을 사용한다. 

 

#include<stdio.h>
#include<stdlib.h>

int a = 10;
void f() {
    int c = 30;
    printf("%d",c);
}

int main(){
	int b = 20;
    int*p = (int*)malloc(100);
    f();
    printf("%d",b);
    return -1 ;
}

이 코드가 실행된다고 생각해보자.

 

 

왼쪽은 f()의 printf() 함수가 실행이 끝난 시점, 오른 쪽은 main 함수의 f();가 끝난 시점이다. 

힙 영역은 동적 할당 받는 공간이기에 100byte 만큼 할당어 있고, 스택 영역에는 코드가 실행 중에 사용되는 것인데 f()함수가 메인 함수에서 실행이 완료되면 int c 는 더이상 사용되지 않기 때문에 스택 영역에서 사라지게 된다. 

 

3-2 커널의 프로세스 관리

다중 프로그램 OS는 프로세스 테이블을 두고 모든 프로세스 정보를 관리한다.

 

커널은 프로세스 생성시마다 PCB라는 프로세스 제어 블록을 생성하고 프로세스 정보를 저장한다. 

그리고 프로세스 테이블에 PID와 PCB를 연결하는데 프로세스 테이블과 PCB는 커널 공간에 생성되고 커널만 접근이 가능하다. 

 

PCB는 프로세스 관리의 핵심 데이터라고 할 수 있는데 

프로세스를 실행할 때, 스케줄링 할 때, 메모리 관리할 때, 파일을 입출력할 때 등 많은 상황에서 커널에 의해 엑세스 되고 갱신된다.

 

PCB에 저장되는 정보 

PCB에는 

  • PID: 프로세스를 식별하는 고유의 번호로 0과 양의 정수로 이루어져 있음
  • PPID: 부모 프로세스의 PID
  • 프로세스 상태 정보: 프로세스의 상태 (run, running, ready, blocked 등)
  • 프로세스 컨텍스트: 다른 프로세스가 실행될 때 커널은 실행중인 프로세스의 상황 정보를 PCB에 저장한다.
  • 스케쥴링 정보: 프로세스 우선순위, CPU 시간, 실행시간
  • 종료코드: 종료시 종료 이유를 부모 프로세스에게 전달하기 위한 정수 값 
  • 프로세스 오픈 파일 테이블: 프로세스 실행 중 열어놓은 파일에 대한 정보
  • 메모리 관리를 위한 정보: 매핑 테이블 정보 등
  • 프로세스 사이 통신 정보: 커널이 지원하는 IPC(inter process communication)
  • 회계 정보
  • 소유자 정보

이렇게 프로세스를 관리하기 위한 많은 정보들이 들어 있다 .

 

프로세스 생명주기

프로세스의 상태는 실행 중 계속해서 변하는데, 운영체제의 커널 코드에 의해 바뀌게 된다. 

 

프로세스 생명 주기

위 그림은 프로세스의 생명 주기를 간단하게 도식화한 것이다. 

 

New 상태

프로세스를 생성하는 시스템 호출이 실행돼 새로운 프로세스가 생성된 상태이다. 커널은 프로세스의 코드와 데이터를 적재하고 PCB를 만들어 프로세스 테이블에 적재한다. 

 

Ready상태

커널에 있는 준비큐에 들어간 상태 혹은 running 상태인 프로세스에 할당된 CPU 시간이 경과되거나 프로세스가 스스로 양보하는 경우이다.

실행중인 프로세스가 종료될 때 커널은 준비큐에서 다음 실행될 프로세스를 선택한다. 이 과정이 CPU 스케쥴링이다. 스케쥴리에 따라 큐에 들어있지만 실행되지 않는 기아프로세스가 생길 수 있다. 

 

Running상태

CPU에 의해 실행되고 있는 상태로, 완료되면 terminated/zombie 상태가 된다. 

running 상태에서 다른 상태가 될 때 스케쥴링이 시행되고, running 프로세스는 PCB에 저장된다. 이것이 컨텍스트 스위칭 과정이다.

 

Block, wait 상태

프로세스 자원을 요청하거나 입출력 요청 후 완료를 기다리고 있는 상태이다. 

프로세스가 시스템 호출을 일으키면 커널은 현재 프로세스를 Block 또는 Wait 상태로 설정하고 Ready 상태의 프로세스와 컨텍스트 스위칭을 실시한다. 

 

Terminated/ Zombie

프로세스가 종료된 상태이다. 커널은 프로세스가 차지하던 메모리와 자원을 모두 반환하고 파일을 닫는다. 

해당 프로세스는 종료코드를 남기고, 이를 부모 프로세스가 읽어야한다. 부모 프로세스가 종료코드를 읽지 않은 상태를 zombie 프로세스라고 한다. zombie 프로세스는 메모리를 반환하고 파일을 닫았음에도 PCB에서 제거되지 않은 상태이다. 

 

Terminated/Out

부모 프레세스가 zombie 상태의 자식 프로세스의 종료코드를 읽으면, 커널은 zombie 프로세스의 PCB를 시스템에서 제거하고 프로세스 테이블에서 제거한다. 완전히 종료된 것이다. 

 

 

프로세스를 다루다 보면 스케쥴링이라는 말을 자주 하게 되는데

다중 프로그래밍 OS에서는 실행중인 CPU를 할당할 프로세스를 결정해야만 한다. 

이 결정을 스케쥴링이라고 하는데, 요즘에는 프로세스보다 작은 크기의 실행단위인 스레드를 스케쥴링한다. 

스레드는 개발자가 작업을 구현하는 단위이고 운영체제에 의해 스케쥴링 되는 단위이다. 

멀티 스레드는 1개의 작업ㅇ르 1개의 스레드로 만들고, 프로세스 내의 여러 스레드로 여러 작업을 동시에 처리하는 것을 의미한다. 

OS의 실행단위를 스레드라고 할 수 있다. 

프로세스는 프로세스에 속한 스레드에게 공유자원을 제공하는 컨테이너인 것이다. 

이런 프로세스 스케쥴링이나 스레드 스케쥴링은 이후 더 자세히 다룰 것이기에 간단히 설명하고 넘어가겠다. 

 

 

 

3-3 프로세스 계층 구조 

앞서 PPID를 설명할 때 부모 프로세스가 존재한다고 하였는데, 사실 가장 상위에 존재하는 프로세스를 제외한 모든 프로세스는 프로세스에 의해 실행된다. 그리고 이 과정에서 부모 프로세스와 자식 프로세스의 관계가 형성된다. 프로세스는 여러 자식을 가질 수도 있다. 

프로세스 계층 구조는 이 부모 - 자식 관계를 의미한다. 

 

OS는 모든 프로세스를 부모 - 자식의 계층 구조로 관리한다. 

 

linux 운영체제의 프로세스 계층 구조

 

linux 운영체제를 기준으로 프로세스 계층 구조 중 상위 프로세스를 간단하게 살펴보자. 가장 하단의 프로세스들이 자식 프로세스를 가지지 않는 것처럼 그렸지만 실제로는 계속해서 프로세스 계층 구조를 이루고 있다. 지금은 간단히 어떤 구조로 이루어져 있는지 알아보기 위해 생략하였다. 

 

#0 idle process

스케쥴링될 프로세스가 없는 실행되는 유휴 프로세스이다. 초기 유닉스에서는 부팅과 메모리 공간을 확보할 때 #0 프로세스(swapper)를 사용했었다. 하지만 현재는 idle 프로세스라고 부르며 프로세스가 아무 작업도 실행되지 않아 무한 루프에 빠지지 않는 것을 방지하기 위해 사용된다. 모든 프로세스가 blocked 상태여서 시스템 실행을 ready 시킬 프로세스가 1개도 없는 경우를 막는 것이다. 

idle process는 또 인터럽트가 발생될 때 까지 CPU의 클럭 속도를 줄여 CPU가 절전 모드에 들 수 있도록 한다. 

 

#1 init/systemd 

부팅 과정에서 시스템을 초기화해 사용자가 시스템을 사용할 수 있는 상태까지 부팅을 완료하며, 시스템 종료까지 살아있어 시스템 종료를 책임져준다. 자식 프로세스로 외부 네트워크로부터 연결을 요청하는 sshd 프로세스를 생성하고, 이 sshd 프로세스는 사용자로부터 로그인, 암호를 확인한 후 bash 프로세스를 자식 프로세스로 생성한다. bash 프로세스는 또 명령을 받으면 자식 프로세스를 생성해 ps 명령을 실행시킨다. 사용자 모드에서 실행되는 프로세스들의 조상이 바로 sshd 프로세스인 것이다. 

 

#2 kethreadd

부팅 때 커널에서 커널 모드로 실행되며 커널의 기능을 돕는다. 

 

가장 상위 프로세스 이외에는 부모 프로세스가 있다고 했으며, 프로세스가 프로세스를 만든다고 하였지만

#1과 #2프로세스는 부팅시 하드 코딩으로 생성되는 것이기에 #0에 의해 생성된다고 할 수는 없다. 

 

프로세스를 생성하는 것은 프로세스 테이블과 PCB등 커널 테이블을 생성하고, 조작하는 작업을 포함한다. 

이는 커널 코드에서 이루어지는 것인데, 그렇다보니 OS는 시스템 콜을 통해서만 프로세스를 생성하고 종료하도록 한다. 

 

Linux에서는 

fork()  - 자식 프로세스를 생성하는 시스템 콜 함수

exit() - 현재프로세스를 종료하는 시스템 콜 함수

wait() - 부모 프로세스가 자식 프로세스 종료까지 기다리는 시스템 콜 함수

와 같은 시스템 콜 함수를 지원한다. 

 

Unix 계열은 부모프로세스가 자식 프로세스의 종료를 책임지도록 만들어졌다. 이는 자식이 종료코드를 통해 종료 원인을 부모프로세스에게 전달할 수 있도록 하기 위함이다. 

 

부모프로세스가 자식의 종료를 기다릴 때

 

부모 프로세스가 fork()를 통해 자식 프로세스를 만들었고, 자식 프로세스가 실행 후 exit()을 통해 종료했다고 해보자. 

이 때 부모 프로세스가 이보다 먼저 wait() 을 통해 자식의 종료 코드를 받을 준비가 됐다면 자식의 종료코드는 부모 프로세스에 의해 확인되고 바로 종료된다. 

 

 

자식 프로세스가 먼저 종료될 때

 

그런데 자식 프로세스가 부모 프로세스의 wait() 보다 먼저 exit()을 실행해 종료됐다면 자식 프로세스는 부모 프로세스가 자신의 종료코드를 읽어줄 때 까지 종료/좀비상태가 된다.(그림은 오타..)

그리고 부모가 wait()을 통해 자신의 종료 코드를 읽었을 때 완전 종료 상태가 되어 PCB를 프로세스 테이블에서 제거하게 된다. 

 

그런데 만약 부모프로세스가 wait()을 실시하지 않는다면 어떨까?

이때 종료했지만 완전 종료되지 않은 좀비프로세스 상태가 된다.

자식 프로세스는 종료 시 일반적으로 부모에게 자신의 죽음을 통보하도록 설계된다. 

하지만 자식 혹은 부모 프로세스가 잘못 만들어졌거나 시스템 오류로 인해 wait()을 호출하지 않게 만들어졌다면 계속 zombie 프로세스로 남게된다.

이를 제거하려면 kill zombie PID 명령을 통해 제거할 수도 있는데, 이는 부모프로세스에 SIGCHLD 신호를 보내 해당 좀비 프로세스의 부모를 init 프로세스로 바꾸게 한다. init 프로세스는 주기적으로 wait()을 실행시켜 좀비 프로세스를 제거하는 역할을 한다

 

이런 경우 이외에도 부모가 자식 프로세스보다 먼저 종료된 프로세스를 고아 프로세스라고 하는데

부모 프로세스가 exit()을 호출해 종료할 때 아직 살아 있는 자식 프로세스들은 exit() 호출 시 커널 코드에 의해 부모 프로세스를 init 프로세스로 바꾼다. 

 

추가로 사용자와의 대화가 필요 없는 프로세스를 백그라운드 프로세스, 터미널 사용자로부터 입출력을 독점하는 프로세스를 포그라운드 프로세스, 계산중심의 작업을 수행해 CPU 사용이 많은 프로세스를 CPU 집중 프로세스, I/O와 네트워크 전송을 주로 하는 프로세스를 I/O 프로세스라고한다. 

 

 

3-4  프로세스 제어 

프로세스가 실행되는 경우는 

  • 시스템 부팅시 프로세스 생성
  • 로그인 시 쉘 프로세스 생성
  • 사용자 명령에 따라 응용프로세스 생성
  • 배치 프로세스 생성
  • 응용프로그램이 다중 처리를 위해 자식 프로세스 생성 

등등이 존재한다. 

fork()와 create process()와 같은 시스템 호출에 의해 프로세스는 생성되는데

 

프로세스가 생성되는 과정은 

 

새로운 PID를 할당하고, PCB 구조체를 생성한다.

이후 프로세스 테이블에 새 항목을 할당하고 만들어둔 PCB 를 연결한다.

이제 새로운 프로세스를 위한 메모리 공간을 할당하고, 이 메모리 공간에 프로세스의 코드와 데이터를 적재한다. 

PCB에 프로세스 정보를 기록한 뒤, 프로세스 상태를 Ready로 표시한 후 준비큐에 넣어 차후 스케줄되게 만든다.

이제 PID가 부모프로세스에게 알려진다. 

 

 

fork() 시스템 호출

pid_t pid; //pid 변수 선언 
pid = fork(); //자식 프로세스 생성

if(pid>0){
 // 부모 프로세스 실행
}

if(pid = 0) {
// 자식 프로세스 실행
}
else{
//fork()오류
}

 

fork()를 이용하는 경우, 응용프로그램내에 부모프로세스의 코드와 자식 프로세스를 모두 둔다.

현재 프로세스의 코드, 스택, 힙 , 데이터 등을 복사한 자식 프로세스를 만들고 리턴한다. 

부모와 자식 프로세스는 각각 fork()에서 리턴한 후 리턴 값을 자신의 PID로 갖는다. 

pid = fork(); 와 같이 변수에 값을 넣는 다음 지점부터 실행이 시작된다. 

부모 프로세스가 실행되면 pid 변수에 자식 프로세스가, 자식 프로세스의 pid 변수에는 0이 저장된다. 

 

fork()의 커널 코드가 각각 pid 변수에 리턴 값을 주고, 부모 자식 모두 fork()로 부터 실행된다.

 

프로세스 오버레이

현재 실행중인 프로세스의 주소 공간에 새로운 응용 프로그램을 적재하여 실행하는 기법을 '프로세스 오버레이'라고 한다. 

exec() 시스템 호출을 통해 사용 가능한데, 

호출한 프로세스의 주소 공간에 새로운 응용프로그램의 코드, 데이터, 힙, 스택을 올리고 기존 프로그램의 모든 영역이 사라진다. 그렇지만 PID는 그대로 유지된다. 

 

프로세스 종료와 종료대기 - exit() 

프로세스가 종료되려면 반드시 exit() 시스템 호출이 실행되어야 한다. 

exit() 시스템콜이 실행되면 

1. 호출한 프로세스에게 할당된 코드, 데이터, 힙, 스탯등 모든 데이터와 자원을 반환하고, 프로세스를 실행하며 열어놓은 파일이나 소켓을 닫는다. 

2. PCB와 프로세스 테이블 항목을 그대로 두고, PCB내의 프로세스 상태를 terminated/zombie로 바꾼다. 종료코드를 PCB에 저장하는데, main() 함수의 리턴 값이나 exit(stats) 매개변수가 종료코드이다. main()의 리턴 값은 종료코드로 PCB에 저장되어 결국 부모프로세스에게 전달되게 된다. 

3. 자식 프로세스가 실행중이라면 이들을 init 프로세스에게 입양시킨다.

4. 자신의 부모프로세스에게 죽음을 알리기 위해 SIGCHLD 신호를 보낸다. 만약 부모가 이에 대한 핸들러를 가지고 있다면 부모 프로세스의 wait() 시스템 콜을 통해 완전 종료되지만 그게 아니라면 zombie 프로세스로 남게 된다.

 

프로세스가 완전 종료되면 main() 함수의 커널 모드는 PCB에서 종료 코드를 읽고 자식 프로세스의 PCB를 삭제한 후 테이블 항목을 제거한다. 

 

남아 있는 좀비프로세스는 문제가 될까?

좀비프로세스는 PCB에 남아있게 되지만 차지하는 메모리는 크지 않고, 스케쥴링에서 배제되기에 CPU의 시간을 소요하지도 않는다. 

하지만 프로세스 테이블은 1개만 존재하는데 이것에 크기가 한정적이기에 좀비 프로세스가 많아질 경우 최악의 경우에는 프로세스 테이블의 공간이 부족해 프로세스를 만들지 못하는 상황이 일어날지도 모른다.

 

 


이번 포스팅에서는 프로그램과 프로세스에 대해서 알아보았다. 

 

프로그램이 메모리에 의해 적제돼 실행 준비가 되면 프로세스라고 부른다.

 

그리고 프로세스는 코드 - 데이터 - 힙 - 스택의 메모리 구성을 갖으며, 가상 공간을 부여된 프로세스 주소 공간도 갖는다.

이는 매핑 테이블에 의해 물리 메모리와 매핑되지만 서로 메모리 공간에 적재되어 충돌이 일어나지 않고, 혹여나 물리 메모리보다 총 프로세스 크기가 크다면 가상 메모리 기법으로 이를 해결했었다. 

 

프로세스는 생명주기를 갖는데, new, ready, running, blocked, terminaed/zombiem terminted/out의 상태가 있다. 

ready 상태의 프로세스들은 준비 큐에서 CPU에 의해 스케쥴링될 준비를 한다. 

 

프로세스는 가장 상위 프로세스를 제외하고는 부모가 있으며, 프로세스에 의해 만들어진다. 따라서 부모프로세스와 자식프로세스라는 계층 관계가 만들어진다. 프로세들은 시스템 콜을 통해 자식 프로세스를 만들고, 종료할 수 있다. 

 

프로세스는 생성될 때 PID를 부여받고 PCB를 프로세스 테이블에 등록한다. 프로세스 메모리 영역을 할당 받고 값을 적재한다. PCB는 프로세스 정보를 관리하기 위해 중요한 역할을 수행한다. 

 

프로세스는 종료 될 때 exit() 시스템 콜을 실행하고, 종료코드를 부모코드가 읽어야만 PCB가 제거돼 완전히 종료된다. 고아 프로세스는 init 프로세스에게 입양되어 종료된다. 

 

다음 포스팅에는 스레드와 멀티 스레드에 대해 알아보도록 하겠다.

'운영체제' 카테고리의 다른 글

[운영체제] 5. CPU 스케줄링  (0) 2025.02.12
[운영체제] 4. 스레드와 멀티 스레딩  (2) 2025.01.27
[운영체제] 2. 컴퓨터 시스템과 운영체제  (3) 2025.01.06
[운영체제]1-2 운영체제의 태동  (5) 2024.12.19
[운영체제] 1-1 운영체제 개념  (3) 2024.12.05
'운영체제' 카테고리의 다른 글
  • [운영체제] 5. CPU 스케줄링
  • [운영체제] 4. 스레드와 멀티 스레딩
  • [운영체제] 2. 컴퓨터 시스템과 운영체제
  • [운영체제]1-2 운영체제의 태동
코뮝
코뮝
  • 코뮝
    코뮝의 기술 블로그
    코뮝
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • DB (1)
      • JAVA (0)
      • 운영체제 (11)
      • Spring (9)
      • 알고리즘 (2)
      • 카테캠 3기 (1)
      • DevOps (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    카태켐3기
    백엔드
    OS
    카태켐
    운영체제 공부
    시스템 콜
    분할 메모리 할당
    김영한
    생산자 소비자 문제
    기초 cs
    자바
    카테캠 백엔드
    CS
    참조의 지역성
    원자 명령
    운영체제
    가변 크기 할당
    기아 스레드
    고정 크기 할당
    Java
    타조 알고리즘
    프로그래머스 유연근무제
    코스만 조건
    Spring
    커널 레벨 스레드
    명품 운영체제
    스프링
    역페이지테이블
    스프링 기본
    스레드 매핑
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
코뮝
[운영체제] 3. 프로세스와 프로세스 관리
상단으로

티스토리툴바