1-1. 프로세스
프로그램
특정한 목적을 수행하기 위한 명령어, 데이터의 집합
프로세스
실행을 위해 메모리에 올라온 동적인 상태
일괄 작업 방식
큐로 작업을 처리, 먼저 들어온 작업을 처리해야 뒤에 들어온 작업을 할 수 있기 때문에 작업 효율이 떨어짐
시분할 방식
시간을 배분하여 작업을 처리, 여러 작업을 순서에 상관없이 번갈아 가면서 수행할 수 있음
1-2. 프로그램 → 프로세스 전환
프로세스 제어 블록(PCB; Process Control Block)
프로그램이 프로세스로 전환될 때 운영체제가 만드는 작업 지시서
PCB의 유무가 프로세스가 되거나 종료되거나를 결정
PCB가 가진 대표적 정보
- 프로세스 구분자(PID; Process IDentification): 각 프로세스를 구분하는 구분자
- 메모리 관련 정보: 프로세스의 메모리 위치 정보, 메모리 보호를 위한 경계, 한계 레지스터
- 각종 중간값: 프로세스가 사용했던 중간값
프로세스 4가지 상태
- 생성 상태: 프로세스가 메모리에 올라와 실행 준비를 완료한 상태, PCB 생성
- 준비 상태: 프로세스가 CPU 할당을 기다리는 상태
- 실행 상태: 준비 상태의 프로세스가 CPU를 할당받아 실제 작업을 수행하는 상태
- 완료 상태: 실행 상태의 프로세스가 시간 동안 작업을 마치면 진입하는 상태, PCB 사라짐
- 대기 상태: 실행 상태의 프로세스가 입출력을 요청하면 입출력을 기다리는 상태, 작업효율↑
타임아웃: 프로세스가 주어진 타임슬라이스안에 작업을 끝내지 못해 준비 상태로 돌아감
디스패치: 준비 상태의 프로세스 중 하나를 실행 상태로 바꿈
CPU 스케줄러: 디스패치할 프로세스를 선정
- 휴식 상태: 프로세스가 작업을 쉬고있는 상태
- 보류 상태: 프로세스가 메모리에서 잠시 쫓겨난 상태(일시 정지 상태)
2-1. 프로세스 제어 블록
프로세스 제어 블록의 구성
- 포인터: 준비 상태, 대기 상태 큐 구현
- 프로세스 상태: 프로세스의 현 상태를 나타냄
- 프로세스 구분자: 운영체제 내의 여러 프로세스를 구분하기 위함
- 프로그램 카운터: 다음 실행될 명령어의 위치를 가르킴
- 프로세스 우선순위: 프로세스의 실행 순서를 결정함
- 각종 레지스터 정보: 프로세스 실행 중 사용하던 레지스터 값
- 메모리 관리 정보: 프로세스가 있는 메모리의 위치 정보
- 할당된 자원 정보: 프로세스를 실행하기 위해 사용되는 자원에 대한 정보
- 계정 정보: 계정 번호, CPU 할당 시간, CPU 사용 시간 등
- PPID와 CPID 정보(Parent Process IDentification, Child Process IDentification)
2-2. 문맥 교환
의미
- CPU를 차지하던 프로세스가 나가고 새로운 프로세스가 들어오는 것
- 두 프로세스의 PCB를 교환
문맥 교환에도 시간이 들기 때문에 타임슬라이스를 적당한 크기로 설정해야 함(너무 크면 문맥교환이 잘 안일어나고 너무 작으면 너무 많이 일어나서 효율 떨어짐)
3-1. 프로세스의 구조
코드 영역
프로그래머가 작성한 코드가 탑재되는 영역
프로그램의 본문이 기술
데이터 영역
코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳
읽기와 쓰기가 가능
스택 영역
- 운영체제가 프로세스를 실행하는데 필요한 데이터를 모아놓은 곳
- 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 저장하는 곳
3-2. 프로세스 생성, 복사
fork()
실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
원래의 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라 함 (부모-자식 관계 성립)
fork() 호출 동작 과정
fork()가 호출되면 PCB의 대부분이 복사됨 but, PID, 메모리 관련 정보, PPID와 CPID는 변경
fork() 장점
- 프로세스 생성 속도가 빠름
- 추가 작업 필요없이 자원 상속
- 시스템 관리 효율적
exec()
기존의 프로세스를 새로운 프로세스로 전환(재사용)하는 함수
프로세스는 그대로 둔 채 내용만 변경하는 시스템 호출
exec() 호출 동작 과정
exec()가 호출되면 코드 영역의 코드를 지우고 새로운 코드로 변경
데이터 영역이 새로운 변수로 채워지고 스택 영역 리셋
PID, PPID, CPID, 메모리 관련 사항은 그대로, 각종 레지스터 값과 사용한 파일 정보 리셋
exec() 호출의 예
- 부모 프로세스에서 fork()해서 자식 프로세스를 생성하고, 부모 프로세스는 wait()으로 자식 프로세스가 끝날 때까지 기다림
- 부모 코드 = 자식 코드
- exec()로 자식코드를 새로운 코드로 바꿔도 PID, PPID, CPID는 그대로 → 프로세스 종료 시 다시 부모 프로세스로 돌아올 수 있음
3-3. 프로세스 계층 구조
유닉스에서 프로세스 계층 구조
유닉스에서 모든 프로세스는 init의 자식 프로세스로 트리구조를 이룸
프로세스 계층 구조의 장점
- 여러 작업을 동시에 처리할 수 있다.
- 프로세스의 재사용 용이
- 자원회수가 쉽다.
고아 프로세스, 좀비 프로세스
고아 프로세스: 부모 프로세스가 먼저 종료되어 돌아갈 곳이 없는 프로세스(init 프로세스가 새로운 부모 프로세스가 됨)
좀비 프로세스: 자식 프로세스가 종료되었는데 부모 프로세스가 뒤처리를 하지않아 발생하는 프로세스(부모가 wait()을 통해 보고받지 못한 경우), C에서는 exit() or return()으로 종료를 알림
4. 스레드
스레드 개념
- 프로세스에서 실행되는 프로그램 코드의 흐름
- CPU 스케줄러가 CPU에 전달하는 일 ‘하나’
- CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드
- (프로세스 = 운영체제의 작업단위)
- 스레드끼리는 코드, 데이터 영역, 시스템 자원은 공유 / 스레드ID, 프로그램 카운터, 레지스터 집합, 스택은 독립적 소유
프로세스와 스레드 차이
프로세스끼리는 약하게, 스레드끼리는 강하게 연결됨
스레드 관련 용어
- 멀티 스레드: 프로세스 내의 작업을 여러 개의 스레드로 분할해 작업 부담을 줄임
- 멀티 태스킹: 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분
- 멀티 프로세싱: 여러 개 CPU로 여러 개의 스레드를 동시에 처리
멀티 스레드의 구조
멀티 태스킹 = 하나의 프로세스를 여러 개로 나눠 각각 작업
멀티 스레드 = 하나의 프로세스 안에서 여러 개의 스레드로 작업
멀티 스레드의 장단점
장점
- 응답성 향상
- 자원 공유
- 효율성 향상
- 다중 CPU 지원
단점
- 모든 스레드가 자원을 공유 → 한 스레드의 문제가 전체에 영향을 끼침
커널 스레드
커널 스레드: 커널이 직접 생성하고 관리하는 스레드
사용자 스레드
사용자 스레드: 라이브러리에 의해 구현된 일반적인 스레드
- 사용자 스레드(1 to N 모델)
- 사용자 프로세스 내에 여러 개의 스레드가 커널 스레드 하나와 연결
- 라이브러리가 작업을 스케줄링하고 정보를 처리하기 때문에 문맥 교환 X
- 커널 스레드가 대기 상태에 들어가면 모든 사용자 스레드가 대기하게 됨
- 한 프로세스의 타임 슬라이스를 여러 개의 스레드가 공유하므로 여러개의 CPU를 사용할 수 없음
- 커널 스레드(1 to 1 모델)
- 하나의 사용자 스레드가 하나의 커널 스레드와 연결
- 독립적으로 스케줄링 → 하나의 스레드가 대기 상태가 돼도 다른 스레드는 작업 가능
- 커널 레벨에서 모든 작업을 지원 → 멀티 CPU 사용 가능
- 커널의 기능을 사용 → 보안에 유리, 안정적
- 문맥 교환 시 오버헤드 때문에 느림
- 멀티레벨 스레드(M to N 모델)
- 사용자 스레드와 커널 스레드의 혼합
- 커널 스레드가 대기 상태에 들어가면 다른 커널 스레드가 대신 작업
- 커널 스레드를 같이 사용하기에 문맥 교환이 일어나서 느림
- 빨라야 하는 건 사용자 스레드, 안정적으로 움직여야 하는 건 커널 스레드로 작동
5-1. 프로세스의 동적 할당 영역
프로세스 구조
- 코드 영역
- 데이터 영역
- 스택 영역, 힙 영역: 프로세스 실행 동안 생성되는 영역, 크기가 가변적인 동적 할당 영역
스택 영역
스레드가 작동하는 동안 추가되거나 삭제되는 동적 할당 영역
힙 영역
프로그램이 실행하는 동안 할당되는 변수 영역
new, malloc(), 포인터 등으로 새로 할당 가능
5-2. exit(), wait() 시스템 호출
exit() 시스템 호출
- 작업의 종료를 알려줌
- 부모 프로세스가 자식 프로세스가 사용하던 자원을 회수할 수 있음
- exit()가 전달하는 인자로 자식 프로세스가 어떤 상태로 종료 되었는지 파악 가능
- 0 → 정상종료
- 1 → 비정상종료
wait() 시스템 호출
- 자식 프로세스가 끝나기 기다렸다가 끝나면 다음 문장을 실행
- 부모 프로세스와 자식 프로세스간의 동기화에도 사용
'Computer Science > 운영체제' 카테고리의 다른 글
5. 프로세스 동기화 (0) | 2024.08.01 |
---|---|
4. CPU 스케줄링 (0) | 2023.10.16 |
2. 컴퓨터 구조와 성능 향상 (0) | 2023.10.16 |
1. 운영체제 개요 (0) | 2023.10.16 |