[2024.10.19] 필수 온라인 강의 Part2 운영체제 CH02 프로세스와 스레드
* 기술면접 단골 질문! 암기할 내용!
커널 영역과 사용자 영역의 프로세스
- 프로세스 = 실행중인 프로그램!!!!!
- 메모리는 운영체제가 적재되는 커널 / 사용자가 사용하는 게 적재되는 사용자 영역
- 같은 프로그램도 별도의 프로세스가 될 수 있다
- 여러번 시행하면, 어러개의 프로세스가 된다.
- 꼭 중복 적재 XX : 가장 메모리로 되는 경우도 있음! 중복 적재 안 되고, 별ㄹ도의 프로세스가 되는 경우가 있다!
리눅스 운영체제에서는 ps 명령어를 통해서, 실행중인 프로세스들을 확인할 수 있음
- 프로그라운드 프로세스 & 백그라운드 프로세스
- 대표적으로 나누어지는 프로세스 ( 프로세스의 종류는 정말 다양하게 나눠진다.)
프로그라운드 : 직접적으로 사용자와 소통을 하는 프로세스
백그라운드 : 뒷단에서 사용자와 직접적 상호작용X
- 백그라운드 중에서 더 특별한 프로세스 : 서비스, 데몬 등이 있음
- 서비스 : 백그라운드 프로세스(사용자와 완전히 전혀!!!!! 상호작용X) - 운영체제는 이런 많은 프로세스를 어떻게 관리할까? 프로세스 제어 블록 (PCB)
- 프로세스들이 동시다발적으로 많이 시행이 됨 : 이걸 관리하려면 프로세스 제어 블록 (PCB)이라고 하는 특별한 자료구조가 필요함
- 특별한 데이터 덩어리가 필요함
- 관리를 위해 프로세스들에게 달아놓은 꼬리표라고 생각
- 운영체제의 커널 영역 내에 할당!!!!!!!!!!!!
- 실행이 되면 pcb 생성 / 종료시 pcb 폐기
- 적힌 정보 (굉장히 간단하게)
- PID (Process ID, 학번/사번 정도로 생각) (PPID(부모 프로세스의 PID)가 같이 명시된 경우도 있음)
- 별도의 프로세스는 각각의 PID를 가짐(같은 프로그램이라고 해도 다른 PID)
- getpid, getppid라는 시스템콜로 쉽게 알 수 있음
- 특정 pid값으로 어떤 프로세스인지도 검색이 가능 : pidof bash , pgrep bash 등의 시스템 콜 사용
- 레지스터
- 스케줄링 정보 : 얼마나 자주 할당받아서, 얼마나 빨리 시행?일지 나와있음
- 메모리 정보 : 메모리 어디에 적재 되어있는가?
- 사용한 파일 정보
- 입출력장치 정보
- 실제로 적히는 정보는 굉장히 복잡하다 : 운영체제마다 다른 정보, 훨씬 더 많은 정보
- linux kernel - task_struct 구조체 : 리눅스 운영체제가 관리하는 pcd를 볼 수 있음
: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/sched.h?h=v6.3.13#n737
- 문맥 교환 : 여러 프로세스들이 번갈아가며 실행되는 원리
- 문맥 (context): 실행을 재개하기 위해 기억해야 할 정보
- PCB를 통해서 정말 많은 프로세스들을 운영체제가 식별하고 자원(CPU, 메모리 등) 을 할당하는데,
항상!!!! 자원의 개수보다 일반적으로 실행되는 프로세스의 개수가 훨씬 많음
-> 번갈아가면서 한정된 자원을 사용해야함!
- 프로세스 A가 진행되다가 프로세스B가 진행되고, 다시 A차례가 오면 어디까지 진행이 되었는지를 알아야함.
- 빠를 수록 좋음! 다양한 프로그램이 동시에 시행되는 것처럼 보임
- 자주 발생할 수록 안 좋음 : 비용이 발생함 : 프로세스 실행의 성능이 저하될 수 있음
- 커널영역에서는 PCB가 정말 정말 중요하다!!!!!!!!!!!!!!!!!!
- 프로세스가 실행되면 PCB 생성 / 종료시 PCB 삭제 - 사용자 영역에서는 4가지의 영역이 하나의 프로세스로 구성이 됨
*** 시험.기술면접에 굉장히 많이 나옴!!! 각각의 영역이 어떤 영역인지 꼭 알아놓기 ***
- 구성하고 있는 영역의 크기를 조회하는 명령어
1. size 명령어 :
2. top 명령어 : 시스템 리소스 모니터링을 할 때 많이 사용되는 명령어
- CODE , DATA를 볼 수 있고 그 외에 볼 수 있는 게 많음
- 코드 영역 (텍스트 영역)
- 실행 가능한 코드; 기계어로 이루어진 명령어 Read-only
- cpu는 기계어로 이루어진 명령어를 해석해서 실행 : 그때 어떤 프로세스를 이루는 명령어가 코드 영역에 적재
- 변경X : 읽고와서 실행 읽고와서 실행 : READ ONLY!!!!
- 데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터 (e.g. 전역 변수)
* BSS 영역으로 구분이 되기도 함 (세분화시)
- BSS 영역: 프로그램 실행 동안 유지할 데이터 중 초기값 없는 데이터 <> 있는 데이터 : 데이터 영역
- 힙 영역 (heap 영역)
- 사용자(개발자)가 직접 할당 가능한 공간
- 메모리 영역을 할당 했다면 해제하자*** ( 직접 해제 하기, 자동으로 해제 하기(가비지 컬렉션))
- 다쓰면 직접 해제를 해야한다. 할당받은 영역은 반드시!!!
- 해제를 안하면 : 메모리 누수라는 문제가 생김 : memory leac
- 스택 영역
- 임시로 저장되는 영역 (e.g. 매개 변수, 지역 변수) : 특정영역을 벗어나면 없어짐
- 코드 영역과 데이터 영역은 크기가 바뀌지 않음 : 정적 할당 영역
- 스택영역과 heap 영역은 크키가 계속 바뀜 : 동적 할당 영역
- 반대되는 주소로 할당이 됨
: 힙 영역은 낮은 주소에서 높은 주소로 할당 / 스택 영역은 높은 주소에서 낮은 주소로 할당 (주소 중복 방지)
프로세스 생성과 상태
프로세스가 어떻게 생성? 어떤 상태를 거치면서 시행되는지
프로세스는 다양한 상태를 가지고 있다 : 진행중/ 응답없음 / 일시 중단됨 등등
- 운영체제는 상태를 통해 프로세스를 관리함
- 대표적인 프로세스 상태
- 생성 상태 (new) : 이제 막 pcb를 할당받아서 생성이 된 상태
- 준비 상태 (ready) : 당장이라도 자원을 할당받아 실행이 가능하지만 차례가 오지 않은 상태
- 실행 상태 (running) : 지금 자원을 할당받아 실행중
- 대기 상태 (blocked) : 주로 입출력장치 사용을 요청받았을때 (준비와 다른 건 지금 당장 실행 불가, 이벤트를 기다림)
- 종료 상태 (terminated) : 프로세스의 실행이 끝나서 자원 반납중
- 디스패치 : 자원을 할당받아 이용하는 것
- 타이머 인터럽트 ; 자원 사용 시간이 끝났다면, 타임 아웃되어 준비상태가 됨, 사용시간만 사용 가능 : 기다려야함 - 리눅스 프로세스(태스크) 상태 확인
- R: Running: 실행 상태
- S: Sleeping: 대기 상태
- W: Waiting: 준비 상태
- S: Stopped: 종료 상태
- Z: Zombie: 프로세스 종료 후 자원이 반환되었지만 커널 영역에 프로세스가 남아있는 상태
- 좀비프로세스를 제거한다!라는 말을 함 : 최대한 없애는 게 정말 중요 - 프로세스가 어떤 식으로 관리 되는가 : 많은 운영체제에서는 계층적으로 관리를 하게 됨
- Linux, Unix, MacOS 등등에서 사용
- 최초의 프로세스에서 프로세스를 생성 : 최초의 프로세스는 부모 프로세스가 되는 것
- 자식 프로세스 중엔 서비스 프로세스, 데몬도 포함
- tree형태의 계층적 구조를 띄무
- pstree명령어로 확인이 가능
- fork-exec : 계층적 구조로 프로세스가 생성되는 원리 (시스템 콜)
- fork와 exec가 다른 시스템 콜인데, 세트처럼 같이 실행이 됨
fork exec 복사본 만들기 새로운 코드로 대체 (덮어쓰기)
- PID는 다르지만, 동일한 코드/데이터로 이루어짐
- fork만 해서 사용하는 경우도 있음 : 같은 작업을 두번 실행하고자 할때
- exec (옷갈아입기) : 새로운 코드로 덮어쓰기 해라
- 부모에게 복제본을 만들었는데, 자식에서 exec를 하면 새로운 코드와 새로운 데이터
: pid는 유지가 된 채, 완전히 다른 프로세스가 됨. 하지만 자식 프로세스임
- 부모가 fork를 해서 자식을 만들어 내고, 자식은 exec를 해서 새로운 프로세스가 됨
- 예시 ) bash 프로세스에서 자식 bash (fork, 새로운 메모리 영역 할당)를 만듬
- 두개는 별개의 PID를 가짐
자식 프로세스에서 exec를 통해 ls라는 내용으로 덮어쓰기 한다면,
- bash 프로세스의 자식 프로세스로 ls가 실행되게 됨
스레드
스레드 = 프로세스를 구성하는 실행 흐름의 단위
- CPU랑 SW개발, 프로그램 언어등 여러곳에서 사용 됨, 여기서는 소프트웨어(SW) 에서 말함
- 실행흐름을 더 추가하면, 동시에 실행이 가능 : 실행흐름으로의 스레드
- 구성 요소 : 각기 다른 스레드 ID, 프로그램 카운터, 레지스터, 스택
- 각기 다른 프로그램 실행 흐름을 가지고 있음, 각각으로 실행흐름을 지칭할 수 있음
- linux : task라고 함
멀티 프로세스와 멀티 스레드
- 멀티 프로세스와 멀티 스레드
- 차이점 : 자원 공유 여부
- 프로세스 간에는 기본적으로 자원을 공유하지 않음
- 스레드 간에는 프로세스의 자원을 공유
- 이 차이를 가장 잘 알 수 있는 것 : 웹브라우져 탭 : 멀티탭
- 새창열기를 하면 각각의 탭을 프로세스로 만들 수 있고, 스레드로 만들 수 있음
- 한 탭을 강제종료 하면 각각의 탭은 하나의 탭이 문제라도, 모든 브라우져가 아니라 하나의 탭만 종료하면 됨
- 스레드의 경우 한 탭이 문제가 생기면 다같이 강제종료가 됨
- 멀티프로세스는 자원 공유를 안하기에 메모리등의 자원의 소모가 굉장히 크다.
- 프로세스 간에도 자원 공유를 가능하다!!!! : 프로세스간의 통신 (IPC; Inter-Process Communication)
- 공유 메모리를 통한 통신
- 파이프를 통한 통신
- 네트워크 소켓을 통한 통신
'Study > CS 기초' 카테고리의 다른 글
운영체제 - 가상 메모리 관리 (3) | 2024.10.21 |
---|---|
운영체제 - 동기화와 교착상태 (2) | 2024.10.21 |
운영체제 - CPU 스케줄링 (2) | 2024.10.19 |
운영체제 거시적으로 보기 (7) | 2024.10.19 |
컴퓨터 구조 전체 보기 (4) | 2024.10.15 |