간단한 쉘 스크립트를 작성해보자.

 

test.sh파일




test.sh파일의 내용을 보자.

echo명령어는 화면에 출력할 때 사용하는 명령어이다.

'$'가 붙은 $USERNAMEprintenv 명령어를 사용했을 때 명시되는 USERNAME에 대한 환경변수를 의미한다. $HOSTNAME도 마찬가지다.



이번에는 실행하는 방법에 대해서 알아보자.

쉘 스크립트를 실행하는 방법은 2가지가 있다.

첫번째는 sh test.sh처럼 'sh'명령어를 이용하는 것이다.

두번째는 ./test.sh처럼 앞에 test.sh가 있는 경로명(여기서는 test.sh가 있는 디렉토리에 내가 있기 때문에 현재티렉토리인 ./을 사용)을 써준후,  뒤에 파일명을 입력하면 된다.

LIST

'OS > Shell Script' 카테고리의 다른 글

Shell Script - while문  (0) 2016.04.28
Shell Script - case~esac문  (0) 2016.04.27
Shell Script - for문  (0) 2016.04.27
Shell Script - if문, if~else문  (0) 2016.04.26
Shell Script - 변수와 산술계산  (0) 2016.04.25

<Symbolic, Hard Link>




<하드링크>



하드링크는 생성시 원본 파일과 inode값이 같다.(생성시간도 같음) 이유는 같은 inode로부터 값을 가져오기 때문이다.

원본 파일이 변경된다면 어떻게 될까? 하드링크된 파일도 같이 변경된다.

하지만 원본파일이 삭제된다고 해서 하드링크도 문제가 되진 않는다. 위 그림에서 /home/lee/originalFile.txtinode1 화살표가 없어지는 것일뿐이다.

 

1. ls -liinode값을 확인할 수 있는 명령어이다.


2. 하드링크를 만들어보자.

nsswitch.confinode값은 10이다.

 

하드링크된 nc파일의 inode10이다.

 

3. 심볼릭 링크를 만들고 비교해보자.

nsswitch.confinode값을 10이다.



<심볼릭 링크>



심볼릭 링크는 생성되는 파일의 inode와 원본파일의 inode가 다르다. 다른 inode(위에선 inode3)에 원본 파일을 만날 수 있는 link값이 저장되어 있다.(화살표)

 

심볼릭링크된 sym파일의 inode11이다.





LIST

<사용자 계정>


1. useradd 명령어

useradd [-u uid] [-g, -G group] [-d dir] [-s shell] [-k skel_dir] [-f inactive] [-e expire]

예를 들어보자.

useradd -u 1000 -g sys -G adm -d /export/home/kyg -s /bin/ksh -m kyg

이것을 해석해보면... kyg라는 이름의 계정은 UID1000이고, 기본그룹은 sys, 추가그룹은 adm, 홈 디렉토리는 /export/home/kyg, shell은 콘쉘이다. 마지막 m-m 옵션을 써줘야 디렉토리가 만들어진다.



 

2. usermod 명령어

옵션은 useradd와 똑같고, 단지 사용자 정보를 변경해주는 명령어이다.

usermod -d /export/home/test kyg

이런 명령을 사용하게 되면 kyg계정의 홈디렉토리가 /export/home/kyg에서 /export/home/test로 바뀐다.



 

3. passwd 명령어

이 명령어는 비밀번호를 변경하는 명령어다.

passwd [사용자 ID]를 입력하면 비밀번호를 변경하게 된다.



 

 

 

LIST

<시스템 환경 설정>


시스템의 기본환경 설정들을 보고 싶으면 env명령으로 알아보면 된다.


.profile 파일을 설정해보자.


처음은 사용자가 사용할 명령을 찾을때의 PATH(경로)를 나타낸다.

편집기는 vi를 사용하고, 언어는 korean을 사용한다. 쉘은 콘쉘을 사용하는 내용이다.

 


.kshrc파일을 설정해보자.

 


이렇게 설정 후 재부팅을 해준다. 지금 사용하고 있는 IDroot계정이기때문에 /etc/passwd파일을 수정해준다. 수정해주는 이유는 만든 환경 설정 파일을들 root계정에 적용시키기 위해서이다.

