01_프로세스의 개요
프로세스의 개념
- 프로그램
- 저장장치에 저장 된 정적 상태
- 프로세스
- 실행 중인 프로그램
- 하나의 작업 단위
- 실행을 위해 메모리에 올라온 동적 상태
요사 모형에의 비유
일괄 작업 방식
- 한 번에 하나만 작업 처리
- 작업 효율이 떨어진다.
시분할 방식
- 여러 개의 작업에선 일괄 작업 방식이 비효율적이다.
- 시간을 적당히 배분하여 CPU 1개가 여러 프로세스를 동시 처리
- 예상 치 못한 상황 처리
- 작업을 마무리 하지 못한 상황에서 다른 작업을 처리하는 상황 발생
프로그램 -> 프로세스 전환
- 프로세스가 될 때 프로그램은 메모리에 올라 온다.
- 이 때, 작업 지시서인 프로세스 제어 블럭 이 만들어진다.
- 프로세스를 처리하는데 필요한 다양한 정보가 들어 있다.
- 프로그램이 프로세스가 되었다는 것은 프로세스 제어 블럭을 OS 로 부터 할당 받았다는 것을 의미한다.
- 프로세스 제어 블럭의 대표적인 3가지
- 프로세스 구분자 : pid
- 메모리 관련 정보
- 실행하려는 프로세스의 메모리 저장 위치
- 메모리 보호를 위한 경계, 한계 레지스터 포함
- 각종 중간 값
- 프로세스가 사용했던 중간 데이터
- 프로세스가 작업을 이어 갈 때 활용
- 프로세스 제어 블럭은 OS 영역에 만들어진다.
- 프로세스 종료 시 제어 블럭은 폐기 된다.
프로세스의 상태
- 생성 상태
- 프로세스가 메모리에 올라온 상태
- 프로세스 제어 블럭 생성, 같이 메모리로 옮겨짐
- 준비 상태
- CPU 를 할당 받을 때까지 기다리는 상태
- 준비 QUEUE 에서 대기
- 실제로는 다수 준비 큐 운영
- 큐를 운영하는 방식은 CPU 스케쥴러가 결정
- 실행 상태
- CPU 를 할당 받아 실제 작업을 수행하는 상태
- 프로세스는 CPU 사용 권리 획득
- 할당 받은 시간 (타임 슬라이스) 동안 작업 미완료 시 준비 상태로 복귀
- "타임 아웃"
- 입출력 요청 시, block 함수를 실행, 대기 상태로 옮김
- 완료 상태
- 프로세스가 작업을 마친 상태
- 프로세스 제어 블럭 폐기를 의미
- exit 함수 호출
- 강제 종료 (abort) 시, 직전 메모리 상태를 저장장치로 이동 -> 코어 덤프
- CPU 는 프로세스를 실행 하는 동안 클럭에게 타임 슬라이스 알림을 요청한다.
- 타임 슬라이스 만료 시, 클럭은 인터럽트를 사용한다.
- 대기 상태
- 프로세스가 IO 관련 작업 요청을 실행한 경우, 대기 상태로 바뀐다.
- 작업의 효율성을 위함
- 요청 완료 시, CPU 스케쥴러는 프로세스를 실행 상태로 만든다.
- IO 장치 별 큐에서 대기
- IO 요청 작업 완료 시, wake up 함수 호출 -> 인터럽트
- 휴식 상태
- 프로세스가 작업을 일시적으로 쉬고 있는 상태
- 프로세스 제어 블럭도 유지되므로, 멈춘 지점으로부터 재시작 가능
- 보류 상태
- 프로세스가 메모리에서 잠시 쫓겨난 상태 (일시 정지 상태)
- 메모리가 모자란 경우, 프로그램 오류, 부적절한 프로세스, 우선 순위가 낮은 프로세스, IO 요청 작업이 지연될 때
- 스왑 영역에 보관 된다.
- 프로세스가 메모리에서 잠시 쫓겨난 상태 (일시 정지 상태)
프로세스 제어 블럭
프로세스 제어 블럭 구성
포인터 : 프로세스 제어블럭의 첫번째 블럭에 저장 (큐 구현할때 이용)
프로세스 상태 : 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등 (두 번째 블럭에 저장)
프로그램 구분자 : 운영체제 내에서 프로세스를 구별하기 위한 것
프로그램 카운터 : 다음에 실행 될 명령어의 위치 저장
프로세스 우선순위 : CPU 스케줄러가 준비상태에서 실행상태로 옮길 때 사용
각종 레지스터 정보 : 자신이 사용하던 레지스터의 중간 값
메모리 관리 정보
활당된 자원 정보 : 입출력 자원, 오픈 파일
계정 정보
부모 프로세서 구분자, 자식 프로세스 구분자
- 포인터의 역할
- 같은 IO 를 기다리는 프로세스끼리 모아 놓는다.
- 이 때, 포인터를 통해 이전, 다음 순서를 알 수 있다.
문맥 교환
- 프로세스 간 작업 전환을 의미
- 프로세스 제어 블럭의 내용이 변경 된다.
- 인터럽트 시에도 발생한다.
03_프로세스의 연산
프로세스의 구조
- 코드 영역
- 프로그램의 본문이 기술된 영역 (텍스트 영역)
- 읽기 전용으로 처리 됨 (자기 자신을 수정하는 프로그램은 존재하지 않는다.)
- 데이터 영역
- 코드가 실행되며 사용하는 변수나 파일 등의 각종 데이터를 모아 놓는 영역
- 데이터는 변하는 값이므로 읽기와 쓰기가 가능하다.
- 스택 영역
- 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아 놓은 곳
- 프로세스 내에서 함수를 호출하면, 원래 프로그램으로 되돌아올 위치를 이 영역에 저장
- 사용자에게는 보이지 않음
프로세스의 생성과 복사
- fork() 시스템 호출의 개념
- 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
- 커널에서 제공, 일종의 시스템 호출
- 새로운 워드 프로세스를 실행하면 이 시스템 호출이 실행된다. (새로 만드는 것보다 속도가 훨씬 빠르다.)
- 부모 - 자식 관계로 연결된다.
- fork() 시스템 호출의 동작 과정
- 프로세스 제어 블럭을 포함한 부모 프로ㅔ스 영역의 대부분이 자식 프로세스에 복사 되어 동일한 프로세스가 생성 된다.
- 프로세스 구분자가 바뀐다.
- 메모리 관련 정보가 바뀌낟.
- ppid, cpid 가 바뀐다. 자식 프로세스의 cpid 는 -1
- 프로세스 제어 블럭을 포함한 부모 프로ㅔ스 영역의 대부분이 자식 프로세스에 복사 되어 동일한 프로세스가 생성 된다.
- fork() 시스템 호출의 장점
- 프로세스의 생성 속도가 빠르다.
- 추가 작업 없이 자원을 상속 가능하다.
- 시스템 관리를 효율적으로 할 수 있다.
프로세스의 전환
- exec() 시스템 호출의 개념
- 기존의 프로세스를 새로운 프로세스로 전환하는 함수
- 프로세스의 구조체를 재활용하기 위한 목적
- 이미 생성 된 PCB, Memory, 부모-자식 관계를 그대로 사용 가능하다.
- OS의 작업이 한결 수월해짐.
- exec() 시스템 호출의 동작 과정
- 코드 영역에 있는 기존 내용을 지우고, 새로운 코드로 변경, 스택 영역이 리셋
- pid, ppid, pcid 불변, Program counter registry 값 등 각종 레지스터와 사용한 파일 정보가 리셋 됨.
04. 프로세스의 계층 구조
유닉스의 프로세스 계층 구조
- 유닉스에서 커널이 처음 메모리에 올라와 부팅이 되면, 커널 관련 프로세스를 여러 개 생성한다.
- init 프로세스는 전체 프로세스의 출발점이 된다
- 하위 프로세스의 경우, 모두 자식이 되는 트리 구조를 이룬다.
프로세스 계층 구조의 장점
- 프로세스의 계층 구조는 동시에 여러 작업을 처리하고 종료된 프로세스의 자원을 회수하는 데 유용하다.
- 프로세스를 계층 구조로 만들면, 관계 간 책임이 분명해져, 시스템을 관리하기 수월하다.
- 작업을 마친 프로세스의 자원을 회수할 때 특히 편리하다.
미아 프로세스
- 부모 프로세스가 먼저 종료되거나, 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안 되는 경우, 사용하던 자원이 그대로 남게 된다.
- "좀비프로세스"
- OS 는 반환 되지 못한 자원을 회수하는 자원 회수를 주기적으로 해야 한다.
- C 언어의 return, exit 함수는 자식 프로세스의 작업이 끝난다는 것을 부모에게 알리는 것이다.
- 이를 통해 부모는 동기화가 가능하다.
- 이는 현대 객체 지향 언어에도 동일하게 적용한다. ex) Java 의 Object 클래스
4. 스레드
스레드의 개념
- 프로세스의 코드에 정의된 절차에 따라 CPU 에 작업 요청을 하는 실행 단위
프로세스의 스레드의 차이
- 스레드
- 스레드는 프로세스 내부에서 서로 강하게 연결 되어 있다.
- 멀티태스크
- 서로 독립적인 프로세스는 데이터를 주고받을 때 프로세스 간 통신 IPC 통신을 이용한다.
- 멀티스레드
- 멀티스레드는 변수나 파일 등을 공유하며 전역 변수나 함수 호출 등의 방법으로 스레드 간 통신을 한다.
- 멀티프로세싱
- CPU 를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경
- 병렬 처리에서의 슈퍼스칼라 기법과 같다.
- 여러 개의 CPU 혹은 하나의 CPU 내 여러 개의 코어에 스레드를 배정하여 동시에 작동
- 동일한 네트워크에 여러 컴퓨터에 스레드를 나누어 협업하는 분산 시스템도 멀티프로세싱이다.
- CPU 멀티스레드
- 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법
멀티스레드의 구조와 예
- 멀티태스킹의 낭비 요소를 제거하기 위해 사용한다.
- 응답성 향상에 도움이 된다.
- 자원 공유가 원활하다.
- 효율성 향상에 도움이 된다.
- 하지만, 한 스레드에 문제가 생길 경우, 전체 프로세스에 영향을 미친다.
멀티스레드 모델
커널 스레드
- 커널이 직접 생성하고 관리하는 스레드
- 커널이 멀티스레드를 지원하는 방식하나의 사용자 스레드가 하나의 커널 스레드와 연결되기 때문에, 1 to 1 모델이라 부른다.
- 독립적으로 스케쥴링 되므로 특정 스레드가 대기 상태에 들어가도 작업을 계속할 수 있다.
- 또한 커널이 제공하는 보호 기능과 같은 모든 기능을 사용 가능함.
사용자 스레드
- 라이브러리에 의해 구현된 일반적인 스레드
- 커널 입장에서 이 스레드는 하나의 프로세스처럼 보인다.
- 커널 스레드와 1:N 관계
- 라이브러리가 직접 스케쥴링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요 없다.
- 여러 개의 스레드가 하나의 커널 스레드와 연결 되므로, 커널 스레드가 IO 작업을 위해 대기 상태일 때 연결 된 모든 사용자 스레드도 대기한다.
- 한 프로세스의 타임 슬라이스르 여러 스레드가 공유하므로, 여러 개의 CPU 를 동시에 사용할 수 없다. 하지만 커널의 경우 스레드를 여러 CPU 에 나누어 작업시키는 것이 가능하다.
- 또한 사용자 레벨 스레드는 보안에 취약하다. 커널 레벨에서는 공유 변수를 보호하는 장치가 있다.
멀티레벨 스레드
- 사용자 레벨, 커널 스레드를 혼합한 방식
- 문맥 교환의 오버헤드가 있어 빠르진 않다.
반응형
'🖥️ Computer Science' 카테고리의 다른 글
[쉽게 배우는 운영체제] ch.7 물리 메모리 관리 - 연습 & 심화 문제 (1) | 2022.11.06 |
---|---|
[쉽게 배우는 운영체제] ch.6 프로세스 동기화 - 연습 & 심화 문제 (0) | 2022.11.06 |
[쉽게 배우는 운영체제] ch.5 프로세스 동기화 - 연습 & 심화 문제 (0) | 2022.11.04 |
[쉽게 배우는 운영체제] ch.4 CPU 스케줄링 - 연습 & 심화 문제 (0) | 2022.11.04 |
[쉽게 배우는 운영체제] ch.3 프로세스와 스레드 - 연습 & 심화 문제 (0) | 2022.11.02 |