전체 글
-
하드디스크 구조(3) - 비용파일처리 2020. 5. 17. 01:36
오늘은 하드디스크 구조와 비용에 대해서 알아볼거에요 하드디스크에 데이터를 읽거나 쓰는 행위를 디스크 액세스(Disk Access) 라고 해요 이 디스크 액세스 비용은 아래 세 개로 구분할 수 있어요 Seek time Arm 이 데이터가 있는 실린더로 이동하는 시간 Rotaional time 헤드 밑에 데이터가 있는 섹터가 위치하도록 Platter가 회전하는 시간 하드디스크는 일반적으로 5000rpm(Rotation Per Minute)으로 회전합니다. 따라서 60(초) * 1000(ms) ÷ 5000 = 12ms 12ms 당 한 번씩회전하게 됩니다. 이 때 원하는 섹터가 가까이 있으면 Platter가 조금 회전할 것이고, 멀리 있으면 많이 회전할거에요 그래서 계산을 할 때는 12 ÷ 2 = 6ms 로 ..
-
C/C++ stat(2), lstat(2), fstat(2)C,C++ & Linux 2020. 5. 17. 00:43
stat 함수 기능 지정한 파일의 정보를 담고 있는 stat 구조체를 얻어주는 시스템 함수입니다. stat(2) 파일을 filepath 로 지정합니다. fstat(2) 파일을 fd 넘버로 지정합니다. lstat(2) 파일을 filepath 로 지정하되 지정된 파일이 심볼릭 링크 파일이면 링크파일 자체에 대한 정보를 얻습니다. stat(2) 함수로 심볼릭 링크 파일을 지정하게되면 링크파일이 가리키는 파일에 대한 정보를 얻습니다. stat구조체 struct stat { dev_t st_dev; // 디바이스 번호 ino_t st_ino; // inode 번호 mode_t st_mode; // 모드 (접근권한) nlink_t st_nlink; // 하드링크 수 uid_t st_uid; // 소유자의 사용자 아..
-
C/C++ sync(2), fsync(2), fdatasync(2)C,C++ & Linux 2020. 5. 16. 23:31
함수 기능 OS에서는 파일 쓰기 작업의 성능을 위해 버퍼 캐시에 담아뒀다가 일정 주기에 한 번에 디스크에 반영합니다. 이 때 버퍼 캐시의 내용을 디스크에 반영하면서 동기화를 맞춰주는 시스템 함수가 sync 계열의 함수입니다. sync(2) 시스템 버퍼 캐시의 내용을 디스크에 쓰고, 비워줍니다. fsync(2) 지정한 파일의 시스템 버퍼 캐시의 내용을 디스크에 쓰고, 비워줍니다. fdatasync(2) 특정 파일의 시스템 버퍼 캐시의 내용을 디스크에 쓰되 파일의 일부에만 영향을 줍니다. 그리고 버퍼 캐시를 비워줍니다. 함수 원형 #include void sync(); int fsync(int fd); int fdatasync(int fd); 매개변수 fd 데이터 동기화를 맞출 파일 디스크립터 반환값 성공 ..
-
C/C++ dup2()C,C++ & Linux 2020. 5. 16. 23:22
dup2(2) 함수 기능 파일 디스크립터를 지정된 파일 디스크립터 번호로 복사합니다. 함수 원형 #include int dup2(int fd, int destFd); 매개변수 fd 복사할 파일 디스크립터 destFd 복사된 파일 디스크립터 번호 반환값 성공 시 destFd 리턴 에러 시 -1 리턴하고 errno 설정 예제 #include #include #include #include // for open #include #include #define BUFFER_SIZE 1024 int main(int argc, char *argv[]) { char *fname = "ssu_test.txt"; int fd; // ssu_test.txt 파일 생성 fd = creat(fname, 0666); printf..
-
C/C++ dup()C,C++ & Linux 2020. 5. 16. 23:11
dup(2) 함수 기능 파일 디스크립터를 복사해줍니다. 함수 원형 #include int dup(int fd); 매개변수 fd 복사할 파일 디스크립터 반환값 성공 시 복사된 파일 디스크립터 빈 파일 디스크립터 중 가장 작은 값이 리턴됩니다. 에러 시 -1 리턴과 errno 설정 예제 #include #include #include #include // for open #include #include #define BUFFER_SIZE 1024 int main(int argc, char *argv[]) { char buf[BUFFER_SIZE]; char *fname = "ssu_test.txt"; int count; int fd1, fd2; // fd1 = ssu_test.txt fd1 = open(fn..
-
MT 문제 (boj 10265)알고리즘 2020. 5. 16. 22:52
오늘은 MT 문제에 대해 풀어볼게요 저는 문제를 딱 보는 순간 위상정렬(Topological sort) 문제라는게 보였어요 위 입력은 다 자기 자신을 지목한 상황이라 다른 사람에게 의존하지 않는 경우에요 세 번째 그림을 잘 보셔야해요 1은 2가 가야 가는 것이지만 2가 간다고 무조건 1이 가야하는건 아니에요. 따라서 세 번째 입력의 경우에도 답은 2명이 됩니다. 사실 여기까지는 단순한 위상정렬 문제로 보여요. 의존성이 없는 사람부터 버스에 태우면서 k명이 될때까지 최대한 태워보면 되니까요 하지만 예외가 있습니다. 이런 경우는 조금 다르죠 1, 2, 3 은 서로 의존적이라 다 같이 가거나 다 같이 안 갈 수 밖에 없어요. 따라서 답은 1명이 됩니다. 그냥 위상 정렬로 풀려고 해도 쉽지 않아요. 왜냐면 1,..
-
위상정렬알고리즘 2020. 5. 16. 16:30
위상정렬은 작업간의 순서가 있어서 어떤 작업을 먼저 처리해야하는지 그 순서를 결정하는 문제에요 예를 들어 라면에 파를 넣어 끓여먹는 작업이라고 해볼게요 엄마한테 혼나지 않으려면 설거지까지 잘 해야해요..! 위상 정렬 문제 푸는 방법 1. 각 단계 별로 선행 과제의 갯수를 센다. 2. 선행과제가 없는 단계부터 처리하며 지워나간다. 3. 모든 단계를 처리한다. 1. 각 단계 별로 선행 과제의 갯수를 센다. 2. 선행과제가 없는 단계부터 처리하며 지워나간다. 2-1 2-2 2-3 3. 모두 처리한다. 어때요 쉽죠?
-
C/C++ pread(), pwrite()C,C++ & Linux 2020. 5. 14. 23:37
pread(2), pwrite(2) 함수 기능 read(), wrte() 함수와 lseek() 함수의 결합으로, seek offset 을 이동시킨 뒤 read() or write() 합니다. pread(), pwrite() 함수는 lseek() 과 read() or write() 를 원자적(atomic)으로 처리합니다. 원자적이라 함은 한 번 호출되면 반드시 모든 연산을 마친다는 뜻입니다. 다른 프로세스나 스레드로부터 서로 연산이 분리되지 않는다는 것을 말합니다. lseek() + read() 을 하게 되면 lseek() 이후 프로세스 스케줄링으로 인해 다른 스레드로 컨트롤이 넘어가서 해당 파일의 seek offset 을 훼손시킬 수 있습니다. 그리고 다시 원래 스레드로 돌아와 read() 하게 되면 엉..