LIST

<네트워크 설정>

솔라리스에서 네트워크를 설정하기 위해서는 5가지 파일을 설정해 주어야 한다.

 

1. /etc/hosts

호스트 명과 해당 PC에 대한 IP를 설정



2. /etc/defaultrouter

필자는 VMware로 실습을 하고 있다.

VMwaregateway주소는 192.168.1.2이다. gateway주소를 입력해준다.



3. /etc/netmasks

network 대역을 설정해준다.

 



4. /etc/resolv.conf

nameserver를 설정해준다.



 

5. /etc/nsswitch.conf

hosts: files  dns라고 설정해준다.





5. 네트워크 IP 설정하기

 ifconfig -awindowipconfig /all과 똑같은 명령어다.

네트워크 정보를 알 수 있게 해주는 명령어이다. 

 

다음을 보면 e1000g0e1000g1두 랜카드가 살아있는 것을 볼 수 있다.

 e1000g0e1000g1의 랜카드를 죽이는 방법을 알아보자.

명령어는 ifconfig e1000g0 unplumbifconfig e1000g1 unplumb이다.


 

모두 죽은 것을 확인 할 수 있다.

 

다시 e1000g0을 살려보자.

명령어는 ifconfig e1000g0 plumb이다.



e1000g0IP를 넣어보자.

명령어는 ifconfig e1000g0 IP address netmask Subnet mask up



컴퓨터를 재부팅하게 되면 IP 설정 관련 데이터들은 모두 초기화 된다. 재부팅해도 계속 유지하게 하기위해선 /etc/hostname.e1000g0파일을 만들어서 설정해주면 된다.





모든 IP 설정을 끝냈으면 putty창으로 telnet을 접속해보자.

그 전에 설정해야 할 파일은 /etc/default/login파일이다.


 

CONSOLE=/dev/console 부분을 주석처리 해준다.

 

솔라리스 랜 카드 이름

x86SPARC장비의 랜카드 이름은 다르다.

먼저 x86의 랜카드 이름은 vmware에서 사용한 것처럼 e1000g0, e1000g1, e1000g2 이런식이다.

SPARC장비의 랜카드 이름은 ce, hme, qfe가 있고, eri가 있다. 이렇게 31개로 나눈 이유는 ce, hme, qfe는 별도로 장착하는 랜카드의 이름을 말하고, eri는 내장형 랜카드이기 때문이다.


 

LIST

<세그먼테이션(Segmentation)>

프로그램을 들여다보면 주(Main)프로그램, 프로시저, 함수, 전역 또는 지역변수와 호출 시 사용되는 스택 등으로 논리적으로 하나하나의 단위를 세그먼트라 한다.


세그먼트 단위대로 사상하고 적재하는 기법이 세그먼테이션이다. 세그먼트 개수만큼의 엔트리를 가지는 세그먼트 테이블이 있다. 가상주소는 세그먼트 번호(s)와 세그먼트 내에서의 위치값(d)로 표현한다. 존재 비트의 값에 따라 유효한 디스크 주소와 메모리 주소를 갖는 필드들이 있다. 페이징과 다른 점은 메모리 주소 필드에 적혀 있는 값이 실주소이다. 세그먼트의 길이(Length)가 적혀 있는 필드가 있는데 이것은 세그먼트의 크기가 서로 다름으로 인해 필요한 조치를 위해 사용한다.

읽기, 쓰기, 실행, 추가와 같은 작업을 각 비트를 1또는 0으로 지정하고 해당 세그먼트에 대해 제어할 수 있는데 이런 비트들을 접근 제어 키라 부른다.

 



 

<세그먼트의 보호(Protection)와 공유(Sharing)>


1. 보호

실주소를 위해 더해지는 위치 값(d)이 세그먼트의 길이 값을 초과하면, 트랩을 통해 프로세스의 실행을 중지시켜 사용자 간의 메모리 보호가 가능하다.

접근 제어 키를 사용하여 세그먼트 별로 허용되는 작업을 제어하여, 사용자의 잘못된 접근으로부터 보호될 수 있다.

2. 공유

