파일

소프트웨어 상에서 동작하는 파일은 모두 그렇듯 파일 역시 0, 1로 기록된다. 

png 파일
pdf, apk 파일

UltraEdit을 통해 png, pdf, apk 파일을 열어봤다. 
2진수 비트보다 보기쉽게 16진수로 변환되어 보인다. 

모든 파일은 고유한 포맷을 가지고 있으며 파일 시그니처를 통해 포맷을 기록한다. 
파일 시그니처는 파일의 헤더에 기록된다. (png와 jpg는 footer 시그니처도 가지고 있다)

이렇게 PDF는 25 50 44 46, PNG는 89 50 4E 47 같이 파일 포맷에 맞는 고유한 시그니처가 존재한다. 

시그니처 외에도 파일 헤더에는 파일의 크기, 만든 시간, 접근 권한 등의 정보가 담겨 있다. 

파일 시스템

파일 시스템은 이런 파일과 디렉토리의 CRUD를 관리한다. 

그리고 파일에 대한 접근 방법을 제공하고, 접근 권한을 관리한다. 

또 파일 내용이 손상되지 않도록 무결성을 보장하고, 백업과 복구 작업을 한다.

파일을 보호하기 위한 암호화도 담당한다. 

 

파일 시스템은 어떻게 파일을 저장할까?

  • Continguous Allocation

처음에는 파일을 연속적인 공간에 저장했다. 연속적인 저장장치의 주소를 읽기 때문에 속도는 빠르지만, 파일은 수정을 거듭하며 사이즈가 달라지기 때문에 연속적으로 저장하기 어렵고 단편화 문제도 발생한다.

  • Linked Allocation

파일을 블록단위로 저장하고 각 블록에 다음 블록에 대한 주소를 갖고 있게해 LinkedList 형태로 파일을 읽을 수 있는 방식이다.

  • Indexed Allocation

인덱스를 기록하는 블럭을 하나 두고, 이 index 블록안에 포인터를 보고 파일에 접근하는 방식이다. 

이렇게 저장된 파일에 접근할 때는 파일 테이블을 통해서 접근한다. 

파일 테이블의 블록 번호를 보고 파일에 접근할 수 있다.

그리고 파일 테이블은 디스크 파티션 마다 존재한다 .

 

OS가 파일에 접근하는 법 - File Descriptor

유닉스 계열의 운영체제에서 모든 것은 파일이다. 파일, 디렉토리, 소켓, 등등 모두 파일로 관리된다. 

운영체제에서 파일에 접근할 때 File Descriptor를 사용한다. 

fd = open("test.txt", O_RDONLY);

C언어에서 open으로 파일을 열면 File Descriptor를 반환한다. File Descriptor는 0이 아닌 양의 정수이다. 

파일 디스크립터 값은 파일 디스크립터 테이블의 인덱스값이다. 

파일을 열 때마다 파일 디스크립터 테이블에 파일 테이블에 대한 참조값을 저장하고 인덱스를 반환해준다. 

우리는 fd를 통해 file table의 위치를 찾고 file table의 값을 통해 파일의 위치를 찾아 읽을 수 있다.  

리눅스 - 파일 디스크립터 :: Developer Ahn (tistory.com)

 

 

[운영체제] 파일과 파일 시스템 (velog.io)

[운영체제] File System Implementations (tistory.com)

리눅스 - 파일 디스크립터 :: Developer Ahn (tistory.com)

 

리눅스 - 파일 디스크립터

File Descriptor (파일 디스크립터) [출처: http://dev.plusblog.co.kr/22] 1. 파일 디스크립터 - 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값- 프로세스에서 열린 파일의 목록을 관리하는 테이

dev-ahn.tistory.com

 

[운영체제] File System Implementations

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;) 테이프: 순차 접근만 가능. 건너뛰기 불가능 하드 디스크, 플래시 메모리: 건너뛰기 가능. 직접 접근 가능한 매체

movahws.tistory.com

 

[운영체제] 파일과 파일 시스템

쉽게 배우는 운영체제 2판 책을 통해 내용을 정리한 글입니다!파일 시스템은 파일과 파일의 집합체인 디렉터리(directory)를 관리한다.유닉스 -> 디렉터리윈도우 -> 폴더파일 시스템은 파일 및 디렉

velog.io

 

'CS > 운영체제' 카테고리의 다른 글

3장 프로세스(PCB, Context Switch, Scheduling, IPC)  (1) 2022.05.15

PCB

Process Control Block

프로세스에 대한 정보를 담고있는 블럭으로 메모리 상에 위치한다.

각 프로세스마다 PCB가 존재하면 다음과 같은 정보를 포함하고 있다. 

  • 프로세스 상태
  • 프로그램 카운터
  • CPU 레지스터들
  • CPU 스케줄링 정보
  • 메모리 관리 정보
  • 회계 정보
  • 입출력 상태 정보

Context Switch

CPU 코어에서 작업하는 프로세스(태스크)를 교환하는 작업을 말한다.

이 과정에서 원래 실행하고 있던 프로세스의 데이터(Context)를 저장하고, 새로 실행할 프로세스의 Context를 불러온다.

이 Context가 PCB에 포함되어있다.

Context Switching은 PCB를 저장하고 불러오는 과정이다. 

 

CPU Scheduling

