Show
1. sourcefile을 읽기로 연다. 2. copyfile을 쓰기로 연다. 3. source에서 buffer로 EOF를 만날 때까지 읽는다. 4. buffer에서 copy로 쓴다. 5. sourcefile과 copyfile을 닫는다.0, 1. sourcefile을 읽기로 연다. 2. copyfile을 쓰기로 연다. 3. source에서 buffer로 EOF를 만날 때까지 읽는다. 4. buffer에서 copy로 쓴다. 5. sourcefile과 copyfile을 닫는다.1 API파일 생성: 1. sourcefile을 읽기로 연다. 2. copyfile을 쓰기로 연다. 3. source에서 buffer로 EOF를 만날 때까지 읽는다. 4. buffer에서 copy로 쓴다. 5. sourcefile과 copyfile을 닫는다.0
파일 쓰기: 1. sourcefile을 읽기로 연다. 2. copyfile을 쓰기로 연다. 3. source에서 buffer로 EOF를 만날 때까지 읽는다. 4. buffer에서 copy로 쓴다. 5. sourcefile과 copyfile을 닫는다.1
이제 파일을 생성하고 쓸 수 있으니, 1. sourcefile을 읽기로 연다. 2. copyfile을 쓰기로 연다. 3. source에서 buffer로 EOF를 만날 때까지 읽는다. 4. buffer에서 copy로 쓴다. 5. sourcefile과 copyfile을 닫는다.8pseudo 코드를 먼저 작성해보자.
이제 코드를 작성해보자. 파일 permission위 코드에서, 9 라는 매크로를 cp 0 로 선언하여 파일을 생성하는 것을 알 수 있다. 이게 뭘 의미하는 걸까?먼저, linux permission에는
그렇다면 I/O Buffering하지만 아직 효율성에 대한 문제가 남았다. 바로 buffer의 크기와 관련된 문제이다. 예를 들어서 위 코드에서는 buffer의 크기를 System call의 횟수가 왜 시간에 영향을 줄까?바로 user mode와 kernel mode 사이의 mode change에 걸리는 시간 때문이다. CPU는 특별한 stack과 메모리 환경을 가지는 kernel mode에서 kernel code를 실행하고, user code를 실행할 때는 user mode에서 실행한다. 즉 0, 1 와 같은 system call을 통해 kernel mode로 들어가 kernel code를 실행한 후 다시 8 의 나머지 코드, 즉 user code를 실행하기 위해 user mode로 돌아오는 과정이 시간을 소모하게 되는 것이다.Kernelkernel은 올바른 동작을 위한 OS의 중요한 부분이다. kernel mode에서 실행되며, user mode에서 kernel mode로 변환되기 위해 trap instruction이 사용된다.
그렇다면, 어떻게 더 효율적이게 8 의 코드를 짤 수 있을까? 예를 들면, 한 번에 많은 양의 데이터를 읽은 후 로컬 저장소에 하나씩 저장해 처리하는 것이다. 그렇다면 system call을 반복하는 횟수를 줄일 수 있을 것이다. 이는 cp 8 에도 적용될 수 있다. cp 9 파일을 한 번에 읽은 후 배열에 저장하여 처리한다면 속도를 개선할 수 있을 것이다.Kernel Bufferingbuffering을 통해 효율적인 프로그램을 짤 수 있었다. 그렇다면, 이렇게 좋은 buffering을 kernel도 사용하고 있을까? 물론이다. kernel 또한 디스크의 일정 부분을 복사 해놓은 kernel buffer라는 것을 가지고 있어서 효율적인 I/O 처리를 하고 있다. 1 를 호출하면 프로세서에서 kernel buffer로 데이터를 복사한다. |