엔트리에서 같은 주소 값을 가지도록 한다.

공유해야 할 프로시저가 커서 몇 개의 페이지로 나누어진다면, 이 페이지들의 엔트리는 공유하는 프로세스들의 페이지 테이블에서 모두 같은 위치에 있어야 하고 이것은 테이블의 구성을 힘들게 만들 것이다. 또한, 페이지 크기와 정확하게 맞지 않을 경우, 공유할 필요 없는 (또는, 공유해서는 안 되는) 부분이 공유 페이지에 포함될 수도 있다.


[세그먼트의 장점]

논리적 단위란 것은 단위별로 수정하고 다시 컴파일해서 쓸수 있음

프로그램의 일부의 변경 때문에 전부를 다시 링크하고 로딩하지 않아도 됨




Copyright2014 By 휴먼사이언스 

LIST

<Working set이론>


프로세스가 특정 시점에서 집중적으로 참조하는 페이지들의 집합을 말한다. 이것을 메모리에 적재되도록 함으로써 페이지 부재를 최소화 한다.

Working set은 시간에 따라 변하게 되는데 이를 공식적으로 정의하면 다음과 같다.

시점 t에서 프로세스의 Working set, W(t, Δt)는 해당 프로세스가 [t – Δt ,t] 시간 동안 참조한 페이지들의 집합

Δt는 일정 크기의 시간으로 윈도 크기(Window Size)라 부르며, 시스템에 의해 적절한 값으로 정해진다.




Working set이란 현 시점에서의 지역성을 표현하고, 이 페이지 집합은 앞으로도 당분간 집중적으로 참조될 것이라 보는 것이다.

Working set을 메모리에 적재되도록 하여 스레싱 때문에 겪게 될 성능 감소를 미연에 방지할 수 있다.

윈도 크기를 너무 크게 잡으면 지역성에 포함되는 페이지들 외에 다른 페이지들도 Working set에 포함될수 있게 되어 메모리의 낭비와 함께 적정한 다중 프로그래밍 정도를 유지하기 힘들다.

너무 작게 잡으면 지역성에 포함되는 페이지들조차 Working set에서 빠져 스레싱을 겪게 될 것이므로 시스템의 다양한 상황을 반영하여 세심하게 결정해야 한다.

다음 그림을 보도록 하자.

 

1. 프로그램의 실행이 시작된 후 t0부터 처음 참조되는 페이지들은 부재를 겪으며 점차 Working set을 키워가다가 t1에서 최대 크기인 5가 됨

2. 이후부터 지역성을 보이면서 t2에서와 같이 (세 개의 페이지로 Loop 1을 구성하는 동안에는) 일정한 크기(=3)로 유지 됨

3. 실행이 진행되면 다음 지역성을 보이는 Loop 2 부분으로 넘어가면서 t3에서 5개로 증가했던 Working set은 점점 줄어들어 t4에서와 같이 페이지 두 개로 구성되는 강한 지역성을 드러냄

[Working set 이론 정리]

지역성을 표현하는 Working set을 메모리에 유지함으로써 스레싱을 방지하겠다는 것이다. 크기에 변동이 있으므로 Working set이 작아지면 프레임을 회수하고 커지게 되면 그만큼 프레임을 더 할당해 주는 가변 할당이 필요하다는 것이다.




Copyright2014 By 휴먼사이언스

 

LIST

가상 메모리란 프로그램의 일부분이 메모리에 올라오도록 함으로써 보다 많은 개수의 프로세스를 메모리에 수용함과 동시에 아무리 큰 프로그램도 실행 가능하게 해준다.

이 방법이 유용하게 작용하려면 사상 과정을 최대한 빨리해야하고, 참조하고자 하는 페이지가 메모리에 있어 줄수록 높아진다.

이번에는 가상 메모리의 관리기법에 대해서 알아보자.

우선 크게 두가지 방법이 있다.

첫째, 하드웨어를 사용하는 기법. 이것은 TLB라는 추가의 하드웨어를 사용한 방법이다.(내 블로그에 보면 TLB에 관한 내용이 있다. 읽어보도록...)

둘째, 정책들을 정해놓고, 소프트웨어적으로 관리를 하는 기법들이다.



