
1. 프로세스의 개요
- 프로세스는 하나의 작업 단위로, 마우스로 더블클릭하여 실행하면 프로그램은 프로세스가 된다.
1. 프로세스의 개념
- 저장장치에 보관되어 있따가 더블 클릭으로 실행된다.
- 실행되면 해당 코드가 메모리로 올라와 작업이 실행된다.
- 프러그램일나 어떤 데이터를 사용하여 어떤 작업을 할지 그 절차를 적어 놓은 것이다.
2. 요리사의 모형의 비유
- 운영체제에서 각 프로세스는 여러 상태를 거친다.
- 일괄 작업 시스템
- 한번에 하나의 작업만 처리하는 것
- 먼저 들어온 것 부터 처리: 큐
- 시분할 방식
- CPU 시간을 쪼개어 여러 프로세스에 적당히 분배함
- 프로세스가 동시에 실행되는 것처럼 느껴진다.
- 시분할 방식에서의 예상치 못한 상황 처리
- CPU가 기다리는것
- 보류 목록의 작업은 언제 다시 시작될지 모르거나 중간에 그만둘지 모르는 것으로. 대기 목록에 있는 작업과 구분된다.
3. 프로그램에서 프로세스의 전환
- 프로그램이 프로세스로 전환될 때
- 운영체제는 프로그램에 메모리의 적당한 위치로 가져온다.
- 동시에 주문서에 해당하는 프로세스 제어 블록 (PCB, 작업지시서) 를 만든다.
- 프로그램이 프로세스가 되려면 메모리에 올라오는 것과 동시에 프로세스 제어 블록이 생성되어야 한다.
- 프로그램이 프로세스가 된다는 것은 운영체제로부터 프로세스 제어 블록을 얻는다
- 프로세스가 종료된다는 것은 해당 프로세스 제어 블록이 폐기된다는 뜻이다.
- 프로세스 제어 블록은 운영체제가 해당 프로세스를 실행하기 위해 관리하는 데이터 구조이므로 운영체제 영역에 만들어진다.
- 운영체제도 프로그램이기 때문에 프로세스 형태로 실행되어야 한다.
- 부팅과정에서 부트스트랩이 운영체제 관련 프로세스를 실행한 후 일반 프로세스가 실행된다. (컴퓨터에서는 사용자 프로세스와 커널 프로세스가 섞여서 실행된다.)
- 프로세스 제어 블록의 정보
- 프로세스 구분자: 각 프로세스를 구분하는 구분자
- 메모리관련 정보: 프로세스가 메모리의 어디에 저장되어 있는지에 대한 정보
- 각종 중간값: 여러 프로세스가 번갈아 가며 실행된 -> 각 프로세스는 일정 시간 작업을 한 후 다른 프로세스에 CPU를 넘겨준다, 작업의 중간값을 보관 중인 다른 레지스터도 같이 저장된다.
- 다음에 작업해야 할 코드의 위치가 담긴 레지스터인 프로그램 카운터가 저장된다.

4. 프로세스의 상태
- 시분할 시스템의 경우 프로세스가 중간에 다른 프로세스에 CPU를 넘겨주는 일이 빈번하게 발생한다.
- 운영체제에서 이제 막 프로세스가 되었거나 CPU를 사용하다 쫓겨난 프로세스는 준비상태에서 자기 순서를 기다린다.
프로세스의 네가지 상태
- 생성 상태: 프로세스 제어 블록(PCB) 생성, 메모리에 올라와 실행 준비를 완료하는 상태이다.
- 준비 상태: CPU를 얻을 때까지 기다리는 상태, 자기 실행 순서가 될 때까지 준비 상태에서 기다려야 한다 (준비 큐), CPU 스케줄러에 의해 관리 된다.
- 실행 상태: 일정시간(타임슬라이스) 동안 CPU를 얻어(할당받은 상태) 실제 작업을 수행하 는 상태로 execute status, 프로세스는 자신의 작업이 끝날 때까지 준비 상태와 실행 상태를 왔다 갔다 한다, 실행 상태에 들어가는 프로세스의 수는 CPU 의 개수만큼이다.
- 완료 상태: 주어진 시간 동안 작업을 마친 상태, 데이터를 메모리에서 삭제하고 프로세스 제어 블록이 사라진 상태를 의미이다. 강제 종료를만나면 메모리 상태를 저장장치로 옮김 (코어 덤프: 종료 직전의 메모리 상태를 확인함으로써 오류를 수정할 수 있게 해준다.)
- CPU 스케줄러: 여러 프로세스 중 다음에 실행할 프로세스를 선정하는 일, 모든 프로세스의 작업이 원만하게 이루어지도록 관리한다.
- 디스패치: 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러의 작업
- 타임 슬라이스 또는 타임 퀀텀: 실행 상태에서 일정 시간 동안 작업을 하는데, 프로 세스에 배당된 작업 시간
- 타임아웃: 작업을 끝내지 못하면 다시 준비 상태로 돌아간다.
- 새로운 프로세스가 실행 상태로 들어오면 CPU는 일정 시간이 흐른 뒤 알려 달라고 클록에 요청한다 ( 클록으로부터의 인터럽트)
프로세스의 다섯가지 상태 : 활성 상태
- 입출력을 대비한 대기 상태 추가
- 대기 상태: 입출력을 요구한 프로세스가 입출력이 완료될 때까지 기다리는 상태로 waitstatus, 입출력이 완료되면 인터럽트가 발생하고 대기상태에서 프로세스를 찾고, 찾아낸 프로세스의 프로세스 제어 블록(PCB)을 준비 상 태로 이동시킨다
- 대기 상태의 프로세스는 요청한 입출력이 완료되면 입출력 관리자로부터 인터럽트를 받는다.
- 대기 상태에서 입출 력이 끝난 프로세스는 실행 상태로 가지 않고 준비 상태로 돌아가 자기 차례를 기다린다.


