디바이스 드라이버란 디바이스 드라이버란 마우스, 키보드, 모니터, 디스크, 네트워크 인터페이스 카드 등 컴퓨터의 주변 장치를 제어하기 위한 프로그램이다. 디바이스 드라이버가 없다면 주변 장치들을 사용할 수가 없다. read()라는 작업을 디스크 관점에서 어떻게 처리할 것인가?와 같은 하드웨어에 밀접한 기능들은 모두 디바이스 드라이버로 구현된다. 디바이스 드라이버는 리눅스 커널에서 모듈로 구현하므로, 먼저 리눅스 커널 모듈에 대해서 알아야 한다. 이건 글로 정리해두었다. 디바이스 드라이버의 역할 디바이스의 종류 디바이스는 문자 디바이스 드라이버, 블록 디바이스 드라이버로 나눌 수 있다. 문자 디바이스는 시간 순으로 들어오는 데이터를 처리한다. 예를 들어 마우스, 키보드의 입력과 같이 순서대로 처리하는 것이..
메모리의 기본 단위와 저장 메모리에 데이터를 저장할 때 사용되는 최소 단위 = 비트 하지만 비트 단위로 연속적인 데이터를 저장하다 보면 불편함이 발생 40 + 30을 한다고 했을 때 이 두 십진수를 101000 11110이란 비트로 변환하여 계산해야 하는데, 이 두 수를 특정 주소에서 찾는다고 했을 때 만약 비트 단위로 데이터가 메모리에 저장되어 있다면 위 비트수 만큼의 주소를 조회해야 한다. 이는 많은 양의 데이터를 처리하는 컴퓨터에게 부적합 그래서 메모리에 저장되는 최소 단위를 바이트로 정함 (1byte = 8bit) 메모리 주소 하나당 8bit 만큼의 데이터가 담긴다면 40(00101000)과 30(00011110)이 각각 한 주소에 저장되어 40 + 30을 두 번의 주소 조회로 계산할 수 있을 것..
분산 적재 방식 정적, 동적할당과 buddy system은 메인 메모리 안의 연속된 공간에 하나의 프로세스를 적재하는데 반해 분산 적재 방식은 하나의 프로세스를 특정 단위로 쪼개어 연속되지 않은 공간에 저장이 가능하게 함 paging 프로세스를 동일한 크기의 조각으로 나눔 나눠진 프로세스 각각을 page라고 부름 메모리도 조각으로 나눔 나눠진 조각을 Frame이라고 함 page의 사이즈 = Frame 사이즈 여야 한다. 이렇게 나누는 이유는 프로세스를 page 단위로 쪼개어 여러 frame에 하나의 프로세스의 page들을 분산하여 적재하기 때문에 위의 세 그림을 보면 프로세스 A와 B를 정해진 단위로 쪼개어 메모리의 frame에 적재한 것을 볼 수 있고 밑의 세 그림을 마저 보면 B가 종료되고 D가 할당..
메모리 관리의 개요 static allocation 정적 할당 - 프로그램 시작 이전에 할당 컴파일 타임에 결정 dynamic allocation 동적할당 - 컴퓨터 과학에서 동적이란 runtime을 뜻함 요청이 오면 heap에 할당 프로그램 실행시 미래에 사용될 메모리의 양을 정확히 알 수 없기 때문에 범용 os가 지원함 운영체제의 기능임 OS에서 메모리 관리란? 다수의 프로세스를 위해서 user part의 메모리를 분할하는 기능 - os가 동적으로 메모리 관리 어떻게 효율적으로 할까 - 요구사항 relocation - 재배치 가능하도록 관리해야함 메인메모리는 여러 프로세스가 동시에 사용하므로 1 프로그램 컴파일, 코딩시에 프로세스가 메모리의 어느 위치에 올라갈지 예측 불가능 2 어느 위치에 올라가더라..
DeadLock Avoidance 교착상태 회피 교착상태 회피 기법은 교착 상태 발생을 위한 4가지 조건 중 1, 2, 3을 허용하며, 또한 4처럼 자원 할당 순서를 미리 정하지 않는다. 자원을 할당할 때 교착 상태가 발생 가능한 상황으로 진행하지 않도록 고려한다. 미래의 자원 요청 정보 필요 현재 자원의 가용 개수와 프로세스의 자원 요구향을 미리 알고 있어야 가능하다. 자원 할당 거부 (Resource Allocation Denial) 자원을 할당할 때 교착상태가 발생할 가능성이 있는지 여부를 동적으로 판단. 교착 상태의 가능성이 없을 때 자원 할당 안전한 상태를 계속 유지할 수 있으면 자원 할당 But, 각 프로세스들이 필요한 자원들을 미리 운영체제에게 알려야 한다. 시스템 상태 구분 안전한 상태(s..
식사하는 철학자들 철학자들은 배고프면 식사를 하고 식사를 마쳐서 배가 부르면 사고를 한다. 철학자들 양 옆에는 포크가 놓여져 있고 식사를 하기 위해선 양 옆의 두 개의 포크를 이용해야 한다. 철학자들이 식사를 하는 방법은 다음과 같다. -> 왼쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면 집어든다 -> 오른쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면 집어든다. -> 양쪽의 포크를 잡으면 일정 시간만큼 식사를 한다. -> 오른쪽 포크를 내려놓는다. -> 왼쪽 포크를 내려놓는다. -> 다시 1번으로 돌아간다. 식사를 하기 위해 어떤 포크를 집어 든다면 그 포크는 다른 철학자가 접근하지 못한다. - 포크 = 임계 자원(상호 배제를 만족해야 함) 위의 조건을 지키면서 작업을..
Deadlock semaphore는 한가지 임계 자원이 아닌 여러 임계 자원에 대한 상태를 나태낼 수 있고 아래와 같이 P0, P1가 S, Q라는 임계 자원을 동시에 접근했다고 하면, 첫 S와 Q는 각각 1개의 프로세스가 사용할 수 있다고 가정했을 때 P0와 첫줄의 wait함수를 호출하면 S의 count가 1에서 0으로 바뀐다. 이 때 만약 스케쥴러가 P1을 할당하면 Q도 마찬가지로 0으로 바뀔 것이다. 하지만 또다시 스케쥴러가 P0를 호출한다면 두번째 줄의 wait함수를 호출했을 때 Q가 0이므로 대기 상태로 들어가고 다시 P1이 실행되면 P1도 마찬가지로 S가 0이므로 대기 상태로 들어갈 것이다. 이렇게 두 프로세스가 어느 한쪽도 수행되지 못하는 Deadloack이 발생된다. Deadlock의 특징 ..
조건 변수를 활용하여 여러 쓰레드의 순서를 동기화 할 수 있었는데, 이는 뮤텍스와 같이 사용되어 조금은 복잡한 코드였다. 세마포어를 잘 활용하면 조건 동기화를 동시에 해결할 수 있다. 원래의 조건 동기화 코드는 조건 변수를 사용하기 전과 후에 상호 배제를 위해서 mutex를 사용했지만 세마포어는 그 자체로 상호 배제를 만족하므로 sem_t s; void * child (void *args) { printf(“child\n”); sem_post(&s); return NULL; } int main(int argc, char *argv[]) { sem_init(&s, 0, 0); printf(“parent: begin\n”); pthread_t c; pthread_create(c, NULL, child, NU..