프로세스 개념
프로세스란 실행 중인 프로그램이다. 프로세스의 현재 활동 상태는 프로그램 카운터(pc)값과 프로세서 레지스터의 내용으로 나타낼 수 있다.

- 텍스트 섹션 - 실행 코드
- 데이터 섹션 - 전역 변수
- 힙 섹션 - 프로그램 실행 중에 동적으로 할당되는 메모리
- 스택 섹션 - 함수를 호출할 때 임시 데이터 저장장소
텍스트 섹션, 데이터 섹션은 크기가 고정된다.
스택, 힙 섹션은 동적으로 크기가 변화된다. 함수가 호출될 때 마다 지역 변수, 복귀 주소를 포함하는 activation record가 스택에 푸시 된다.
프로세스는 다음에 실행할 명령어를 찾는 능동적인 존재이다. 실행 파일이 메모리에 적재될 때 프로그램은 프로세스가 된다.
프로세스 상태

- new : 프로세스가 생성 중
- running : 명령어들이 실행 중
- waiting : 프로세스가 어떤 이벤트(입출력 완료 or 신호의 수신)이 일어나기를 기다린다
- ready: 프로세스가 처리기에 할당되기를 기다린다
- terminated: 프로세스의 실행이 종료되었다
어느 한 순간에 한 처리기 코에에서는 오직 하나의 프로세스만이 실행된다는 것을 인식하는 것이 중요하다.
프로세스 제어 블록 Process Control Block
프로세스 제어 블록, PCB, processed control block은 특정 프로세스와 연관된 여러 정보를 수록
- 프로세스 상태 : 상태는 new, ready, running, waiting, halted 등이 있다.
- 프로그램 카운터 : 프로세스가 이 프로세스가 다음에 실행할 명령어 주소를 가리킨다
- cpu 레지스터들 : 누산기, 인덱스 레지스터, 스택 레지스터, 범용 레지스터들과 상태 코드 정보가 포함된다.
- cpu 스케쥴링 정보 : 프로세스 우선순위, 스케쥴 큐에 대한 포인터와 다른 스케쥴 매개변수를 포함
- 메모리 관리 정보 : 시스템에 따라 base, limit 레지스터의 값, 운영체제가 사용하는 메모리 시스템에 따라 페이지 테이블 or 세그먼트 테이블 등과 같은 정보를 포함한다.
- 회계 정보 : cpu 사용 시간과 경과된 실시간, 시간 제한, 계정 번호, 잡 or 프로세스 번호 등을 포함
- 입출력 상태 정보 : 이 프로세스에 할당된 입출력 장치들과 열린 파일의 목록 등을 포함한다.
thread
프로세스는 여러 쓰레드를 허용한다. 한 번에 하나 이상의 일을 수행할 수 허용한다.
여러 쓰레드를 병렬로 진행하는 것이 가능하다.
프로세스 스케쥴링
시분할의 목적은 CPU 코어를 빈번하게 교체하는 것이다. 이를 달성하기 위해 프로세스 스케줄러 or 각 cpu 코어는 한 번에 하나의 프로세스를 실행할 수 있다.
현재 메모리에 있는 프로세스의 수는 “다중 프로그래밍 정도”라고 한다..
I/O 바운드 프로세스는 계산에 소비하는 것보다 I/O에 더 많은 시간을 소비한다
CPU 바운드 프로세스는 계산에 더 많은 시간을 사용한다.
스케쥴링 큐
프로세스가 시스템에 들어가면 준비 큐에 들어가서 ready 상태가 되어 cpu코어에서 실행되기를 기다린다. 이 큐는 연결리스트로 되어있다.
ready queue 헤더에는 첫번째 PCB에 대한 포인터가 저장되고 각 PCB에는 준비 큐의 다음 PCB를 가리키는 포인터 필드가 포함된다.
프로세스 스케쥴링의 일반적인 표현은 queuing diagram이다. 원은 큐에 서비슬 제공하는 자원을 의미하고 화살표는 시스템의 프로세스 흐름을 나타낸다.

