본문 바로가기

CS/유닉스프로그래밍

1. 유닉스 기본 개념

유닉스 구조

1. 커널 

  하드웨어를 컨트롤하는 소프트웨어, OS의 핵

2. system calls

  커널 기능을 사용하기 위한 외부 인터페이스 API

3. application

  외부 애플리케이션이 쉘이나 라이브러리를 거침

  라이브러리는 시스템콜을 통해 커널 기능을 사용

 

Logging in

유닉스는 multi user 

로그인을 해야함 -> user id와 password를 치면 prompt(%)가 뜸

prompt는 shell이 작동한다는 것임

shell은 command interpreter로 명령을 받고 실행시킴

 

shell

 - 기본적으로 제공되는 shell은 AT&T가 만듦

 - command interpreter

 - Bourn shell (/bin/sh) : $

 - Korn shell (/bin/ksh) : $

 - C shell (/bin/csh) : %

 

리눅스는 Korn shell과 비슷한 Ba shell을 사용함 (bin/bash)

 

File and Directories

유닉스는 hierarchical arrangement

루트(/)에서 시작함

디렉토리, 디바이스 모두 파일로 간주

file name

파일 이름은 /로 시작

문자열 맨 끝애는 null 문자가 들어감 - 문자열의 끝을 의미

null 문자는 hexa 값으로 0을 의미

 

. : 현재 디렉토리

.. : parent 디렉토리

pathname

루트 밑에 usr 디렉토리 폴더가 있고 그 아래 keith, ben 디렉토리가 있음

keith 밑에 file1, file2가 있음

- absolute pathname은 /usr/keith/file1

  사이에 있는 /는 루트의 /의 의미와 다름, 구분자 역할

- relative pathname은 keith/file1

  이때 current working directory는 usr

working directory

current working directory를 확인 하려면 pwd를 입력하면 됨

relative pathname은 현재 디렉토리가 usr라서 usr로부터 시작되는 상대적인 위치를 나타내는 것

ben이라는 디렉토리 밑에 file3가 있다고 하면 file3의 relative pathname은 ben/file3

 

working directory는 항상 고정되어 있지 않음

예를 들면 $ cd keith를 하면 current working directory는 keith가 됨

이 때 ben으로 이동하려면 cd ../ben 하면 됨

home directory

$cd ~ 하면 홈 디렉토리로 이동함

 

 

파일 개념

데이터를 포함하고 있는 파일을 regular file이라고 함

regular file만 파일이 아님

not only normal file but also peripheral device

디바이스, 커뮤니케이션 채널도 파일

 

dev라는 디렉토리는 디바이스 파일만 모아 둔 폴더

stdin은 보통 키보드, stdout은 보통 스크린, rmt는 마그네틱 타입을 모아둠

 

cat이라는 명령어는 caterate인데 파일을 합치는 명령어임

cat f1 f2 f3 > f4 

 -> f1, f2, f3을 합쳐서 f4를 만들어라

cat f1 > f5

 -> 그냥 f1을 f5에 copy한 것과 같음

cat file > /dev/rmt0

 ->  write하는 것과 같음, 디바이스 데이터를 이렇게 보내면 편리해짐

      (파일에 read write하는 것과 디바이스에 하는 것과 같아짐. 파일로 간주하기 때문)

 

inter process comunication

파이프는 같은 컴퓨터 내에서 하는 거

소켓은 네트워크로 하는 거

 

유닉스 파일 종류

regular file : txt, binary 파일, 명령어

directory file : 디렉토리 밑에 들어가는 파일 이름과 디렉토리 등의 이름과 위치를 파일로 갖고 있음

FIFO(pipe) : pipe를 파일 형태로 만든 것, ipc를 위한 파일

socket : TCP/IP 원격 통신 채널도 파일로 간주

character special과 block special

           키보드나 터미널은 IO단위가 한 바이트, 디스크는 속도가 빨라서 데이터 전송 단위가 블록임(4KB)

           프린터는 character special, 마그네틱 테이프는 block special

ownership

           유닉스는 multi user, multi tasking

           기본적으로 여러 사람이 같이 씀. user를 많이 만들어서 공용 서버로 사용.

           파일을 만들면 만든 유저와 다른 유저를 구분해야 함. 

           어떤 사용자가 이 파일을 소유하는 지

permission

           접근 권한. ownership에 따라 permission을 줌

           access 하는 권한을 컨트롤할 때 사용. permission이 denied 되면 못 봄

           유저가 액세스 권리르 소유할 수 있음. 그 권한이 permission

 

디렉토리에서 파일을 열거하고 그 파일의 타입을 알아보는 방법

d : directory

l : symbolic link

b : block special file

c : character special file

p : FIFO

- : regular file (textfile, binary file)

 

.으로 시작하는 파일은 hidden file

ls 만 입력하면 파일 이름만 보여줌

ls -a 하면 숨김 파일 까지

ls -al 하면 상세 내용까지 나옴

 

Process

유닉스 오퍼레이팅 시스템에서 프로그램을 실행시키면 프로세스가 만들어짐

ls는 파일들의 list를 열거

ps는 프로세스들의 list를 열거, 자기가 만든 프로세스만 display됨 (다른 유저의 프로세스는 X)

다른 유저의 프로세스까지 보려면 ps -ef하면 됨

 

프로세스간 통신 IPC는

pipe, fifo, signal, shared memory, semaphore, socket이 있음

 

시스템콜

시스템콜은 커널의 기능을 사용하기 위한 API

시스템콜을 사용할 때 C 함수를 쓰는 것 처럼 부르면 됨

일반적으로 서브루틴이랑 시스템콜은 작동하는 방식이 다름

어떤 프로그램이 프로세스를 실행하면 read라는 시스템콜을 사용

read를 부르면 read라는 시스템콜은 user모드에서 호출

kernel 코드를 실행해서 kernel mode로 전환

라이브러리를 통해 read를 부름 fread가 라이브러리임

라이브러리 코드를 보면 read라는 시스템 콜이 들어가 있음

read 커널을 부르게 됨

 

fread는 라이브러리고 read가 시스템콜

유저에서 read 같은 시스템콜을 부르면 유저모드에서 커널모드로 바뀜 = trap(SW interrupt)

 

시스템콜은 매우 무거움, 시스템에 부담을 많이 줌

프로세스가 유저모드에서 커널모드로 갔다가 다시 유저모드로 돌아가는 context switch 발생

자신의 address space를 쓰지 않고 kernel space를 사용

모든 시스템콜은 해더파일에 있음