하나의 코어에서는 하나의 프로세스만 실행될 수 있다. 

여러 개의 프로세스 중에 CPU 코어에서 실행될 하나의 프로세스를 선택하는 것이 스케줄링이다.

스케줄링 큐

프로세스가 시스템에 들어가면, 준비 큐로 들어간다.

준비 큐에서 실행되기를 기다린다.

준비 큐에 저장되는 것은 프로세스에 대한 PCB이다.

준비 큐의 헤더는 첫 번째 PCB를 가리키는 포인터가 있다. 각 PCB는 다음 PCB를 가리키는 포인터를 포함하고 있다.

준비 큐에서 대기하다가 CPU 코어에서 실행된 프로세스는 실행이 종료되거나 대기 큐에 들어간다. 

대기 큐에 들어가는 경우는 다음과 같다.

  • 입출력
  • 자식 프로세스 생성
  • 인터럽트

대기 큐에서 각 이벤트를 처리하고 준비 큐로 다시 들어가게 된다. 

타임슬라이스가 만료된 프로세스는 바로 준비큐로 빠진다.

IPC

Interprocess Communication; 프로세스 간 통신을 말한다.

프로세스가 실행 중이 다른 프로세스들과 영향을 주고받는 다면 협력적인 프로세스라고 한다.

프로세스 협력의 장점은 다음과 같다. 

  • 정보 공유
  • 계산 가속화
  • 모듈성

자세한거는 생략

 

협력적인 프로세스들은 데이터를 교환할 수 있는 기법(IPC)이 필요하다. 

공유 메모리(shared memory), 메세지 전달(message passing) 두 가지 기법이 있다.

속도는 공유메모리 방식이 더 빠르다. 

메세지 전달은 시스템 콜을 사용하므로, 커널 간섭 등 추가적인 시간 소모가 생기지만, 공유 메모리 시스템은 공유 메모리 영역을 구축할 때만 시스템 콜이 필요하기 때문에 더 빠르다.

IPC in Shared Memory Systems

통신하는 프로세스들이 공유하는 메모리 공간을 만드는 것이다. 

프로세스들은 공유공간에 읽고 씀으로써 정보를 교환할 수 있다. 

데이터 형식과 위치는 프로세스들의 책임이다. 동일한 위치에 쓰지 않도록 운영체제가 관리해주는 것이 아니다. 프로세스들이 책임져야한다. 

IPC in Message Passing Systems

운영체제가 메세지 전달 설비를 통해서 프로세스 간에 통신을 가능하게 해주는 방법이다.

메세지 전달 시스템은 최소 2가지의 연산이 필요하다.

`send(msg)`

`receive(msg)`

두 프로세스가 통신을 하려면, 서로 메세지를 보내고 받아야한다. 

두 프로세스 간의 communication link가 있어야한다. 

  • 직접통신
    • 대칭성
    • 비대칭성
  • 간접통신
    • 메일박스

직접 통신 - 대칭성

서로의 프로세스를 가리키는 이름이 있음

`send(P, msg)` - 프로세스 P에 메세지 전송

`receive(Q, msg)` - 프로세스 Q로부터 메세지 수신

  • 두 프로세스 쌍 사이에 연결
  • 각 쌍 사이에는 하나의 연결만 존재

sender, receiver모두 상대방의 이름을 알아야 한다.

직접통신 - 비대칭성

`send(P, message)` - 프로세스 P에 메세지 전송

`receive(id, message)` - 임의의 프로세스로부터 메세지 수신 (id: 통신을 발생시킨 프로세스? 메세지를 받는 프로세스?)

 

직접통신은 프로세스 이름을 하드코딩한다는 단점이 있다. 

 

간접통신 - 메일박스

메일박스라는 곳으로 메세지를 전송하고, 수신하는 방식이다. 

메일박스는 메세지들이 들어가고 나오는 객체라고 볼 수 있다. 

각 메일 박스마다 고유한 id값을 가진다. 

`send(A, msg)` - 메일박스 A에 메세지 전송

`receive(A, msg)` - 메일박스 A로 부터 메세지 수신

 

여러개의 프로세스가 메일박스를 공유한다면, 한 프로세스가 보낸 메세지를 누가 수신하는 가는 수신 기법에 따라 다르다.

여러 프로세스가 모두 수신하는 것이 아니다.

시스템이 임의로 선택하거나, 라운드 로빈 방식 등 여러가지 알고리듬이 사용될 수 있다.

 

메일박스는 한 프로세스에게 소유되거나 운영체제에게 소유될 수 있다.

프로세스 소유 메일박스

프로세스에게 할당된 메모리 공간에 메일박스가 존재한다. 

메일박스의 소유자(해당 프로세스)가 명확하므로 receiver와 sender를 명확히 구분할 수 있게 된다.

(메일박스의 소유자는 receiver 역할만)

운영체제 소유 메일박스

특정 프로세스에 속하지 않는다.

운영체제는 다음 기능을 제공해야한다.

  • 새로운 메일박스를 생성
  • 메일박스를 통해 메세지 send, receive
  • 메일박스 삭제

메일박스를 생성한 프로세스가 메일박스의 소유자가 돼서 유일한 receiver가 된다. 

'CS > 운영체제' 카테고리의 다른 글

파일, 파일 시스템이란?  (0) 2023.09.05

+ Recent posts