유닉스 오퍼레이팅 시스템의 구조를 보자.
제일 가운데에 Kernel이 존재한다. 커널은 하드웨어를 제어하는 소프트웨어로 운영체제의 핵심이다.
그리고 System Calls은 커널의 기능을 사용하기 위한 외부 인터페이스이다. 즉 외부의 Applications가 커널의 기능을 활용하기 위해서는 System Calls을 통해서 커널의 기능을 사용한다.
외부의 Application은 System Calls에 갈 때 Shell을 거치기도 하고, Library Routines를 거치기도 한다.
즉 모든 Applications의 중심에는 Kernel이 있고 그 Kernel을 사용하기 위한 System Calls이 UNIX Operating System에서 공부하는 과목이다.
UNIX는 멀티 유저 멀티 태스킹 시스템이므로, 사용자 로그인을 해야한다. 로그인을 할 경우 '%'이나 '$'와 같은 특수기호와 함께 프롬프트가 나오게 되는데 이 프롬프트가 바로 shell이다.
shell은 Command Interpreter이므로 한 줄 한 줄 명령어 코드를 실행한다.
Shell에는 여러가지 종류가 있는데, 다음과 같다.
– Bourn shell(/bin/sh) : $
– KornShell(/bin/ksh) : $
– C shell(/bin/csh) : %
리눅스의 경우 Bashell(/bin/bash)을 사용하는데 이는 기본적으로 KornShell과 비슷하다.
File and Directories
유닉스의 파일 시스템은 hierarchical arrangement를 이루어 계층적으로 구조가 되어있고, root(/)라는 최상위 계층에서 파일이 시작된다. 유닉스에서는 directory(폴더)도 파일이고 모든 것을 파일로 취급한다. 파일 이름은 '/'와 NULL 문자를 포함할 수 없다. 디렉토리에는 기본적으로 '.', '..'이라는 파일이 만들어지는데 '.'은 현재 디렉토리, '..'은 상위 디렉토리를 의미한다.
경로의 방법 두 가지 절대경로와 상대경로가 있고, 절대경로는 '/user/A/B'와 같이 root로부터 시작하는 경로이고, 상대경로는 현재 위치한 디렉토리(current working directory)를 기준으로 시작하는 경로이다. 현재 위치한 디렉토리의 경로는
% pwd
명령어로 출력할 수 있다. 로그인을 하였다면 /etc/passwd 경로에 유저의 정보가 저장된다. 이 위치가 home directory로 저장되어 명령어
% cd ~
를 사용하면 home directory로 이동할 수 있다.
Generalization of the file concept
유닉스에서는 일반적인 파일(normal / regular files)만이 파일이 아니라 peripheral device(주변 장치)또한, 그리고 inter-process communication channels(프로세스간 통신을 위한 채널)도 파일이다.
e.g) I/O devices
• /dev/stdin, /dev/stdout, /dev/rmt0
$ cat file > /dev/rmt0
cat명령어는 catenate로 특정 파일을 화면에 출력하거나, '>' 를 사용하여
$ cat file1 > file2
$ cat file1, file2, file3 > file4
위와 같이 사용하면 파일의 내용을 모두 연결한 새로운 파일을 생성한다.
$ cat file > /dev/rmt0
와 같이 사용하면 장치에 파일 내용을 보내는 용도로 사용된다.
e.g) Inter-Process Commnucation channels
•FIFO, PIPE, SOCKET
위와 같은 프로세스간 통신을 위한 채널들도 파일로 취급한다.
Unix File Types
유닉스에서 파일의 종류는 다음과 같다.
•Regular file (일반적인 텍스트가 쓰여있는 파일)
–Binary or text file
–Unix does not know the difference
•Directory file
–A file that contains the names and locations of other files.
디렉토리에 포함된 파일들의 이름과 위치 정보를 담고 있음
•Character special and block special files
–Terminals (character special) and disks (block special)
character special 은 속도가 느려 문자(1byte)단위로 데이터를 전송하며, block special은 속도가 빨라 block(4KB 혹은 이상)으로 데이터 전송
•FIFO (pipe의 파일형태)
–A file type used for interprocess communication
프로세스간 통신을 하는데 사용
•Socket
–A file type used for network communication between processes
tcp/ip를 통한 프로세스간 통신을 하는데 사용
Ownership and Permissions
유닉스는 multi-user, multi-tasking 시스템이기에 single-user인 윈도우와 달리 서버로 사용할 수 있다. 따라서 각기 파일에 대한 Ownership(소유권)에 대해서 구분이 되어야 한다. 또한, 파일에 대한 Access Permissions(접근 권한)이 있어 파일에 접근할 수 있는 권한을 소유한 사용자만이 파일조작이 가능하다.
유닉스의 파일 타입들에 대해서 알아보자.
% ls -al
명령어를 사용하여 디렉토리의 모든 파일 리스트를 확인할 수 있는데, 디렉토리명 앞에 '.'이 들어가는 숨겨진 파일들을 '
-a' 속성을 통해서 확인할 수 있고, '-l' 명령어를 통해 디렉토리 하나당 한줄로 표현하여 각종 파일에 대한 정보들을 확인할 수 있다.
위 사진과 같이 파일의 앞에 -rw-r--r--r 이러한 문자가 있다. 이중 가장 첫번째 문자는 파일의 타입을 나타내는데, 다음과 같은 종류가 있다.
– d : directory
– l : symbolic link
– b : block special file
– c : character special file
– p : FIFO
– - : regular file
- s : socket file
위와 같이 가장 왼쪽의 기호가 'd'이면 디렉토리, '-'이면 일반적인 파일임을 알 수 있다.
Process
프로그램을 실행하면 하나 또는 여러개의 Process가 실행이 되는데, 유닉스에서
% ps
명령어를 사용하면 프로세스들에 대한 정보를 표시한다. '-ef'옵션을 사용하면 다른 사용자의 프로세스도 볼 수 있다.
Inter-Process Communication (IPC)에는 다음과 같은 종류가 있다.
–Pipe
–FIFO
–Signals
–Shared memory
–Semaphore (IPC에 필요한 동기화에 사용)
–Sockets (used for cooperating process across a network. TCP/IP에서 사용)
System calls and library subroutines
System call에 대해서 자세히 알아보자
System call은 소프트웨어 개발자의 요청이 UNIX kernel으로 전달되는 인터페이스이다. 마치 C의 서브루틴이나 함수를 호출하는 것과 비슷하다.
nread = read(filedes, inputbuf, BUFSIZE);
프로그램 코드를 읽는 read라는 system call이 있다. 프로그램에서 read system call을 호출하면 user공간에서 작동하다가 kernel공간으로 이동하여 kernel code로 변환되어 실행한다.
nread = fread(inputbuf, OBJSIZE, numberobjs, fileptr);
혹은 프로그램이 외부 라이브러리에서 read system call을 호출하는 방법도 있다.
user process에서 system call이 발생하면 S/W interrupt로 작동을 하는데 이를 trap이라고 한다. kernel에서 작동이 모두 끝나면 user process의 마지막 위치로 return하여 돌아간다.
System call에서 user process에서 kernel로 가고 다시 user process로 돌아오는데, 이 user process와 kernel process는 다른 프로세스이기 때문에 이동할 때 context switches가 일어나므로 작업이 무겁다. 따라서 system call을 과도하지 사용하지 않는 것이 좋다.
모든 system call은 header파일에 존재한다.
'개발 · 컴퓨터공학' 카테고리의 다른 글
네트워크 프로그래밍 - TCP 소켓 프로그래밍의 시작 (0) | 2021.09.12 |
---|---|
네트워크 프로그래밍 - TCP란? (0) | 2021.09.07 |
Virtual Box 설치하기 (0) | 2021.09.04 |
네트워크 프로그래밍 - Physical Address(MAC Address), Logical Address(IP Address), Port Address (0) | 2021.09.03 |
UNIX의 역사 (0) | 2021.09.02 |