<적재 정책>

실행에 필요한 페이지를 언제 메모리에 적재할 것인가를 결정하는 정책이다.

1. 요구 적재

페이지가 참조될 때 적재하는 기법이다. 당연하게 보이는 이 기법은 참조하는 페이지들로만 메모리를 사용하게 되므로 메모리에 관한 한 오버헤드가 없으나, 참조시 페이지 부재일 경우 입출력 부담이 있게 된다.

2. 예측 적재

예측을 통해 확률적으로 참조될 가능성이 높다고 판단되는 페이지를 미리 적재 시키는 기법이다. 예측이 잘 될 경우 페이지 부재 빈도를 낮출 수 있으나, 반대의 경우에는 예측을 위한 오버헤드와 함께 참조되지 않을 페이지를 적재한 메모리 낭비 발생한다.



<배치 정책>

디스크로부터 가져온 페이지를 메모리의 어디에 적재할 것인가를 결정하는 정책이다. 페이징을 사용하는 시스템에서는 빈 프레임만 발견되면 어떤 프레임에 적재하든 문제가 없다. 세그먼테이션을 사용할 경우는 세그먼트의 크기가 얼마든지 다를 수 있으므로, 다양한 크기의 세그먼트를 수용할 수 있는 배치 정책(최초 적합 등)이 요구된다. (최초, 최적, 최악기법이 있음)



<할당 정책>

프로세스들에게 메모리를 얼마큼씩 줄 것인지를 결정하는 정책이다. 페이징의 경우 각 프로세스에게 메모리 프레임을 몇 개 사용할 수 있도록 해 줄 것인가를 결정하는 정책이다. 개수의 변동이 없도록 운영한다면 고정 할당이라 부른다. 반면에 실행 도중 프로세스에 부여된 프레임의 수에 변동이 있도록 한다면 가변 할당이라 부른다.



<교체 정책>

메모리에 빈 프레임이 없을 때 적재될 페이지를 위해 적재된 페이지 중 누군가는 자신이 차지한 프레임을 비워주어야 하는 교체 대상이 되어야 할 텐데, 이때 어떤 페이지를 선택할 것인가를 결정하는 정책이다.

1. 최적기법

현 시점에서 앞으로 가장 오랫동안 참조되지 않을 페이지 즉, 미래에 참조될 때까지의 시간이 가장 긴 페이지를 선택하여 교체하는 기법이다.

페이지 부재를 최소로 해주지만, 프로세스들이 앞으로 어떤 페이지들을 참조할지를 미리 알 수는 없으므로 현실적으로 구현 불가능하다.(미래 예측 불가능)

 



 

2. FIFO(First In First Out) 기법

적재된 지 가장 오래된 페이지를 교체하는 기법이다. 시간 기록 기법(각 페이지가 적재될 때의 시간을 기록한 후, 교체 시 이 시간이 가장 오래전인 페이지를 선택하는 방식)을 사용한다.

큐를 사용하여 큐에서의 상대적인 위치가 적재된 순서를 나타내는 것으로 교체의 대상은 항상 큐의 맨 앞이 되도록 유지, 관리하는 기법이다.

FIFO 모순(Belady’s Anomaly) - FIFO에서 부재율을 낮추기 위해 프레임을 더 주었을 경우 오히려 부재율이 올라가는 현상을 발생할 수 있음


 


3. LRU(Least Recently Used) 기법

참조된 지가 가장 오래된 페이지가 교체 대상으로 하는 기법이다.

시간 기록 기법을 사용하여 페이지들이 적재될 때 의 시간을 기록한 후 이 페이지가 메모리에 있는 동안 참조될 때마다 가장 최근의 참조 시간으로 갱신(FIFO랑 다른 점)해 놓으면, 가장 오래전 시간이 기록되어 있는 페이지가 교체의 대상이 된다.

스택(Stack)을 사용하는 방법으로, 스택의 가장 밑(Bottom)에 있는 페이지가 교체 대상이 되도록 스택에서의 위치가 상대적인 참조 순서를 나타내도록 관리하는 방법이다.

 

 

4. Second-chance 기법

