텍스트 파일과 vs 바이너라 파일 구분하기 !
processes(프로세스) : 실행 중인 프로그램
프로세스 관리 : 그 프로그램들을 살리고, 돌리고, 멈추고, 정리하는 OS의 일
Concurrent processes(병합프로세스): 동시에 같이 실행되는 프로세스
IPC: 프로세스 간 통신
운영체제의 역할 및 시스템 콜 이해
실제 애플리케이션 개발을 위한 리눅스 명령어와 도구 실습
시스템 콜 기반 프로그래밍 익숙해지기
shell: 명령줄 인터프리터
vi, vim, emacs,...: 편집자
GNU tools
compiler(컴파일러) - gcc, g++,...
debugger(디버거) - gdb
Tip) 앞에 g가 붙으면 GNU 소프트웨어구나 생각하기!
컴퓨터 사용자와 컴퓨터 하드웨어 간의 중개 역할을 하는 프로그램
운영체제 목표
기본 OS 개념
1969년 Bell Labs에서 시작 (Ken Thompson, Dennis Ritchie)
BSD와 System V로 분기
TCP/IP, NFS, POSIX 표준 등 진화
unix 철학

1991년 리누스 토르발스가 커널 개발 시작
GPL 기반 오픈소스
서버, 임베디드 시스템, 실시간 시스템에 널리 사용
리눅스 장점 (Advantages)
오픈 소스(Open Source) -> 누구나 자유롭게 사용, 수정, 배포 가능
개발자용, 안정화 버전 등 다양한 형태 존재
자유로운 커뮤니티와 정보 공유
개발자 커뮤니티, LUG(리눅스 사용자 그룹) 등을 통한 정보 교류 활발
로열티 없음 (Royalty Free)
소프트웨어 구매 비용 없이 자유롭게 사용 가능
리눅스 단점 (Weakness)
버전 업그레이드가 너무 빠름, 다양한 배포판과 버전이 존재해서 관리 복잡
공식적인 애플리케이션 부족
MS Office나 일부 게임, 고급 데스크탑 환경은 상대적으로 부족함
상용 장치에 대한 드라이버가 부족하거나 완성도가 낮음
오픈소스 개발 특성상 수익이 낮아 품질 관리가 어려움
특허 문제 및 라이선스 충돌 가능성
리눅스는 개방성과 확장성이 최대 장점이지만,
일관성 부족과 드라이버 호환성이 실사용에 제약을 줄 수 있음!



(the users) - 사용자들
shells and commands - 셸과 명령어
compilers and interpreters - 컴파일러와 인터프리터
system libraries - 시스템 라이브러리
➡ 사용자가 직접 접근하는 영역이고, 응용 프로그램들이 있는 곳
system-call interface to the kernel - 커널과 사용자 공간 사이를 이어주는 통로 역할
➡ 사용자 프로그램이 OS 기능을 요청할 때 이걸 통해 전달.
signals, terminal handling - 시그널 처리, 터미널 관리
character I/O system, terminal drivers - 문자 입출력 시스템, 터미널 드라이버
file system, swapping, block I/O system - 파일 시스템, 스와핑(메모리 교체), 블록 입출력 시스템
disk and tape drivers - 디스크 및 테이프 장치 드라이버
CPU scheduling, page replacement, demand paging - CPU 스케줄링, 페이지 교체, 요청 페이징
virtual memory - 가상 메모리
➡ 커널은 하드웨어를 직접 제어하면서, 사용자 요청을 수행해주는 시스템의 핵심.
terminal controllers, terminals - 터미널 제어기, 터미널 장치
device controllers, disks and tapes - 디바이스 제어기, 디스크 및 테이프
memory controllers, physical memory - 메모리 제어기, 물리적 메모리
➡ OS가 하드웨어와 직접 소통하는 마지막 계층!
➡ 커널은 하드웨어 자원을 직접 제어하고 운영체제의 핵심 기능들을 담당.
프로세스 관리 (Process management): 실행 중인 프로그램(=프로세스)을 효율적으로 관리
파일 관리 (File management)
메모리 관리 (Memory management)
장치 관리 (Device management)
➡ 프로그램이 커널 기능을 요청할 때 사용하는 통신 수단.
프로그래머가 리눅스 커널 기능을 호출하기 위한 함수 인터페이스
라이브러리 함수 또는 시스템 콜을 이용해 커널 서비스를 요청함
➡ 예: ls, cat, vi 같은 명령어도 결국 시스템 콜을 통해 커널과 소통하는 거임.
- 사용자 → 셸 → 시스템 콜 → 커널 → 하드웨어로 요청이 전달됨
- 계층적으로 분리된 구조라서 유지보수와 보안에 유리함
ㄴ> 운영체제 기능을 직접 호출할 때 사용하는 커널 인터페이스
✔ 커널 내부 코드를 직접 호출하는 진입 지점
✔ 커널 영역에서 기능이 직접 구현되어 있음
✔ 리눅스 매뉴얼 2번 섹션에 문서화됨
예: write(2) → $ man 2 write로 확인 가능
ㄴ> 프로그래머가 쉽게 사용하도록 제공되는 편리한 함수 모음
✔ 사용자 영역의 코드에서 제공되는 함수 호출
✔ 대부분 시스템 콜을 내부에서 간접 호출하거나 자체 구현함
✔ 리눅스 매뉴얼 3번 섹션에 문서화됨
예: printf(3) → $ man 3 printf로 확인 가능
✔ 보통 API (Application Programming Interface)라고도 불림



