OS(8)
-
[Operating System] Concurrency Bugs
위의 표에서 보듯이 많은 어플리케이션들에서 발생하는 버그는 주로 concurrency와 관련이 있다. 이 포스팅에서는 여러 concurrency 버그 중에서 데드락(Deadlock)에 대해서 다룬다. Deadlock이란? 데드락은 두 개 이상의 쓰레드가 있을 때 서로 상대방이 끝나기만을 기다려서 어떤 것도 진행되지 못하는 상황을 의미한다. 복잡하고 큰 시스템에서는 모듈들 간에 dependency를 파악하기가 상당히 까다롭기 때문에 데드락에 대처하기가 어렵다. 또한 많은 모듈들이 캡슐화 되어 있어서 모듈 내부에서 어떤 식으로 lock을 잡고 놓는지 파악하는 것도 어려운 일이다. Deadlock이 발생하는 조건 데드락이 발생했다는 건 다음 4가지 조건이 모두 만족 되었다는 의미이다. 이는 다시 말해서 다음 ..
2020.06.04 -
[Operating System] Semaphore
Semaphore란? 이전 포스팅에서 살펴본 CV와 이번에 살펴볼 semaphore는 모두 blocking 매커니즘으로 작동한다. 다시 말해서 현재 쓰레드가 진행 될 수 없는 상황이면 스스로를 run queue에서 제외 시키고(BLOCK 상태로 만들고) 다른 쓰레드에게 컨트롤을 넘긴다. CV가 컨디션 만족 여부를 판단하는 변수에 해당한다면, semaphore는 wait와 post 함수를 통해 증감하는 정수 값을 가진 변수라고 할 수 있다. int sem_wait(sem_t *s) Semaphore의 값을 1 감소 시키고, 감소 이후의 값이 음수(readers = 0; sem_init(&rw->lock, 0, 1); sem_init(&rw->writelock, 0, 1); } // reader가 공유 변수..
2020.06.04 -
[Operating System] Condition Variable
상호배제의 문제는 lock을 통해서 해결했지만, lock은 쓰레드 간에 lock을 얻는 순서를 정해줄 수 있는 기능은 없다. 이와 같은 ordering의 문제는 CV와 semaphore를 통해서 해결할 수 있다. CV란? CV란 말 그대로 조건이 만족되기를 기다리는 공유 변수를 의미한다. 뒤에서 살펴 보겠지만 CV가 쓰레드 간에 공유되는 state라는 점은 꼭 명심해야할 부분이다. Ex) 쓰레드에서 instruction 수행 이전에 컨디션이 만족 되었는지를 먼저 확인하고 싶은 경우가 존재한다. 예를 들어서 parent 쓰레드가 child 쓰레드가 완료되었는지(exit 했는지) 확인을 하고 싶은 경우에 join()을 사용한다. CV의 특징 1. 쓰레드 간 공유되는 공유 변수이므로 상호 배제가 되어야 한다...
2020.06.03 -
[Operating System] File System API
파일이란 읽고 쓸 수 있는 영구적인 byte array이다. 각각의 파일은 inode number라는 low-level 이름을 가지고 있다. (inode 하나가 file 하나를 가리킨다.) File Name inode number 하나의 FS에서 각각의 inode number는 유일하다. (다른 FS끼리는 같은 넘버가 사용될 수 있음) inode number는 삭제된 뒤에는 재사용 가능하다. path inode #는 유저에게 친숙하지 않기 때문에 string file name을 따로 정의하고 inode와 매핑시킨다. path-inode 간의 매핑에 대한 정보는 root 파일(inode 2번)에 저장된다. 따라서 특정 파일이나 directory를 read할 때 root inode부터 읽어야한다. 만약 /e..
2020.06.02 -
[Operating System] RAID (Redundant Array of Inexpensive Disk)
(1) capacity, (2) reliability, (3) performance를 위해서 하나의 시스템에서도 여러 개의 디스크를 사용한다. JBOB vs RAID JBOB: 각각의 디스크 마다 독립적인 FS가 존재하는 형태. 그냥 용량만 늘어난 것이 전부 RAID: 여러 개의 physical disk를 하나의 logical disk와 같이 사용한다. user application과 FS 상에서는 마치 한 개의 disk만 다루는 듯하게 보임. transparent, deployable 참고) RAID에 "Inexpensive"라는 단어가 들어간 이유는 말 그대로 값이 싼 디스크 여러 개를 통해 고성능을 낼 수 있도록 만들어졌기 때문이다. RAID 특징 Performance와 Capacity 상의 이점 ..
2020.06.02 -
[Operating System] I/O Devices
I/O Bus 빠른 I/O와 느린 I/O를 구분하기 위해서 여러 hierarchy의 I/O bus가 존재한다. I/O 버스는 I/O 디바이스와 3가지 요소를 통하여 연결된다. (port, interface, controller) Canonical Device OS는 device register의 status, command, data에 R/W를 한다. 디바이스 레지스터는 OS에 보이지만 디바이스의 내부에 대한 정보는 hidden black box이다. 따라서 OS와 디바이스는 device register의 인터페이스에 따라서만 통신할 수 있고, OS는 정해진 인터페이스 내에서만 디바이스의 operation을 control할 수 있다. spinning을 어떻게 피하는가? interrupt write pro..
2020.06.02