ㅇTL

UNIX System Overview 본문

2-2/시스템 프로그래밍

UNIX System Overview

정노르레기 2021. 10. 10. 03:25

* unix : 유닉스(Unix)는 벨 연구소에서 개발한 운영 체제로, 대부분의 현대적 컴퓨터 운영 체제의 원형이 되었다. 윈도우를 제외한 리눅스, 안드로이드, macOS, iOS[1] 등의 대부분의 운영 체제가 유닉스를 그 뿌리로 하고 있다.

 

0. history

bell lap에서 만듬 ,, 에디션 발전,,

 

1. 구조 architecture

  • 커널 : 운영체제의 핵심. 쉽게 말해, 소프트웨어와 하드웨어간의 커뮤니케이션을 관리하는 프로그램(커널은 원래 하드웨어에 있다가, 부팅하면서 메인메모리 RAM으로 가져와진다. bootstrap ! 위에 초록색쓴거는 개소리가틈
  • 쉘 : 사용자-운영체제 사이의 커뮤니케이션이 가능하도록 명령어를 해석해 줌
    -> CLI(명령어. 커맨드라인) / GUI (그래픽기반) 이 있다( 사용자가 하드웨어조작과정: 사용자(명령 입력) -> 쉘(해석) -> 커널(명령 수행 후 결과 전송) -> 쉘(해석) -> 사용자(결과 확인) )

* 커널의 서비스에 접근하기 위해서는? 

1. system call 직접사용하기(직접적인 커널 access) - 버퍼를 사용자가 알아서 관리해야함 (버퍼링)

2. 라이브러리로 간접적으로 시스템콜 불러서 커널에 접근하기 - 버퍼 자동 관리

(이 버퍼관리를 누가하느냐가 가장 큰, 중요한 차이점!!)

 

2.  etc/passwd 파일

로그인 시 이 파일에서 정보 보고 로그인하게 됨

-> 7필드로 나뉨

login name:password:user ID:groupID:comment:home directory:shell

해당 로그인 네임으로 로그인할 때 pw맞으면, 해당 홈 디렉토리로 가게되고 해당 shell을 열어주게 된다

3. 파일 시스템

- 계층구조를 가짐 (트리구조)

- 루트디렉토리 -> / 으로 표현

- 현재 작업 디렉토리 -> . 으로 표현 (걍.치면 그대로 현재)

- 절대경로 : 루트부터 해당 곳까지 다 적는것 (/juny/dsfs/sdf/s)

- 상대 경로 : 현재 디렉토리에서 이동하는 것 (.. 하면 위로감) (그냥 '/'로 시작안하게 쓰면 아래로 감 cd dd/sdfs/s 이런식으로)

 

-> shell 명령어 조금

- pwd : 현재 작업 디렉토리의 절대 경로 출력(/부터. 루트부터)

- ls : 해당 디렉토리에 뭐가 있는지 리스팅.

- ls 하위디렉토리 : 그 하위 디렉토리에 뭐가 있는지 리스팅.

ex

 

4. input and output

파일의 i/o 순서

1. open 해야함 (-> pd 할당. pd가 리턴됨 ) (처음오픈할 때는 pd 당연 없음)

2. read, write함 -> pd로 파일에 access !!

3. close

 

*표준 스트림(standard streams)은 특정한 프로그래밍 언어 인터페이스뿐 아니라 유닉스 및 유닉스 계열 운영 체제에서 컴퓨터 프로그램과 그 환경(일반적으로 단말기) 사이에 미리 연결된 입출력 통로를 가리킴.

일반적으로 유닉스에서 동작하는 프로그램은 실행 시 세 개의 스트림이 자동으로 열린다. 이를 표준 스트림이라고 부른다.

하나는 입력을 위한 스트림(Standard input, STDIN, 0), 하나는 출력을 위한 스트림(Standard Output, STDOUT, 1), 하나는 오류 메시지를 출력하기 위한 스트림(Standard Error, STDERR, 2)이며, 이 세 개의 표준 스트림은 사용자의 터미널(단말기)에 부착된다.

 

-file descriptor (양수 값)

 

: 유닉스 계열의 시스템에서 프로세스(process)가 파일(file)을 다룰 때 사용하는 개념으로, 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값. 유닉스 시스템에서 프로세스가 파일들에 접근할 때 파일 디스크립터라는 개념을 이용함. (이걸로 파일을 구분함)

프로세스가 실행 중에 파일을 Open하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않는 가장 작은 값을 할당해준다.

그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터(FD)값을 이용해서 파일을 지칭할 수 있다.

 

 

프로그램이 프로세스로 메모리에서 실행될 때, 기본적으로 할당되는 파일디스크립터는 표준입력(Standard Input), 표준 출력(Standard Output), 표준에러(Standard Error)이며 이들에게 각각 0, 1, 2라는 정수가 할당된다.

다른 파일들은 3부터 할당받음

 

(유닉스에서는 일반적인 파일, 디렉토리, 소켓, 파이프, 블록 디바이스, 케릭터 디바이스 등 이 모든 객체를 파일로 관리함.

std세개 = 터미널 (단말기), 그리고 얘네도 하나의 파일. 그리고 얘넨 따로 오픈할 필요가 x. 무튼 그래서 파일이라서 pd를 배정한다)

 

- unbuffered I/O (시스템 콜 사용) vs Standard I/O (라이브러리 사용)

= ( open, read, write ... ) vs ( fopen, fgetc, printf ... )

 

-프로그램 (인풋 아웃풋 프로그램)

키보드에서 입력받은 것을 단말기 모니터에 뿌려주는 프로그램

1. 시스템콜 이용해서 (unbuffered. 사용자가 버퍼 관리)

2. 라이브러리 이용해서 (시스템이 버퍼관리함. 이 코드엔 버퍼 관련 없음)

 

 

5. programs and processes

  • 프로그램 : 디스크에 저장되어있는 실행파일 ( .exe 같은거)
  • 프로세스 : 실행되고 있는 프로그램 -> 실행하면 process id (PID) 할당하여 프로세스를 구분함 (양수)

( 워드 = 프로그램, 실행중인 워드 창들 = 프로세스)

 

-프로세스 관련 시스템콜 : fork, exec, waitpid ..

-> fork : 똑같은 프로세스 생성함(child process를 만드는 것)

  • fork() => 프로세스 두개가 되므로 child와 parent 일 때의 두개를 리턴하게 됨! 
  • ->( parent 리턴값 : pid>0(child의 pid리턴) :  , child 리턴값 : pid==0 )
  • exec() : 무언가를 실행?
  • waitpid: 기다림?

->EX PROGRAM

: 걍 어떤 프로세스를 fork해서 복사하고, 그 자식 프로세스가 어떤 명령 시행할 때까지 기다렸다가 자식 프로세스가 끝나면 부모에게 시그널을 줘서 프로그램 끝나도록 하는 것

 

코드

 

6. Threads

= 컨트롤의 흐름. 하나의 프로세스 안에 있는 모든 쓰레드는 공유

어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.

-> 자원의 효율적 사용!! (요즘엔 스레드 최대한 활용하여 자원 효율적으로 사용하자 ! 함)

 

( 각각 다 process로 만들면 오버헤드가 클 수 있음 -> 하나의 프로세스 안에서 서로 다른 스레드로 만든다 !! )

 

7. error handling

: 에러처리를 해준다

대략적으로 에러 이유를 알게 해준다

8. signals

: 어떤 이벤트가 발생했는지 알려준다

- 시그널을 수신했을 때, 프로세서의 처리 방법

  • 무시 가능
  • default 처리
  • handler부착 (내가 원하는 방식으로 처리하고 싶을 때)

- 시그널 만드는 법

  • 키보드에서 생성 가능 (ex. ctrl-c / ctrl-backslash)
  • 함수로 생성 가능 (ex. kill())

ex

 

9. unix time values

  • calendar time : 1970 1.1 0시부터 초단위 !
  • process time : 틱단위 ! (하드웨어마다 다름) -the actual time a person spends working on a specific item or task
  • 명령어 : time ls - time=shell명령어, ls=수행되는데 걸리는 시간

10. unix man page

man 페이지(←매뉴얼 페이지(Manual pages)의 줄임말)는 거의 모든 유닉스  유닉스 계열 운영 체제에 기본으로 설치되는 광범위의 문서들이다. man라는 유닉스 명령어를 이용하면 이 문서들을 볼 수 있다. 각 페이지는 개별 문서로 이루어져 있다.

'2-2 > 시스템 프로그래밍' 카테고리의 다른 글

시스템 프로그래밍이란 ?????  (0) 2021.10.08