티스토리 뷰
1. 프로세스
- 실행중인 프로그렘
- 디스크에 저장된 실행 파일이 메모리에 적재될 때 비로소 프로세스가 된다.
- 텍스트 세션: 실행 코드
- 데이터 세션: 전역변수
- 힙 세션: 프로그램 실행 시 동적으로 할당되는 메모리
- 스택 세션: 함수 호출 시 임시 데이터 저장
프로세스 상태 별 설명
New: 프로세스 생성 중
Running: 명령어들이 실행 중
Waiting: 프로세스가 어떤 사건이 일어나기를 기다림
Ready: 프로세스가 처리기에 할당 되기를 기다림
Terminated: 프로세스 실행이 종료
각 프로세스는 운영체제에서 프로세스 제어 블록 PCB에 의해 표현됨
프로그램 카운터: 프로세스가 다음에 실행할 명령어의 주소
CPU 레지스터
메모리 관리 정보
CPU 스케줄링 정보
2. 프로세스 스케줄링
Job Queue: 프로세스가 시스템에 들어오면
Ready Queue: 준비 완료 상태에서 실행을 대기하는 프로세스들은
Device Queue: 특정 입출력 장치를 대기하는 프로세스들의 리스트
스케줄러
- 단기: CPU 스케줄러
- 중기: 일부 운영체제가 도입, 메모리에서 프로세스들을 제거, 메모리 상의 프로세스들의 수를 완화, 스와핑
- 장기: 잡 스케줄러, 실행 빈도 낮음, 메모리 상 프로세스들의 수를 제어, 입출력 중심 + CPU 중심 적절한 혼합 중요
3. 컨텍스트 스위치
프로세스를 재개하려면
문맥(Context)
- CPU 레지스터의 값, 프로세스 상태, 메모리 관리 정보 등을 포함
컨텍스트 스위치가 진행될 동안의 시스템
- 그 동안 시스템은 아무런 유용한 일을 하지 못함
=> 컨텍스트 스위치 소요 시간은 순수한 오버헤드
4. 프로세스 연산
- 부모 프로세스: 프로세스를 생성하는 주체
- 자식 프로세스: 새로운 프로세스
- 고유의 프로세스 식별자(pid): 대부분 운영체제가 이것을 사용하여 프로세스를 구분
- 프로세스가 자식 프로세스를 생성할 때, 자식 프로세스는 운영체제에게 자원을 직접 얻을 수 있고, 부모 프로세스가 가진 자원의 부분 집합만을 사용하도록 제한한다.
- 프로세스가 새로운 프로세스를 생성할 때, 부모 프로세스는 자식 프로세스와 동시에 구동, 자식 프로세스 전부/일부가 종료될 때까지 대기한다.
* fork() 시스템 콜로 새로운 프로세스 생성 => 두 프로세스 중 한 프로세스가 exec() 시스템 콜을 사용, 자신의 메모리 공간을 새로운 프로그램으로 교체 => exec() 시스템 콜은 바이너리 파일을 메모리로 적재, 프로그램 실행 시작 => 자식 프로세스가 종료될 때까지 부모 프로세스는 wait()
* 자식 프로세스에게 보이는 pid는 0, 부모 프로세스에게 보이는 pid 값은 0보다 큰 정수값(리턴값)
* 자식 프로세스는 리소스 권한, 스케쥴링 속성을 부모 프로세스로부터 상속
* 부모는 wait() 시스템콜로 자식 프로세스가 종료되기를 대기
* 자식 프로세스 종료 후 부모는 wait()으로부터 프로세스를 재개하여 exit()으로 종료
* 최종 실행이 종료된 뒤 exit()을 통해 운영체제에 삭제를 요청
- 대기중인 부모 프로세스에게 상태값을 리턴
- 운영체제에 의해 모든 프로세스들의 자원들은 할당 해제
* 부모 프로세스가 자식 프로세스를 종료 시키는 경우 abort()
- 자식이 할당된 자원의 사용량을 초과하는 경우
- 자식 task가 더 이상 필요하지 않은 경우
- 부모가 종료되었고 자식은 종료되지 않았을 때 자식만 실행될 순 없음
* 좀비 프로세스
- 종료되었지만 부모 프로세스가 아직 wait() 콜을 하지 않은 프로세스
- 부모가 wait() 콜을 하면 좀비 프로세스의 pid와 프로세스 테이블 항목을 운영체제에게 반환
* 고아 프로세스
- 부모 프로세스가 wait()을 콜 하는 대신 종료하게 되면 자식은 고아프로세스가 됨
- 리눅스, 유닉스 계열은 고아 프로세스의 새로운 부모 프로세스로 init 프로세스를 지정하여 문제를 해결
5. 프로세스 컨트롤
sudo service httpd start
start httpd.service
ps -ef | grep httpd //모든 프로세스에 대한 정보 확인
=> pid는 중복되지 않는 랜덤으로 할당된다.
kill -l //kill 명령어 list
kill -9 17270 //프로세스를 하나 죽였더니 새로운 프로세스가 생기게 되고, root의 프로세스를 죽이니 관련 자식 프로세스들도 모두 죽었다.
6. 프로세스 간 통신
- 프로세스들은 독립적 또는 협력적
- 협력 프로세스: 데이터 공유를 포함하여 프로세스들에게 영향을 주거나 받는다.
- 협력을 허용하는 환경을 제공하는 이유
- 정보 공유
- 계산 가속화
- 모듈화
- 편의성
- 프로세스 간 통신(Inter-Process Communication: IPC) 기법
- 통신하는 프로세스들이 공유 메모리 영역을 구축해야 한다.
- 생산자 - 소비자 문제의 해결책으로 공유 메모리를 사용하고, 버퍼가 반드시 사용 가능해야 한다.
- 무한 버퍼: 버퍼의 크기에 실질적인 한계가 없다.
- 유한 버퍼: 버퍼 크기 고정, 버퍼가 비어있으면 소비자는 반드시 대기한다. 모든 버퍼가 채워져있으면 생산자가 대기한다.
in: 버퍼 내에서 다음으로 비어있는 위치
out: 버퍼 내에서 첫 번째 차 있는 위치
- 동일한 주소 공간을 공유하지 않고도 프로세스들이 통신을 하고, 그 동작을 동기화 할 수 있도록 허용하는 기법
- send(message) / receive(message) 연산 제공
- 통신 연결을 통해 프로세스 간 메시지를 송수신
- 논리적 구현 방법: 직접/간접 통신, 동기식/비동기식 통신, 자동/명시적 버퍼링
- 통신을 원하는 각 프로세스는 통신의 수신자 또는 송신자의 이름을 명시해야 함
- 연결(link)이 자동적으로 생성되고, 정확히 두 프로세스 사이에서만 연관
- 프로세스들의 각 쌍 사이에는 정확히 한 연결만 존재
- 대칭 주소 지정: 발신자, 수신자 프로세스 모두 이름을 지정하여 통신
- 비대칭 주소 지정: 발신자만 수신자의 프로세스 이름을 지정
- 메일함 또는 포트로 메시지 송수신, 두 프로세스는 프로세스가 공유된 경우에만 통신 가능
- 두 구성원이 모두 있는 경우에만 연결 설정
- 연결은 두 개 이상의 프로세스와 연결 가능하고, 프로세스의 각 쌍 상태에서는 여러가지 서로 다른 연결이 존재
- 공유 메일함: 프로세스 혹은 우영체제에게 소유권이 존재
Q. A 메일함을 공유하는 P1, P2, P3 중 P1이 A에 메시지를 보낸다면 누가 메시지를 받아야 하나?
=> 최대 2개의 프로세스가 링크를 공유하도록 구성 => 한 번에 한 프로세스만 receive 연산을 수행할 수 있도록 함 => 송신자가 수신자를 선택할 수 있도록 함
* Blocking 모드(동기)
- send: 송신된 메시지가 수신될 때까지 송신자를 블록(정지)
- receive: 이용 가능한 메시지가 있을 때까지 수신자를 블록(정지)
* Non-Blocking 모드(비동기)
- send: 메시지를 전달한 뒤 다른 작업을 처리
- receive: 유효한 메시지를 받거나 null 메시지를 수신
- 통신 프로세스 간 교환되는 메시지는 임시 대기열에 존재
- 용량 Zero(최대길이 0): 발신자는 수신자가 메시지를 받을 때까지 차단
- 제한된 용량(유한길이 n): 연결이 가득 차면 발신자는 대기열 공간이 확보될 때까지 차단
- 무한 용량: 발신자는 절대 차단하지 않음
분산 환경에서는 메시지 전달 방식이 좋다.
7. 클라이언트-서버 환경 통신
소켓(Socket)
- 커뮤니케이션을 하기 위한 통신의 극점(Endpoint)
- IP주소 및 Port 번호를 조합하여 식별
클라이언트-서버 아키텍처
- 서버는 특정 포트를 listen 하면서 클라이언트 요청에 대기
- 요청을 받으면 서버는 클라이언트 소켓으로부터의 연결 요청을 수락함으로써 연결을 완성
원격 프로시저 호출(Remote Procedure Call, RPC)
- 네트워크로 연결 된 서버 상의 프로시저(함수, 메소드 등)를 원격으로 호출할 수 있는 기능
1) RPC 생성 2) 생성한 stub과 client 프로그램 필드 3) 함수 호출 4) 함수 호출 5/6) 결과 반환
* 정리
프로세스의 개별 구성요소 이해
- 프로세스: 실행하고 있는 프로그램
- 메모리 상에서의 프로세스: 스택 / 힙 / 데이터 / 텍스트
- 프로세스 상태: New / Running / Waiting / Ready / Terminated
- 프로세스 제어 블록(PCB)
스케줄링의 목적 및 종류와 흐름 확인
- 프로세스 스케쥴링 목적(CPU 이용을 최대화)
- 대기시간 최소화
- 최대한 공평하게
- idle 최소화
- 스케쥴링 큐: Job / Ready / Device
컨텍스트 스위치 개념을 이해
- 컨텍스트 스위치
- 실행중이던 작업 중간에 다른 작업의 수행이 필요할 때, 이전 프로세스 상태를 보관, 프로세스 재개 시 참조 할 수 있도록 함
- 컨텍스트 복구작업, 다른 프로세스로 교환하는 작업
- PCB에 실행중이던 프로세스 문맥 저장
운영체제에서 프로세스 생성/종료 이해
- 자식 프로세스, 부모 프로세스 => 생성, 종료시까지 wait
- fork(), exec() 시스템 콜
- exit(), abort(), 좀비 프로세스, 고아 프로세스
공유메모리와 메시지 전달을 통한 프로세스간 통신에 대해 이해하고 비교
- 프로세스가 협력을 허용하는 환경을 제공하는 이유
- 정보공유, 계산 가속화, 모듈성, 편의성
- 공유메모리: 통신하는 프로세스들 공유 메모리 영역 구축, 사용
- 메시지 전달
- 동일한 주소공간을 공유하지 않음, 프로세스들이 통신 가능
- 그 동작을 동기화 할 수 있도록 허용하는 기법
- 직접, 간접 통신 / 동기식, 비동기식 통신 / 자동, 명시적 버퍼링
[비교] 공유메모리 -> 속도/메시지전달 -> 구현용이성, 분산환경
소켓 통신과 원격 프로시져 콜을 이용한 client-server 통신을 이해
- 소켓(socket): IP, Port 번호를 조합하여 식별
- 원격 프로시저 콜(Remote Procedure Call)
- 네트워크로 연결된 서버 상의 프로시저를 원격으로 호출할 수 있는 기능
* 기타 키워드: Swapping, CPU Register, PID, PGID, PPID, Cascading 종료, MSA, REST, SOAP
'운영체제' 카테고리의 다른 글
Ch04. 스레드와 동시성 / Ch05. CPU 스케줄링 (0) | 2023.12.29 |
---|---|
Ch01. 운영체제 개요 / Ch02. 운영체제 서비스 (1) | 2023.12.28 |