

프로세스 개념
- 실행 중인 프로그램 - 프로그램 카운터와 프로세스 레지스터를 포함한 현재 진행 중인 활동
- 프로세스가 생성이되면, 운영체제에서 메모리 관리부서에 그 프로세스의 정보를 등록함→ 등록한 정보중 하나
- 프로세스의 실행은 순차적 형태로 진행 된다.
- 다양한 부분으로 이루어짐
- 텍스트 섹션 : 프로그램 코드
- 스택 : 임시 데이터 저장(e.g 함수 매개변수, 복귀 주소, 지역변수)
- 데이터 섹션 : 전역 변수
- 힙(heap) : 실행 중 동적으로 할당되는 메모리 영역

프로세스 상태
new : 프로세스가 생성되는 중인 상태
running : 명령어가 실행 중인 상태
waiting : 프로세스가 처리기가 할당되기를 기다리고 있는 상태
terminated: 프로세스가 실행을 완료한 상태
프로세스 제어 블록
프로세스 한개마다 하나씩 존재하는 일종의 자료구조 → 각 프로세스와 관련된 정보를 가지고있는다.
- 프로세스 상태- ex. running? waiting?
- 프로그램 카운터 : 다음에 실행할 명령어의 주소
- CPU 레지스터 : CPU 내 레지스터 내용
- CPU 스케줄링 정보 : 우선순위, 스케줄링 큐 포인터
- 메모리 관리 정보 ; 프로세스에게 할당된 메모리
- 회계 정보 : 사용된 CPU 양, 실행이 시작된 이후 경과된 클럭 타임, 시간 제한
- I/O 상태 정보: 프로세스에게 할당된 I/O 장치, 열린 파일 목록
스레드(실타래)
프로세스는 하나의 실행 흐름을 가짐
한 프로세스가 여러개의 스레들를 가지도록 허용
- 프로세스가 한 번에 하나 이상의 일을 수행 ex. 한글에서 문자를 입력하면서 동시에 철자 검사(각자 자신이 맡은 임무 수행)
- 여러 제어 흐름→ 스레드
스레드 지원 시스템은 PCB가 각 스레드 관련 정보를 저장하도록 확장
Linux 표현
PCB : structure로 표현되며, <linux/sched.h> 헤더 파일에 존재한다.
time_slice는 시분할에서만 존재 = 현재의 운영체제는 대부분 시분할
parent - 부모 프로세스(나를 생성한 부모 프로세스)
프로젝트 스케줄링
큐

스케줄러의 목표 : CPU 이용의 극대화
ready queue(준비 완료 큐)
- 메인 메모리에 존재하며 준비 완료 상태에서 실행을 기다리는 프로세스들의 집합
- 연결 리스트로 구현
- 헤더는 리스트의 첫번째와 마지막 PCB를 가리키는 포인터를 포함
- 각 PCB는 다음 프로세스를 가리키는 포인터 필드를 가진다.
장치 큐
- I/O 장치를 기다리고 있는 프로세스의 집합
입출력 집중 프로세스
- cpu에서 작업을 한다는 것은 계산을 한다는것 - 계산 보다 입출력에 더 많은 시간을 소모
- 짧은 CPU 활동시간. running보다 waiting,ready 상태가 더 길다고 할 수 있다.
- ex. 한글 프로그램,문서 편집기,
CPU 집중 프로세스
- 계산하는데 더 많은 시간을 소모
- 매우 긴 CPU 활동시간
스케줄러라는것은 CPU도 놀지않고 CPU를 기다리는 시간도 많지않게 적절하게 계산을 하여 입출력 bound와 CPU bound를 적절하게 사용해야한다.
단기 스케줄러(short-term scheduler)
- CPU 스케줄러에 속해있다.
- 레디큐에 대기하고있는 아이들중 다음 CPU에 누가 할당받을 것인지 결정
- millisecond 간격으로 자주 호출되기 때문에 빨라야한다.
- 시분할 시스템일 경우 I/O bound라고 할지라도 정해진 시간마다 cpu가 비워져야하기때문에 더 많이 사용되어질 수 있다.
- long-term scheduler → job scheduler
중기 스케줄링(mdium-term scheduler)
다중 프로그래밍 정도를 낮출 필요가 있을때 → 일정시간동안 사용되지않은 프로세스를 탐지
새로운 사용자를 받거나, 기존 사용자에게 메모리 공간을 더 주는것→ 효율적인 자원이용
스와핑(swapping)
- 메모리에서 프로세스를 제거하여 하드디스크에 일정 공간을 만든 다음 저장 = swap out
- 실행을 계속하기 위해서는 디스크에서 메모리로 다시 적재 = swap in

