[pintos] 시스템 콜 - Open, Close

da__ell·2022년 11월 29일
0

Pintos-Kaist

목록 보기
4/9

  • 운영체제(OS)는 다양한 서비스를 수행하기 위해 하드웨어를 직접적으로 관리함.
  • 하지만 응용프로그램은 OS가 제공하는 인터페이스인 시스템 콜을 통해서만 하드웨어의 자원을 사용할 수 있음.
  • 응용프로그램의 요청에 따라 운영체제의 커널에 접근하여 커널이 제공하는 서비스를 사용할 수 있음.

C언어를 예로 들면

#include <stdio.h>
int main()
{
  printf("Hello World!");
  return 0;
}
  1. printf 함수의 실행은 사용자 모드에서 실행되어 stdio 라이브러리를 호출한다.
  2. stdio 라이브러리는 시스템 콜인 write 함수를 호출하고, 커널 모드로 실행 흐름이 전환된다.
  3. 커널은 호출을 실행하여 모니터에 Hello World!를 출력하고 사용자 모드로 실행 흐름을 전환하여 함수의 다음 단계를 진행한다.

open : 파일을 열 때 사용하는 시스템 콜, 성공 시 할당받은 fd를 반환하고 실패 시 -1을 반환한다.
close : 열린 파일을 닫을 때 사용하는 시스템 콜, 해당 fd에 대응하는 파일을 닫는다. 파일을 닫고 fd를 닫는다.

파일을 열게되면 열린 파일에 대응하는 fd를 할당하고 이를 함께 저장하여야 한다고 생각했다. 그것이 서로 대응하는 fd와 파일을 의도치 않은 변경 없이 적절히 관리할 수 있는 수단이라고 판단하였다.

이를 위해 fd_list라는 연결 리스트를 고안해서 이를 관리하고자 하였다.
새로운 파일을 열게 되면 새로운 파일-fd를 저장하는 구조체 new_fd를 초기화하여주고 파일에 대응하는 새로운 fd를 할당하였다.

여기서 open할 때 가장 주요하게 고려하여야 할 점은 open 될때 마다 fd를 갱신하고 갱신된 fd를 할당시키는 방안이다.
이를 위해. 다음와 같은 방법을 생각해보았다. thread 구조체 안에 fd_count변수를 선언하고 file을 열 때마다 이를 갱신하는 방식을 생각했다. 해당 프로세스가 진행되는 한 해당 count는 계속해서 이용할 수 있으며 갱신시키고 할당하기 용이한 방법이라고 생각했다.

파일을 open할 때 마다 fd_count를 1씩 증가시키고 증가된 fd_count를 fd로 할당하였다. 이를 통해 open될때 마다 서로 다른 새로운 fd를 할당할 수 있게 하였다.

이러한 방식으로 fd_list를 구현함으로써 얻을 수 있는 이점은 close를 할 때 삭제 대상인 fd만 받아줘도 이미 리스트 안에 대응하는 file을 포함하는 구조체 fd_elem이 존재하기 때문에 이를 순회하면서 찾아주면 된다.

profile
daelkdev@gmail.com

0개의 댓글