리눅스 파일에는 atime, ctime, mtime 3가지 시간 정보가 있다.각각 Access Time, Change Time, Modify Time을 의미한다. 파일의 메타데이터 정보를 보여주는 stat() 명령어를 공부하다가 세 가지 시간 정보가 등장하는 것을 확인했다. atime (Access Time)파일에 마지막으로 접근 Access한 시간을 기록한다.time of last access 파일이 어떤 명령어나 스크립트, 프로그램에 의해 열리거나 읽혔을 때 갱신된다.vi나 emac 같은 에디터 프로그램 뿐만 아니라 cat, tail 같은 명령어에 의해 읽힌 경우에도 갱신된다. Access Time은 너무 자주 갱신이 된다. 파일에 접근할 때마다 inode에 갱신해주어야 하기 때문에 애플리케이션의 성..
SKKU SW/Operating System
비동기함수 sync, 동기함수 fsync 유닉스(리눅스)에서는 메모리 정보를 disk에 적을 때 바로 disk에 적지 않고,CPU 바로 옆에 있는 cache에 적은 다음 그 정보를 disk로 옮긴다. sync 또는 fsync 시스템 콜을 이용해서 write를 할 수 있는데, sync는 비동기함수이기 때문에 write 명령을 CPU에 전달하고 리턴된다. void sync(void); // 항상 성공하므로 반환 값이 없다.단순히 모든 버퍼를 디스크에 쓰도록 처리하는 과정을 시작하도록 명령할 뿐그 버퍼 내용을 디스크에 쓰는 연산이 완료될 때까지 기다리지는 않는다. 반면, fsync는 동기함수로, write가 끝날 때까지 기다렸다가 리턴된다.(disk 끝까지 내려가서 써지는 거 확인하고 return) int f..
conditional variable을 사용하여 producer-consumer (Bound buffer) problem을 해결하는 과정에서 pipe라는 용어가 나왔고는데,추가적인 공부를 위해 anonymous pipe와 named pipe를 알아보려 한다. 일단 anonymous pipe와 named pipe 둘 다 프로세스 간 통신 (IPC, Inter-Process Communication) 방법 중 하나로,데이터를 전달하는 데 사용된다. Anonymous pipe특징1. 일회성 연결: 주로 부모 프로세스와 자식 프로세스 간의 통신을 위해 사용된다.2. 단방향 통신: 한쪽 방향으로만 데이터가 흐른다.데이터 송신과 수신을 위한 별도의 파이프가 필요하다.3. 익명성: 시스템 내에서 이름이 없으므로 파일..
Multi core -> Multiprocessor Thread 개념을 이용해 parallel programming을 해야 한다. (Multithreading) Cache Coherence : Multicore 환경에서 각 CPU Core에는 개별적인 Cache가 존재하고, 이 Core들은 공통된 Bus를 통해 Memory에 접근하는데, 이때 각 Core Cache, 그리고 Main Memory 사이에서 Data들의 Consistency를 어떻게 유지할 것인가? Bus snooping https://gusdkstudyhard.tistory.com/139 [OS] Multiprocessor Scheduling(1) - Cache Coherence(캐시 일관성) & Bus snooping(버스 스누핑) Si..
Single Core 환경은 (CPU - Cache) ----- Memory 형태로 되어 있다. Cache는 Main Memory보다 용량은 작지만, 주요 data들을 모아 둔 작고 빠른 임시저장장치이다. 이 Cache를 이요함으로써 CPU와 Memory 간의 다소 느린 속도를 보완해줄 수 있다. 그렇다면 Multi Core는 어떨까 (CPU - Cache) ----- |----- Memory (CPU - Cache) ----- 와 같은 형태일 것이다. (core는 더 많을 수도 있다) 이 경우에 문제가 복잡해진다. CPU1에서 CPU2로 작업을 옮기려면 CPU2에서 다시 필요한 정보를 Memory에서 Cache로 가져오고, 또 Context Switch가 발생하면 CPU1의 Cache로 필요한 정보를 ..
시스템 콜(System Call)이란? 시스템 호출(system call)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 보통 C나 C++과 같은 고급 언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없기 때문에 고급 API를 통해 시스템 호출에 접근하게 하는 방법이다. application은 반드시 I/O가 필요한데, 이는 하드웨어 장치를 통해서 이루어진다. 이때 사용자 프로그램은 system call을 통해 OS에게 부탁한다. 통상적으로 시스템 콜은 여러 종류의 기능으로 나누어진다. 각 시스템 콜에는 번호가 할당되고 시스템 콜 인터페이스는 시스템 콜 번호와 시스템 콜 핸들러 함수 주소로 구성되는 시스템 콜 테이블을 유지한다. ..
int main(int argc, char *argv[]) 함수는 윈도우나 리눅스 같은 OS 명령 프롬프트를 이용해 인자를 전달해서 작동할 수 있도록 한다. main 함수의 매개변수를 넘겨줌으로써 원하는 실행결과를 도출하고자 한다. 1. int argc argc = argument count argc는 운영체제가 이 프로그램을 실행했을 때 전달되는 인수의 갯수 즉 main()함수에 전달되는 데이터의 갯수를 의미 2. char *argv[] argv = argument variable char *argv[]는 문자열의 주소를 저장하는 포인터 배열 argv[0]은 프로그램의 실행경로 argv[1], argv[2]... 에는 순서대로 사용자가 입력한 argument가 저장됨 예를 들어, int main(int..