시스템 메모리 증가더 많은 데이터가 캐시되면서 디스크의 사용은 대체적으로 쓰기 위주가 되었고 읽기는 캐시에서 처리되었다.임의 I/O와 순차 I/O의 성능 간의 격차탐색과 회전 지연 비용은 매우 천천히 감소하고 있다.워크로드에서 기존 파일 시스템들의 성능이 좋지 않았다.예를 들어, 파일 시스템은 크기가 하나의 블록인 새 파일을 생성하기 위해 많은 수의 작업을 수행한다.LFS 로그기반 파일 시스템모든 갱신을 디스크에 순차적으로 기록하는 것이 핵심디스크 기록시, LFS는 모든 갱신 정보(메타데이터 포함)를 세그멘트에 버퍼링한다.세그먼트가 가득차면, 디스크에서 빈 공간을 찾아 한번에 기록한다. LFS는 기존의 내용을 덮어 쓰지 않는다. 대신 항상 비어있는 곳에 세그먼트를 쓴다.디스크에 순차적으로 쓰기읽기동작의 ..
OSTEP
간단한 파일 시스템을 어떻게 구현해야할까?파일 시스템은 순수 소프트웨어이다.CPU 및 메모리 가상화와 달리, 파일 시스템의 어떤 측면을 개선하기 위해 하드웨어 기능을 추가하지 않는다.데이터 구조파일 시스템은 데이터를 구성하기 위해 어떤 종류의 on-disk 구조를 사용하나?접근 방법파일 시스템은 open(), read(), write() 등과 같은 프로세스가 호출한 함수를 자신의 구조에 어떻게 매핑할까?전체 구성vsfs 파일 시스템의 자료 구조에 대해 디스크 상의 전체적인 구성을 개발하자디스크를 block들로 나눈다. (단일 블럭 크기만 사용 가정, 4KB)Data Region : 사용자 데이터가 있는 디스크 공간, 디스크의 일정 부분을 데이터 영역으로 확보Meta Data : 각 파일에 대한 정보를 추..
System ArchitectureI/O DevicesInterface시스템 소프트웨어가 그 운영을 제어할 수 있도록 한다.모든 하드웨어 장치들은 특정한 상호 동작을 위한 인터페이스와 프로토콜을 가진다.Internal structure구현 세부 사항에 따라, 시스템에게 제공하는 장치에 대한 추상화를 정의하는 책임을 가진다.Protocol: 표준 방식while (STATUS == BUSY); // 장치가 바쁜 상태가 아닐 때까지 대기데이터를 Data 레지스터에 쓰기명령어를 COMMAND 레지스터에 쓰기(그러면 장치가 명령어를 실행한다.)while (STATUS == BUSY); // 요청을 처리하여 완료할 때까지 대기Polling운영체제가 데이터 레지스터에 어떤 데이터를 전달운영체제가 명령 레지스터에 명령..
비 교착 상태 오류원자성 위반 오류( atomicity violation )다수의 메모리 참조 연산들 간에 있어 예상했던 직렬성이 보장되지 않았다. 즉, 코드의 일부에 원자성이 요구되었으나, 실행 시에 그 원자성이 위반되었다.**[MySQL]**Thread 1:if (thd->proc_info) { ... fputs(thd->proc_info, ...); ...}Thread 2:thd->proc_info = NULL;thd 자료 구조의 proc_info필드를 두개의 다른 쓰레드가 접근한다.Thread 1: 값이 NULL인지 검사후 값을 출력Thread 2: 값을 NULL로 설정만약 스레드 1이 체크(즉, if)를 수행한 후 fputs()를 호출하기 전에 인터럽트가 걸리면, 스레드 2가 그 사이에 실행되어..
세마포어란?🌼 동기화 기법 🌼세마포어는 락과 컨디션 변수로 모두 사용할 수 있다. 정수값을 갖는 객체로서 두 개의 루틴으로 조작가능(초기화 포함은 3개)세마포어는 초기값에 의해 동작이 결정된다. ➡️ 사용하기 전에 제일 먼저 값을 초기화 해야함 POSIX semaphores- int sem_init(sem_t *s, int pshared, unsigned int value) 두번째 인자는 모든 예제에서 0이다. ➡️ 이 값은 같은 프로세스 내의 쓰레드 간에 세마포어를 공유한다는 것을 의미 0이 아니라면 세마포어는 프로세스 간에 공유되며, 공유 메모리 영역에 위치해야 한다.- int sem_wait(sem_t *s) 세마포어 값이 1이상이면 함수는 즉시 리턴, 아니면 값이 1이상이 될 때까지 호출..
조건을 기다리는 방법어떤 조건이 참이 되기 전까지 스레드가 대기하는 것이 필요하다.물론 조건이 참이 될 때까지 단순히 반복할 수 있지만 ⇒ CPU 사이클을 낭비volatile int done = 0;void *child(void *arg) { printf("child\\n"); done = 1; return NULL;}int main(int argc, char *argv[]) { pthread_t c; printf("parent: begin\\n"); pthread_create(&c, NULL, child, NULL); // create child while (done == 0); // 회전 printf("parent: end\\n"); return 0;}..
진짜 어렵다... 밑에 있는 책을 꼭 읽어보길 추천...책이 정말 잘 설명해준다.. 근데 난 이해 못하겠다..ㅎㅎ자료구조에 락을 추가하는 방법?자료구조에 락을 추가하여 thread safe하게 만들 수 있따. Correctness : 어떻게 락을 추가하고 올바르게 추가하려면 어떻게 해야할까? Concurrency : 데이터 구조가 높은 성능을 제공하고, 많은 스레드가 동시에 구조에 접근할 수 있도록 잠금을 추가하는 방법은 무엇인가?Simple Counter (Without Locks)typedef struct __counter_t {int value;} counter_t;void init(counter_t *c) {c->value = 0;}void increment(counter_t *c) {c->v..
락: 기본 개념balance = balance + 1;lock_t mutex; // 글로벌 변수로 선언된 락 …lock(&mutex);balance = balance + 1;unlock(&mutex);소스 코드의 임계 영역을 락으로 둘러서 그 임계 영역이 마치 하나의 원자 단위 명령인 것 처럼 실행되도록 한다. [ 락의 상태 ]사용가능( available, (unlocked or free)): 어느 쓰레드도 락을 갖고 있지 않는 것사용중(acquired) : 즉, 임계 영역에서 정확히 하나의 쓰레드가 락을 획득한 상태lock()호출을 통해 락 획득을 시도한다.만약 어떤 쓰레드도 락을 갖고 있지 않으면, 그 쓰레드는 락을 획득하여 임계영역 내로 진입⇒ 진입한 쓰레드 : 락의 소유자(owner)다른 스레드는..