수업/System Programming 9

[System Programming] Thread & Mutex Lock

이 글에선 Thread와 Mutex Lock에 대해 알아본다. 우선 Thread가 무엇인지 알아보자. 일단 Multi proecessor는 고려하진 말자. Thread는 Single Processor일때도 있던 개념이다. UNIX OS에서 계산기 프로그램을 실행시켰는데 시계가 작동하지 않는다면 사고다. 우리는 어떻게 여러 작업을 동시에 처리할 수 있는지에 대해 기술적인 고민을 할 수 있다. 예를들어 실제로 우리가 웹 브라우저로 특정 웹사이트에 들어갔는데 데이터가 많을 수 있는데, 이럴때 우리 웹브라우저는 하나씩 다운로드 받지 않고, 병렬로 여러 데이터를 다운받는다. client인 우리 웹부라우저만 이러는게 아니라 web sever도 data를 병렬로 보내준다. 이게 딱히 새로운건 아니다. 예전 글에서 f..

[System Programming] Semaphore

이번에는 Inter Process Communication 수단? 이라기보단 IPC 보조 수단인 Semaphore에 대해 알아본다. 우선 앞서 배운 shared memory의 문제점을 짚어보고, Semaphore의 필요성을 알아보자. 사실 shared memory든 뭐든, 공유자원은 동시에 접근할 경우 문제가 생기기쉽다. 특히 특정 자원에 여러 processes가 동시에 write를 하는 경우 그렇다.(write하는게 한 놈 뿐이라면 아마 문제가 없지 않을까 싶음) 예를들어 특정 shm의 초기값이 0일때 해당 shm에 대해 동시에 두 프로세스에서 각각 100000번씩 +1을하는 loop를 돌리면 200000이 나와야하겠지만, 실제론 그렇지 않을 수 있다는 말이다.(실제로 test해보려면 loop문 안에서..

[System Programming] Barrier

Barrier의 개념이나 구현을 완전히 자세하게 하진 않고, 간단하게 개념을 알아본 뒤, IPC 중 하나인 SIGNAL을 이용해서 간단하게 구현해보자. > Barrier란? 간단히 말해서 동기화 도구 중 하나이다. 같은 작업을 여러 processors가 나눠서 진행중이라면, 다른 놈들보다 먼저 본인의 일을 끝내는 processor가 나오기 마련이다. 그럴때 같은 일을 하는 다른 모든 processors가 일을 끝마칠때까지 기다리도록 하는 것이 barrier이다. 위 예시처럼 특정 작업이 끝나고 다른 작업을 시작해야할때 적용할 수 있다. SIGNAL을 이용해서 이런 기능을 하도록 하려면 어떻게 해야할까? 0. 일단 모든 processors는 미리 정해둔 SIGNAL을 받아서 카운트를 하도록 signal h..

[System Programming] Inter Process Communication(IPC)

앞서 배운 pipe/named pipe나 signal도 process간 통신 수단 중 하나이다. 이 글에선 다른 IPC 관련 명령어/함수들을 알아본다. 여기선 아래 두가지 IPC 수단을 추가로 배운다. 1. mesasge queue를 이용한 IPC 2. shared memory를 이용한 IPC 이외에도 file lock, semaphore, socket, 일반 file 등등.. IPC 관련 개념/system calls가 많긴한데 여기선 위 두가지만 배운다. (pipe도 결국 위 두 개념에 속하는게 아닌가? → 말만 보면 그런 것 같긴한데, UNIX/LINUX에서 위 두가지를 전문적으로 해주는 기능이 존재함. pipe도 IPC는 맞지. pipe/message queue/shared memory 다 따로따로..

[System Programming] pipe 공부

pipe는 UNIX system IPC(InterProcessCommunication) 중 하나이다. 즉, Process간 통신을 할때 사용된다. > File Descriptor file descriptor란 process가 file을 다루기위해 사용하는 개념으로 0 이상의 정수값을 갖는다. processor가 생길때마다 각 processes는 각자 file descriptors (목록)을 가진다. process는 file에 직접 접근하는게아니라 이 file descriptor을 통해서 지정된 file에 접근한다. 그럼 이제 processor가 file을 open할때마다 사용하지 않는 file descriptor 숫자 중 "가장 작은 값"과 해당 file을 연결(?)해서 접근할 수 있게 해주는 것이다. ..

[System Programming] Shell 공부

Shell이 무엇인지 알아보고, Shell의 작동 원리를 카피해 비슷한 기능을 하도록 간단하게 구현하는 방법을 알아본다. 그 전에 기본이 되는 개념인 program과 process의 차이에 대해서도 간단하게 알아본다. Program : disk에 file로 저장된 machine instructions Process : memory에 올라와있는 machine instructions, CPU가 각 줄을 실행한다. (PCB라는 구조체가 현재 프로세스 정보를 담고 관리한다) file system이 disk의 file 정보들을 포함/관리 하듯이, User Space라는 것이 memory의 processes와 그 data 정보를 포함한다. 메모리는 사실 아래 그림과 같이 kernel space와 user space..

[System Programming] who 공부

`who` 명령어는 누가 현재 접속 중인지를 출력한다. 이걸 차근차근 구현해보자. (중간중간 유용한 정보 많음) 우선 who 명령어가 어떤 명령어인지 알아보려면, `man who` 명령어를 통해 who의 manual page를 볼 수 있다. 읽다보면 who 명령어가 `/var/run/utmp` 파일을 사용해 정보를 읽어와 출력한다는 것을 알 수 있다.(구체 경로는 아마 환경따라 다를거임) 교수님께서 알려주셨는데, 보통 `/var`에 시스템 로그 관련 파일들이 있다. utmp가 이젠 궁금하니, `man utmp` 명령어를 통해 utmp의 manual page를 보자. 참고로 utmp라는 keyword가 나오는 모든 manual page를 검색하고 싶다면, `man -k utmp` 명령어를 이용하면 된다. ..

[System Programming] File Systems 공부

Linux File Systems는 files과 directories의 collection이다. 우선 directory든 file이든 모두 Hard Disk에 저장된다. Hard disk는 Sector라는 기본 unit으로 나뉘어진다. 우리는 각 Sector에 번호를 부여함으로써 마치 하드디스크를 마치 큰 배열처럼 사용할 수 있고, 그런 점을 이용해 Linux의 파일 시스템은 아래와 같은 Layout을 띄게 된다. 1) The Supuer Block : File system 자체의 구조에 대한 정보를 담고 있다. ex. 각 area의 크기, 사용되지않는 data blocks의 위치 등등 2) The Inode Table : `struct inode`에 각 file의 정보(data 위치, size, Use..

[System Programming] ls 공부

directory 내의 files을 출력하는 ls를 구현하기위해선 우선 directory가 무엇인지 알아야한다. UNIX/LINUX에서 "file"은 byte들이 모인 것일뿐이다. 어떤 프로그램으로 해석을 하느냐가 그것에 의미를 부여할 뿐이다.(매우 당연한 관점같지만 UNIX에서부터 시작된 것이다.) LINUX에선 directory도 file로 취급한다. directory file엔 해당 directory 내부 정보나 다른 하위 directory 정보가 담긴다. 각 directory들은 tree구조로 엮인다.(뭐 node만들어서 엮고 하는 그런 특별한게 아니라 그냥 하위 directory 정보를 포함할 뿐이지 상위 directory 정보를 포함하진 않으니 tree 구조란 얘기인듯) 이제 System Ca..