휴식 상태와 보류 상태
- 휴식 상태: 프로세스가 작업을 일시적으로 쉬고 있는 상태, 사용하던 데이터가 메모리에 그대로 있고 프로세스 제어 블록도 유지되므로 프로세스는 멈춘 지점에서부터 재시작할 수 있다.
- 보류 상태( 일시 정지 상태 ): 프로세스가 메모리에서 잠시 쫓겨난 상태, 대개 컴퓨터의 성능을 떨 어뜨리거나 실행을 미루어도 큰 지장이 없는 프로세스가 해당된다. 보류 상태에 들어간 프로세스는 메모리 밖으로 쫓겨나 스왑 영역( 메모리에서 쫓겨난 데이터가 임시로 보관되는 곳 )에 보관된다.
- 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때
- 프로그램에 오류가 있을때
- 바이러스 프로세스라고 판단될 때
- 매우 긴 주기로 반복되는 프로세스
- 입출력이 계속 지연될 때
- 보류 상태는 스왑 영역에 있는 상태이고 휴식 상태는 프로세스가 메모리에 있으나 멈춘 상태다.
- 보류 대기 상태: 보류 상태가 다시 대기 상태에서 옮겨진 상태, 보류 대기 상태에서 입출력이 완료되면 활성 상태가 아닌 보류 준비 상태 로옮겨간다.
- 보류 준비 상태: 보류 상태가 준비 상태에서 옮겨진 상태
- 각 상태에서 재시작하면 원래의 활성 상태로 들어간다.

2. 프로세스 제어 블록과 문맥 교환
1. 프로세스 제어 블록(PCB, TCB)
- 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조
- 모든 프로세스에는 고유한 프로세스 제어 블록이 있다.
- 프로세스가 생성될 때 만들어져 프로세스 실행이 완료되면 폐기 된다.
- 프로세스 제어 블록 구성
- 포인터: 첫번째 블록에 포인터가 저장되고, 프로세스 제어 블록을 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 포인터를 사용한다.
- 프로세스 상태: 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 상태 등이 두번째 블록에 저장된다.
- 프로세스 구분자
- 프로그램 카운터
- 프로세스 우선순위: 우선순위에 따라 프로세스 제어 블록들이 여러 줄로 서 있다.
- 각종 레지스터 정보: 누산기, 색인 레지스터, 스택 포인터, 레지스터의 중간값
- 메모리 관리 정보: 프로세스가 메모리의 어디에 저장되어 있는지
- 할당된 자원 정보: 입출력 자원이나 오픈 파일에 대한 정보
- 계정 정보: 계정 번호, CPU 할당 시간, CPU사용 시간 등
- 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)
2. 문맥 교환
- 의미: CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말한다.
- 주어진 시 간을 다 사용하면 발생하고, 인터럽트가 걸렸을 때도 발생한다.
- 절차
- 기존 프로세스가 타임아웃이 되면 프로세스 제어 블록에 작업 결과를 저장하고 준비상태로 쫓겨난다.
- 준비 상태에 있던 다음 프로세스가 실행상태가 되고 CPU의 레지스터가 프로세스 제어블록에 값을 채워 작업을 한다.
- 문맥 교환과 타임 슬라이스의 크기
- 너무 길어도(시간이 오래 걸려 끊겨 보인다.) 너무 짧아도(시스템 성능이 떨어진다.) 안된다.
- 타임 슬라이스는 되도록 작게 설정하되 문맥 교환에 걸리는 시간을 고려하여 적 당한 크기로 설정하는 것이 중요하다.

