<aside> 💡 NOTE
</aside>
<aside> 💡 NOTE
java에서는 시스템콜을 할수없다. 따라서 JNI라는 것을 이용해서 시스템 콜을 하며 단계는 다음과 같다. JVM → JNI → 시스템 콜 → 커널 → 디스크 컨트롤러 → 커널 버퍼 복사→ JVM 버퍼 복사 java가 느리다는 이유도 여기서 나온다. 해결방법으로 NIO(new Input Output)이 등장했다.
IO과정에서 유저 영역은 커널 영역을 거치면서 버퍼와 복사 과정이 추가된다.
예시 1) 비디오 카드(모니터) - 커널 영역의 버퍼로 데이터를 이동하는 것은 DMA(direct memory access) 기술을 통해 cpu자원이 필요없다. 하지만 커널 → 프로세스 영역으로 이동은 cpu가 반드시 개입해야한다. 따라서 JVM 내 버퍼로 복사해 오는 것이 아닌 커널 영역에 버퍼의 데이터를 직접 사용할 수 있다면 cpu 자원낭비를 막을 수 있다.
예시 2) 디스크(HDD, SSD) → 커널 영역으로 데이터를 복사해오는 동안 JVM으로 바로 복사되지 않고 커널 영역에 내 버퍼가 찰때까지 블로킹 된다. 그리고 버퍼에 가득 찼을때 JVM으로 데이터를 전송한다. 참고 : https://internet-craft.tistory.com/94
Copy-On-Write
fork()를 통한 시스템 콜
main()
{
int pid;
pid = fork()
if (pid == 0) // 이때부터 자식이 가져간다(부모님 양수(자식의 pid), 자식은 0 가진다)
print("hello I am children")
else if (pid >0)
print("hello I am parent")
}
exec()를 통한 시스템 콜
main()
{
int pid;
pid = fork();
if (pid == 0)
print("Hello I am child I am run date") // date라는 메서드
execlp("/bin/date","/bin/date",(char *)0);
else if (pid > 0)
print("Hello I am parent")
}
wait()를 통한 시스템 콜
exit()
<aside> ✍️ NOTE
독립적 프로세스(Independent) 따라서 프로세스 간 정보를 주기 위해서 IPC를 이용합니다.
협력이 필요할 때 매커니즘 : IPC(Inter Process Communication)
메시지를 전달하는 방법
주소 공간을 공유하는 방법
메시지 전달
이름을 명시(direct communication)
이름 명시x (Indirect communication)
</aside>
<aside> ✍️ NOTE
CPU and I/O Bursts in Program Execution
</aside>
CPU 로드를 보면 빨강은 CPU가 커널 영역의 일을 했다는 것을 표시하고 하늘 색은 CPU가 커널 이외의 영역, 즉 사용자 영역의 작업을 했다는 것을 의미합니다.