스와핑(swapping)
- 메모리에서 프로세스를 제거하여 하드디스크에 일정 공간을 만든 다음 저장 = swap out
- 실행을 계속하기 위해서는 디스크에서 메모리로 다시 적재 = swap in
문맥 교환
cpu가 현재 실행하고 있는 프로세스가아닌 다른 프로세스를 실행할때 문맥교환이 일어남
현재 실행되고있는 프로세스의 상태를 PCB에 저장하고 다음 들어올 프로세스의 PCB 상태를 CPU에 적재(프로세스의 문맥은 PCB에 표현- CPU 레지스터 값, 프로세스 상태, 메모리 관리 등)
중단된 프로세스를 다시 시작하기 위한 작업
문맥 교환 시간은 오버헤드(불필요한 시간)이다. - CPU는 문맥 교환 시간 동안 쉬기때문에, 운영체제와 PCB가 복잡할수록 문맥 교환 시간은 길어진다.
프로세스 생성
프로세스는 실행되는 동안 여러 개의 프로세스를 생성한다.
프로세스를 생성하는 프로세스는 부모 프로세스라하고 생성되는 프로세스는 자식프로세스라고 한다.
프로세스를 계속생성하다보면 프로세스의 트리구조를 형성하게됨
프로세스 관리 및 접근하기 위한 식별자인 프로세스 식별자(pid)를 가진다.
리눅스 운영체제는 메모리에 로드되면 가장 먼저 init 프로세스를 실행시킨다.
init - 시스템 부팅 과정 중 최초의 프로세스, 다른 모든 프로세스들의 직간접적 부모 프로세스, pid= 1,
login - 클라이언트들을 관리, 사용자 계정을 매개변수로 받아 실행할 로그인 쉘
kthreadd - 앞으로 생성 되어질 프로세스들을 생성하는 데몬 프로세스
sshd - 원격 보안 접속을 위한 데몬 프로세스
프로세스를 생성한다는것은 = 자원을 할당하는 것 때문에 운영체제가 하는일이다.
자식 프로세스 생성시
- 자원옵션
- 운영체제에게 자원을 요청 → 부모가 가진 자원을 사용할 옵션을 가진다.(all 공유, 부분공유, no 공유)
- 실행 옵션
- 부모와 자식은 병행하게 실행된다. 부모는 자식이 종료될 때까지 기다린다.
- 주소 공간
- 자식은 프로세스의 주소 공간을 복제한다. 자식은 그 공간에 새로운 프로그램을 적재한다.


