프로세스
프로세스의 상태
New
Ready
Running
Waiting
Terminated
PCB
각 각의 프로세스는 자신의 정보 묶음인 PCB를 가지고 있어요.
Process 정보, 레지스터, 스케쥴링, 메모리, I/O 등...
어떠한 정보들이 있나요?
Process State : 프로세스 상태
Program counter : 다음 명령
CPU registers : 프로세스가 인터럽트 이후 올바르게 작업을 이어가기 위해 참조하는 CPU 레지스터 값
CPU-scheduling information : 스케쥴링과 관련된 정보 (중요도, 스케줄링 큐 포인터)
Memory-management information : base, limit 레지스터 값, 페이지 테이블 등의 메모리 시스템 정보
Accounting information : 사용된 CPU 총량, 프로세스 개수, 시간 제한 등
I/O status information : 프로세스에 할당된 I/O device 목록, 열린 파일 목록 등
프로세스를 쪼개 하나의 프로세스 안에서 동시에 여러 작업
을 처리할 수 있어요.
싱글 스레드 프로세스는 한 번에 하나의 작업만 할 수 있어요.
멀티 프로그래밍의 목적
CPU를 최대 사용
하고 싶어요! → 항상 일부 프로세스를 실행타임 쉐어링의 목적
사용자
가 각 프로그램이 실행되는 동안 서로 상호작용
할 수 있도록!👉 멀티 프로그래밍과 타임 쉐어링의 목적을 위해 CPU에서 실행 가능한 프로세스를 선택하고 할당하는 일을 프로세스 스케쥴링
이라 합니다.
Job Queue
Ready Queue
Device Queue
Job Scheduler , Long-term Scheduler
to ready queue
CPU 밖에서 가끔 수행됩니다.
CPU Scheduler , Short-term Scheduler
to processor
CPU 안에서 자주 수행됩니다.
프로세스 실행 도중 문제 발생 → 인터럽트 발생 → OS가 개입하여 할당된 프로세스를 교체! (프로세서가 현재 가지고 있는 PCB의 정보가 바뀌겠죠?)
Syscall을 사용해야 하면 프로세스가 자체적으로 처리할 수 없기 때문에 OS가 개입해야 해요.
Context
: 내 시스템에서 활용 가능한 모니터링된 정보들
🤔 하지만, Context Switch는 오버헤드가 발생하니 자주 하면 안 됩니다!
🎄 프로세스는 트리 구조
🔑 PCB의 pid로 식별합니다.
🔨 생성은 마치 플라나리아 번식
부모가 fork()로 자식을 생성해요.
자식은 exec()로 내용을 변경해요.
❗ fork()를 하게 되면 부모는 자식의 pid를 가지게 되고 자식은 0을 가지게 됩니다.
🔚 exit()를 호출하면 프로세스가 종료됩니다.
🧑🍼 부모 종료 → 자식은 상위 프로세스를 부모로 봅니다 (할아버지, 할머니)
😂 자식 종료 → 만약 부모가 자식이 반환한 정보를 회수하지 않았다면 자식은 좀비가 됩니다. (정보가 메모리에 남아 있는 상태)
📫 우편 방식
커널
→ 수신😀 커널에서 기본적인 기능을 제공해서 구현이 쉬운 편이예요.
😂 Context Switching이 발생해서 느려요!
📄 게시판 방식
😀커널 없어서 빨라요.
😂 메모리 동시 접근을 막아야해서 프로그래머가 더 구현해줘야 해요.
생산자 - 소비자 문제
프로세스 중 정보를 생산하는 친구를 생산자, 받는 친구를 소비자라고 해요.
생산보다 소비가 빠르면
동기화 문제가 발생해요.
🤔 버퍼
를 사용합시다.
Message Passing Sync 문제 해결 방법
서버와 클라이언트가 통신하는 방식이예요.
ip 주소, 포트 정보
만 있다면.. → 클라가 서버에 접근 가능해요.
RPC(Remote Procedure Calls)
IP주소와 포트를 래핑해서 Stub
으로 만들어 전송합니다.😕 파이프는 단방향 통신이라 양방향 하려면 두 개 필요해요.
파이프는 파일입니다.
파이프에 이름을 붙인 named pipe를 사용하면 부모-자식 관계 아니여도 통신이 가능해요.