적재된 후 한번이라도 더 참조된 페이지를 바로 교체시키지 않고 한 번 더(Second) 메모리에 머무를 수 있는 기회(Chance)를 주는 기법이다. 적재된 페이지에 참조 비트를 두어 교체 대상인 페이지의 참조 비트가 0이면 바로 교체되고, 1로 되어 있을 경우 즉, 적재 도중 한번 이상 참조된 경우 이 비트를 0으로 만들면서 큐의 맨 뒤로 보냄으로써 메모리에 머무를 기회를 한 번 더 주는 것이다.

 

 

5. 개선된 Second-chance (또는 NUR) 기법

Clock 기법에 갱신 비트를 추가하면 보다 나은 교체 정책을 만들 수 있다는 생각으로 출발한 기법이다.

(갱신 비트가 1이란 말은 이 페이지가 적재 중 변경되었다는 것을 의미)

교체가 될 경우 변경된 내용으로 디스크에 기록을 해 주어야 하는 부담이 있으므로 가급적 교체를 미루어 디스크에 대한 쓰기 작업을 줄이고자하는 의도이다.

참조 비트와 갱신 비트 값의 조합은 네 종류로서 참조도 변경도 되지 않은 경우부터 참조되고 변경까지 된 경우 -> 11, 10, 01, 00



- 첫 번째 단계로, 현재 포인터 위치에서 포인터를 이동하며 참조와 갱신 비트가 모두 0인 페이지를 찾아 교체하고 다음 페이지로 포인터를 위치시킨다.

- 첫 번째 단계에서 그런 페이지를 찾지 못하면 두 번째로 참조는 0, 갱신은 1로 되어 있는 페이지를 찾아 교체

- 포인터를 이동하면서 모든 프레임의 참조 비트를 0으로 바꿈

- 두 번째 단계에서도 해당 페이지를 찾지 못했다면 포인터는 제자리로 돌아와 있을 것이며, 모든 프레임의 참조 비트는 0이 되어 있을 것이므로 다시 첫 번째 단계를 시도하고 안 되면 두 번째 단계까지 시도 해 보면 교체 대상 페이지가 발견될 것임

NUR 역시 참조와 갱신 비트를 사용하되, 참조 비트는 시스템에서 주기적으로 0으로 만들어줌


6. LFU (Least Frequently Used) 기법

적재되어 있는 동안 참조된 횟수를 누적하여 기록한 후 그 값으로 교체 대상을 선택하는 기법

LFU는 많이 참조된 페이지는 앞으로도 참조될 확률이 높을 것이란 판단에 근거하여 값이 가장 작은 페이지를 선택


7. MFU (Most Frequently Used) 기법

MFU는 많이 참조된 페이지는 충분히 참조가 이루어졌으므로 더 이상 참조되지 않을 것이란 판단에 근거하여 값이 가장 큰 페이지를 선택

LFUMFU 두 기법 모두 편향된 시각에 근거함으로써 실제로 구현되는 경우는 매우 드뭄




Copyright2014 By 휴먼사이언스

LIST

<2단계 페이징 사상>

32 비트를 사용해 주소를 표현하는 시스템에서 하위 12 비트를 offset으로 사용한다면, 페이지의 크기는 4 Kbyte(2^12)가 되고 사상 테이블은 최대 100만개(220)의 엔트리를 가질 수 있다.

엔트리의 크기를 4 Byte로 잡더라도 페이지 테이블의 크기는 4 Mbyte가 되므로 매우 큰 크기가 되어 메모리에 모두 저장하기에는 벅차게 되므로, 페이지 테이블을 작게 나누어 필요한 부분만을 메모리에 적재하기 위해 계층구조를 갖도록 구성할 수 있다.


ex) 계층구조인 2단계 페이징을 예로 들어 보자.

위에서 말한 페이지 번호를 나타내는 20 비트를 10 비트씩 나누어 상위 10 비트를 바깥(또는 루트)페이지 테이블의 엔트리 위치로, 하위 10 비트는 나누어진 테이블 내의 엔트리 위치를 나타내도록 하면 어떨까? 메모리에 상주시키는 4 Kbyte 크기의 루트 테이블과 같은 크기의 1024(2^10)개 페이지 테이블들의 선택적인 메모리 적재를 통해 전부 적재해야 하는 부담을 줄일 수 있다.

 




 