application code: 응용 프로그램 코드(사용자가 작성한 코드)
C library functions: C 라이브러리 함수들 (printf(), scanf(), fopen()과 같은 표준 C 라이브러리 함수들)
system calls: 파일 읽기/쓰기, 프로세스 생성, 메모리 요청 등 하드웨어 관련 작업을 위해 필요.
OS kernel: 시스템의 핵심. 하드웨어 자원을 관리하고, 시스템 콜을 통해 사용자 요청을 처리함.
hardware (hard disk…): 실제 물리적인 자원들. 커널을 통해서만 접근 가능.
user process (사용자 프로세스): 점선 박스는 하나의 사용자 프로세스를 의미. (즉, application code와 C library functions는 사용자 영역에서 실행됨)





man [섹션 번호][키워드]
ex) man 3 printf → 섹션 3(라이브러리 함수)에 있는 printf에 대한 설명 출력
섹션 번호를 생략하면 가장 먼저 해당 키워드를 찾은 섹션 내용을 보여줌
<매뉴얼 섹션 번호별 의미>
번호: 설명
1: 실행 가능한 프로그램 또는 셸 명령어 (e.g. ls, cat)
2: 시스템 콜 (e.g. open(), fork())
3: 라이브러리 호출 (e.g. printf(), malloc())
4: 특수 파일 (디바이스 파일 등)
5: 파일 형식 및 설정 파일 문법 (e.g. /etc/passwd)
6: 게임
7: 기타 (매크로, 규약, 표준 등)
8: 시스템 관리자용 명령어 (주로 root가 사용)
- man 명령어 ➡ 리눅스 문서 열람용. 섹션 번호를 이용해 정확한 정보 확인
- 로그인 ➡ 계정과 비밀번호로 인증 후 $ 프롬프트 표시
- 명령어 입력 ➡ command options arguments 형식, 대소문자 구분, 종료하려면 exit 명령어 사용
- 원격 접속 ➡ SSH 프로토콜을 이용한 터미널 프로그램 사용
<기능>
/bin/sh Bourne Shell ➡ POSIX 호환
/bin/csh ➡ C Shell
/bin/tcsh ➡ 개선된 C Shell
/bin/ksh ➡ Korn Shell
/bin/bash ➡ Bash (가장 보편적인 무료 셸)
<주요 기능>
로그인 후 셸을 인터랙티브하게 사용할 수 있어요. 주요 기능:
명령어 히스토리 (↑ ↓ 키로 이전 명령 복원)
커맨드 라인 편집
파일 이름 자동 완성 (ex: tab)
명령어 확장 (ex: echo *)
키 바인딩
오타 자동 수정
작업 제어 (백그라운드 실행 등)
while (사용자 명령어 입력 받음) {
명령어 해석
명령어 실행
}
명령어 [옵션][인자]
ex) ls -l /home/suvin
ls → 명령어
**특수 문자는 shell로 해석됨 (ex: cd ~ → 셸이 해석해서 사용자의 홈 디렉토리 경로로 바꿈)
<예시>
$: 프롬프트 (prompt) – 명령어를 입력하라는 표시
ls: 명령어(command) – 디렉토리의 내용을 나열
-l /bin: 인자(arguments)
ㄴ> -l: long listing 형식 옵션, /bin: 목록을 볼 디렉토리
명령어는 입력되면 shell이 이를 파싱(parsing) 해서 명령어와 인자로 나눔. 이걸 splitting이라고 부름.




<디렉터리 계층 구조>
루트 디렉토리 /를 기준으로 하위 디렉토리들이 트리 구조로 확장됨
예: /bin, /home, /usr, /etc 등

<홈 디렉토리 (Home Directory)>
사용자 계정별로 부여된 개인 작업 공간
일반적으로 /home/사용자이름
ex) suvin 사용자의 홈 디렉토리는 /home/suvin
<절대 경로(Absolute Path)>
루트 /부터 전체 경로를 명시
예: /home/avr/java/Go.java
<상대 경로(Relative Path)>
현재 위치 기준으로 경로 표현
. 현재 디렉토리
.. 상위 디렉토리
~ 내 홈 디렉토리
cd, cd ~ 홈으로 돌아감
파일 권한 구성
각 파일/디렉토리는 소유자(owner), 그룹(group), 기타(others) 에 대해 권한을 가짐
r: 읽기(Read)
w: 쓰기(Write)
x: 실행(Execute)
형식 예시: -rwxr-xr-x
- : 일반 파일
rwx: 소유자는 읽기/쓰기/실행 모두 가능
r-x: 그룹은 소유자는 읽기/실행 가능
r-x: 일반 사용자도 읽기/실행 가능
<파일 권한 변경 방법 – chmod>
chmod [권한][파일이름]
ex) chmod 774 myFile.txt