[리눅스 상황]
부모프로세스일때
fork()시스템 콜 - 새로운 프로세스를 생성
fork의 return 값은 자식프로세스의 pid→ 정상적으로 실행되었다면 양수 값 → else문으로 떨어진다.
자식 프로세스일때
fork()의 리턴값은 0, else if문으로 이동
exec() 시스템콜 - 프로세스의 메모리 공간을 새로운 프로그램으로 대체
부모프로세스때와 다르게 내용이 달라짐
프로세스 종료
- exit()시스템 콜 사용
- 운영체제에게 삭제 요청하면 자식프로세스는 부모 프로세스에게 상태값을 wait()시스템 콜을 사용하여 반환할 수있다.이로인해 프로세스가 사용하던 메모리나 파일들을 운영체제에게 반환된다.
- abort()시스템 콜 사용
- 자식이 자신에게 할당된 자원을 초과 사용할때
- 자식에게 배정된 테스크가 더이상 필요하지 않을 시
- 운영체제가 부모가 종료시, 자식프로세스의 실행을 허용하지 않을 시
- 부모프로세스가 자식 프로세스에게 이상함이 감지되었을때 강제로 종료시킬 때 사용한다.
- wait()시스템 콜
- 부모 프로세스가 자식 프로세스의 종료를 기다릴때 사용한다. 이때 자식의 상태 정보와 종료된 프로세스의 pid를 반환한다.
- 좀비 프로세스- 자신(자식)은 종료되었으나 부모가 아직 wait()을 호출하지 않은 프로세스
- 고아 프로세스 - 부모가 wait()를 호출하지 않고 종료된 프로세스
협력적 프로세스
다중 프로세스 아키텍처- chrome 브라우저
: 하나의 프로그램을 실행시키기위해서 여러개의 프로세스이 협력해서 작업
많은 웹 브라우저는 하나의 프로세스로 실행- 한웹사이트가 문제를 일으키면, 전체 브라우저에 영향을 미침
크롬 브라우저는 다중 프로세스로 설계 - Broswer프로세스는 가장 먼저 실행되는 프로세스로 전체틀, 인터페이스, 디스크와 네트워크 아이디 등을 핵심적인 부분을 관리한다.
Renderer 프로세스는 탭을 만들때마다 화면 페이지 하나하나에 해당하는 renderer를 fork()로 계속 생성한다. 웹 페이지를 화면에 나타내고, HTML과 javascript를 처리한다. 디스크와 네트워크 입출력이 제한된 sandbox에서 실행되어 보안 악용의 효과를 최소화한다.
확장프로그램을 사용하지않으면 plug-in 프로세스는 생성되지 않는다.
프로세스 간 통신
- 메세지 전달 방식(메세지 전달 시스템)IPC 기능인 두가지 연산은메세지를 보내는 경우 send 받는 경우 receive를 사용한다.프로세스 P와 Q가 통신하길 원한다면 둘 사이에 통신 연결을 설정하고 send와 receive를 통하여 메세지를 교환한다.
- 메세지의 길이는 다양한데 고정이면 시스템 수준 구현은 간단하지만(운영체제나 네트워크가 가는것) 프로그래밍 작업은 어렵다.(프로세스, 순서맞추기) 가변이면 시스템 수준 구현은 복잡하지만 프로그래밍 작업은 간단하다.
- 운영체제의 도움을 받아 메세지를 주고받음 따라서 네트워크에 의해 통신하는 분산 환경에서 유용하다.
- 공유 메모리 방식 (공유 메모리 시스템)협력적 프로세스의 전형적인 예로 컴파일러, 어셈블러, 로더가있다.생산자는 정보를 생산하고 그 정보는 소비자 프로세스에 의해 소비하는 구조공유메모리 구현 시, 시스템 호출에 이용한다. 무한 버퍼는 가상적인 이야기지만 이때는 생산자는 공간이 계속 있기 때문에 항상 새로운 항목 생산이 가능하다. 소비자는 생산자가 생산을 하지않아 버퍼가 비었을 시, 대기한다. 무한버퍼일때 생산자는 대기가없고 소비자만 대기동기화 문제
- 소비자가 읽고 있는데 생산자가 write하면 read와 write정보가 섞일 수 도 있다. write 할때 read를 하면 안됨 , 반대 상황에서도 동일
- 유한버퍼는 (창고라고 생각)생산자는 소비자보다 생산하는 시간이 빠르다면 버퍼가 꽉 차 있을시 대기한다. 소비자는 버퍼가 비었을 시 대기한다.
- 프로세스 간 통신을 원할 시, 공유되는 메모리 영역 = 버퍼
- 컴파일러 : 고급언어를 어셈블러언어로 전환 / 어셈블러 : 목적코드를 만듬
- 일종의 버퍼를 만들어서 데이터를 주고받음 A,B 둘만 접근할 수 있는 메모리. 메모리를 만들때만 운영체제가 관여하고 메모리 관리 및 접근은 프로세스를 개발하는 개발자의 몫.
'CS' 카테고리의 다른 글
| chapter05-2 세마포/교착상태 (0) | 2023.05.05 |
|---|---|
| chapter05. 프로세스 / 임계구역 / (0) | 2023.05.05 |
| chapter04. Threads (1) | 2023.01.14 |
| chapter02.운영체제 구조 및 서비스 (0) | 2023.01.12 |
| chapter01. (0) | 2023.01.12 |