service, daemon
백그라운드에서 동작하는 기능을 관리하며, 부팅 시 자동으로 실행되는 프로세스
① Windows: 서비스
② Linux: 데몬
PCB(Process Control Block)
한정된 CPU 자원을 프로세스에게 배분하고, 프로세스의 실행 순서를 관리하는 자료 구조. (프로세스와 관련된 정보를 저장)
즉, 운영체제는 PCB를 통해 특정 프로세스를 식별하고, 해당 프로세스를 처리하는데 필요한 정보를 판단합니다.
그럼 PCB에 저장되는 정보는 무엇일까요?
① PID
② 레지스터 값: 해당 프로세스가 실행하며 사용했던 PC를 비롯한 레지스터 값들
③ 프로세스 상태
④ CPU 스케줄링 정보
⑤ 메모리 관리 정보: 프로세스가 메모리에 저장된 주소
⑥ 사용한 파일과 I/O Device 목록
이러한 PCB에 기록되는 정보를 문맥이라고도 합니다. 그럼 문맥이란?
문맥 교환
프로세스 A가 운영체제로부터 CPU를 할당받아 실행되다가 프로세스 B에 CPU 사용을 양보한다고 가정합니다.
프로세스 A는 다음 자신의 차례가 왔을 때 이어서 작업할 수 있도록 PC를 비롯한 각종 레지스터 값, 메모리 정보 등 중간 정보를 백업하여야 합니다. 이러한 중간 정보, 즉 하나의 프로세스 수행을 재개하기 위해 기억해야할 정보를 문맥이라고 합니다.(PCB에 표현)
프로세스 상태
프로세스의 상태는 크게 생성, 준비, 실행, 대기, 종료 상태가 있습니다. 운영체제는 이 상태를 PCB에 기록하여 프로세스들을 관리합니다.
프로세스 계층 구조
자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 기록되기도 합니다. 이때 Linux에서 모든 프로세스의 최상단 부모 프로세스는 init 프로세스 입니다.
처음 Linux 가 부팅되면 운영체제에 의해 swapper이라는 PID 0인 프로세스가 생성됩니다. 이후 PID 1, 2인 init과 pagedaemon을 생성하기 위해 fork/exec를 두 번 실행합니다. (swapper과 pagedaemon은 커널모드에서 영구 실행되는 커널 프로세스)
xx를 실행하는 새로운 프로세스를 생성하는 시스템 호출? → 그런 시스템 호출은 없다.
기존의 프로세스를 복제한 후 새로 생성한 자식 프로세스를 실행 파일 xx와 연결.
이때 fork와 exec란?
① fork: 자기 자신 프로세스의 복사본을 만드는 시스템 호출
② exec: 복사본이 만들어진 후 자식 프로세스는 exec를 통해 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
※ 좀비 프로세스란?
종료 후 부모 프로세스의 확인이 없었기 때문에, 실제로 실행되지는 않지만 프로세스 테이블 목록에 있는 프로세스. 하단의 명령어를 통해 검출 가능합니다.
## 1
ps -ef | grep defunct
## 2
top -b -n 1 | grep zombie
스레드
스레드는 프로세스를 구성하는 실행 (흐름) 단위입니다.
하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 스레드는 하나의 프로세스 내에서 각기 다른 스레드 ID, PC 값을 비롯한 레지스터 값, 스택으로 구성됩니다.
이때 프로세스의 스레드들은 실행에 필요한 최소한의 정보(PC 등의 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행됩니다.
그렇다면 단일 스레드 프로세스 여러 개를 실행하는 것과 하나의 프로세스를 여러 스레드로 실행하는 것은 무엇이 다를까요?
마찬가지로 hello.os가 3번 출력하는 것은 동일합니다.
허나 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유합니다. 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고, 열린 파일과 같은 프로세스 자원을 공유하기 때문에 서로 협력과 통신에 유리하죠.
그렇지만 프로세스의 자원을 공유한다는 특성은 때로 단점이 될 수 있습니다. 멀티 스레드 환경에서 하나의 스레드가 문제가 생기면 프로세스 전체가 문제가 생길 수도 있습니다.
'Computer Science > 운영체제' 카테고리의 다른 글
교착 상태 (0) | 2023.04.06 |
---|---|
이중 모드와 시스템 호출 (0) | 2023.03.30 |