위의 그림에서 1024개의 페이지 테이블을 생략하였다.



<역 페이지 테이블 사상 - 역발상>

메모리에 고정 크기의 페이지 테이블 하나만 둠으로써 해결하는 방법이다.

메모리의 프레임 수만큼 엔트리를 가진다.

테이블 내에서 엔트리의 순서는 프레임의 순서와 같다. k 번째 엔트리는 메모리의 k 번째 프레임에 대한 사상 정보를 가지고 있는데, 빈 프레임인지 아닌지를 나타내는존재 비트와 함께 적재된 경우 어떤 프로세스의 몇 번째 페이지인지를 나타내게 된다.

가상주소는 페이지 번호(p), 위치값(d)과 함께 이 페이지를 소유하는 프로세스 번호(Pid)도 가져야 한다. 사상을 할 때 프로세스 번호와 페이지 번호를 함께 사용하여 페이지 테이블을 검색해야 하기 때문이다. 다른 프로세스라 할지라도 페이지 테이블은 같은 페이지 번호로 매겨진다. -> 공유가 힘들다.


ex) 번호가 2인 프로세스가 페이지 번호 3과 위치 값 10으로 사상을 요구할 때, 가상주소는 <2, 3, 10>

1. 먼저 23을 가지는 엔트리를 검색(최악의 경우 엔트리의 끝까지 검색)

2. 발견된 엔트리의 역 페이지 테이블에서의 위치가 일곱 번째라면 메모리의 일곱 번째 프레임에 2번 프로세스의 3번 페이지가 적재되어 있다는 것이며, 여기서 위치 값 10을 더해 실주소를 알게 되는 것이다.



 

페이징은 고정 크기의 페이지로 메모리를 관리함으로써 구현이 쉽다는 장점을 가지기 때문에 대부분의 시스템에서 채택되고 있다.

프로그램의 마지막 페이지는 (평균적으로 페이지 크기의 반 정도의) 내부 단편화가 발생되는 단점이 있다.

예를 들어 3K 크기의 메모리에 페이지의 크기를 1K로 했을경우 1.5K 크기의 프로그램 두 개가 내부 단편화 때문에 전부 적재되지 못한다.

하나로 붙어 다녀야 효과적인 크기(서브루틴, for문 또는 매트릭스(Matrix) ) 가 페이지 단위로 나누어져 일부가 적재되면 사상 시간이 길어지고 공유 또한 불편하게 될 수 있다.



Copyright2014 By 휴먼사이언스

 

LIST

'OS > Theory' 카테고리의 다른 글

Working set이론  (0) 2016.04.21
상 메모리의 관리(적재, 배치, 할당 기법)  (0) 2016.04.20
페이지의 보호와 공유  (0) 2016.04.19
TLB(Translation Lookaside Buffer)  (2) 2016.04.18
페이징(Paging)  (0) 2016.04.17

<페이지의 보호(Protection)와 공유(Sharing)>


1. 페이지 보호


접근하고자 하는 페이지에 대해 읽기나 쓰기 작업을 어떻게 제한할 것인가와 다른 프로세스의 주소 공간으로 침범하지 못하도록 하는 것이다.

보호 비트(Protection Bits)를 두어 허용되는 접근설정을 하고, 보호에 위반되면 트랩을 일으킨다.


2. 공유

프로그램의 한 부분만을 메모리에 두고 실행함으로써 메모리 공간 절약 가능하다.

공유되는 프로그램은 코드의 내용이 실행 도중 변하지 않아야 하므로 재진입 코드(Reentrant 또는 Pure Code)로 컴파일 되어 있다.

페이징에서의 고융는 프로세스 각자의 페이지 테이블에서 엔트리에 같은 프레임 번호를 가지도록 한다. 프로그램은 명령어 페이지와 데이터 페이지로 나누어 지는데 명령어 페이지를 공유하여 사용한다.

 


 

Copyright2014 By 휴먼사이언스

LIST

+ Recent posts