3. 프로세스의 연산
1. 프로세스의 구조
- 코드영역: 프로그램의 본문이 기술된 곳으로 텍스트 영역이다.
- 데이터 영역: 사용자가 변수나 파일 등의 각종 데이터를 모아놓은 곳이다.
- 스택 영역: 부수적으로 필요한 데이터, 프로세스 작동을 위해 유지하는 영역이다.

2. 프로세스의 생성과 복사
- 사용자가 프로그램을 실행하면 운영체제는 프로그램을 메모리로 가져와 코드 영역에 넣고 프로세스 제어블록을 생성한다.
- 메모리는 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행한다.
fork() 시스템 호출의 개념 : 복사하는 함수
- 실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수 (커널에서 제공)
- 동일한 프로세스가 생성된다.
- 처음 프로그램 실행 속도보다 훨씬 빠르다.
- 새로생긴 프로세스는 자식 프로세스가 되어, 부모-자식 관계로 연결된다.
fork() 시스템 호출의 동작 과정
- 부모와 똑같은 자식 프로세스 (단, 프로세스 구분자가 바뀐다.)
- 부모와 자식 프로세스가 차지하는 메모리의 위치가 다르므로 메모리 관련 정보가 바뀐다.
- 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자 (CPID)가 바뀐다.

fork() 시스템 호출의 장점
- 프로세스의 생성 속도가 빠르다.
- 추가 작업 없이 작원을 상속할 수 있다.
- 부모-자식 프로세스가 구분자로 연결되어, 시스템 관리를 효율적으로 할 수 있다
fork() 시스템 호출의 예
- pid = fork()
- pid == 0이면 자식 프로세스, pid > 0 이면 부모 프로세스다
- 어떤 프로세스가 먼저 출력되는지 알 수 없다.
3. 프로세스의 전환
exec() 시스템 호출의 개념
- exec() 시스템 호출: 기존 프로세스 새로운 프로세스로 전환하는 함수이다.
- 프로세스의 구조를 재활용: 이미 만들어진 프로세스 제어 블록, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있다.
- 시스템 호출은 각종 프로세스 구분자(PID, PPID, CPID)만 남겨두고 프로세스의 나머지 내용을 새로운 것으로 바꾼다.
exec() 시스템 호출의 동작 과정
- 코드 영역에 있는 기존 내용이 지워지고 새로운 코드로 바뀐다.
- 데이터 영역은 새로운 변수로 채워진다. ( 프로그램 카운터 레지스터 값을 비롯한 각종 레지스터와 사용한 파일 정보가 모두 리셋된다.)
- 스택 영역은 리셋된다.

exec() 시스템 호출의 예
- 부모 프로세스: 자식 프로세스 생성(fork())하고 wait()문으로 자식 프로세스가 끝날 때까지 기다린다.
- exec()로 다른 프로세스로 전환되더라도 프로세스 구분자는 변경되지 않기 때문에 부모 프로세스로 돌아온다.
4. 프로세스의 계층 구조
- 프로세스의 복사와 전환은 프로세스의 생성 과정과 계층 구조를 이해하는 데 중요한 열쇠가 된다
유닉스의 프로세스 계층 구조
- 부팅이 되고, 프로세스 여러개를 만든다. init 프로세스의 자식으로 만든다.
- init 프로세스가 맨 위에 위치하고, fork()와 exec() 시스템 호출로 자식 프로세스를 만든다.

프로세스 계층 구조의 장점
- 여러 작업의 동시 처리: fork()시스템 호출로 여러 프로세스를 만들오, 여러 사용자를 동시에 처리할 수 있다.
- shell프로세스가 있어 야 사용자가 운영체제에 명령을 내리고 결과를 받을 수 있다
- login이 끝나면 새로운 shell 프로세스가 생성된다.
- exec() 시스템 호출을 사용하여 login 프로세스의 구조를 shell 프로세스로 다시 활용하면 자원을 효율적으로 관리할 수 있다


