📒 학교 강의를 바탕으로 개인적인 공부를 위해 정리한 글입니다.

⏺️ 커널(Kernel)
OS의 핵.
유닉스 OS 구조의 가운데에 있음.
하드웨어를 컨트롤하는 소프트웨어.
⏺️ 시스템 콜(System calls)
커널을 싸고 있는 것.
커널의 기능을 사용하기 위한 외부 인터페이스.
function API
외부의 애플리케이션들이 커널의 기능(하드웨어 접근 등)을 사용하려면, 커널의 외부 인터페이스인 시스템 콜을 통해야 함.
외부 애플리케이션들이 커널에 접근하려면
이때, 쉘과 라이브러리도 결국 시스템 콜을 통해 커널에 접근함.
유닉스는 멀티 유저, 멀티 태스킹 시스템.
→ 로그인을 해야 함.

⏺️ 프롬프트(Prompt)
맨 아래의 '%' 기호.
프롬프트 다음부터는 쉘이 작동함.
⏺️ 쉘(Shell)
Command Interpreter.
프롬프트에 커맨드를 입력할 수 있음.
명령어를 입력하고 엔터키를 누르면, 쉘이 명령어 문자열을 받아서 해석한 다음에 명령을 실행시켜줌.
쉘에는 여러가지 종류가 있음

Bourn shell과 KornShell은 AT&T에서 만듦.
KornShell이 사용하기 조금 더 편리함.
C shell은 BSD에서 만듦.
리눅스에서 사용하는 것은 bashell(/bin/bash)
이 bashell은 KornShell하고 비슷함.
디렉토리 안에 파일과 또다른 디렉토리가 있음.
⏺️ 유닉스의 파일 시스템
계층적 파일 시스템(Hierarchical Filesystem)
모든 것은 루트 디렉토리 '/'에서부터 시작함.
모든 것이 파일
→ 디렉토리, 디바이스도 파일로 간주함.
⏺️ 파일 이름(Filename)
파일 이름은 '/'와 null 문자를 포함할 수 없음.
새 디렉토리가 생성될 때, 두 개의 파일 이름이 자동적으로 생성됨.
⏺️ 경로명(Pathname)
모든 파일은 경로명을 가짐.

file1에 대한 경로명(현재 워킹 디렉토리 : /usr)
1) 절대 경로(Absolute pathname)
/usr/keith/file1
항상 루트부터 시작함.
2) 상대 경로(Relative pathname)
keith/file1 : /usr이 현재 워킹 디렉토리일 때.
current working directory부터 시작해서 상대적인 위치를 나타냄.
현재 디렉토리는 나타내지 않음.
ben 디렉토리 밑에 file3가 있고 현재 디렉토리가 /usr/Keith라면,
file3의 상대 경로는 "../ben/file3"
절대 경로는 현재 디렉토리에 상관없이 항상 일정함.
상대 경로는 일정하지 않음.
⏺️ Working Directory
= current working directory
쉘의 현재 작동 디렉토리.
명령어 pwd(print working directory)를 통해 출력할 수 있음.
워킹 디렉토리가 항상 고정되어 있는 것은 아님.
→ cd 명령어를 통해 변경할 수 있음.
ex) cd Keith
→ 이때의 Keith는 상대 경로
이 명령어를 수행하면 현재 디렉토리가 /usr/Keith로 바뀜.
⏺️ Home Directory
로그인 할 때 설정되는 디폴트 디렉토리.
현재 디렉토리를 홈 디렉토리로 바꾸는 명령어 : cd ~
⏺️ 유닉스의 파일 개념
1) normal file(regular file)
데이터를 포함하고 있는 파일.
디스크에 저장되어 있는 파일.
유닉스에서는 normal file만 파일이 아니고, 파일의 개념을 확장함.
2) peripheral device
장치도 파일.
모든 I/O 디바이스는 다 파일.
루트 아래의 디렉토리 /dev
→ 디바이스 파일만 모아놓은 디렉토리.
3) inter-process communication channels
커뮤니케이션 채널도 파일.
프로세스간의 통신
소켓(Socket) : 인터넷으로 통신
파이프(Pipe) : 같은 컴퓨터 안에서 통신
FIFO : 파이프의 일종
⏺️ 파일의 종류
1) Regualr file
보통의 이진/텍스트 파일.
2) Directory file
디렉토리도 파일로 간주함.
디렉토리 밑에는 디렉토리나 파일의 이름이 들어감.
그것이 어디에 저장되는지 위치 정보도 들어감.
해당 디렉토리 밑에 들어가는 파일이나 디렉토리의 이름과 그 위치에 관한 정보를 파일로 갖고 있음.
3) FIFO
파이프를 파일 형태로 만든 것.
IPC(Inter-Process Communication)을 하기 위함.
파일로 간주.
4) 소켓(Socket)
TCP/IP에서 원격 프로세스간에 통신하는 채널.
파일로 간주.
5) I/O 디바이스
두 가지 종류가 있음
💡 character special 디바이스 파일
터미널, 키보드, 프린터
속도가 느림.
I/O 단위가 한 바이트 단위로 데이터가 왔다 갔다 함.
키보드에서 한 글자를 치면, 한 글자 친 것만 데이터가 전달됨.
💡 block special 디바이스 파일
디스크
속도가 빠름.
데이터 전송 단위가 블록 단위. (보통 4kbyte)
⏺️ cat 명령어
cat f1 f2 f3 > f4
왼쪽에 있는 파일 f1, f2, f3을 순서대로 붙여서 오른쪽에 있는 파일 f4로 합침.
cat f1 > f5
왼쪽에 있는 파일 f1을 오른쪽에 있는 파일 f5로 복사.
cat file > /dev/rmt0
오른쪽에 파일이 아닌 디바이스를 넣으면, 파일이 디바이스로 write 됨.
⏺️ ls -al 명령어
디렉토리에서 파일들을 열거하고, 그 파일의 타입을 알아보는 방법.
ls 명령어 : 현재 디렉토리 밑에 있는 파일들을 보는 방법