CPU 스케쥴링
프로세스는 수명주기 동안 준비 큐와 다양한 대기 큐를 이주한다. CPU 스케쥴러의 역할은 준비 큐에 있는 프로세스 중에서 선택된 하나의 프로세스에 CPU 코어를 할당하는 것이다.
일부 운영체제는 스와핑으로 알려진 중간 정도의 스케쥴링을 가지고 있는데 여기의 핵심 아이디어는 때로 메모리에서 cpu에 대한 능동적 경쟁에서 프로세스를 제거하여 다중 프로그래밍의 정도를 감소시키는 것이 유리하다는 것이다.
스와핑 : 메모리에서 디스크로 스왑 아웃하고 현재 상태를 저장 → 디스크에서 메모리로 스왑인 하여 상태를 복구
Context switch, 문맥 교환
인터럽트가 발생하면 인터럽트 처리가 끝난 후 context를 복구할 수 있도록 현재 실행중인 프로세스의 현재 문맥을 저장할 필요가 있다.
- state save
커널 모드, 유저 모드이든 CPU의 현재 상태를 저장하는 행위이다. - state restore
나중에 연산을 재개하기 위해 상태 복구 작업을 수행한다. - context switch
이전의 프로세스의 상태를 PCB에 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업이다.
이 작업은 순수 오버헤드이라서 하드웨어의 지원에 따라 많이 좌우된다.
프로세스에 대한 연산
대부분 시스템 내의 프로세스들은 병행 실행될 수 있으며, 반드시 동적으로 생성되고, 제거되어야 한다.
unix, Linux → pid를 사용하여 프로세스를 구분한다. 이 식별자는 보통 정수이다. 두 자식 프로세스 logind와 sshd 프로세스를 볼 수 있다.
프로세스를 생성하기
- 부모와 자식과 병행하게 실행을 계속한다
- 부모는 일부 or 모든 자식이 실행을 종료할 때까지 기다린다.
새로운 프로세스들의 주소 공간 측면에서 볼 때 두가지 기능이 있다
- 자식 프로세스는 부모 프로세스의 복사본이다
- 자식 프로세스는 자신에게 적재될 새로운 프로그램을 가진다
새로운 프로세스는 fork() system call로 생성된다. 이는 원래 프로세스의 주소 복사본으로 구성된다. 이를 통해 부모 프로세스가 쉽게 자식 프로세스와 통신할 수 있게 된다.
exec()는 이진 파일을 메모리로 적재하고 그 프로그램의 실행을 시작한다 .window에서는 createProcess()의 형태로 진행이 된다.
프로세스가 종료되는 경우
작업이 완료되는 경우 모든 자원을 운영체제에 반납하고 시스템 테이블에서 제거가 이루어진다.
만약 제대로 된 종료가 이루어지지 않았을 때의 경우
- zombile 프로세스
프로세스가 종료되었지만 부모 프로세스가 아직 wait()를 하지 않는 경우 - orphan process
부모 프로세스가 wait()를 호출하는 대신 종료
android의 process종류
- 전경 프로세스 : forground process- 사용자가 현재 상호 작용하고 있는 응용 프로그램, 화면에 보이는 현재 프로세스
- visible process: 전경에서 직접 볼 수 없지만 전경 프로세스가 참조하는 활동(현재 상태에서 forground process에 표시되는 활동을 수행하는 프로세스)을 수행하는 프로세스
- service process: background process와 유사하지만 사용자가 인지할 수 있는 활동을 수행하는 프로세스
- background process : 활동을 하고 있지만 사용자가 인식못하는 프로세스
- empty process : 응용 프로그램과 관련된 활성 구성요소가 없는 프로세스
프로세스 간 통신
- 프로세스 협력을 허용하는 환경을 제공하는 이유
- 정보 공유
- 여러 프로그램이 동일한 정보에 흥미를 느낄 수 있기 때문에
- 계산 가속화
- 특정 태스크를 빠르게 하고자 하면, 각각이 다른 서브태스크들과 병렬로 실행되도록 하는 것
- 모듈성
- 시스템 기능을 별도의 프로세스 or thread들로 나누어 모듈식 형태로 시스템을 구성하길 원하는 것
IPC (interprocess communication, 프로세스 간 통신)기법이 필요
- 정보 공유
프로세스 모델의 두가지 종류
-
공유 메모리 모델
프로세스 간 통신은 shared memory, message passing 두개의 모델이 있다. 공유 메모리 모델에서는 협력 프로세스들에 의해 공유되는 메모리 영역이 구축된다.
프로세스들은 그 영역에 데이터를 읽고 쓰고 함으로써 정보를 교환할 수 있다. -
메시지 전달 모델
시스템 콜 사용하여 구현, 분산시스템에서 구현하기가 쉽다.
다만 시스템 콜을 사용하기 때문에 부가적인 시간 소비가 된다.
동기화, synchronization
메시지 전달 모델에서 프로세스간 통신은 send, receive primitive에 의한 호출에 의해 발생된다
- 봉쇄형 보내기 : 송신하는 프로세스는 메시지가 수신 프로세스 or 메일박스에 의해 수신될 때까지 봉쇄된다.
- 비봉쇄형 보내기 : 송신하는 프로세스가 메시지를 보내고 작업을 재시작한다
- 봉쇄형 받기 : 메시지가 이용 가능할 때까지 수신 프로세스가 봉쇄된다.
- 비봉쇄형 받기 : 송신하는 프로세스가 유효한 메시지 or null을 받는다.
둘다 봉쇄형인 경우 rendezvous, 랑데부를 하게 된다. → blocked process끼리 하는 통신
파이프
두 프로세스가 통신할 수 있게 하는 전달자
-
일반 파이프
생산자는 파이프의 쓰기 종단에 쓰고 소비자는 읽기 종단에 읽는다. 오직 단방향 통신만 가능하게 한다. 양방향 통신이 필요하다면 두개의 파이프를 써야 한다. -
지명 파이프, named pipe
일반 파이프보다 강력한 통신기구, 통신은 양방향 모두 가능하고 부모 자식관계도 필요하지 않는다. 이를 기준으로 여러 프로세스들이 통신할 수 있다.
소켓
통신의 endpoint, 두 프로세스가 네트워크 상에서 통신하기 위해서 필요
각 소켓은 IP 주소와 포트 번호로 접합하여 구분한다
크게 TCP, UDP 소켓으로 나뉘어진다.
참고 : 127.0.0.1은 접속시 루프백을 해주는 IP주소