- 용이한 자원 회수
- 프로세스 간의 책임 관계가 분명해져, 자원을 회수할 떄 편하다.
- 자식 프로세스가 작업을 마쳤을 때 사용하던 자원을 부모 프로세스가 회수하면 된다.
고아 프로세스와 좀비 프로세스
- 부모 프로세스가 먼저 종료, 자식 프로세스가 비정상적으로 종료 되면 자원이 그래도 남게 된다.
- 고아 프로세스: 부모가 먼저 종료되었을 때
- 좀비 프로세스: 부모 프로세스가 뒷처리를 하지 않았을 때
- 극복하기 위해 주기적으로 반환되지 못한 자원을 회수한다, exit() 또는 return() 문은 자식 프로세스가 작업이 끝났음을 부모 프로세스에 알리는 것이다.
4. 스레드
- 운영체제는 낭비요소를 제거하고 작업의 유연성을 얻기 위해 멀티 스레드를 사용한다.
1. 스레드의 개념
스레드의 정의
- 프로세스의 작업 과정
- 운영체제는 코드와 데이터를 메모리에 올려, 프로세스 제어블록을 생성하고, 메모리를 확보한다. 이후 준비된 프로세스를 준비 큐에 삽입한다.
- 프로세스가 생성되면, CPU스케쥴러는 프로세스가 해야하는 일을 CPU에 전달하고 실제 작업은 CPU가 수행한다.
이때!! CPU스케쥴러가 CPU에 전달하는 일 하나가 스레드다.
- 운영체제 입장의 작업 단위는 프로세스고, CPU입장의 작업 단위는 스레드다. (집 짓기: 프로세스, 세부작업: 스레드)
프로세스와 스레드의 차이
- 프로세스끼리는 약하게 연결되어 있지만, 스레드끼리는 강하게 연결되어 있다.
- 멀티태스트: 서로 독립적인 프로세스는 데이터를 주고받을 때 프로세스 간 통신을 한다.
- 멀티스레드: 워드프로세서가 종료되면 프로세스 내의 스레드도 강제 종료된다, 여러 개의 코어를 가진 CPU가 생기면서 생김.
- 따라서, 프로세스를 다양한 스레드로 나누어 여러 개의 코어에 배분함으로써 시스템의 효율을 높인다.
스레드 관련 용어
- 멀티스레드: 프로세스를 여러 개의 스레드로 분할함으로써 작업의 부담을 줄인다.
- 멀티태스킹: CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법이다. (시분할 시스템)
- 멀티 프로세싱: CPU를 여러개 사용하여 스레드를 동시에 처리, 하나의 CPU 내 여러 개의 코어로 스레드를 동시에 처리
- CPU 멀티 스레드: 하나의 CPU에서 스레드를 잘게 쪼개어 동시에 처리하는 명령어 병렬 처리 기법
2. 멀티스레드의 구조와 예
멀티스레드의 구조
- 프로세스 = 정적인 영역 + 동적인 영역 (레지스터 값, 스택, 힙)
- 멀티태스킹: 여러개를 동시에 처리하기 위해 fork()를 사용하면 메모리에 중복되는 요소가 많아서 낭비였다. 부모-자식 관계여도 독립적인 프로세스라 낭비 요소를제거할 수 없다.
- 필요 없는 정적 영역이 여러개
- 멀티스레드: 코드, 데이터 등을 공유하면서 여러 개릐 일을 하나의 프로세스 내에서 하는 것이다.
- 코드 파일 등의 자원이 공유된다.
- 낭비를 막고 효율설을 향상할 수 있다.
- 두 번째 부터는 빠르게 실행도니다.
- 스레드 1개 :무거운 프로세스 / 스레드 여러개: 가벼운 프로세스

멀티스레드의 예
이헤xxxxxxx