💡 -l 옵션 : 위의 세 가지 파일이 나타나지 않음.
이때, '.'으로 시작하는 파일을 hidden file이라고 함.
💡 -al 옵션 : 위의 세 가지 파일도 나타남.
-l 없이 ls만 하면 파일 이름만 나타남.
-l 옵션을 붙여주면 롱폼으로 파일 이름 외에도 아래 사진과 같은 부분들이 추가로 나타남.

-l 옵션을 주었을 때, 가장 앞에 나오는 문자열의 첫 글자가 파일의 타입을 의미함.

d : directory
l : symbolic link
b : block special file
c : character special file
p : FIFO
- : regular file
s : socket file
유닉스는 멀티 유저, 멀티 태스킹 시스템.
기본적으로 여러 사람이 같이 쓸 수 있음.
→ 윈도우는 여러 사람이 같이 쓸 수 없음.
⏺️ 소유권(Ownership)
어떤 유저가 만든 파일은 다른 유저가 만든 파일과 구분되어야 함.
파일마다 소유권과 소유자가 있음.
⏺️ 권한(Permission)
access permission
접근 권한.
어떤 파일을 접근하는 권한을 컨트롤하는데 사용됨.
권한이 주어지면 접근할 수 있고, 그렇지 않으면 못함.
다른 유저가 만든 파일을 함부로 보관하면 안됨.
→ 내가 만든 파일을 다른 유저가 함부로 보게 만들면 안됨.
파일에는 소유자가 있고, 소유권에 따라 볼 수 있고 없는 권한이 있음.
소유자가 그 파일에 대한 접근 권한을 부여할 수 있음.
⏺️ 프로세스(process)
프로그램을 실행시키면 만들어짐.
프로그램과는 다름.
⏺️ ps 명령어
프로세스들의 리스트를 열거함.
자신이 만든 프로세스만 보여짐.
-ef 옵션을 주면 다른 사람이 만든 프로세스까지 보여짐.
⏺️ 프로세스간의 통신(Inter-Process Communication, IPC)
💡 Pipe
💡 FIFO
💡 Signals
💡 Shared memory
💡 Semaphore
💡 Sockets
⏺️ 시스템 콜(system call)
유닉스 커널의 인터페이스.
소프트웨어 개발자가 커널의 기능을 사용하기 위해 호출하는 API.
모든 시스템 콜은 헤더 파일이 있음.
프로그래머는 시스템 콜을 사용할 때, C 서브루틴과 함수를 쓰는 것처럼 호출하면 됨.
일반적인 서브루틴하고 시스템 콜은 작동하는 방법이 다름.

어떤 유저 프로그램에서 read 시스템 콜을 호출하면, 유저 모드에서 작동하다가 커널 코드를 실행하면서 커널 모드(OS mode)로 바뀜.
⏺️ 라이브러리
라이브러리를 통해 시스템 콜을 호출할 수 있음.
ex) fread 라이브러리.
fread는 시스템 콜이 아님.
시스템 콜은 read 하나 뿐.
fread 라이브러리 코드 안에 read 시스템 콜이 들어가 있음.
fread는 라이브러리, read는 시스템 콜.

유저 프로그램에서 read 시스템 콜을 호출하면, 유저 모드에서 작동하다가 커널 모드로 바뀜.
이것을 소프트웨어 트랩이라고 함.
여기서부터는 OS 프로세스를 실행하고, 유저 프로세스는 멈춰져 있음.
커널의 프로세스가 다 끝나면 시스템 콜을 호출했던 다음 위치로 리턴되어 유저 모드로 실행됨.
⏺️ 시스템 콜은 굉장히 헤비함
프로세스가 유저 모드에서 커널 모드로 갔다가, 다시 유저 모드로 돌아옴.
유저 프로세스와 커널 프로세스는 서로 다른 프로세스임.
이 사이에 context switch가 일어남.
context switch는 굉장히 헤비한 작업임.
시스템 콜은 시스템에 굉장히 부담이 많이 감.
프로세스 자신의 주소 공간을 쓰지 않고 커널 스페이스를 사용함.
시스템 콜을 과다하게 쓰는 것은 시스템에 과부하를 주기 때문에 피하는 것이 좋음.
잘 읽었습니다.