일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- @Component
- 코딩테스트
- git
- C++
- 시스템호출
- C언어
- 카카오 코테
- nestjs auth
- thymeleaf
- nestJS
- 카카오 알고리즘
- 파이썬
- nestjs typeorm
- 스프링
- Nodejs
- @Autowired
- OpenCV
- AWS
- 알고리즘
- 구조체배열
- 해시
- 컴포넌트스캔
- 프로그래머스
- python
- Spring
- 가상면접사례로배우는대규모시스템설계기초
- TypeORM
- spring boot
- 코테
- 카카오
Archives
- Today
- Total
공부 기록장 💻
[운영체제/OS] 03장 프로세스 본문
1. 프로세스의 개념
- 프로그램: 저장장치에 저장되어 있는 정적인 상태
- 프로세스(process): 실행을 위해 메모리에 올라온 동적인 상태, 실행중인 프로그램
- exe 실행 파일(바이너리 파일) → 실행되어 메모리에 적재되면 ‘프로세스’가 됨
- 비동기적(asynchronous) 행위
- 운영체제에 들어있는 프로세스 제어블록이 생성됨
- 프로세서(CPU)에 할당하여 실행할 수 있는 개체 디스패치가 가능한 대상
- 프로세스를 처리할 때는, 일괄 방식이 아닌 시분할 방식을 사용하여 시간을 배분함으로써 시스템의 효율을 높인다.
프로세스와 메모리
프로그램에서 프로세스로의 전환
프로세스 제어 블록(PCB, Process Control Block)
- OS가 해당 프로세스를 위해 관리하는 자료구조 (Linked List 기반)
- 프로세스 구분자(PID): 각 프로세스를 구분하는 구분자
- 메모리 관련 정보: 프로세스의 메모리 위치 정보
- 각종 중간값: 프로세스가 사용했던 중간값 - 다음 작업해야할 코드의 위치가 담긴 레지스터인 PC 저장
프로세스와 프로그램의 관계
- OS로부터 프로세스 제어 블록을 얻는다는 뜻 (프로세스 = 프로그램 + 프로세스 제어블록)
프로세스의 상태 (4가지)
- 생성상태: 프로세스가 메모리에 올라와 실행 준비를 완료한 상태 ****
- 준비상태: 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태 (큐 구조)
- 실행상태: 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어(디스패치됨) 실제 작업을 수행
- 디스패치: 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU스케줄러의 작업
- 타임아웃: 프로세스가 자신에게 주어진 하나의 타임 슬라이스 동안 작업을 끝내지 못하면 다시 준비 상태로 돌아가는 것
- 완료상태: 실행 상태의 프로세스가 주어진 시간동안 작업을 마치면 진입하는 상태(PCB가 사라진 상태) → 더이상 PCB가 없고 모두 제거되는 상태
프로세스의 다섯가지 상태 **
- 생성상태
- 프로그램이 메모리에 올라오고 OS로부터 PCB를 할당 받은 상태
- 생성된 프로세스는 바로 실행되지 않고, 준비 상태에서 자기 순서를 READY QUEUE에서 기다리며, PCB도 같이 준비 상태로 옮겨짐
- 준비상태
- 실행 대기 중인 모든 프로세스가 자기 순서를 기다리는 상태
- PCB는 준비 큐에서 기다리며 CPU 스케줄러에 의해 관리됨
- (CPU scheduling 알고리즘 → 준비 상태에서 큐를 몇 개 운영할지, 큐에서 어떤 프로세스의 PCB를 실행 상태로 보낼지 결정 → 어떤 알고리즘에서 수행 되는 지에 따라 시스템의 성능이 매우 달라짐)
- 디스패치(PID) 명령 → 어떤 PCB를 선택하는 작업
- 해당 프로세스가 준비 상태에서 실행 상태로 변경되어 작업이 수행됨
- 실행상태
- 프로세스가 CPU를 할당 받아 실행되는 상태
- 자신에게 주어진 시간, 타임 슬라이스(time slice, time quantum)동안만 작업
- 시간 다 사용 시, timeout(PID) 실행 → 준비 상태
- 작업 완료, exit(PID) 실행 → 정상 종료
- 입출력 요청 → CPU는 입출력 관리자에게 입출력 요청하고 block(PID) 실행
- 입출력 완료될 때까지 작업 진행 불가, 대기 상태로 옮기고 CPU 스케줄러는 다른 새로운 프로세스를 실행 상태로 가져옴
- 대기상태: 프로세스가 입출력을 요청하고 입출력이 완료될 때까지 기다리는 상태 (wait status)
- 입출력 처리는 CPU가 입출력 관리자에게 요청을 하므로 대기 상태가 발생
- 대기 상태의 프로세스는 입출력 장치 별로 마련된 큐에서 기다리다가 입출력이 완료되면 인터럽트가 발생하고, 대기 상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾음 → wakeup(PID)
- wakeup로 해당 프로세스의 PCB가 준비 상태로 이동
- 완료 상태
- 코드, 사용했던 데이터를 메모리에서 삭제하고 PCB를 폐기
- 정상 종료 → exit()으로 처리
- 오류, 다른 프로세스에 의해 비정상적으로 종료되는 강제 종료 abort → 디버깅하기 위해 강제 종료 직전의 메모리 상태를 저장장치로 옮김 → 코어 덤프(core dump)
휴식, 보류 상태
- 활성 상태: 생성, 준비, 실행, 대기, 완료 상태
- 휴식 상태(puase status)
- 프로세스가 작업을 일시적으로 쉬고 있는 상태
- 유닉스에서 프로그램 실행 도중 Ctrl+Z 키 누른 경우
- 보류 상태(suspend)
- 프로세스가 메모리에서 잠시 쫓겨난 상태
- 메모리가 꽉 찬 경우, 프로그램에 오류가 있는 경우, 바이러스와 같은 악의적인 공격을 하는 프로세스라 판단될 때, 매우 긴 주기로 반복되는 프로세스인 경우, 입출력이 계속 지연될 때
2. 프로세스 제어블록 (PCB)
프로세스 제어블록(PCB, Process Control Block)
- 프로세스를 실행하는데 필요한 중요한 정보를 보관하는 자료구조
- 프로세스 - 고유의 PCB를 가짐
- 프로세스 생성 시 만들어져서, 프로세스 실행 완료 시 폐기
PCB의 구성
- 포인터: 준비 상태, 대기 상태의 큐를 구현할 때 사용
- 프로세스 상태: 생성/준비/실행/대기/보류준비/보류대기 상태
- 프로세스 구분자(PID)
- 프로그램 카운터: 다음 실행할 명령어의 위치를 가리키는 PC의 값 저장
- 프로세스 우선순위: 대기 큐, 준비 큐에 있는 프로세스 중 실행 상태로 옮겨야 할 프로세스의 우선순위 정보
- 각종 레지스터 정보: 누산기, 색인 레지스터, 스택 포인터
- 메모리 관리 정보: 메모리 위치 정보, 경계/한계 레지스터 값
- 할당된 자원 정보, 계정 정보: 계정 번호, CPU 할당 시간, CPU 사용 시간
- 부모 프로세스 구분자와 자식 프로세스의 구분자: PPID, CCID
포인터의 역할
- 준비 상태, 대기 상태에 있는 여러 큐 내에서 각각의 PCB를 연결하는 역할
문맥 교환(context switching)
- CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업 (작업 간의 전환 작업)
- CPU를 사용하던 프로세스가 다른 상태로 옮겨 갔을 때(작업 내용 저장), 다시 CPU가 새로운 프로세스 상태를 가져와 PCB의 내용을 할당 받는 전환의 과정
- CPU의 레지스터가 새로운 PCB 값으로 채워져 다음 작업을 하게 되는 전환 과정
문맥 교환이 일어나는 경우는 언제인가?
- 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생 → 인터럽트 발생시
- 어떤 프로세스가 자신에게 주어진 메모리 공간을 넘어가려 하여 경계 레지스터의 범위를 벗어나는 경우 → 인터럽트 관리 프로세스를 실행 상태로 만드는 경우
3. 프로세스의 연산
- 프로세스가 어떻게 생성되고 복사되는가? → 시스템 프로그래밍
프로세스의 구조
코드영역
- 프로그램의 본문이 기술된 텍스트 영역
- 프로그래머가 작성한 프로그램
데이터 영역
- 코드가 실행되며 사용하는 변수나 파일 등의 각종 데이터를 모아 놓은 곳
- 본문에 사용되며, 변하는 데이터 값들 (읽기, 쓰기)
스택 영역
- OS가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아 놓은 곳
- 함수를 호출하면 함수 수행한 뒤 원래 프로그램으로 되돌아올 위치를 저장
프로세스의 생성과 복사
fork() 시스템 호출의 개념
- 실행 중인 프로세스로부터 새로운 프로세스를 복사하는, 커널에서 제공하는 시스템 호출 함수
- 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어짐
- Ctrl+N 키를 누르면 실행 → 실행하던 프로세스가 부모 프로세스, 새로 생긴 프로세스가 자식 프로세스로서 부모-자식 관계가 됨
fork() 시스템 호출의 동작 과정
- PCB를 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사 되어 똑같은 프로세스가 만들어짐
- PCB의 내용 중 변경되는 것
- 프로세스 구분자 (PID)
- 메모리 관련 정보 (메모리 위치가 다르므로)
- 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)
- 자식 프로세스가 없는 경우 CPID의 값이 -1이다.
fork() 시스템 호출의 장점
- 프로세스의 생성 속도가 빠름
- 하드디스크로부터 프로그램을 새로 가져오지 않고 기존 메모리에서 복사하기 때문에 자식 프로세스의 생성 속도가 빠르다.
- 추가 작업 없이 자원 상속 가능
- 부모 프로세서가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속 가능
- 효율적인 시스템 관리
- PCID와 CCID가 연결되어 있어 자식 프로세스를 종료하면 자식이 사용하던 자원을 부모 프로세스가 정리 가능
- 프로세스 종료 시 프로세스가 사용하던 메모리 영역, 파일, 하드웨어를 잘 정리해야 하는데 이러한 정리를 부모 프로세스에 맡김으로써 시스템이 효율적으로 관리됨
교재 p.155 그림3-2
- main.c → main.exe 실행 파일에서 pid의 값에 따라 parent, child process를 각각 만들게 되는데, 동일한 파일 내라도 조건문에 따라 기존 PID 혹은 new PID인지에 따라 실행되는 위치가 다르다.
- ex) 웹 서버 - 클라이언트가 서버에 데이터나 페이지를 요청한 동시에 다른 클라이언트가 또 요청을 하게 되면, main 프로세스가 프로세스를 분기하여 프로세스 A와 B에 대해 child 프로세스를 각각 만들어 서버가 여러 요청을 각각 처리할 수 있도록 함. (순서대로 처리하게 되면 효율이 떨어짐) ⇒ 여러 클라이언트가 서버에 붙어 처리할 수 있도록 만들어야 구성 해 야함 → 스레드의 개념
프로세스의 전환
exec() 시스템 호출의 개념
- 기존의 프로세스를 새로운 프로세스로 전환하는 함수
- 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 변경
- 데이터 영역이 새로운 변수로 채워지고, 코드 영역은 새로운 코드로, 스택 영역은 리셋됨
- fork(): 새로운 프로세스를 복사하는 시스템 호출
- exec(): 각종 프로세스 구분자(PID, PPID, CPID)만 남겨두고 나머지의 내용을 새로 바꾸는 시스템 호출(내부 데이터 영역의 값들이 업데이트 됨)
exec()를 사용하는 목적
- 프로세스의 구조체를 재활용하기 위함
- 새로운 메모리의 확보가 필요 없으며, GC를 위해 상위 프로세스와 부모-자식 관계를 만들어야 함
- 이미 만들어진 PCB, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리함
프로세스의 계층 구조
유닉스의 프로세스 계층 구조
- 모든 프로세스는 init 프로세스의 자식이 되어 트리 구조를 이룸
- 부모 프로세스, 자식(서브) 프로세스
프로세스 계층 구조의 장점
- 여러 작업을 동시에 처리할 수 있다.
- login 프로세스: 유닉스 OS는 여러 사용자를 동시에 처리하기 위해 fork() 시스템 호출로 login 프로세스를 여러 개 만들어 사용자에게 나누어준다. (로그인 된 클라이언트들 각각에 대한 처리 가능)
- shell 프로세스: login프로세스가 작업을 마치면 해당 프로세스가 종료되고 shell 프로세스가 생성된다. shell에 대한 PCB가 새로 생성되는데, exec() 시스템 호출을 사용해 login 프로세스를 shell 프로세스로 바꾸어 사용자의 명령을 기다린다.
- 응용 프로그램 프로세스: exec() 시스템 호출
- 프로세스의 재사용이 용이하다.
- 자원 회수가 쉽다.계층 구조로 만들면 프로세스 간의 책임 관계가 분명해져 시스템 관리하기가 수월
미아 프로세스(orphan/zombie process)
- 부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때까지 기다려야 하는데, 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안되는 경우 발생 → 프로세스 종료 후에도 비정상적으로 남아있는 미아 프로세스
- 미아 프로세스가 많아지면 자원이 낭비되어 시스템의 성능이 떨어지게 됨
- C언어의 exit() 또는 return()문은 자식 프로세스가 작업이 끝났음을 부모 프로세스에게 알리는 것 → 미아 프로세스 발생을 미연에 방지→ 자식 프로세스가 먼저 종료된 후에, 부모 프로세스가 종료될 수 있도록 코드를 구성하지 않았기 때문에 발생하는 문제점
- ex) Java의 모든 객체가 상위 객체의 모든 특징을 상혹(Object 최상위 클래스)
- → Garbage Collection같은 경우: 사용하지 않는 변수 등을 자동적으로 처리해줌
- → 미뤄왔던 자원 정리나 프로세스와의 동기화를 할 수 있다.
4. 스레드
스레드의 개념
스레드의 정의
- 스레드(thread): 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위
- 프로세스의 특성인 자원과 제어에서 제어만 분리한 실행 단위
- CPU 스케줄러가 CPU에 전달하는 일 하나
- CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드
- OS 입장에서의 작업 단위 → 프로세스
- CPU 입장에서의 작업 단위 → 스레드
- 프로세스 하나는 스레드 한 개 이상으로 나눌 수 있음
- 같은 프로세스의 스레드들은 동일한 주소 공간 공유
프로세스와 스레드의 차이점
- 스레드 → 자원을 공유하는 여러 제어 영역 (한 스레드의 영향이 전체 프로세스에 영향을 미침)
- ex) 하나가 비정상 종료를 하며 리소스 영역까지 다 메모리로부터 해제하게 되면, 다른 스레드에도 영향을 미치게 됨
- 프로세스의 경우에는 자원/제어 영역이 모두 분리되어 관리되기 때문에 다른 프로세스에 영향을 미치지 않게 됨
멀티 태스크와 멀티 스레드
- 멀티태스크 : 여러 개의 프로세스로 구성된 것
- 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법(시분할 시스템)
- 운영체제가 CPU에 스레드 작업을 전달
- 서로 독립적인 프로세스들이 서로 데이터를 주고 받을 때 프로세스간 통신(IPC, Inter Process Communication)을 이용
- 멀티스레드: 하나의 프로세스에 여러 개의 스레드로 구성된 것
- 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법
- 프로세스 하나 안에서 동일한 자원을 사용(메모리 사용 영역-변수나 파일 등을 공유)하며, 제어권만 분리하여 쓰레드로 분리되어 있음
- 멀티프로세싱: CPU를 여러 개 사용해서 여러 개의 스레드를 동시에 처리하는 작업 환경
- 코어가 여러 개인 형태인 컴퓨터에서는, CPU하나로도 여러 스레드를 처리 가능하다.
- CPU 멀티스레드
- 한번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법
- 멀티스레드: OS가 소프트웨어 적으로 프로세스를 작은 단위의 스레드로 분할하여 운영하는 기법
- CPU 멀티스레드 : 하드웨어 적인 방법으로 하나의 CPU에서 여러 스레드를 동시에 처리하는 병렬 기법
- 한번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법
멀티스레드의 구조와 예
멀티태스킹의 낭비 요소
- fork() 시스템 호출로 프로세스를 복사 → 코드, 데이터 영역의 일부가 메모리에 중복되어 존재하므로 부모-자식 관계이지만 서로 독립적인 프로세스이므로 낭비 요소를 제거할 수 없음
- 따라서 스레드는, 비슷한 일을 하는 2ㅐ의 프로세스를 만드는 대신 코드, 데이터 등을 공유하며 여러 개의 일을 하나의 프로세스 내에서 함
멀티태스킹과 멀티스레드의 차이
- fork() 시스템 호출로 여러 개의 프로세스를 만들면 필요 없는 정적 영역이 여러 개가 됨
- 멀티스레드는 코드, 파일 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성을 향상 가능
스레드의 주소 공간
멀티스레드의 장단점
장점
- 응답성 향상
- 자원 공유
- 효율성 향상
- 다중 CPU지원
→ ex) 채팅 프로그램에서 채팅을 보내는 것과 파일을 공유하는 것을 동시에 수행 할 수 있음 (파일 전송 중인 경우에 채팅 전송 스레드는 대기 시간이 발생하지 않고 계속 실행 가능)
단점
- 모든 스레드가 자원을 공유하기 때문에, 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미침
- 인터넷 익스플로러에 여러 개의 화면을 동에 띄웠는데 그중 하나에 문제가 생기면 모든 익스플로러 전체가 종료되는 경우 / 문서에 문제가 생긴 경우 해당 워드 프로세스 자체가 종료됨
- 크롬의 경우, 멀티스레드 대신 멀티태스킹을 이용
멀티스레드 모델
- 멀티스레드: 프로그램 하나를 여러 실행 단위로 쪼개어 실행
- 커널 스레드 : 커널이 직접 생성하고 관리하는 스레드
- OS가 멀티스레드를 지원하지 않을 때 사용하는 방법으로, 사용자 프로세스 내에 여러 개의 스레드가 커널의 스레드 하나와 연결 (1 to N 모델)\
- 사용자 스레드(user thread) : 라이브러리에 의해 구현된 일반적인 스레드
사용자 레벨 스레드
- 라이브러리가 직접 스케줄링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요 없음(커널이 하는 일을 라이브러리가 대신 처리하여, 여러 개의 스레드를 작동함)
- ex) 워드프로세서와 뮤직 플레이어는 사용하는 레지스터, 주변장치가 다르기 떄문에 문맥교환이 필요하지만 같은 워드프로세서에서 서로 다른 문서를 편집하는 사용자 레벨 스레드에서는 문맥 교환이 필요 X
- 커널 입장에서는 하나의 스레드이다. 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하므로, 커널 스레드의 대기 상태가 모든 스레드에 영향을 줌
- 커널 스레드가 입출력 작업을 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기하게 됨
- 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러 개의 CPU를 동시에 사용할 수 없음
커널 레벨 스레드
- 커널이 직접 생성하고 관리하는 스레드
- 커널이 멀티스레드를 지원하는 경우 사용하는 방법
- 하나의 사용자 스레드가 하나의 커널 스레드와 연결 (1 to 1 모델)
- 독립적으로 스케줄링이 되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있음
- 커널 레벨에서 모든 작업을 지원하기 때문에 멀티 CPU를 사용 가능
- 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있음
- 커널의 기능을 사용하므로 보안에 강하고 안정적으로 작동
- 문맥 교환할 때 오버헤드 때문에 느리게 작동
- 사용자 레벨 스레드 & 커널 레벨 스레드를 혼합한 방식 (M to N 모델)
- 커널 스레드가 대기 상태로 들어가면 다른 커널 스레드가 대신 작업을 하여 사용자 레벨 스레드보다 유연하게 작업 처리 가능
멀티레벨 스레드(하이브리드 스레드)
- 사용자 레벨 스레드 & 커널 레벨 스레드를 혼합한 방식 (M to N 모델)
- 커널 스레드가 대기 상태로 들어가면 다른 커널 스레드가 대신 작업을 하여 사용자 레벨 스레드보다 유연하게 작업 처리 가능
728x90
반응형
'# CS Study > Opearing System' 카테고리의 다른 글
[운영체제/OS] 04장 CPU 스케줄링 (0) | 2022.08.21 |
---|---|
[운영체제/OS] 쉽게 배우는 운영체제 03장 문제 풀이 (프로세스) (0) | 2022.08.21 |
[운영체제/OS] 쉽게 배우는 운영체제 2장 문제풀이 (컴퓨터의 구조와 성능 향상) (0) | 2022.08.20 |
[운영체제/OS] 02장 컴퓨터의 구조와 성능 향상 (0) | 2022.08.20 |
[운영체제/OS] 쉽게 배우는 운영체제 1장 문제 풀이 (운영체제의 개요) (0) | 2022.08.20 |
Comments