3. 멀티스레드의 장단점
멀티스레드의 장점
- 프로세스 공유부분을 제외하고 실행과 관련된 부분을 나누어 관리하면 자원의 중복사용을 피해, 낭비를 막을 수 있다.
- 응답성 향상: 입출력이 있어도 다른 스레드가 있어서 기다리지 않는다.
- 자원공유:
- 효율성 향상: 여러 프로세스를 사용하면 작업의 효율을 높일 수 있다.
- 다중 CCPU지원 가능
멀티스레드의 단점
- 인터넷 익스플로러: 하나의 프로세스에 멀티 스레드 사용
- 낭비는 없지만, 공유하고 있어서 문제가 생기면 전체 프로세스에 영향을 미친다.
- 크롬: 여러 개의 프로세스 사용, 멀티 태스킹
- 낭비는 있지만, 독립적이어서 각 프로세스에 영향을 주지 않는다.
- 메모리도 넉넉하고 멀티 코어 CPU가 대중화 되어 여러 개의 프로세스를 여러 개의 CPU에서 동시에 실행 할수 있다.
4. 멀티스레드 모델
- 커널 스레드: 커널이 직접 생성하고 관리하는 스레드
- 사용자 스레드: 라이브러리에 의해 구현된 일반적인 스레드 (시스템 호출이 있으면 커널스레드 이용가능)
사용자 스레드 (1 to N 모델)
- 사용자 레벨에서 라이브러리를 사용하여 스레드를 구현한다.
- 스케줄링이나 동기화를 대신 구현해준다.
- 라이브러리가 직접 스케줄링하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요 없다.
- 사용자 프로세스 내에 여러 개의 스레드가 존재하지만 커널의 스레드 하나와 연결되리 때문에 1 to N모델이다.
- 커널 스 레드가 입출력 작업을 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기하게 된다
- 한 프로세스의 타임슬라이스를 여러 스레드가 공유하기 때문에 여러개의 CPU를 동시에 사용할 수 없다.
- 보안에 취약하다.

커널 스레드 (1 to 1 모델)
- 커널 스레드는 독 립적으로 스케줄링되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있다
- 멀티 CPU 를 사용할 수 있고, 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있다.
- 문맥 교환을 할 때 오버헤드 때문에 느리게 작동

멀티레벨 스레드 ( M to N 모델 )
- 멀티레벨 스레드, 하이브리드 슬드 = 사용자 스레드 + 커널 스레드
- 하나의 커널 스레드가 대기 상태에 들어가면 다른 커널 스레드가 대신 작업을 하여 사용자 스레드보다 유연하게 작업을 처리할 수 있다
- 문맥 교환 시 오버헤드가 있어 사용자 스레드만 큼 빠르지 않다.

5. 동적 할당 영역과 시스템 호출
1. 프로세서의 동적 할당 영역
- 정적(코드 영역, 데이터 영역) + 동적 (힙, 스택 영역)
스택 영역 - 동적 할당 영역
- 함수호출이후 돌아올 메모리 주소 저장
- 변수 사용범위에 영향을 미치는 영역 (지역변수)
- 스택은 프로세스를 작동하기 위해 커널이 유지하는 자료구조다
- 함수가 몇번호출되냐에 따라 다르다 -> 스택은 스레드가 진행됨에 따라 커지거나 작아진다.
힙 영역 - 동적 할당 영역
- molloc(): 메모리 자리 차지, 프로세스 제어 블록 만들고 큐에 삽입한다. 종료되면 메모리 공간 반환
- darr은 필요할 때 malloc() 함수로 메모리를 할당받았다가 필요 없어지 면 free() 함수로 메모리 영역을 반환한다

2. exit()와 wait() 시스템 호출
- exit(): 자식 프로세스가 끝난것을 부모에 알림, 자식의 자원을 빨리 거둬갈 수 있다.4
- 인자가 0이면 정상 종료이고 -1이면 비정상 종료다.
- wait(): 부모가 먼저 종료되면 자식은 고아 프로세스가 된다. 이를 방지
- getpid(): 프로세스 구분자를 확인하기 위해

- 전면프로세스: 작업이 끝날 때까지 셸이 다음 명령어의 입력을 받아들이지 않는다.
- 후면 프로세스: 프로세스를 실행한 후 셸이 바로 다음 명령어를 실행할 준비를 한다
출처 : 조성호 , 『IT CookBook, 쉽게 배우는 운영체제(2판)』한빛아카데미(2023).
'COMPUTER SCIENCE > OS' 카테고리의 다른 글
| [쉽게 배우는 운영체제 2판] 4. CPU 스케줄링 (0) | 2025.04.16 |
|---|---|
| [쉽게 배우는 운영체제 2판] 3장 연습문제 (0) | 2025.04.15 |
| [쉽게 배우는 운영체제 2판] 2장 연습문제 (0) | 2025.04.14 |
| [쉽게 배우는 운영체제 2판] 1장 연습문제 (0) | 2025.04.14 |
| [쉽게 배우는 운영체제 2판] 2. 컴퓨터의 구조와 성능 (0) | 2025.04.11 |