반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍15 - 서브플롯 활용하기



이번에는 서브플롯을 활용하여 한 화면에 여러가지 그래프를 보는 방법에 대해 살펴봅니다.

여태까지 다룬 소스코드는 주가트렌드, 주가캔들 그리고 미국 출생아수에 대한 그래프를 출력하는 것이었죠.

이들 세 가지 그래프를 서브플롯을 이용해 그려봅니다.


서브플롯은 아래의 코드로 3개로 구분합니다.


>>> ax1 = plt.subplot2grid((2, 2), (0, 0))

>>> ax2 = plt.subplot2grid((2, 2), (0, 1))

>>> ax3 = plt.subplot2gird((2, 2), (1, 0), colspan=2)


ax1에는 주가트렌드 그래프를, ax2에는 주가캔들 그래프를, ax3에는 미국 출생아수 그래프를 출력하도록 이전 코드를 활용해서 그려봅니다.


14편까지 충실하게 따라왔다면 아래 코드는 별로 설명할 것이 없습니다.





결과는 아래와 같습니다.




이 예에서는 미국 출생아수 그래프는 나머지 2개와 관련이 없는 것이지만, 이런 유형의 데이터 시각화는 서로 상관이 있는 것들을 다른 각도에서 살펴보기 위해 많이 활용됩니다.


자, 그러면 연관성이 있는 주가트렌드와 주가캔들을 서브플롯을 활용하여 한눈에 보이도록 해봅니다.

x축의 값은 날짜로 동일하며, y축의 값은 주가이므로 동일한 스케일로 그려주면 될 것 같습니다.

이를 위해서 x축을 공유하여 서브플롯을 정의합니다. ax1에는 주가트렌드를, ax2에는 주가캔들을 그릴 겁니다.

>>> ax1 = plt.subplot2grid((2,1), (0,0))

>>> ax2 = plt.subplot2grid((2,1), (1,0), sharex=ax1)



그리고 y축의 스케일을 같게 두기 위해 주가트렌드 그래프 및 주가캔들을 그린 후 아래의 코드를 추가합니다.


주가트렌드 그래프를 그린 후 추가할 코드


>>> ax1.yaxis.set_major_locator(mticker.MaxNLocator(nbins=5, prune='lower'))



주가캔들을 그린 후 추가할 코드


>>> ax2.yaxis.set_major_locator(mticker.MaxNLocator(nbins=5, prune='upper'))


마지막으로 plt.show()를 호출하기 전에 아래 코드를 삽입하여 ax1의 x축에 표시되는 눈금 라벨을 보이지 않게 합니다.


>>> plt.setp(ax1.get_xticklabels(), visible=False)



수정된 drawStockTrend() 함수 부분은 아래와 같습니다.




코드 실행 결과는 아래와 같습니다.





반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍14 - 그래프 또는 차트에 주석 달기



데이터를 분석하여 그래프나 차트로 보여줄 때 중요한 이벤트나 이슈 등이 있다면 이를 텍스트나 화살표로 표시하면 사용자에게 보다 친절함을 제공해줄 수 있습니다.


13편에서 활용한 데이터는 1880년 이후로 미국에서 태어난 남자아이, 여자아이 출생수를 그래프로 나타낸 것입니다. 그래프를 보면 1958년 정도에 피크를 보인 후 점차 출생자수가 줄어드는 것을 알 수 있습니다.


1958년에 즈음에 태어난 세대들을 우리나라에서는 베이비붐 세대라고 하는데 미국에서도 마찬가지네요. 차트에 이 부분을 '베이비붐'이라고 표시를 해보도록 하겠습니다.



13편의 코드와 달라진 부분은 하나입니다.


>>> ax.annotate('베이비붐', (1958, y2[1958-1881]), xytext=(0.7, 0.95),

        textcoords='axes fraction', arrowprops=dict(color='g', alpha=0.5))


annotate()는 플롯에 텍스트를 표시하며 옵션으로 화살표도 표시할 수 있습니다. annotate()에 사용된 인자를 살펴보면,

  • '베이비붐': 플롯에 표시할 텍스트
  • (1958, y2[1958-1881]): 화살표를 그리는 경우 화살표 끝이 지시할 위치. 좌표값으로 표시함
  • xytext=(0.7, 0.95): 텍스트가 위치할 지점. textcoords 인자가 'axes fraction'인 경우 0.7과 0.95는 플롯의 가로, 세로방향으로 70%와 95%위치임을 의미함
  • textcoords='axes fraction': xytext의 인자는 가로방향, 세로방향의 비율로 지정
  • arrowprops=dict(color='g', alpha=0.5): 화살표의 속성을 사전 자료로 지정. 색상은 green, 투명도는 0.5로 설정함. 여기에 사용될 수 있는 인자는 여기를 참고


여기서 텍스트 위치를 지정하는 xytext는 textcoords 인자에 따라 인자의 값이 의미하는 바가 다릅니다. textcoords를 지정하지 않으면 xytext로 지정되는 값은 디폴트로 좌표값이 됩니다.


이 코드를 실행하면 아래와 같습니다.




이제, 베이비붐 시기에 태어난 남자아이 여자아이 출생수를 차트에 삽입해보겠습니다.

이 역시 annotate()를 사용할 것인데, 위 코드의 plt.legend(loc=4) 앞부분에 아래의 코드를 삽입합니다.




>>> bbox_props_f = dict(boxstyle='round', fc='w', ec='r', lw=2)

>>> bbox_props_m = dict(boxstyle='round', fc='w', ec='b', lw=2)


주석을 둥근 모서리 사각형으로 둘러싸기 위해 박스 속성을 위해 사전자료를 정의합니다. 주요 인자는 다음과 같습니다.


  • boxstyle='round': 박스스타일을 둥근 모서리 사각형으로 지정 
  • fc = 'w': 사각형을 흰색으로 채움
  • ec='r': 외곽선을 빨간색 선으로 함
  • lw=2: 선두께를 2로 설정


annotate()에 사용되는 화살표 및 박스 속성 인자에 대해 보다 많은 정보는 여기를 참고하세요~


annotate()의 인자로 bbox= 가 있음을 알 수 있습니다. 코드를 실행하면 아래와 같은 결과가 나옵니다.



반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍13 - Matplotlib 스타일 적용하기



Matplotlib은 그래프를 다양한 스타일로 출력할 수 있게 해줍니다. 윈도우 커맨드 창을 열고 파이썬을 실행한 후 아래의 코드를 입력하고 돌려봅니다.


>>> from matplotlib import style

>>> print(style.available)


화면에 출력되는 것은 Matplotlib에서 사용 가능한 스타일입니다.


  • seaborn-dark-palette
  • seaborn-darkgrid
  • seaborn-whitegrid
  • seaborn-colorbline
  • seaborn-poster
  • seaborn-paper
  • seaborn-ticks
  • seaborn-notebook
  • seaborn-pastel
  • seaborn-deep
  • seaborn-white
  • seaborn-dark
  • seaborn-muted
  • seaborn-talk
  • seaborn-bright
  • bmh
  • dark_background
  • classic
  • fivethirtyeight
  • ggplot
  • grayscale


스타일을 적용하려면 여태까지 여러분이 작성한 코드에 matplotlib.style을 import하고 아래 한줄을 추가하면 됩니다.,


>>> style.use(스타일)


예를 들어 dark_background를 적용하려면


>>> style.use('dark_backgroud')

로 하면 됩니다.


단, 몇몇 스타일에서는 한글이 제대로 동작하지 않는 경우도 있네요. 이 부분은 아직 제가 해결하지 못했습니다. 뭐 언젠가는 해결되겠죠~


아래는 7편에서 다루었던 코드에 몇몇 스타일을 적용한 결과입니다.



seaborn-talk


ggplot


dark_background



이것 말고 다른 스타일은 각자가 한번씩 사용해보기 바랍니다.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍12 - 주가 캔들 그리기




이왕 Matplotlib을 응용하는 예로 주식 가격을 예로 들었으므로, 주가 캔들을 그리는 방법에 대해 알아겠습니다. 주식에 전혀 관심 없는 분들도 있겠지만 주식을 조금이라도 해본 분들은 주가 캔들에 대해 많이 알고 있을거라 생각합니다.


흔히 주가 캔들을 양봉, 음봉으로 부르기도 하는데, 우리나라 주식 시장에서 빨간색은 좋은 것이고, 파란색은 별로 안좋은 것이죠. 무슨 말인고 하면 빨간색은 주가가 전날에 비해 올라갔다는 말이고, 파란색은 전날에 비해 내려갔다는 의미입니다.


먼저, 11편에서 다루었던 코드를 약간 수정하여 삼성전자 주가의 1달치를 가져와서 주가 캔들을 그려보는 코드를 작성합니다.




코드의 주요 부분만 살펴봅니다.


>>> import matplotlib.finance import candlestick_ohlc


주가 캔들을 그려주기 위해 matplotlib의 필요한 모듈을 import 합니다.



>>>  ohlc = []

     for i in range(len(date)):

         stock_data = date[i], openp[i], high[i], low[i], closep[i], volume[i]

         ohlc.append(stock_data)


주가를 뽑아낸 기간 동안 날짜, 시작가, 고가, 저가, 종가, 거래량 순으로 묶어 ohlc의 요소로 추가합니다.



>>> candlestick_ohlc(ax, ohlc, width=0.5, colorup='r', colordown='b')


주가 캔들을 그립니다. 그릴 공간은 서브플롯 ax, 데이터는 ohlc, 주가 캔들의 폭은 0.5, 양봉은 빨간색으로, 음봉은 파란색으로 그려라는 의미입니다.



>>> ax.xaxis.set_major_formatter(mdates,DateFormatter(%Y-%m-$d))

>>> ax.xaxis.set_major_locator(mticker.MaxNLocator(10))


그래프 좌표의 x축을 설정합니다. 눈금에 표시할 라벨을 날짜 형식으로 지정하고, 눈금의 개수를 10개 정도로 합니다.

이 값을 변경해보면 그래프의 모양이 바뀌는 것을 알 수 있습니다.


코드 실행 결과는 아래와 같습니다.




반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍11 - Spine과 임의의 수평선을 기준으로 상하 부분 색칠하기



Spine은 영어로 척추를 의미합니다. 척추란 동물이나 사람의 몸을 지탱하는 중요한 역할을 하죠. 플로팅에서 Spine이란 좌표의 테두리를 굵게 표시하는 것으로 생각하면 됩니다. 이번 포스팅에서는 Matplotlib으로 Spine을 표시하는 방법을 살펴보겠습니다.


그리고 또 살펴볼 것은 다음과 같습니다.

주가 그래프를 볼 때 어떤 가격을 기준으로 윗부분과 아랫부분의 영역을 다른 색상으로 칠하면 보기에 매우 직관적일 것입니다. 예를 들어 삼성전자 주가 그래프에서 125만원 아랫쪽은 파란색, 윗쪽은 빨간색으로 칠하게 되면 120만원보다 주가가 낮았을 때와 높았을 때를 구분하여 보기 쉬울 것입니다.



10편의 코드와 다른 부분만 살펴보겠습니다.


>>> ref_price = 1250000


삼성전자 주가 그래프에서 ref_price를 기준으로 위쪽과 아래쪽의 색상을 다르게 할 것입니다.



>>> ax.fill_between(date, closep, ref_price, where=(closep > ref_price), \

                     facecolor='r', alpha=0.5)

>>> ax.fill_between(date, closep, ref_price, where=(closep < ref_price), \

                     facecolor='b', alpha=0.5)


10편에서 다루었던 fill_between()에서 인자 where= 가 추가되었습니다. where= 다음에는 조건을 입력합니다. where=(closep > ref_price)는 closep의 값이 ref_price보다 클 경우에만 색으로 채우는데, 그 색은 'r'로써 빨간색이며, 투명도는 0.5로 합니다. 마찬가지로 아래의 fill_between()은 closep의 값이 ref_price 보다 작을 경우에만 파란색으로 칠하고 투명도는 0.5로 합니다.



>>> ax.spines['left'].set_color('c')

>>> ax.spines['left'].set_linewidth(5)

>>> ax.spines['right'].set_visible(False)

>>> ax.spines['top'].set_visible(False)


Spine을 설정합니다. 좌측 Spine은 색상은 cyan, 두께는 5로 지정하였고 오른쪽과 위쪽은 Spine을 보이지 않게 했습니다.

 

 

>>> ax.tick_params(axis='x', color='r')

>>> ax.tick_params(axis='y', color='#225588')

 

x축의 값을 빨간색으로 표시하고, y축의 값을 225588 값에 해당하는 색으로 나타냅니다.


 

이 코드의 실행 결과는 다음과 같습니다.



반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍10 - 격자 표시 및 x축과 그래프로 둘러싸인 부분 색으로 채우기




8편의 코드에서 야후의 Open API를 이용해 주식정보를 받아오는 코드를 별도의 파일 stockreader.py로 만들어서 다른 코드에서 재사용할 수 있도록 했습니다. 첨부로 파일을 올려 두었으니 필요하신 분은 사용하세요~


stockreader.py의 getStockData() 함수를 재사용하게 될 것이며, 이 함수의 인자는 2개로 하나는 종목코드, 나머지 하나는 주식 데이터를 뽑을 기간입니다. 뽑을 기간은 현재 기준으로 삼성전자 주가 데이터을 1년, 3년, 1달, 3달치를 각각 얻고 싶으면 아래와 같이 호출하면 됩니다.


# 현재기준 1년치, 3년치 삼성전자 주가 데이터를 가져와 data1, data2에 할당함  

>>> import stockreader

>>> data1 = stockreader.getStockData('005930', '1y')

>>> data2 = stockreader.getStockData('005930', '3y')


# 현재기준 1달치, 3달치 삼성전자 주가 데이터를 가져와 data3, data4에 할당함  

>>> import stockreader

>>> data3 = stockreader.getStockData('005930', '1m')

>>> data4 = stockreader.getStockData('005930', '3m')



getStockData의 두 번째 인자를 지정하지 않으면 디폴트로 10년치 주가 데이터를 가져옵니다.


Matplotlib 강좌를 하면서 각종 그래프를 그릴 때 아무것도 없는 백지에다 그렸습니다. 하지만 1년치 주가정보와 같이 값을 확인해야 할 필요가 있는 경우, 모눈종이처럼 격자가 있으면 확인하기가 편리할 겁니다.


자, 다음의 코드를 보시죠~




전편 코드와 비교해서 달라진 부분만 살펴봅니다.


>>> krfont = {'family': 'NanumGothic', 'weight':'bold', 'size':10}

>>> matplotlib.rc('font', **krfont)


Matplotlib에 한글을 표시할 수 있도록 matplotlib에 한글 폰트를 지정해줍니다. 'family'의 값으로 폰트 파일의 이름을 써주시면 됩니다. 우분투의 경우 폰트 디렉토리 위치는 아래와 같으니 폰트파일(.ttf)을 이곳에 복사하면 됩니다.


/usr/share/fonts/trutype/



>>> date, closep, high, low, openp, volume = stockreader.getStockData(compcode, 1)


compcode에 해당하는 주가 데이터의 1년치를 가져옵니다.



>>> ax = plt.subplot2grid((1,1), (0,0))


루트 플롯을 1 x 1로 구분한 서브 플롯을 생성하고 루트 플롯의 (0, 0)에 위치킵니다. 즉, 서브 플롯은 루트 플롯과 그 크기가 동일합니다. 우리는 여태 matplotlib의 루트 플롯에 그래프나 차트를 그리고 화면에 출력했습니다. subplot2grid()는 루트 플롯에 서브 플롯을 지정해줍니다. 루트 플롯은 하나밖에 안되지만 서브 플롯은 여러개가 될 수 있습니다. 이는 UI 프로그래밍을 할 때 루트 프레임을 여러 개의 서브 프레임으로 나누고 서브 프레임에 다양한 위젯을 위치시키는 원리와 비슷합니다. 이해를 돕기 위해 아래의 코드를 봅니다.


>>> ax1 = plt.subplot2grid((3,3), (0,0), colspan=3)

>>> ax2 = plt.subplot2grid((3,3), (1,0), colspan=2)

>>> ax3 = plt.subplot2grid((3,3), (1,2), rowspan=2)

>>> ax4 = plt.subplot2gird((3,3), (2,0))

>>> ax5 = plt.subplot2grid((3,3), (2,1))


위 코드는 루트 플롯을 3 x 3, 9개의 영역으로 구분하고 ax1~ax5에 해당하는 서브 플롯을 정의해주는 코드입니다. 이 코드를 실행하면 matplotlib의 루트 플롯은 아래의 그림과 같이 5개의 서브 플롯으로 구분됩니다.



ax1~ax5는 플로팅을 위한 독립적인 공간이 됩니다. 따라서 무엇을 어떻게 어떤 배치로 나타낼 것이다라는 것을 미리 스케치한 후 matplotlib의 서브 플롯을 적절하게 구성하여 그에 맞는 차트나 그래프를 그려주면 됩니다.


우리의 코드에서는 루트 플롯과 같은 크기의 서브 플롯을 생성했습니다.



>>> ax.plot_date(date, closep, '-')


서브 플롯 ax에 시간별 주식 종가를 선으로 그려줍니다.



>>> for label in ax.xaxis.get_ticklabels():

            label.set_rotation(45)


서브 플롯 ax의 x축의 라벨을 45도 각도로 틀어줍니다.



>>> ax.grid(True)


서브 플롯 ax에 격자를 보이게 합니다.



>>> plt.subplots_adjust(left=0.1, bottom=0.2, right=0.95, top=0.9, wspace=0.2, hspace=0)


서브 플롯간의 간격을 조정해줍니다. 이번 코드는 서브 플롯이 하나이므로 루트 플롯과의 간격이 됩니다. 이 값을 조정해보면 어떤 내용인지 이해할 수 있습니다.



이제 주가 그래프의 아랫 부분을 색으로 채워 보겠습니다.




처음 코드에서 한 줄이 추가되었습니다.


>>> ax.fill_between(date, 1000000, closep)


fill_between(date, 1000000, closep)는 x값은 date이고, 1000000 이상 closep 이하 부분을 디폴트 색상인 파란색으로 채웁니다. 만약 1000000을 500000으로 줄여서 다시 그려보면 아래의 그림과 같이 나옵니다.




이는 y값의 범위가 달라져서 원래의 스케일과는 좀 다르게 나타납니다. 경계부분의 트렌드는 비슷한데 상대적인 차이가 줄어든 것입니다.


채우는 색상을 변경하고자 하면 아래와 같이 하면 됩니다. 아래는 cyan으로 채우고 그리는 색을 변경합니다.


>>> ax.fill_between(date, 1000000, closep, color='c')

>>> ax.plot_date(date, closep, '-', color='c')


결과는 아래와 같이 출력됩니다.





아래 코드는 부분을 칠하는 방법입니다. 물론 이는 정상적인 방법이 아닐 수 있습니다. 코드에 대한 설명은 생략합니다.





반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍9 - pandas를 이용해 주식 차트 그리기



pandas는 파이썬을 위한 데이터 구조 및 분석을 위한 매우 편리하고 고성능의 오픈소스 라이브러리 입니다. BSD 라이선스라서 pandas를 누구나 수정하여 사용할 수 있고, 재배포의 의무가 없으며 심지어 상용 소프트웨어에서도 제한없이 사용할 수 있습니다.


8편에서 주식 차트를 그리기위해 야후의 Open API URL주소를 이용해서 데이터를 가져오고 그것을 numpy.loadtxt()라는 함수로 주가 데이터를 파싱하여 matplotlib으로 차트를 그리는 알고리즘이었습니다.


자, 이제는 pandas를 이용해 8편과 동일한 프로그램을 만들어 보겠습니다. pandas의 위력을 조금이나마 알 수 있습니다. 먼저 pandas를 사용하기 위해서는 pandas를 우리의 컴퓨터에 설치를 해야겠지요..

PIP를 이용해 pandas를 설치합니다.


D:\> pip install pandas


그리고 pandas로부터 독립을 선언(?)한 pandas_datareader 모듈을 PIP로 설치합니다.


D:\> pip install pandas_datareader


무사히 잘 설치되었다면 파이썬을 구동해서 pandas를 import 해봅니다. 오류없다면 설치끝~


이제 아래의 코드를 보시죠~




8편의 코드에 비해 많이 단순하게 되었습니다. 살포시 코드로 가보죠..


>>> import pandas_datareader.data as web


pandas의 독립적인 모듈인 pandas_datareader.data를 web이라는 별명으로 import 합니다.



>>> def viewStockTrend(compcode)


인자로 입력된 compcode에 해당되는 주가 정보를 가져와서 matploitlib으로 화면에 그래프를 그려주는 함수입니다.



>>> start = datetime.datetime(2015, 2, 2)

>>> end = datetime.datetime(2016, 7, 13)


datetime.datetime(2015, 2, 2)는 2015-02-02 00:00:00 형식으로 변환해줍니다.


start와 end는 살펴볼 기간입니다.



>>> stock = web.DataReader(compcode, 'yahoo', start, end)


이 부분은 야후로부터 종목코드 compcode에 해당하는 주가 정보를 start, end로 지정된 기간만큼 가져와서 stock 변수에 담습니다.

만약 start와 end가 생략되면 2010-01-01 부터 프로그램을 구동한 현재까지의 주가정보를 가져오고, start만 인자로 입력하면 start부터 현재까지의 주가정보를 가져옵니다.


삼성전자의 2015년 2월 2일부터 2016년 7월 13일까지의 주가 그래프를 결과로 그려줍니다.

이와 같이 pandas를 이용하면 복잡한 작업을 매우 편리하게 해주는 기능들을 활용할 수 있어 프로그래밍이 매우 단순해집니다.


pandas에 대해서는 시간이 나는대로 별도로 포스팅할 예정입니다.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍8 - Open API를 이용해 주식 차트 그리기




이번에는 인터넷에 공개된 API를 이용해 주식 정보를 받아오고 이에 대한 차트를 Matplotlib으로 그려보도록 하겠습니다. 불행히도 주식 정보를 API로 제공하는 국내 사이트는 없습니다.


증권사에서 자체적인 API를 제공해주고 있긴 한데, 그냥 가져다 쓰기에는 무척이나 번거로운 작업이고 절차도 까다롭습니다. 하지만 걱정은 여기까지~


우리나라 주가 정보를 편리하게 제공해주는 사이트가 하나 있는데, 바로 미국의 야후입니다.

주가 정보를 제공하는 주소는 다음과 같습니다.


http://chartapi.finance.yahoo.com/instrument/1.0/{종목코드}/chartdata:type=quote;range=10y/csv

 

예를 들어 삼성전자의 종목코드는 005930입니다. 야후는 전세계 주식 정보를 제공해주고 있어서 이 종목코드가 어느 나라의 것인지 구분하기 위해 종목코드 뒤에 식별자를 부여해줘야 하는데, 우리나라는 KS가 식별자입니다. 따라서 005930.KS가 유효한 삼성전자 종목코드가 됩니다.


인터넷 브라우저를 열고 아래의 주소를 입력한 후 엔터를 쳐보세요~


http://chartapi.finance.yahoo.com/instrument/1.0/005930.KS/chartdata;type=quote;range=10y/csv


그러면 아래와 같이 브라우저에 삼성전자에 대한 주가 정보가 텍스트로 나타납니다.



브라우저에 나타난 데이터에서 우리가 관심이 있는 것은 주가입니다. 바로 요부분입니다.

20060717,594000.0000,598000.0000,576000.0000,584000.0000,224900
....
....

이 부분은 모두 콤마로 6개 부분으로 구분되어 있습니다. 
순서대로 날짜, 종가, 고가, 저가, 시작가, 거래량입니다.

우리는 이 데이터를 받아와서 Matplotlib으로 주식 차트를 그려볼 겁니다. 일반적인 주식 차트는 그날의 종가를 기준으로 그려줍니다. 자 그러면 아래의 코드를 보시죠~

stockreader.py

stockreader.py의 주요 부분만 살펴보겠습니다.

>>> bytesdate2num(fmt, encoding='utf-8')
이 함수는 8자리로 된 날짜 데이터를 Matplotlib이 인식하는 숫자로 변경합니다. 

이제 실제로 주식 차트를 그려주는 아래의 코드를 작성합니다.

 

>>> viewStockTrend(compcode):

종목코드 compcode를 인자로 받고, 이 인자에 .KS를 추가하여 야후 주식 Open API의 {종목코드} 부분에 대입하고 urlopen() 함수를 이용해 호출합니다.
데이터를 한줄씩 읽은 후 콤마로 구분하고 그 크기가 6인 경우에, 'values'와 'labels'라는 문자가 데이터에 없으면 바로 주식 정보이므로 이것만 읽습니다. Matplotlib으로 해당 데이터를 읽어 차트를 그립니다.

삼성전자의 종목코드인 005930에 대해 위 코드를 실행하면 아래와 같은 주가 트렌드 차트가 화면에 출력됩니다.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍7 - 파일로부터 데이터를 읽어서 그래프 그리기




첨부한 파일(births.txt)은 1880년부터 2011년까지 미국에서 태어난 남녀 출생아 수를 정리한 데이터입니다.

이 파일은 아래와 같은 형식으로 되어 있습니다.


1880, 90993, 110491
1881, 91954, 100745
1882, 107850, 113688

....

....


각 숫자는 콤마로 구분되어 있고 첫번째 데이터는 년도, 두번째 데이터는 여자 아기 출생수, 세번째 데이터는 남자 아기 출생수입니다.

우리가 해볼 것은 이 데이터를 읽어서 여자 아기와 남자 아기의 출생수 추이를 그래프로 나타내 보고자 합니다.


자, 코드를 바로 보실까요..




>>> import csv


파일로부터 데이터를 편리하게 읽어 들이기 위해 csv 모듈이 제공하는 reader()를 사용할 예정입니다.



>>> years = range(1880, 2012)


년도의 범위는 1880년에서 2011년 까지로 합니다.



>>> with open(datafile, 'rb') as f:

          data = csv.reader(f, delimiter = ',')

          for d in data:

               pieces.append(d)


births.txt 파일을 바이너리 읽기 모드로 열고 그 핸들을 f로 합니다. csv.reader(f, delimiter = ',')은 구분자를 콤마로 해서 파일 f의 데이터를 읽고 구분하여 변수 data에 할당합니다.

data는 [['1880', '90993', '110491'], ['1881', '91954', '100745'], ['1882', '107850', '113688'],....] 와 같은 형식이 됩니다.


x, y1, y2에 각각 data의 첫번째 데이터인 년도, 두번째 데이터인 여자 아기 출생수, 세번째 데이터인 남자 아기 출생수만 따로 모아서 구성합니다.



>>> p1 = plt.plot(x, y1, 'r^--', label='female')

>>> p2 = plt.plot(x, y2, 'bs-', label='male')


데이터를 그래프로 그립니다. plot의 세번째 인자인 'r^--'은 점선으로 연결된 빨간색 삼각형,  'bs-'은 선으로 연결된 파란색 사각형을 의미합니다. 그래프를 그릴 때 마커에 대한 내용은 4편에서 이미 살펴보았습니다.  


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍6 - Matplotlib으로 파이 차트 그리기




파이 차트는 전체를 이루는 각 구성 요소가 전체 중 얼마만큼의 비중으로 되어 있는지 파악하기 매우 좋은 그래프 유형입니다. 바로 코드를 보실까요..




파이 차트를 그리기 위한 데이터는 누적 영역 그래프에서 사용된 어느 사람의 한달 동안 하루 일과 데이터입니다.


>>> activities = ['sleeping', 'working', 'eating', playing']


파이 차트의 라벨을 정의합니다. 이는 데이터 순서와 동일해야 합니다.



>>> n = 11

>>> title = 'Pie Chart for %d day' %(n+1)

>>> plt.title(title)


한 사람의 한달 동안 하루 일과에서 12일 부분을 선택하여 파이 차트를 그릴 예정입니다. 타이틀을 그에 맞게 구성합니다.



>>> slice = [sleeping[n], working[n], earing[n], playing[n]]


파이 차트를 구성하는 슬라이스 데이터를 정의합니다. 한달 데이터에서 12번째 데이터를 각각 취해서 하나의 리스트로 구성합니다.



>>> plt.pie(slice, labels=activities, startangle=90, shadow=True,

                explode=(0, 0, 0.1, 0), autopct='%1.1f%%')


파이 차트를 그려주는 Matplotlib 함수는 plt.pie()입니다. 인자는 다음과 같습니다.


  • slice: 파이 차트를 구성할 데이터
  • labels: 파이 조각의 라벨
  • startangle: 그려지는 파이 조각 시작 위치. 90이면 12시 방향임. 파이 조각은 이 각도를 기준을 반시계 방향으로 그려짐
  • shadow: 파이 차트의 그림자 효과 유무
  • explode: 파이 조각이 돌출되는 크기. 0이면 돌출되지 않음
  • autopct: 파이 조각의 전체 대비 백분율.


코드에서 explode는 3번째 파이 조각을 돌출하게 했습니다. 그리고 autopct에서 파이 조각 백분율은 소수점 1자리까지 %로 표기하도록 했습니다.


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍5 - Matplotlib으로 누적 영역 그래프 그리기



누적 영역 그래프(Stacked Area Graph)는 전체에서 부분이 차지하는 것을 쉽게 보이게 하는 그래프의 한 종류입니다. 이런 목적을 가진 다른 유형의 그래프는 파이 차트입니다. 누적 그래프는 시간의 경과에 따라 각 부분들이 어떻게 변해가는지 살펴보기에 좋은 유형의 그래프인 반면, 파이 차트는 특정 기간 동안 각 부분이 얼만큼 비중을 차지하는가를 살펴보기에 좋은 그래프입니다.


일단 누적 영역 그래프를 그려보겠습니다.




이 코드는 1에서 180도까지 사인 그래프 4개를 누적시킨 그래프를 그립니다.

Matplotlib의 누적 영역 그래프를 그리는 함수는 plt.stackplot() 입니다.


>>> plt.stackplot(days, y1, y2, y3, y4, colors=colors)


x축 방향으로는 days를 위치시키고 y1, y2, y3, y4를 누적하여 그래프를 그립니다. 각 그래프 영역의 색상은 colors로 정의합니다.



보다 실제적인 누적 영역 그래프를 그려보도록 하겠습니다.


어느 한 사람의 하루 일과중 소비하는 시간 추이를 보여주는 그래프를 그리는 코드입니다.




어느 사람의 한달동안 생활 패턴을 분석한 결과를 누적 영역 그래프로 표시하는 코드입니다.

사용한 Matplotlib 함수는 동일하지만, 그래프를 그리기 위한 데이터가 달라졌습니다. sleeping, working, eating, playing의 동일한 위치의 요소들의 합은 모두 24가 됩니다. 하루는 24시간이므로 이 값은 변함이 없어야 겠지요.


playing의 색상은 'k'로 지정했는데, 이는 검정색을 나타냅니다. 


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍4 - Matplotlib으로 산점도 그리기




산점도(Scatter plot)는 2차원 또는 3차원 좌표에 도형으로 표시를 하여 데이터의 상관관계 등을 파악하기 위해 주로 사용됩니다.


아래의 코드는 1에서 100까지 수를 마구 섞어 x좌표, y좌표를 만들고 산점도 결과를 출력하는 코드입니다.




산점도를 그려주는 Matplotlib 함수는 plt.scatter() 입니다. scatter() 함수의 인자는 다양한데, 이 코드에서는 x, y좌표와 라벨, 표시할 도형 종류, 그리고 색상만 인자로 정의했습니다.


산점도에서 표시할 수 있는 도형은 marker= 로 지정하면 되는데, Matplotlib에서 제공하는 마커의 종류는 여기를 참고하세요. 


산점도 그리기를 좀 더 응용해 보겠습니다.




위 코드는 Numpy 배열을 활용하여 50개의 좌표를 무작위로 만들고, 산점도를 원 모양으로 그리되 원의 크기를 무작위로, 원의 색상도 무작위로 해서 그려줍니다.


>>> x = np.random.rand(N)

>>> y = np.random.rand(N)


0에서 1사이의 N개의 수를 무작위로 생성하여 numpy 배열로 구성합니다. 마찬가지로 colors와 area를 50개의 요소를 무작위로 만들어 numpy 배열로 구성합니다. area는 0~15 포인트 사이의 값을 가집니다.



>>> plt.scatter(x, y, label='samples', s=area, c=colors, alpha=0.5)


scatter()의 인자 s는 도형의 크기, c는 도형의 색상, alpha는 색상의 투명도를 지정합니다. alpha의 값이 0이면 완전 투명이고, 1이면 완전 불투명입니다. 


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍3 - Matplotlib으로 막대그래프, 히스토그램 그리기




막대 그래프(Bar Chart)나 히스토그램은 특정 그룹의 데이터의 추세와 정량적인 분포를 파악하는데 매우 유용합니다. 



Matplotlib으로 막대 그래프 그리기

다음과 같은 두 개의 데이터 세트가 있다고 가정합니다.


세트1: (1, 5), (3, 3), (5, 9), (7, 2), (9, 8) 

세트2: (2, 8), (4, 7), (6, 2), (8, 11), (10, 4)


이를 막대 래프로 그리기 위한 코드는 아래와 같습니다.




>>> plt.bar(data_x1, data_y1, label='Set 1', color='b')


Matplotlib에서 막대 그래프를 그리는 함수는 plt.bar() 입니다. 막대의 폭을 지정하지 않으면 막대의 폭이 0.8로 정해집니다. data_x1으로 지정된 좌표에서 폭이 0.8이고 높이가 data_y1, color로 지정된 색상의 막대를 그립니다. Matplotlib에서 색상은 'r'이 Red, 'g'는 Green, 'b'는 Blue를 뜻합니다.


color값으로 #AA2848 처럼 RGB의 색상값으로 표현해도 됩니다.


위 코드에서 Set 2의 막대 그래프 색상을 #AA2848로 저정하여 실행하면 아래와 같은 결과가 나옵니다.




막대의 폭 0.5로 조정하고 싶다면 plt.bar()의 인자로 width = 0.5를 지정하면 됩니다. 아래는 Set 2의 막대그래프 폭을 0.5로 지정하여 출력한 결과입니다.





Matplotlib으로 히스토그램 그리기

히스토그램은 막대그래프와 모양은 비슷하나, 데이터가 있을 때 특정 범위의 값들을 그룹화하여 막대그래프 모양으로 표시하는 것입니다. 예를 들어 아래와 같은 30개의 데이터가 있다고 가정합니다.


22,55,62,45,21,22,34,42,42,4,99,102,110,120,121,122,130,111,115,112,80,75,65,54,44,43,42,48,16,11


이 데이터를 10단위의 간격으로 히스토그램을 그리는 코드는 아래와 같습니다. 


 



Matplotlib에서 히스토그램을 그리는 함수는 plt.hist() 입니다. 위 코드에서 변수 bins는 데이터 분류 기준이 되는 간격을 정의합니다. 여기서는 0~10, 11~20, 21~30,, 과 같이 간격을 10으로 정의했습니다. 히스토그램에서 BIN은 분류하고자 하는 범위라고 생각하면 됩니다. data에 있는 값들을 헤아려서 0~10, 11~20,,, 범위에 있는 개수를 히스토그램으로 나타냅니다. 


결과를 보면 data에 있는 값들 중 0~10 사이에 있는 값은 1개, 60~70사이에 있는 값은 2개임을 알 수 있습니다.


만약, 데이터를 분류하는 범위를 수동으로 지정하지 않고 BIN의 크기로 정해줄 수도 있습니다. data에 있는 값들을 분류하여 BIN의 크기대로 범위를 자동으로 정하고 결과를 화면에 출력하는 것이죠.


위 코드에서 bins = 8로 수정하고 실행하면 아래와 같은 결과가 출력됩니다.




BIN의 크기에 따라 data를 분류하는 값의 범위가 자동적으로 조정되었음을 알 수 있습니다.


이미치 처리를 위해 히스토그램을 응용하기도 하는데, 여기를 눌러 살펴보세요~ 


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍2 - Matplotlib에 제목, 라벨, 레전드 삽입하기




데이터를 분석하고 그 결과만 화면에 출력한다면 이게 무슨 데이터를 분석하여 나온 결과인지 전혀 모를 수 있습니다.

따라서 결과 화면에 제목과 라벨, 레전드 등을 삽입하여 결과를 보는 사용자에게 친절함을 베풀어주는 것이 중요하겠죠.


이번 포스팅에서는 Matplotlib을 이용해 결과를 화면에 출력하되 제목과 라벨, 레전드를 삽입하는 방법에 대해 알아봅니다. 아래는 Jupyter Notebook으로 코딩을 하고 실행한 후 결과를 보인 것입니다.




이 코드는 0도에서 360도 범위에서 삼각함수의 사인함수와 코사인함수의 그래프를 화면에 출력합니다.

plt.plot()에 대해서는 이전 포스팅에서 배웠으므로, 우리의 주제인 제목과 라벨, 레전드 삽입 코드만 살펴보겠습니다.



>>> plt.plot(xs, ys1, label='SIN Curve')

>>> plt.plot(xs, ys2, label='COS Curve')


사인곡선과 코사인곡선을 계산하여 그리되 라벨링을 포함합니다.



>>> plt.xlim([0, 360])


출력할 때 x 값의 범위를 0에서 360도로 제한합니다.



>>> plt.xlabel('X value')

>>> plt.ylabel('Y value')


plt.xlabel()과 plt.ylabel()은 각각 Matplotlib이 출력한 그래프의 x축과 y축에 라벨링하는 함수입니다. 



>>> plt.title('Trigonometric Function')


plt.title()은 Matplotlib이 출력한 결과 화면에 제목을 표시합니다.



>>> plt.legend()


각 곡선에 라벨링한 것을 레전드로 표시합니다.



>>> plt.show()


결과를 화면에 출력합니다.


이제 Matplotlib을 이용한 결과가 좀 풍성해진 것 같네요.. 


반응형
반응형

파이썬 Matplotlib을 이용한 데이터 시각화 프로그래밍1 - Matplotlib 시작하기



요즘 IT업계에서 유행하는 용어가 '빅데이터' 입니다.

빅데이터는 말그대로 용량이 매우 큰 데이터라는 말인데, 좀 더 세밀하게 정의하면 이 의미 의외에 몇가지가 더 있습니다.




아무튼 데이터든 빅데이터든 이들을 분석해서 의미있는 자료로 가공하는 것이 중요한 일이고, 가공된 데이터는 사람이 알아보기 쉽게 시각화(비주얼라이제이션; Visualization) 해주는 것이 중요합니다.


빅데이터 분석을 위한 강좌를 하기 전에 먼저 데이터를 시각화 하는 방법에 대해 살펴보도록 하겠습니다.


먼저 환경은 윈도우 10, 파이썬 3.5.2 입니다. 파이썬 2.7.x 버전을 사용하시는 분들은 일부 코드가 호환되지 않을 수 있으니 참고하세요.


파이썬 라이브러리 Matplotlib은 데이터 분석 결과를 시각화 하는데 필요한 막대 그래프, 선 그래프, 파이 차트, 바 차트 등 다양한 그래프와 차트를 생성하는 함수들을 제공합니다. 일단 Matplotlib을 설치해야 겠네요. 윈도 커맨드창에서 PIP를 이용해 다음과 같이 Matplotlib을 설치하면 필요한 모듈을 모두 알아서 설치해줍니다.


pip install matplotlib


만약 PIP로 matplotlib이 제대로 설치되지 않으면 여기로 가서 차근차근 읽어보고 matplotlib을 설치해보기 바랍니다.


Matplotlib이 제대로 설치되었는지 윈도 명령 프롬프트창에서 파이썬을 실행하고 matplotlib을 import 해봅니다.


>>> import matplotlib


아무 오류없이 import가 되면 성공적으로 설치가 된 것입니다.


자, 그러면 파이썬을 실행하거나 에디터를 이용해 다음과 같이 간단한 코드를 한번 작성해봅니다.


>>> import matplotlib.pyplot as plt

>>> xs = [x for x in range(10)]

>>> ys = [y*y for y in range(10)]

>>> plt.plot(xs, ys)

>>> plt.show()


이 코드는 matplotlib.pyplot을 import 하는데 이 녀석의 별명을 plt로 정의합니다.


plt.plot(xs, ys)는 리스트인 xs와 ys를 이용해 그려야 할 좌표를 정의하고 이 좌표들을 선으로 연결합니다.

xs와 ys는 수가 멤버인 크기가 동일한 리스트여야 합니다.


plt.show()는 결과를 화면에 그려줍니다.


이 코드를 실행하면 아래와 같이 matplotlib 윈도우가 생성되고 결과를 화면에 그려줍니다.




matplotlib 윈도우 아랫부분에는 결과를 다양하게 탐색할 수 있는 버튼들이 있습니다. 마치 인터넷 브라우저의 버튼과 비슷해 보입니다. 맨 왼쪽 집모양은 홈버튼입니다. 결과를 확대하고 축소하고 옮겨다니다가 맨 처음 모양으로 되돌리는 버튼입니다.


화살표 모양의 버튼은 뒤로 가기와 앞으로 가기 버튼입니다. 결과들을 이리저리 보다가 인터넷 브라우저 처럼 이전의 결과를 보고 싶으면 왼쪽 화살표 버튼을, 이후의 결과를 보고 싶으면 오른쪽 화살표 버튼을 이용합니다.


십자가 모양의 화살표는 결과를 이리저리 옮길 수 있다는 것을 표시해주는 아이콘입니다. 결과 화면에 마우스 왼쪽  버튼을 누른 채로 이동하면 결과를 아래 위나 왼쪽 오른쪽으로 이동할 수 있습니다.




결과 화면에 마우스 오른쪽 버튼을 누른채로 움직이면 결과를 확대하거나 축소할 수 있습니다. 아래 그림은 결과를 임의로 축소해본 것입니다.




다섯번째 아이콘을 클릭하면 결과 화면의 특정 부분을 사각형 영역으로 지정하여 확대해 볼 수 있습니다. 아래 그림은 사각형 영역으로 지정한 후 확대한 것입니다.




여섯번째 아이콘을 클릭하면 아래 그림과 같이 그림판의 여백을 조절할 수 있는 게이지가 나타납니다.



아래 그림은 right 여백을 조정한 결과입니다. 게이지 조정에 따른 결과 화면입니다.




이번 포스팅에서는 matplotlib의 기본적인 사항에 대해 가볍게 살펴보았습니다.


참고로 데이터 시각화 프로그래밍2에서는 데이터 분석을 위한 프로그래밍 도구로 많이 활용되는 Jupyter Notebook을 이용할 예정입니다. Jupyter Notebook에 대한 자세한 내용은 아래의 링크를 참조하세요.


Jupyter Notebook 개요 및 설치 


반응형
반응형


# 파이프라인을 가진 스트리밍 워크플로우

'''
위스콘신 유방암 데이터
이 데이터는 악성(malignant)과 양성(benign)의 암세포로 구성된 569개 샘플을 포함.
~2 열까지는 각 샘플의 ID숫자와 이들의 진단 결과값을 저장
3 ~ 32 열은 30개의 실제 값으로 이루어진 피처
'''

import pandas as pd
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data', header=None)

from sklearn.preprocessing import LabelEncoder
X = df.loc[:, 2:].values
y = df.loc[:, 1].values
print('df: ', df)
print('X: ', X)
print('y: ', y)
le = LabelEncoder()
y = le.fit_transform(y)
print('y-transform: ', y)

print(le.transform(['M', 'B']))

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=1)
print('X_train: ', X_train)
print('y_train: ', y_train)
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
pipe_lr = Pipeline([('scl', StandardScaler()),
('pca', PCA(n_components=2)),
('clf', LogisticRegression(random_state=1))])
pipe_lr.fit(X_train, y_train)
print('Test Accuracy: %.3f' % pipe_lr.score(X_test, y_test))


# k-fold 교차검증을 사용하여 모델 성능 평가
# - 일반화 성능을 만족시키는 최적의 하이퍼파라미터 값을 찾기 위한 모델 튜닝에 사용
import numpy as np
from sklearn.cross_validation import StratifiedKFold
kfold = StratifiedKFold(y=y_train, n_folds=10, random_state=1)
#print('kfold: ', kfold)
scores = []
for k, (train, test) in enumerate(kfold):
# print('train: ', train, 'test: ', test)
pipe_lr.fit(X_train[train], y_train[train])
score = pipe_lr.score(X_train[test], y_train[test])
scores.append(score)
print('Fold: %s, Class dist.: %s, Acc: %.3f' % (k+1, np.bincount(y_train[train]), score))
print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))


from sklearn.cross_validation import cross_val_score
scores = cross_val_score(estimator=pipe_lr, X=X_train, y=y_train, cv=10, n_jobs=1)
print('CV accuracy scores: %s' % scores)
print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))

# 검증 곡선을 사용해서 높은 바이어스나 높은 분산에 대한 이슈를 어떻게 해소할 수 있는지 확인.
import matplotlib.pyplot as plt
from sklearn.learning_curve import learning_curve
pipe_lr = Pipeline([
('scl', StandardScaler()),
('clf', LogisticRegression(penalty='l2', random_state=0))
])
train_sizes, train_scores, test_scores = learning_curve(estimator=pipe_lr,
X=X_train,
y=y_train,
train_sizes=np.linspace(0.1, 1.0, 10),
cv=10,
n_jobs=1)
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)

plt.plot(train_sizes, train_mean, color='blue', marker='o', markersize=5, label='training accuracy')
plt.fill_between(train_sizes, train_mean + train_std, train_mean - train_std, alpha=0.15, color='blue')
plt.plot(train_sizes, test_mean, color='green', linestyle='--', marker='s', markersize=5, label='validation accuracy')
plt.fill_between(train_sizes, test_mean + test_std, test_mean - test_std, alpha=0.15, color='green')
plt.grid()
plt.xlabel('Number of training samples')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.ylim([0.8, 1.0])
plt.show()

# 검증곡선으로 오버피팅과 언더피팅 다루기
'''
검증곡선은 학습곡선과 관련되어 있지만 훈련 정확도와 테스트 정확도를 샘플 크기의 함수로 플롯하는 대신,
로지스틱 회귀의 역정규화 파라피터 C와 같은 모델 파라미터 값들을 다양하게 한다.
'''
from sklearn.learning_curve import validation_curve
param_range = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]
train_scores, test_scores = validation_curve(
estimator=pipe_lr,
X=X_train,
y=y_train,
param_name='clf__C',
param_range=param_range,
cv=10
)
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)
plt.plot(param_range, train_mean, color='blue', marker='o', markersize=5, label='training accuracy')
plt.fill_between(param_range, train_mean + train_std, train_mean - train_std, alpha=0.15, color='blue')
plt.plot(param_range, test_mean, color='green', linestyle='--', marker='s', markersize=5, label='validation accuracy')
plt.fill_between(param_range, test_mean + test_std, test_mean - test_std, alpha=0.15, color='green')
plt.grid()
plt.xscale('log')
plt.legend(loc='lower right')
plt.xlabel('Parameter C')
plt.ylabel('Accuracy')
plt.ylim([0.8, 1.0])
plt.show()


반응형
반응형
'''
차원축소를 위한 피처 선택의 방법 중 피처 추출이 있다.
원래보다 낮은 차원의 새로운 피처 부분공간으로 변환시킴으로써 데이터의 정보를 요약할 수 있도록 도와주는
세 가지 기초 기법에 대해 학습한다.
* 비지도적 데이터 압축을 위한 주성분 분석(PCA)
* 최대화 분류 분리를 위한 지도적 차원축소 기법으로써의 선형 분리 분석(LDA)
* 커널(kernel) 주성분 분석을 활용한 비선형 차원축소
'''
# 주성분 분석을 활요한 비지도적 차원축소

# 전체 분산과 설명 분산
import pandas as pd
df_wine = pd.read_csv('wine.data', header=None)

from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# 표준화
sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.fit_transform(X_test)

# 공분산 행렬 만들기
# 아이겐페어(eigenpairs) Numpy linalg.eig 함수 사용
import numpy as np
cov_mat = np.cov(X_train_std.T) # 공분산행렬 계산 (같은 피처를 행으로 만들어서)
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
print('\nEigenvalues \n%s' % eigen_vals)
print('\nEigenvectors \n%s' % eigen_vecs)

# 아이겐밸류의 분산 비율을 구한다.
tot = sum(eigen_vals)
var_exp = [(i / tot) for i in sorted(eigen_vals, reverse=True)] # 내림차순 정렬
cum_var_exp = np.cumsum(var_exp) # 설명 분산의 누적 합 계산
import matplotlib.pyplot as plt
plt.bar(range(1,14), var_exp, alpha=0.5, align='center', label='individual explained variance')
plt.step(range(1,14), cum_var_exp, where='mid', label='cumulative explained variance')
plt.ylabel('Explained variance ratio')
plt.xlabel('Principal components')
plt.legend(loc='best')
plt.show()

# 피처 변환
eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:, i]) for i in range(len(eigen_vals))]
eigen_pairs.sort(reverse=True) # 내림차순 정렬
print('eigen_pairs:\n', eigen_pairs)
w = np.hstack((eigen_pairs[0][1][:, np.newaxis], eigen_pairs[1][1][:, np.newaxis]))
print('Matrix W:\n', w)

# 투영행렬을 사용해서 샘플 x(1x13차원의 행 벡터) PCA 부분공간 x`로 변환할 수 있다.
print('X_train_std[0]:\n', X_train_std[0].dot(w))
# 124 x 13차원의 훈련데이터를 행렬의 내적곱 계산을 사용해서 두 개의 주성분으로 변환
X_train_pca = X_train_std.dot(w)

colors = ['r', 'b', 'g']
markers = ['s', 'x', 'o']
for l, c, m in zip(np.unique(y_train), colors, markers):
plt.scatter(X_train_pca[y_train==l, 0], X_train_pca[y_train==l, 1], c=c, label=l, marker=m)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='upper left')
plt.show()


## 사이킷런에서 주성분 분석
from matplotlib.colors import ListedColormap

def plot_decision_regions(X, y, classifier, resolution=0.02):
markers = ('s', 'x', 'o', '^', 'v')
colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
cmap = ListedColormap(colors[:len(np.unique(y))])

x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))

Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())

for idx, cl in enumerate(np.unique(y)):
plt.scatter(x=X[y==cl, 0], y=X[y==cl, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=cl)

from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
lr = LogisticRegression()
X_train_pca = pca.fit_transform(X_train_std)
X_test_pca = pca.transform(X_test_std)
lr.fit(X_train_pca, y_train)
plot_decision_regions(X_train_pca, y_train, classifier=lr)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.legend(loc='lower left')
plt.show()

plot_decision_regions(X_test_pca, y_test, classifier=lr)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='lower left')
plt.show()

pca = PCA(n_components=None)
X_train_pca = pca.fit_transform(X_train_std)
print('pca.explained_variance_ratio_:\n', pca.explained_variance_ratio_)

# 세 개의 평균 벡터 결과 도출
np.set_printoptions(precision=4)
mean_vecs = []

for label in range(1,4):
mean_vecs.append(np.mean(X_train_std[y_train==label], axis=0))
print('MV %s: %s\n' %(label, mean_vecs[label-1]))

d = 13 # number of features
S_W = np.zeros((d, d))
for label, mv in zip(range(1,4), mean_vecs):
class_scatter = np.zeros((d, d))
for row in X[y==label]:
row, mv = row.reshape(d, 1), mv.reshape(d, 1)
class_scatter += (row-mv).dot((row-mv).T)
S_W += class_scatter
print('Within-class scatter matrix: %sx%s' % (S_W.shape[0], S_W.shape[1]))

print('Class label distribution: %s' % np.bincount(y_train)[1:])

d = 13
S_W = np.zeros((d, d))
for label, mv in zip(range(1,4), mean_vecs):
class_scatter = np.cov(X_train_std[y_train==label].T)
S_W += class_scatter
print('Scaled within-class scatter matrix: %sx%s' % (S_W.shape[0], S_W.shape[1]))

mean_overall = np.mean(X_train_std, axis=0)
d = 13
S_B = np.zeros((d,d))
for i, mean_vec in enumerate(mean_vecs):
n = X[y==i+1, :].shape[0]
mean_vec = mean_vec.reshape(d, 1)
mean_overall = mean_overall.reshape(d, 1)
S_B += n * (mean_vec - mean_overall).dot((mean_vec - mean_overall).T)
print('Between-class scatter matrix: %sx%s' % (S_B.shape[0], S_B.shape[1]))


반응형
반응형


import pandas as pd
from io import StringIO

csv_data = '''A,B,C,D
1.0,2.0,3.0,4.0
5.0,6.0,,8.0
0.0,11.0,12.0,
'''
df = pd.read_csv(StringIO(csv_data))
print('df:\n ', df)
print('df.isnull().sum():\n ', df.isnull().sum())

# 결측값을 가진 샘플이나 피처 제거
print('df.dropna():\n ', df.dropna()) # 결측값을 가진 행을 제거하는 방법
print('df.dropna(axis=1):\n ', df.dropna(axis=1)) # 결측값을 가진 열을 제거하는 방법
print("df.dropna(how='all'):\n", df.dropna(how='all')) # 모든 열이 결측값을 가진 행만 제거
print('df.dropna(thresh=4):\n', df.dropna(thresh=4)) # 최소 4개의 결측치가 아닌 값을 가지지 못하는 행 제거
print("df.dropna(subset=['C']:\n", df.dropna(subset=['C'])) # C열에서 결측치가 있는 행을 제거

# 결측값의 보정
# 전체 피처열의 평균값으로 결측값을 간단히 대체하는 평균보정법
from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN', strategy='mean', axis=0)
imr = imr.fit(df)
imputed_data = imr.transform(df.values)
print('imputed_data:\n', imputed_data)


import pandas as pd
df = pd.DataFrame([
['green', 'M', 10.1, 'class1'],
['red', 'L', 13.5, 'class2'],
['blue', 'XL', 15.3, 'class1']
])
df.columns = ['color', 'size', 'price', 'classlabel']
print('df:\n', df)

# 순위형 피처 매핑
# ex) XL = L + 1 = M + 2
size_mapping = {'XL': 3, 'L': 2, 'M': 1}
df['size'] = df['size'].map(size_mapping)
print('df:\n', df)

# 역매핑
inv_size_mapping = {v: k for k, v in size_mapping.items()}
print('inv_size_mapping:\n', inv_size_mapping)


# 분류 레이블 인코딩
import numpy as np
class_mapping = {label:idx for idx, label in enumerate(np.unique(df['classlabel']))}
print('class_mapping:\n', class_mapping)

df['classlabel'] = df['classlabel'].map(class_mapping)
print('df:\n', df)
# 역매핑
inv_class_mapping = {v: k for k, v in class_mapping.items()}
df['classlabel'] = df['classlabel'].map(inv_class_mapping)
print('df:\n', df)

from sklearn.preprocessing import LabelEncoder
class_le = LabelEncoder()
y = class_le.fit_transform(df['classlabel'].values)
print('y:\n', y)

print('class_le.inverse_transform(y):\n', class_le.inverse_transform(y))


# 명목형 피처에 원핫 인코딩 수행
X = df[['color', 'size', 'price']].values
color_le = LabelEncoder()
X[:, 0] = color_le.fit_transform(X[:, 0])
print('X:\n', X)


# one hot encoding
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(categorical_features=[0])
print('ohe.fit_transform(X).toarray():\n', ohe.fit_transform(X).toarray())

print('df:\n', df)
print("pd.get_dummies(df[['price', 'color', 'size']]):\n", pd.get_dummies(df[['price', 'color', 'size']]))


# 데이터를 훈련용과 테스트용으로 분할하기
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None)
df_wine.columns = ['Class label', 'Alcohol',
'Malic acid', 'Ash',
'Alcalinity of ash', 'Magnesium',
'Total phenols', 'Flavanoids',
'Nonflavanoid phenols', 'Proanthocyanins',
'Color intensity', 'Hue',
'OD280/OD315 of diluted wines', 'Proline']
print('Class labels', np.unique(df_wine['Class label']))
print('df_wine.head():\n', df_wine.head())

# 테스트용과 훈련용으로 임의 분할하기 위한 편리한 방법 한 가지는 사이킷런 cross_validation 서브 모듈의 train_test_split 함수
from sklearn.cross_validation import train_test_split
X, y = df_wine.iloc[:, 1].values, df_wine.iloc[:, 0].values
print('X:\n', df_wine.iloc[:, 1].values) # Alcohol
print('y:\n', df_wine.iloc[:, 0].values) # Class label
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
print('X_train:\n', X_train)
print('X_test:\n', X_test)

# 최소-최대 스케일링 프로시저
from sklearn.preprocessing import MinMaxScaler
mms = MinMaxScaler()
X_train = np.array(X_train).reshape((len(X_train), 1))
X_test = np.array(X_test).reshape((len(X_test), 1))
X_train_norm = mms.fit_transform(X_train)
X_test_norm = mms.transform(X_test)
print('X_train_norm:\n', X_train_norm)
print('X_test_norm:\n', X_test_norm)

# 표준화 프로시저
from sklearn.preprocessing import StandardScaler
stdsc = StandardScaler()
X_train_std = stdsc.fit_transform(X_train)
X_test_std = stdsc.transform(X_test)
print('X_train:\n', X_train)
print('X_train_std:\n', X_train_std)


############ 오버피팅을 줄일 수 있는 일반적인 방법

from sklearn.linear_model import LogisticRegression
LogisticRegression(penalty='l1')
print("LogistincRegression(penality='l1'):\n", LogisticRegression(penalty='l1'))
lr = LogisticRegression(penalty='l1', C=0.1)
lr.fit(X_train_std, y_train)
print('Training accuracy:', lr.score(X_train_std, y_train))
print('Test accuracy:', lr.score(X_test_std, y_test))
lr.intercept_
print('lr.intercept_: ', lr.intercept_)
lr.coef_
print('lr.coef_: ', lr.coef_)


# 여러가지 정규화 강도를 위한 다양한 피처들의 가중계수인 정규화의 경로를 플롯
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.subplot(111)
colors = ['blue', 'green', 'red', 'cyan',
'magenta', 'yellow', 'black',
'pink', 'lightgreen', 'lightblue',
'gray', 'indigo', 'orange']
weights, params = [], []
for c in np.arange(-4, 6):
lr = LogisticRegression(penalty='l1', C=10**np.float32(c), random_state=0)
lr.fit(X_train_std, y_train)
weights.append(lr.coef_[1])
params.append(10**np.float32(c))

weights = np.array(weights)
for column, color in zip(range(weights.shape[1]), colors):
plt.plot(params, weights[:, column], label=df_wine.columns[column+1], color=color)

plt.axhline(0, color='black', linestyle='--', linewidth=3)
plt.xlim([10**(-5), 10**5])
plt.ylabel('weight coefficient')
plt.xlabel('C')
plt.xscale('log')
plt.legend(loc='upper left')
ax.legend(loc='upper center', bbox_to_anchor=(1.38, 1.03), ncol=1, fancybox=True)
plt.show()
# 연속형 피처 선택 알고리즘
'''
SBS(Sequential Backward Selection) : 계산상 효율을 위해 초기 피처 부분 공간의 차원을 축소시킬 때
분류기 성능이 무너지는 것을 최소화하는 것을 목표로 한다.
'''
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None)
df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash',
'Alcalinity of ash', 'Magnesium', 'Total phenols', 'Flavanoids',
'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue',
'OD280/OD315 of diluted wines', 'Proline']

from sklearn.cross_validation import train_test_split
X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values

from sklearn.base import clone
from itertools import combinations
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score
class SBS():
def __init__(self, estimator, k_features, scoring=accuracy_score,
test_size=0.25, random_state=1):
self.scoring = scoring
self.estimator = clone(estimator)
self.k_features = k_features
self.test_size = test_size
self.random_state = random_state

def fit(self, X, y):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=self.test_size,
random_state=self.random_state)
dim = X_train.shape[1]
#print('dim:\n', dim)
self.indices_ = tuple(range(dim))
#print('self.indices:\n', self.indices_)
self.subsets_ = [self.indices_]
#print('self.subsets:\n', self.subsets_)
score = self._calc_score(X_train, y_train, X_test, y_test, self.indices_)
#print('score:\n', score)
self.scores_ = [score]

while dim > self.k_features:
scores = []
subsets = []

for p in combinations(self.indices_, r=dim-1):
score = self._calc_score(X_train, y_train, X_test, y_test, p)
scores.append(score)
subsets.append(p)
best = np.argmax(scores)
self.indices_ = subsets[best]
self.subsets_.append(self.indices_)
dim -= 1

self.scores_.append(scores[best])
#print('self.scores_:\n', self.scores_)
self.k_score_ = self.scores_[-1]

return self

def transform(self, X):
return X[:, self.indices_]

def _calc_score(self, X_train, y_train, X_test, y_test, indices):
self.estimator.fit(X_train[:, indices], y_train)
y_pred = self.estimator.predict(X_test[:, indices])
score = self.scoring(y_test, y_pred)
return score

from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
knn = KNeighborsClassifier(n_neighbors=2)
sbs = SBS(knn, k_features=1)
sbs.fit(X_train_std, y_train)
#print('sbs.subsets_:\n', sbs.subsets_)
k_feat = [len(k) for k in sbs.subsets_]
plt.plot(k_feat, sbs.scores_, marker='o')
plt.ylim([0.7, 1.1])
plt.ylabel('Accuracy')
plt.xlabel('Number of features')
plt.grid()
plt.show()

k5 = list(sbs.subsets_[8])
#print('k5:\n', k5)
print('df_wine.columns[1:][k5]:\n', df_wine.columns[1:][k5])

knn.fit(X_train_std, y_train)
print('Training accuracy:', knn.score(X_train_std, y_train))
print('Test accuracy:', knn.score(X_test_std, y_test))

knn.fit(X_train_std[:, k5], y_train)
print('Training accuracy:', knn.score(X_train_std[:, k5], y_train))
print('Test accuracy:', knn.score(X_test_std[:, k5], y_test))

#### 랜덤 포레스트를 활용한 피처 중요도의 평가
'''
랜덤 포레스트를 사용하면 데이터가 선형적으로 분리 가능한지 여부와 상관없이
포레스트 내의 모든 의사결정나무로부터 계산된 평균 불순도 감소분으로 피처의 중요도를 측정할 수 있다.
나무 기반의 모델은 표준화나 정규화가 필요하지 않다는 것을 기억하자.
'''
from sklearn.ensemble import RandomForestClassifier
feat_labels = df_wine.columns[1:]
forest = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)
forest.fit(X_train, y_train)
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1]
for f in range(X_train.shape[1]):
print("%2d) %-*s %f" % (f+1, 30, feat_labels[f], importances[indices[f]]))

plt.title('Feature Importances')
plt.bar(range(X_train.shape[1]), importances[indices], color='lightblue', align='center')
plt.xticks(range(X_train.shape[1]), feat_labels, rotation=90)
plt.xlim([-1, X_train.shape[1]])
plt.tight_layout()
plt.show()

X_selected = forest.transform(X_train, threshold=0.15)
print('X_selected.shape:\n', X_selected.shape)


반응형
반응형

이제 드디어 APM을 설치합니다.


SSH로 아마존 인스턴스에 접속합니다. putty를 통해 접속하는 방법은 이미 알고계시죠? : )


# sudo su


를 입력하여 root권한을 획득 하고 이후의 내용을 진행하세요.



이제 본격적으로 Apache, Mysql, PHP를 설치할 것입니다.



먼저 yum 업데이트를 시작합니다. 여러 패키지들을 업데이트 합니다.


# yum update


를 입력하세요.



설치할 패키지 목록이 쭈욱 나타나고 설치를 진행할것인지 묻습니다. 


y를 입력하고 엔터를 누르면 다운로드 및 설치가 진행됩니다.





완료가 되었습니다.

APM을 설치해봅시다. 설치과정은 위와 유사합니다.



PHP와 아파치, 기타 모듈 설치

# sudo yum install php-mysql php php-xml php-mcrypt php-mbstring php-cli mysql httpd

마찬가지로 설치를 할것이냐고 물으면 y를 눌러주세요.



MYSQL 설치

#sudo yum install mysql mysql-server mysql-libs mysql-server




PHP, Apache, MYSQL를 한꺼번에 설치하고, 그리고 SSL까지 쓴다면 이렇게 한꺼번에 타이핑하여 한방에 설치하셔도 됩니다.

# sudo yum install mod_ssl mysql mysql-sever mysql-libs mysql-server php php-mysql php-xml php-mcrypt php-mbstring php-cli httpd

설치가 완료되면

mysql을 실행해봅시다.


# sudo /etc/init.d/mysqld start




OK 가 나타났다면 정상적으로 실행이 된것입니다.



MYSQL root 비밀번호 설정


# mysqladmin -u root password '비밀번호'




보안을 위해서 mysql root 비번도 바꿔주는 센스!

향후 사용할 DB를 생성하고 사용자를 추가하고 그에 대한 권한을 주는것은 기존에 하시던 방식과 동일하니 넘어가겠습니다.


아파치 conf 파일을 수정할 차례입니다. 

이 과정은 /etc/httpd/conf/httpd.conf 에 웹서버 정보를 수정하는 과정입니다.

아파치 conf 파일은 /etc/httpd/conf/httpd.conf 경로에 위치해있습니다.


# vi /etc/httpd/conf/httpd.conf



로 파일을 열고 웹서버정보를 수정해봅시다.

아무것도 수정하지 않은 httpd.conf의 설정은 /var/www/html 을 루트경로로 하고있습니다.

도메인은 설정되지 않았습니다.


먼저 도메인을 설정합니다.

(먼저 가지고 계신 도메인의 DNS 설정을 마치셔야 합니다.)


#ServerName www.example.com:80


주석으로 처리된 이 부분을 주석을 삭제하고 여러분이 가지고 계신 도메인으로 설정하세요.


ServerName www.test.com


도메인이 없다면 아마존이 제공해준 굉장히 긴 이름의 public DNS를 그대로 입력하셔도 됩니다.


이제 웹서버의 루트 경로를 변경할 차례입니다.

루트경로를 굳이 변경하지 않는 경우에는 기본 경로인 /var/www/html가 웹서버의 루트경로가 되고

웹문서는 여기에 업로드하시면 됩니다.


웹서버의 루트경로를 변경하는 경우에는

httpd.conf 파일에서

아래 두 부분을 찾아 원하는 경로로 수정하시면 됩니다.




DocumentRoot "/var/www/html"

<Directory "/var/www/html">


저는 웹문서경로는 /var/www/html 폴더를 그대로 사용하고

ServerName은 아마존에서 제공해준 public DNS를 그대로 사용했습니다.


/home/ec2-user/ 폴더를 웹루트폴더로 사용하려고 ec2-user 폴더의 퍼미션을 변경하면 그 다음부터 해당 인스턴스에 더이상 접속이 되지 않습니다. ec2-user 폴더의 퍼미션을 절대 변경하지마세요.



한가지 더 수정할 것이 있는데

인덱스파일로 index.php를 추가해주는 것입니다.

httpd.conf 파일에서


DirectoryIndex index.html index.php




DirectoryIndex를 찾아 끝에 index.php를 추가해주세요.

폴더에 접근했을때 index.html을 가장 먼저 보여주고, index.html 파일이 없을때 index.php 파일을 보여준다는 설정입니다.

수정한 것을 저장하고, 아파치를 실행합니다.


# sudo /etc/init.d/httpd start


재부팅시에도 apache와 mysql이 자동으로 실행될수 있도록 설정합니다.


# sudo chkconfig --levels 235 mysqld on
# sudo chkconfig --levels 235 httpd on




이제 웹페이지에 보여줄 php 파일을 만들어보겠습니다.

저는 웹문서경로가 /var/www/html 이고,

이 안에 아래의 내용이 담긴 index.php 파일을 생성하여 업로드하였습니다.


<html>
<head>
<title>Hello World!</title>
</head>
<body>
<?php echo 'Hello World!' ?>
</body>
</html>



자 이제 웹브라우저를 통해서 접속해볼까요.



잘나오는군요!


웹서버의 루트경로에 아무런 웹문서가 없다면



웹브라우저로 접속했을때 이런 화면이 나올거예요.




혹시 접근할수 없다는 메시지가 나온다면

웹문서경로의 퍼미션을 확인해주세요.


※ https 를 사용하신다면

https 를 사용하시는 경우에는 mod_ssl을 추가로 설치하셔야 합니다.

설치는 매우간단합니다.

# yum install mod_ssl

설치하시면 mod_ssl.so 파일이 modules 폴더에 설치될거예요. 끝이예요. 참쉽죠?

SSL과 관련된 아파치 설정파일은 /etc/httpd/conf.d/ssl.conf 파일에 정의되어있습니다.

ssl.conf 파일을 원하시는 값으로 수정하시고 아파치를 재실행해주시면 적용이 됩니다.


yum install git-coregit을 사용하신다면 git도 요렇게 설치해주시고

이제 드디어 아마존 EC2를 이용하여 LAMP 환경을 구축하는 것을 모두 마쳤습니다.

아직 DB연결에 관한 부분은 테스트 하지 않았지만,

아마 여기까지 성공하셨으니 이 이후과정은 충분히 진행하실 수 있으리라 생각합니다.



아마존 클라우드 서비스는 앞으로도 활용할 곳이 정말 무궁무진합니다.

아마존 서비스 장애가 발생할 우려가 있다는 것은 충분히 감안하시고,

잘 활용하신다면 상대적으로 저렴한 비용에 아주 손쉽게 서버를 구성하실수 있습니다.

사용해보니 아시아에 위치해 있는 서버도 국내에서 호스팅을 이용하는 것보다는 속도가 떨어지는것 같습니다.

이점도 참고하시면 좋을 것 같아요.



저희가 지금까지 해온 과정은 하나의 인스턴스에 APM을 설치하는것이었는데

이렇게 하지 않고 두개의 인스턴스를 사용해서 웹서버와 DB서버로 나누어서 사용하는 방법도 있습니다.

이렇게 사용할 경우에는 php코드 상에서 mysql host를 적을때 mysql이 실행되고 있는 인스턴스의 ip를 적어주시면 되겠죠.


즐거운 개발하세요~



코드 작성을 위해 EC2에 editplus로 접속하는 방법이 포스팅 되었습니다.



출처: http://trend21c.tistory.com/1297 [나를 찾는 아이]

반응형
반응형

1. EC2 인스턴스 생성할 때 만든 key pair를 다운받는다.(기존 key pair를 선택하거나 새로 만들어 다운받는다) pem 파일


2. $ ssh -i [pem파일 경로] [유저명@퍼블릭DNS or IP]

예) ssh -i ~/Download/ec2.pem ec2-user@ec2-51-71-102-14.ap-northeast-2.compute.amazonaws.com


여기까지가 접속방법


pem 파일 없이 ssh keygen을 가지고 접속하기 위해서는 아래와 같이 적용한다.


1. $ ssh-keygen -t rsa


2. yes 를 연달아 치면 $HOME/.ssh 경로에 id_rsa파일이 만들어진다. id_rsa.pub파일을 텍스트 에디터로 열고 내용 그대로를 remote 서버에 $HOME/.ssh/authorized_keys 파일에 내용을 추가해준다.


3. $ ssh ec2-user@[DNS(IP)] 접속



출처: http://tbang.tistory.com/116 [heene]

반응형

'연구개발 > AWS' 카테고리의 다른 글

[Appium, TestNG, AWS DevicaFarm] 안드로이드 자동화 테스트하기 1 -(Appium 셋팅, TestCode 셋팅)  (0) 2018.01.04
ec2 apm 설치  (0) 2017.09.02
openvpn aws  (0) 2017.07.26
lrzsz  (0) 2017.07.12
ec2 metadata  (0) 2017.07.07
반응형

FROM


ON


JOIN


WHERE


GROUP BY


WITH CUBE | WITH ROLLUP


HAVING


SELECT


DISTINCT


ORDER BY


TOP

반응형

'연구개발 > DBA' 카테고리의 다른 글

Mysql Mssql linked server  (0) 2018.04.17
oracle mssql linked server  (0) 2018.04.17
Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
mssql 권한설정  (0) 2016.03.16
tempdb 분리  (0) 2016.03.15
반응형


wget https://raw.githubusercontent.com/sarfata/voodooprivacy/master/voodoo-vpn.sh


vi voodoo-vpn.sh


정보 변경


sudo bash voodoo-vpn.sh



그리고 방화벽 오픈

UDP로 열 것..

4500

500

1701 <--- 요거만 열어주면 되긴 함..

반응형

'연구개발 > AWS' 카테고리의 다른 글

ec2 apm 설치  (0) 2017.09.02
AWS EC2 생성 후 접속(pem -> ssh-keygen)  (0) 2017.08.08
lrzsz  (0) 2017.07.12
ec2 metadata  (0) 2017.07.07
[AWS] EC2 Linux(Ubuntu) 계정 추가 & 설정  (0) 2017.06.22
반응형

http://blog.naver.com/wjdtjdgus956/120211932298

반응형

'연구개발 > IOS' 카테고리의 다른 글

java apns용 인증서(.p12)생성법  (0) 2016.07.14
APNS 따라하기 시리즈 (인증서 만들기)  (0) 2016.03.21
반응형
一、申请AWS云服务器 由于个人笔记本配置低,在VMWare里跑Linux非常卡,所以想租一台云服务器来玩。同学推荐用Amazon的云服务,新注册用户可以免费试用一年。 首先,你需要注册一个账号,然后申请一年免费试用,可以看看这边文章《亚马逊AWS/EC2一年免费申请过程》,注意你需要有一个信用卡,并且会被收取 $1 美元的授权费用。 申请成功以后,就可以创建并运行一个主机实例,《亚马逊AWS怎么新建主机》。 最后,用 xshell 连接你的AWS服务器即可,《使用Xshell连接AWS EC2云服务器》。 连接成功后如下图: 通常使用ec2-user用户登录云服务器,然后可以切换到 root 用户(不需要密码): 

 $ sudo su root 

二、配置开发环境 我使用云服务器主要是为了开发,所以我们需要自己配置基本的开发环境。 2.1 安装gcc/g++ AWS云服务器上并没有安装gcc/g++编译环境,使用一下命令进行安装: 

$ sudo yum update 
$ sudo yum install gcc gcc-c++ make 

2.2 安装lrzsz 通常我们需要在AWS云服务器和本地电脑之间互相传文件,这时需要用到sz、rz命令,安装如下:  

$ wget https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 
$ tar -xzf lrzsz-0.12.20.tar.gz 
$ cd lrzsz-0.12.20 
$ ./configure 
$ make 
$ sudo make install

## 建软链接 

$ cd /usr/bin/ 
$ sudo ln -s /usr/local/bin/lrz rz 
$ sudo ln -s /usr/local/bin/lsz sz 

OK!现在就可以自由地传文件了。 未完,待续……

链接:http://www.jianshu.com/p/391b269a9989
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


반응형

'연구개발 > AWS' 카테고리의 다른 글

AWS EC2 생성 후 접속(pem -> ssh-keygen)  (0) 2017.08.08
openvpn aws  (0) 2017.07.26
ec2 metadata  (0) 2017.07.07
[AWS] EC2 Linux(Ubuntu) 계정 추가 & 설정  (0) 2017.06.22
centos lrzsz  (0) 2017.06.12
반응형

wget http://s3.amazonaws.com/ec2metadata/ec2-metadata


chmod +x ec2-metadata


./ec2-metadata





http://169.254.169.254/latest/meta-data/



help

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

반응형

'연구개발 > AWS' 카테고리의 다른 글

openvpn aws  (0) 2017.07.26
lrzsz  (0) 2017.07.12
[AWS] EC2 Linux(Ubuntu) 계정 추가 & 설정  (0) 2017.06.22
centos lrzsz  (0) 2017.06.12
아마존 클라우드 Ubuntu에서 한글 사용  (0) 2016.05.18
반응형

https://cjh5414.github.io/ubuntu-jenkins/



SpringBoot 프로젝트에 Jenkins를 이용하여 배포, 테스트 자동화 등을 적용하기 위해 Ubuntu 16.04에서 Jenkins를 설치하는 과정을 기록했다.


Jenkins 설치

apt-get을 이용하여 Jenkins를 설치 하기 위해 저장소 key를 다운받고 (정상적으로 저장소 key를 다운받으면 OK를 반환한다.) 패키지 주소를 sources.list에 더해준다.

$ wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
OK

$ echo deb http://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list

새로 받은 저장소를 적용하기 위해 apt-get을 업데이트한 후에 Jenkins를 설치한다.

$ sudo apt-get update
$ sudo apt-get install jenkins


Jenkins 시작하기

systemctl을 이용하여 Jenkins를 시작할 수 있다. 하지만 결과를 출력해주지 않기 때문에 status를 이용하여 시작이 잘 되었는지 확인해보는 것이 좋다. 잘 동작했다면 아래와 같은 메세지를 출력할 것이다.

$ sudo systemctl start jenkins
$ sudo systemctl status jenkins
● jenkins.service - LSB: Start Jenkins at boot time
  Loaded: loaded (/etc/init.d/jenkins; bad; vendor preset: enabled)
  Active:active (exited) since Thu 2017-04-20 16:51:13 UTC; 2min 7s ago
    Docs: man:systemd-sysv-generator(8)
    ...


Firewall 허용하기

Jenkins가 잘 동작하면 웹 브라우저를 통해 접근할 수 있도록 방화벽 설정이 필요하다. Jenkins는 기본적으로 8080포트에서 실행되도록 설정 돼 있다. ufw으로 8080 포트를 허가해줘서 접근할 수 있도록 하고 결과를 확인해본다.

$ sudo ufw allow 8080
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
8080                       ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
8080 (v6)                  ALLOW       Anywhere (v6)


Jenkins Port 변경

만약 다른 곳에서 8080포트를 사용하고 있으면 중복되어서 Jenkins가 동작하지 않을 것이다. 아래와 같이 jenkins 설정 파일에서 포트를 8081으로 바꿔줄 수 있다.

/etc/default/jenkins

HTTP_PORT=8081

방화벽 또한 8081포트를 허용해주고 Jenkins를 재시작하면 된다.

$ sudo ufw allow 8081
$ sudo systemctl restart jenkins


Jenkins 설정

이제 웹 브라우저를 통해 Jenkins에 접속할 수 있다.

http://ip_address_or_domain_name:8080 
포트를 변경했다면,
http://ip_address_or_domain_name:8081
으로 입력한다.

처음 접속했다면 아래와 같은 화면이 보일텐데 Jenkins를 설치할 때 생성된/var/lib/jenkins/secrets/initialAdminPassword 파일의 내용을 빈칸에 입력해야한다.

unlock

cat 명령으로 파일의 내용을 출력한 후 복사해서 붙여넣자.

$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword

완료되면 두 가지 선택사항이 나오는데 Select plugins to install을 클릭하면 설치하고 싶은 plugins를 선택할 수 있다. 권장하는 설치 항목들을 설치하고 싶다면 Install suggested plugins를 선택하자.

customize

설치가 완료되면 admin 계정을 생성하고,

ready

Start using Jenkins 을 클릭하면 완료된다.

result


참고자료


반응형

'연구개발 > Ubuntu' 카테고리의 다른 글

tail 원격  (0) 2018.07.29
우분투 계정 관리  (0) 2017.06.13
한글  (0) 2016.05.22
[Ubuntu] 시간 동기화 - ntpdate  (0) 2014.12.12
ubuntu mysql 삭제  (0) 2014.10.27
반응형

EC2 Linux(ubuntu) 계정 추가 & 설정

AWS의 EC2 를 생성하고 계정을 관리하면서 새로 알게된 내용을 정리한다.

정석은 EC2에서 생성한 각각의 사용자 계정마다 key pair를 생성해 주고, 각 계정에 맞게 설정된 key pair를 통해 접속해야 하지만...
최초 EC2를 생성하며 만들었던 key pair를 모든 사용자가 공유한다던가, password 기반의 로그인을 활성화하여 ssh key를 사용하지 않고 password 기반으로 로그인 하는 방법이 있다. 여기서는 사용자를 추가한 후 password 기반으로 로그인 하는 방법과 모든 사용자가 같은 pem파일을 사용할 수 있도록 하는 방법을 정리하였다.

먼저 AWS EC2 instance(Amazon Linux)를 생성하면 자동으로 ec2-user가 생성된다.
instance 생성시 설정했던 key pair (.pem)를 통해 서버에 접속한다.

1. root password 설정
[ec2-user@ip-172-31-7-114 ~]$ sudo passwd root

2. password 기반의 로그인을 활성화하기
[ec2-user@ip-172-31-7-114 ~]$ sudo vi /etc/ssh/sshd_config

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

위의 no를 yes로 변경한 후 저장한다.

3. root 계정으로 로그인
[ec2-user@ip-172-31-7-114 ~]$ su - root 

4. 다른 사용자 계정 추가
[root@ip-172-31-7-114 ~]$ adduser jmkim

5. 새로 생성한 사용자 계정의 비밀번호 변경
[root@ip-172-31-7-114 ~]$ sudo passwd jmkim

6. 새로 생성한 사용자 계정에 root 권한을 사용할 수 있도록 설정
[root@ip-172-31-7-114 ~]$ sudo visudo

root ALL=(ALL) ALL 아래에 
jmkim ALL=(ALL) ALL 을 추가해 준다.

7. 같은 key pair로 로그인 할 수 있도록 새로 생성한 사용자 계정으로 ec2-user 의 것을 복사

# 이부분에 대한 자세한 내용은 SSH KEY 를 참고한다. (https://opentutorials.org/module/432/3742)

# ubuntu 에서.ssh 폴더를 생성해 주어야한다.
[root@ip-172-31-7-114 ~]$ sudo cp /home/ec2-user/.ssh/ /home/jmkim/.ssh/

8. 복사한 key pair의 소유자를 jmkim으로 변경 (-R : 하위 폴더까지 모두 소유권을 바꿔줌)

[root@ip-172-31-7-114 ~]$ sudo chown -R jmkim:jmkim /home/jmkim/.ssh

9. sshd 서비스 재시작
[root@ip-172-31-7-114 ~]$ sudo service sshd restart
# ubuntu
[root@ip-172-31-7-114 ~]$ sudo service ssh restart
 

이제 EC2 instance를 생성할때 만들었던 .pem 파일과 설정한 비밀번호를 통해 새로 생성한 계정으로 서버에 접속할 수 있다.



출처: http://uroa.tistory.com/100 [UroA 개발 블로그]




추가. 테스트 해보니 제대로 권한이 처리가 안된다.

그래서 확인해보니 

   46  chmod u+w /etc/sudoers

   47  vi /etc/sudoers

   48  chmod u-w /etc/sudoers

   49  ls -al /etc/sudoers

요렇게 권한을 주고 수정한 후 다시 권한을 빼라.

그리고 reboot 하면 권한이 주어진다.

반응형

'연구개발 > AWS' 카테고리의 다른 글

lrzsz  (0) 2017.07.12
ec2 metadata  (0) 2017.07.07
centos lrzsz  (0) 2017.06.12
아마존 클라우드 Ubuntu에서 한글 사용  (0) 2016.05.18
aws. instance. clone. 복제  (0) 2016.02.19
반응형

우분투를 설치후 매번 admin으로 접속하기는 찜찜(?)하니 계정을 추가하여 접속을 해보도록 하자.


우분투에서는 계정을 생성하는 명령어가 두가지가 있다. 바로 adduser와 useradd이다. 

두 명령어 모두 계정을 추가하는 명령어지만 약간의 차이점이 있다. 

adduser의 경우 명령어 실행시 기본 계정정보를 같이 생성해주지만

useradd의 경우 계정만 생성하며 기타 다른 정보를 수동으로 생성 및 설정해주어야 한다. 

하나하나 실행하면서 살펴보도록 하자.


1. adduser [계정이름] - 계정 추가

- 계정생성시 비밀번호 까지 입력받으며 기본정보를 바로 입력 시켜줄수 있다. 홈 디렉토리 또한 자동으로 생성된다.

$   adduser mirUseradd
'miradduser' 사용자를 추가 중...
새 그룹 'miradduser' (1002) 추가 ...
새 사용자 'miradduser' (1002) 을(를) 그룹 'miradduser' (으)로 추가 ...
'/home/miradduser' 홈 디렉터리를 생성하는 중...
'/etc/skel'에서 파일들을 복사하는 중...
새 UNIX 암호 입력:
새 UNIX 암호 재입력:
passwd: password updated successfully
Changing the user information for miradduser
Enter the new value, or press ENTER for the default
    Full Name []: Mir
    Room Number []: 2000
    Work Phone []: 0101111111
    Home Phone []: 0102222222
    Other []: test
정보가 올바릅니까? [Y/n] y

이렇게 adduser로 계정을 생성시 우선 암호입력창이 뜨고 후에 부가적인 Commant 입력창이 생성된다.


2. useradd [계정이름] - 계정 추가

- 순수 계정만 생성해주고 기본 셀인 sh가 할당되며 홈 디렉토리와 패스워드는 따로 설정해줘야 한다.

$   useradd mirUseradd

useradd로 계정을 추가시 따로 결과 메세지나 입력메세지가 없다.

이제 이 두가지 계정을 한번 비교해보도록 하자


3. /etc/passwd - 계정 정보 파일

- 사용자 인증에 필요한 계정 정보를 가지고 있다. cat 명령어로 내용을 살펴보자.

$   cat /etc/passwd
[생략]...
mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh
miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash         

맨 아래줄에 보면 mirUseradd와 miradduser 계정이 추가된것이 보인다.

하나하나 자세히 분석해보자.

miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 사용자 계정을 표시한다.


miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 비밀번호를 표시한다. (모두 x로 표시되며 자세한 비밀번호는 아래에서 검색해보겠다.)


miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 사용자 ID를 표시한다. (0 : 관리자, 1~499 : 시스템 계정, 500~ : 일반 계정)


miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 그룹 ID를 표시한다.


miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000:(null):/home/mirUseradd:/bin/sh

- 계정정보(Comment)를 표시한다. 


miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 홈 디렉토리를 표시한다.


miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

mirUseradd:x:1000:1000::/home/mirUseradd:/bin/sh

- 로그인 쉘을 표시한다.

분명 위에서 useradd 명령은 홈 디렉토리를 따로 설정해줘야 된다고 말했지만 계정정보를 보면 홈디렉토리가 보인다.

하지만 실제로 홈 디렉토리를 가볼려고 하면 디렉토리가 없다고 표시된다.

$   cd /home/mirUseradd
-bash: cd: /home/mirUseradd: 그런 파일이나 디렉터리가 없습니다    

즉 설정된 홈디렉토리를 생성시켜주거나 다른 홈디렉토리를 생성하여 설정값을 바꿔줘야 한다.


4. /etc/shadow - 암호 정보 파일

- 사용자 인증에 필요한 암호 정보를 가지고 있다. cat 명령어로 내용을 살펴 보자.

$   cat /etc/shadow
[생략]...
miradduser:$6$..[생략]..vE.:16596:0:99999:7:::
mirUseradd:!:16595:0:99999:7:::

암호정보도 하나하나 분석해보자.

miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 사용자 계정을 표시한다.


miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 암호화 시킨 패스워드를 표시한다. (useradd명령어로 추가한 계정에는 패스워드가 없어서 !로 표시됨)


miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 1970년 1월 1일 기준으로 패스워드를 수정한 마지막 날짜를 계산하여 표시한다.


miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 패스워드를 변경하기위한 최소 사용일수를 표시한다.


miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 패스워드를 사용할수 있는 최대 사용일수를 표시한다.


miradduser:$6$..[생략]..vE.:16596:0:99999:7:::

mirUseradd:!:16595:0:99999:7:::

- 패스워드 만기일 전에 경고메세지를 몇일전 부터 알려줄지 표시한다.


miradduser:$6$..[생략]..vE.:16596:0:99999:7:(null)::

mirUseradd:!:16595:0:99999:7:(null)::

- 로그인 차단 일수를 표시한다. (현재는 아무런 정보가 없어서 임의로 null로 표시해주었다.)


miradduser:$6$..[생략]..vE.:16596:0:99999:7::(null):

mirUseradd:!:16595:0:99999:7::(null):

- 얼마간 로그인 차단을 시킬지 표시한다. (현재는 아무런 정보가 없어서 임의로 null로 표시해주었다.)


miradduser:$6$..[생략]..vE.:16596:0:99999:7:::(null)

mirUseradd:!:16595:0:99999:7:::(null)

- 현재는 사용되지 않는 정보이다.



5. usermod [옵션] [계정명]- 계정 수정

- 옵션과 계정명을 받아서 해당 계정을 옵션의 명령에 따라 처리 한다.

-c : [Comment] - 계정 Comment를 수정한다.

-d : [Home Diretory] - 계정 홈 디렉토리를 수정한다.

-e : [Expiredate] - 계정 만기 날짜를 수정한다. 

-L : [Lock User] - 사용자 계정을 잠근다.

-U : [Unlock] - 잠금처리되어 있는 계정을 풀어준다.

-h : [Help] - 명령어 옵션 설명을 표시해준다.


위 옵션이외의 많은 옵션이 있으며 -h를 이용하여 알아보는것도 좋다.


몇몇 명령어를 테스트 해볼겸 useradd로 생성시킨 계정에 Comment를 넣어보자.

$   usermod -c Comment_Test mirUseradd

확인은 /etc/passwd를 살펴보면 된다.

[생략]...
mirUseradd:x:1000:1000:Comment_Test:/home/mirUseradd:/bin/sh
miradduser:x:1002:1002:Mir,2000,0101111111,0102222222,test:/home/miradduser:/bin/bash

새로운 Comment가 추가된것을 확인할수 있다.


6. passwd [계정명] - 계정 암호 수정

- 계정 Password를 수정시 usermod -p를 사용하면 /etc/shadow를 직접 바꾸게 되기때문에 실제로 바꾼 Password로 로그인을 할수가 없다. 그래서 passwd 명령어를 사용하여 수정해주어야 한다.

$   passwd  mirUseradd
새 UNIX 암호 입력:
새 UNIX 암호 재입력:
passwd: password updated successfully

새 암호 입력후 확인을 위해 /etc/shadow를 살펴보자

[생략]...
mirUseradd:$6$Vx23FZI.$6pguZVI5T9oO7nVf7N7cURTqrPAvBj4nT.6LEuIY99fZJxvRabKNp3OuK4jc2TYeE/mE6nlKqy0e0ZXiMUhrs.:16596:0:99999:7:::
miradduser:$6$uqJt2OQg$ZZtpcfz7WMdvOx1gmDzlYEuM4l1vKNyF9.SdkqZwsNIw0z8kO50O8nNmB7fj.tOHmXbFdu9Ty0M1hv0brymZR0:16596:0:99999:7:::

위에서 살펴볼때는 아무 설정도 되어 있지 않았지만 현재는 암호화되어 Password가 들어가 있는것이 확인 된다.


7. deluser [계정명] - 계정 삭제

- 계정을 삭제하는 명령어이다. 

기본적으로 계정만 삭제되며 계정에 관련된 폴더, 파일을 삭제할려면 옵션을 주어야 한다.

$   deluser mirUseradd
$   deluser -remove-all-files miradduser

useradd로 추가한 계정은 어차피 계정 정보밖에 없으므로 옵션을 주지 않고 삭제하였고 

adduser로 추가한 계정은 홈디렉토리까지 삭제하기 위해 옵션을 주었다.

만약 옵션을 주지 않고 삭제한경우 홈디렉토리가 그대로 남아있는걸 확인할수 있다.

root@mirwebma001:~# ls /home
miradduser


리눅스 계정관리에 관한 기본적인 명령어를 살펴보았다.

다음번엔 리눅스 계정에 sudo 권한 부여에 대해 알아보겠다.


참고로 useradd로 계정을 생성할경우 다양한 옵션값으로 생성시 모든 정보를 입력할수도 있지만

특별한 경우가 아니면 adduser 명령어로 그냥 자동으로 생성되게 하는게 편한듯 하다.



출처: http://mirwebma.tistory.com/112 [Run and Fly]

반응형

'연구개발 > Ubuntu' 카테고리의 다른 글

tail 원격  (0) 2018.07.29
jenkins (젠킨스) 설치  (0) 2017.07.06
한글  (0) 2016.05.22
[Ubuntu] 시간 동기화 - ntpdate  (0) 2014.12.12
ubuntu mysql 삭제  (0) 2014.10.27
반응형

There is no default zmodem protocol support on amazon ec2 instance, so we need to install one manually (We use lrzsz as example here. You can get the latest version on lrzsz’s website). Follow these simple steps to install:

  1. wget http://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz
  2. tar -xzvf lrzsz-0.12.20.tar.gz
  3. cd lrzsz-0.12.20
  4. ./configure –-prefix=/usr/local/lrzsz
  5. make
  6. sudo make install
  7. cd /usr/bin
  8. ln -s /usr/local/lrzsz/bin/lrz rz
  9. ln -s /usr/local/lrzsz/bin/lsz sz

now try running rz on your ec2 install, the file upload window should be shown :)

반응형

'연구개발 > AWS' 카테고리의 다른 글

ec2 metadata  (0) 2017.07.07
[AWS] EC2 Linux(Ubuntu) 계정 추가 & 설정  (0) 2017.06.22
아마존 클라우드 Ubuntu에서 한글 사용  (0) 2016.05.18
aws. instance. clone. 복제  (0) 2016.02.19
리눅스 시간 동기화  (0) 2015.11.06
반응형

제1장 OS의 개요

1.1 OS의 개념 및 종류

1.1.1 운영체제의 개념

     (1) 정의 - 제한된 컴퓨터의 각종 자원을 효율적으로 관리, 운영함으로써 사용자에게 최대의 편리

                성을 제공하고자 하는 인간과 컴퓨터 사이의 인터페이스를 위한 시스템 소프트웨어

     (2) 역할 - 사용자와 컴퓨터 시스템간의 인터페이스 정의

              - 사용자들간의 하드웨어의 공동사용         - 여러 사용자간의 자원 공유    

              - 자원의 효과적인 운영을 위한 스케쥴링     - 입출력에 대한 보조 역할      

              - 에러에 대한 처리                         - 사용자들간의 간섭 방지

              - 자원의 사용량 계산                       - 병렬 수행을 위한 편의 제공

              - 데이터에 대한 보안과 신속한 사용         - 통신 네트워크 관리

     (3) 목적

        1) 사용의 편리성 - 사용자로 하여금 컴퓨터의 하드웨어와 각종 정보를 효율적으로 관리하여 

                           컴퓨터를 보다 편리하게 사용할 수 있도록 제공

        2) 시스템 성능의 향상 - 성능의 최대 발휘를 목적으로 하며 다음의 기준으로 판단

           ① 처리능력(throughput) - 일정 단위 시간 동안 컴퓨터가 처리하는 작업의 양

           ② 응답시간(turn around time) - 한 작업을 처리할 때 입력으로부터 결과가 출력될 때까지

                                           의 경과 시간

           ③ 사용의 용이성(availability) - 사용자가 필요로하는 컴퓨터를 적절한 때에 얼마나 빨리 

                                          사용할 수 있도록 할 것인가

           ④ 신뢰도(reliability) - 컴퓨터가 올바로 작동되는가

     (4) 구성

        1) 제어 프로그램(control program)

           ① 감시 프로그램(supervisor program)

           ② 데이터 관리 프로그램(data management program)

           ③ 작업 제어 프로그램(job control program)

        2) 처리 프로그램(processing program)

           ① 언어 번역 프로그램(language translator program)

           ② 서비스 프로그램(service program)

           ③ 문제 프로그램(problem program)

     (5) 운영체제의 구조

        - 커널 : 인터럽트처리기, 디스패쳐, 프로세서 동기를 위한 기능 지원, H/W와 밀접하게 관련

        - 기억장치 관리기       - 입출력 시스템        - 파일 관리기

        - 단기 스케줄러 : 시스템 내 활성 큐 관리, CPU 관리, H/W와 무관

        - 자원관리기 : CPU를 제외한 다른 자원들을 관리

        - 장기 스케줄러 : 프로세서의 생성, 소멸, 제어를 담당

        - 명령어 해석기 : 사용자와 직접 대화, Shell 이라 부름


1.1.2 OS의 종류

     (1) 운영체제의 등장

         1) 1950년대 초 general motors사에서 IBM 701을 위한 최초의 운영체제를 개발하였으며 그 전에는 

            운영체제의 할 일이 사람에 의해서 직접 처리되었다.

         2) 특징(1950년대) - 일괄처리 시스템의 시작

                          - 작업제어 언어의 등장

     (2) 초기 운영체제 시스템

         - 한번에 하나의 작업만 수행하며 준비시간이 많이 걸린다

         - 장치 구동기 사용

     (3) 일괄처리 시스템(batch processing system)

         1) 1950년대 초기의 컴퓨터 처리방법 중 하나로 처리할 데이터를 일정량을 모아 한꺼번에 처리 

         2) 상주모니터(resident monitor) - 사용자가 한번에 한 작업씩 수행하던 것을 한 개의 batch로 묶어 

                                          자동 처리되게 한 OS

             * 상주모니터 구성요소

                - 인터럽트와 트랩 벡터, 장치 구동기, 작업의 순서화(대기 작업들), 제어카드 해석기

         3) 장점 - 시스템의 사용계획을 구체적으로 세워 능률적으로 사용할 수 있다

         4) 단점 - 반환시간이 늦고 프로그램의 오류수정 작업이 어려우며 CPU가 유휴상태로 되기 쉽다

             * 단점 보완 방법

               - 상주모니터, 오프라인 연산, 버퍼링, 스풀링

     (4) 다중 프로그래밍 시스템(multi programming system)

         - 하나의 중앙처리장치에 여러 개의 프로그램을 실행시킴으로써 짧은 시간에 많은 작업을 수행할 

           수 있게 하여 시스템의 효율을 높여 주는 것

         1) 고려사항 - CPU스케줄링, 기억장치관리기법, 장치스케줄링, 교착상태, 병행제어 및 보호문제

         2) 장점 - 다중 작업을 구현하므로 시스템의 효율이 높다

         3) 단점 - CPU의 유휴 시간이 길어진다

                 - 기억장치 관리 기법, CPU 스케쥴링 기법이 필요

     (5) 다중 처리 시스템(multi processing system) 기출96

         - 하나의 공용 기억장치를 통하여 두 개 이상의 프로세서를 제어하는 시스템

         - 공유된 주기억장치의 사용을 스케줄링 하는데 어려움이 존재

         1) 장점 - CPU를 여러 개 사용하여 작업속도와 신뢰성을 높일 수 있다

     (6) 시분할 시스템(time sharing system)

         - 한 대의 컴퓨터로 일정한 시간 내에 여러 가지 작업을 처리하는 방법

         1) 장점 - 여러 사람이 공동으로 CPU를 사용하며 여러 개의 프로그램을 기억장치에 적재

         2) 단점 - 운영체제를 복잡하게 한다

     (7) 실시간 시스템(real time system)

         - 처리 대상 데이터가 발생하는 즉시 처리하여 결과를 산출하는 방식

         1) 장점 - 사용자의 노력이 절감되고 처리시간이 단축되며 처리비용이 절감

         2) 단점 - 입출력 자료의 일시저장 및 대기가 필요하고 특정상태의 재현이 불가능

                 - 시스템에 장애가 발생할 때 단순한 재실행이 불가능

     (8) 분산처리 시스템(distributed processing system)

         - 지역적으로 분산되어 있는 여러 대의 컴퓨터가 프로세서 사이의 특별한 데이터 링크를 통해 교신

           하면서 한 조직 내의 동일한 업무를 수행하고 정보 교환을 위해 네트워크로 상호 결합된 시스템

         - 특징 : 자원공유, 신뢰성, 계산속도 증가, 통신


1.1.3 운영체제 관점

 * 운영체제에 대한 사용자의 관점은 시스템 프로그램 특히 명령어 해석기에 의해 결정

     (1) 프로세스 관점

         1) 운영체제를 프로세스의 상태를 변화시키는 프로그램의 일종으로 보는 관점

         2) 중앙처리장치는 한 시점에서 하나의 작업만 수행하므로 각 프로세스의 상태를 변화시켜야 한다

     (2) 자원 관리자 관점

         - 운영체제를 시스템 자원들을 관리하기 위해 설계된 프로그램의 집단이라고 보는 관점

         1) 프로세스 관리 기능 - 어느 작업에게 CPU를 할당할 것인가를 결정

         2) 기억장치 관리 기능 - 어느 프로세스에게 기억장치를 할당할 것인가를 결정

         3) 장치관리 기능 - 장치를 할당하는데 어떤 방법이 효율적인지를 결정

         4) 정보관리 기능 - 어느 작업에게 어떤 자원을 사용하도록 할 것인지를 결정

     (3) 계층구조 관점

         1) 계층 1 - 프로세서 관리

            : 동기화 및 프로세서의 스케쥴링을 위한 프로세서 관리를 담당

         2) 계층 2 - 기억장치 관리

            : 기억공간의 할당 및 회수 기능을 실행하는 기억장치 관리를 담당

         3) 계층 3 - 프로세스 관리

            : 프로세스의 생성, 제거, 프로세스간 메시지전달, 프로세스의 시작과 정지 담당

         4) 계층 4 - 주변장치 관리

            : 주변장치의 상태파악 및 입출력 장치의 스케쥴링을 하고 입출력에 대한 전반 사항 지시

         5) 계층 5 - 파일 및 데이터 관리

            : 파일 생성과 소멸, 파일 오픈과 닫기, 파일의 유지 및 관리 등을 담당

     (4) 하드웨어 확장 관점 - 운영체제를 하드웨어의 기능 확대라는 측면에서 보는 관점

     (5) 기능적 관점 - 운영체제를 시스템 구성원 중의 일부로 보는 관점

     (6) 작업제어 언어 관점


1.2 System Software의 종류

1.2.1 System Software의 개념

     (1) 정의 - 특정한 문제를 해결하기 위한 알고리즘을 하드웨어에 정의해 주는 명령문과 데이터를 가진 

                프로그램으로 구성

     (2) 특징 - 컴퓨터의 작동, 수행에 있어서 기본이 되며 하드웨어 환경을 직접 제어

              - 컴퓨터 제조회사나 시스템 프로그래머에 의해 작성


1.2.2 System Software의 종류

     (1) 매크로(macro) - 프로그램에서 동일한 코드가 반복되어 나타나는 경우 이를 매번 나열하기 보다

                         하나의 간단한 코드로 정의하여 사용하는 기법

     (2) 링커(linker)

         - 목적프로그램 안에서 다른 목적프로그램을 호출하거나 여러 목적 프로그램들이 하나의 데이터를 

           공동으로 이용할 수 있도록 각 모듈간의 호출 및 공동 데이터의 이용을 가능하게 해주는 시스템 

           프로그램

     (3) 로더(loader)

        1) 절대로더(absolute loader) - 기계어 코드 프로그램에서 미리 지정한 번지에 프로그램과 데이터를 

                                      로드 한다

        2) 상대로더(relocating loader) - 로드 과정에서 메모리의 적당한 영역을 찾아 로드


2장 프로세스 관리

2.1 프로세스의 개념

2.1.1 프로세스 기출95

     (1) 개요 - 시스템에서 진행 중에 있는 모든 활동을 의미

     (2) 정의 - 현재 실행중이거나 곧 실행이 가능한 PCB를 가진 프로그램

              - 비동기적 행위, 순차적 실행, 능동적 개체, 수행중의 작업

              - 목적 또는 결과에 따라 발생되는 사건들의 과정

              - 지정된 결과를 얻기 위한 일련의 계통적 동작

              - 프로세스가 할당하는 개체로서 디스패치가 가능한 단위


2.1.2 순차 프로세스   - 의미 : 현재 실행중인 프로세스


2.1.3 프로세스의 상태

     (1) 프로세스 상태도

          보류(pending) → 준비(ready) ← 대기(blocked)

                                ↓↑      ↑

                                실행(running)

                                     ↓

                                완료(terminate)

     (2) 프로세스 상태

         1) 보류상태(pending) - 작업이 제출되어 스풀공간인 디스크에 수록되어 있는 상태

         2) 준비상태(ready)

            - CPU를 할당받을 수 있는 상태로서 CPU가 프로세스 자신을 처리해 주기를 기다리고 있는 것

         3) 실행상태(running)

             - 프로세스가 CPU를 차지하고 있는 상태로서 CPU에 의해 프로세스를 수행하고 있는 것

             - 부모 프로세스는 모든 자식 프로세스들이 종료될 때까지 기다린다

         4) 대기상태(blocked)

             - 프로세스가 CPU를 차지하고 실행되다가 입출력 처리와 같은 사건이 발생하게 되면 CPU를 

               양도하고 입출력 처리가 완료될 때까지 대기 큐에서 대기하고 있는 상태

         5) 완료상태(terminated)

             - 프로세스가 CPU를 할당받아 주어진 시간 내에 수행을 종료한 상태

             - 문장이 실행을 마쳤을 때 부모 프로세스에게 실행 결과를 돌려준다

     (3) 프로세스의 상태 전환 기출94

         1) 준비상태 -> 실행상태 : dispatch

            - 준비 상태의 프로세스들 중에서 우선순위가 가장 높은 프로세스를 선정하여 CPU를 할당함으

              로써 실행상태로 전환

         2) 실행상태 -> 준비상태 : time runout(할당시간 초과)

            - CPU의 지정된 할당 시간을 모두 사용한 프로세스는 다른 프로세스를 위해 다시 준비 상태로 

              되돌아간다

         3) 실행상태 -> 대기상태 : block

            - 실행중인 프로세스가 입출력 명령을 만나면 인터럽트가 발생하여 입출력 전용 프로세서에게 

              CPU를 양도하고 자신은 대기 상태로 전환 

         4) 대기상태 -> 준비상태 : wake up

            - 입출력 완료를 기다리다 입출력 완료 신호가 들어오면 대기중인 프로세스는 준비 상태로 전환


2.1.4 프로세스 제어블록(PCB)

     - 운영체제에 프로세스에 대한 중요한 정보를 제공해 주는 자료구조 테이블

     (1) PCB 수록 내용 기출94 기출96

         1) 프로세스 상태 - 보류, 실행, 준비, 대기, 정지 등의 상태

         2) 프로세스 번호 - 프로세스의 고유 번호

         3) 프로그램 카운터 - 프로세스가 다음에 실행할 명령어의 주소

         4) 레지스터 - 누산기, 인덱스레지스터, 스택 레지스터 등 범용레지스터와 상태코드 정보

         5) 기억장치 관리정보 - 경계 레지스터나 페이지 테이블들을 포함

         6) 계정 정보(회계정보) - CPU가 사용된 시간량, 시간의 범위, 계정번호, 작업 또는 레지스터 번호

         7) 입출력 상태 정보 - 입출력 요구들, 입출력 장치들과 개방된 파일 목록등

     (2) PCB의 관리

       - 프로세스 생성시에 만들어지며 모든 프로세스는 각각 고유한 PCB를 가지게 되고 수행이 완료된 

         프로세스인 경우에는 해당 PCB도 함께 삭제된다


2.1.5 프로세스 스케줄러의 종류 기출96

     (1) 장기 스케줄러(작업 스케쥴러)

         - 모든 job의 상태 파악, 다음에 수행될 job 선택, 시스템 자원 분배

         - 디스크 공간에 제출된 프로세스들을 선택하여 주기억 장치로 적재

         - 실행 간격이 비교적 크기 때문에 다음에 실행할 적절한 프로세스를 선택하는 시간을 더 사용해도 

           된다, 처리될 작업 결정, 다중 프로그래밍의 정도를 결정

     (2) 단기 스케쥴러(CPU스케쥴러)

         - 실행 준비가 되어있는 프로세스들 중에서 한 프로세스를 선택하여 CPU를 할당

         - 프로세스들간에 CPU를 자주 선택하기 때문에 수행 빈도수가 많고 각 프로세스의 CPU 할당 시간

           을 적게 한다면 더욱 자주 수행될 것이다, 주기억장치 내 작업들 중 실행작업 선택

     (3) 중기 스케쥴러

         - 기억장치에서 CPU를 경쟁하는 프로세스들의 수를 줄여서 다중 프로그래밍의 정도를 완화하는 것


2.1.6 프로세스의 종류

     (1) 독립적 프로세스(independent process)

         - 한 프로세스가 실행되면 다른 프로세스에 영향을 주거나 받지 않는 프로세스

         1) 프로세스가 독립적이므로 타 프로세스에 의한 공유가 없다

         2) 동일 입력은 동일한 결과를 갖는다

         3) 실행결과는 입력에 의해서만 결정된다

         4) 안정적으로 중단, 재실행될 수 있다

     (2) 유기적 프로세스(cooperating process)

         - 다른 프로세스와 데이터를 공유함으로써 영향을 주고받는 프로세스를 말한다

         1) 프로세스를 공유한다

         2) 실행결과는 입력뿐 아니라 상대적 실행순서에 의존한다

         3) 동일한 입력이라도 실행결과는 매번 다를 수 있다


2.2 병행 프로세스

2.2.1 병행 프로세스의 개요

  - 의미 : PCB를 가진 두 개 이상의 프로그램이 각각의 프로세스를 형성하여 동시에 수행


2.2.2 병행 프로세스에서 사용되는 주요 개념

     (1) 경쟁조건(race condition)

         - 공유메모리 : 함께 동작하는 프로세스들은 종종 메모리를 공유함

         - 경쟁 조건 : 2개 이상의 프로세스들이 공유 메모리에 읽기/쓰기를 하고, 그 결과가 어떤 프로세스

                       에 언제 실행되느냐에 따라 달라질 수 있는 상황

     (2) 상호배제(mutual exclusion)

         - 경쟁조건을 피하기 위한 방법

         - 상호배제 : 한 프로세스가 공유 메모리 혹은 공유 파일을 사용하고 있을 때 다른 프로세스들이 

                      사용하지 못하도록 배제시키는 제어기법 

                   or 두 프로세스가 하나의 자원을 동시에 점유할 수 없도록 조절하여 순차적으로 사용할 

                      수 있도록 하는 것(=상호보완)

     (3) 임계영역(critical section) 기출94

         - 임계영역 : 공유 메모리가 참조되는 프로그램의 부분

              or 두 프로세스가 한 버퍼에 있는 데이터를 동시에 접근하여 읽기/쓰기를 하고자 할 때의 버퍼 

         - 시간 종속 오류를 다루는 최초의 고급 수준 언어구조

           * 시간 종속 오류 : 프로세스들이 임의적으로 변수들을 공유할 때, 특정 순서로 실행될 때 발생

         - 임계영역 문제

            : 프로세스들이 서로 유기적으로 사용해야 하는 프로토콜을 설계

            : 각 프로세스는 그 임계구역에 들어갈 수 있는지의 여부를 미리 요청

            : 해결 ; 동기화 장치 또는 세마포어

         - 수행 순서를 잘 조절하여 2개 이상의 프로세스가 동시에 임계영역에 들어가지 않도록 한다면 

           경쟁 조건을 피할 수 있다

         - 상호배제를 위한 4가지 요구조건

           ① 상호배제조건 : 두개 이상의 프로세스들이 동시에 임계영역에 있어서는 안됨

           ② 진행조건 : 임계구역 바깥에 있는 프로세스가 다른 프로세스의 임계구역 진입을 막아서는 안됨

           ③ 한계대기조건 : 어떤 프로세스도 임계구역으로 들어가는 것이 무한정 연기되어서는 안됨

           ④ 프로세스들의 상대적인 속도에 대해서는 어떠한 가정도 하지 않는다


2.2.3 병행 프로세스의 문제점

     (1) 동기화(synchronization)

         - 두 프로세스가 한 기능을 사용할 때 상호배제가 이루어지도록 공동 협력하여 사용하는 것

     (2) 결과의 동일성 문제(determinancy)

         - 여러 프로세스가 동시에 수행될 때 각 프로세스의 수행결과는 수행순서와 시간에 관계없이 항상

           같아야 함

     (3) 의사소통 문제(communication)

         - 프로세스 사이의 데이터 교환에 관한 문제로서 일반적으로 메시지 전달 방법을 이용하여 데이터

           의 송수신을 확인

     (4) 외부 스케줄(explicit schedule)

         - 외부에서 프로그래머가 프로그램의 개발, 운영체제의 개발을 통하여 직접 해결할 수 있도록 하는 

           문제

     (5) 교착상태 문제(dead lock)

         - 상호배제와 동기화문제를 해결하지 못하여 프로세스들이 아무런 작업도 수행할 수 없도록 되는 

           문제

     (6) 동시처리 문제(concurrent processing)

         - 프로그래머가 직접 언어를 통하여 병행처리가 가능하도록 프로그래밍하는 것


2.2.4 세마포어(semaphore)

     (1) 세마포어의 개요 기출95 기출96

         1) 세마포어란 ?

            - 복잡한 문제에 있어서 상호배제를 해결하기 위한 동기화 도구

            - 신호기라는 뜻으로 각 프로세서에 제어신호를 전달하여 순차적으로 진행하기 위한 동기화구현

            - Dijkstra-데커의 알고리즘을 n개의 프로세스로 확장하여 상호배제 문제를 소프트웨어로 해결

         2) 세마포어의 사용

            - n개의 프로세스 임계구역 문제를 다루는데 사용

            - 여러 가지 동기화 문제를 해결하는데 사용

     (2) 표준연산

         - 세마포어 S는 표준단위연산 P(wait)와 V(signal)에 의해서만 접근 가능한 변수

         1) P(wait) 연산 : 프로세스를 대기상태로 전환하는 wait 연산을 수행

            # s.wait():

                 if (s.value > 0)  s.value--;

                 else 현재의 프로세스를 s.list에서 기다린다

         2) V(signal) 연산 : 프로세스에게 wake up 신호를 전달하는 signal 연산을 수행

            # s.signal():

                 if (1개 이상의 프로세스가 s에서 대기중이면)  그 중 1개 프로세스 수행

                 else s.value++;

         3) wait와 signal 연산이 세마포어 변수를 수정하는 것은 개별적으로 수행되므로 한 프로세스가 

            세마포어 변수 s를 수정 하면 다른 프로세스는 동일 변수 s에 대해 수정할 수 없다

     (3) 세마포어 응용

         1) 세마포어를 이용한 상호배제의 구현

            - 단지 세마포어 변수의 값을 1로 주고 임계영역에 들어가기 전에 wait를, 나올 때 signal을 호출

              하기만 하면 된다

         2) 세마포어를 이용한 동기화

            - block/wakeup 프로토콜 : 한 프로세스가 입출력을 요구하면 입출력이 끝날 때까지 그

              프로세스는 블록 상태가 되는데 이때 다른 프로세스는 이 블록된 프로세스를 깨워 줌

         3) 세마포어를 이용한 생산자 소비자 문제

            - 생산자는 소비자의 버퍼가 비었는지를 기다리고 소비자는 생산자의 버퍼가 채워졌는지를 

              기다림


2.2.5 모니터(monitor)

     - 상호배제에 대한 문제를 확실히 해결하여 여러 프로세스들이 자원을 안전하고 효과적으로 공유 할 수 

       있도록 한 기법

     (1) 목적 : 동기화를 자동적으로 제공하기 위함

     (2) 특징

         1) 모니터는 상호배제를 엄격하게 실시되어 한 순간에 하나의 프로세스만 모니터 내에서 수행

         2) 순차적으로만 사용할 수 있는 공유자원을 할당하는데 사용된다

         3) 데이터, 프로시저를 포함하는 병행성 구조

         4) 정보의 은폐(information hiding) 기법 - 모니터내부의 변수는 모니터 내부에서만 접근가능

         5) 모니터는 프로세스들이 추상 자료형을 안전하고 효과적으로 공유할 수 있게 함 


2.2.6 프로세스간 통신

     (1) 통신기법 기출94 기출95

         1) 공유 기억장치 기법(shared memory)

            - 통신하는 프로세스간에 기억장치 공간의 일부를 공유하도록 한다.

            - 통신 제공의 책임은 프로그래머에게 달려 있고, 운영체제는 단지 공유 기억장소만 제공

         2) 메시지 시스템 방법

            - 프로세스가 공유 변수에 의존하지 않고도 메시지를 이용하여 서로 통신할 수 있다.

            - 메시지를 관리, 전달하는 책임은 운영체제에 있다.

            - 일반적으로 send 와 receive 두 개의 연산을 제공한다.

            - 발생 가능한 예외적 상황 : 프로세스 종료, 메시지 상실, 메시지 혼합

            - 프로세스에 의해 보내지는 메시지 형태 : 고정크기, 가변크기, 타입을 가진 메시지

     (2) 명명(naming)

         1) 직접 통신 링크

            - 메시지를 주고받기를 원하는 프로세스가 수신자나 송신자의 이름을 명시적으로 표현해야 함

            - 통신을 원하는 프로세스 쌍 사이에는 자동으로 링크가 설정됨

            - 프로세스는 통신하는 상대 프로세스의 고유 이름만 알면 된다.

            - 링크는 두 프로세스와 관계하고 양방향성이다.

            - 어드레싱면에서 대칭적이고 일대일 통신이다.

            - 안정성과 신뢰성이 높다.

         2) 간접 통신 링크

            - 우편함을 통하여 메시지를 주고받을 수 있다.

            - 각 우편함은 메시지를 구별할 수 있는 유일한 이름을 갖는다.

            - 두 개의 프로세스는 공유 우편함을 갖고 있을 때에만 링크가 성립하여 통신이 가능하다.

            - 각 프로세스 쌍 사이에, 하나의 우편함에 관계되는 여러 개의 서로 다른 링크가 있을 수 있다.

            - 링크는 단방향 또는 양방향일 수 있다.


2.3 교착상태(Deadlock)

2.3.1 교착상태의 개요 기출95

     (1) 정의 

         1) 하나 또는 둘 이상의 프로세스가 더 이상 계속할 수 없는 어떤 특정 사건(자원의 할당과 해제)을 

            기다리고 있는 상태

         2) 둘 이상의 서로 다른 프로세스가 요구한 자원을 할당받아 점유하고 있으면서 상호간에 상대방 

            프로세스가 가지고 있는 자원을 요구하는 경우

     (2) 발생 예

         - 프로세스 1은 자원 1을 가지고 있으면서 자원 2를 요구하고, 프로세스 2는 자원 2를 가지고

           있으면서 자원 1을 요구하는 상태

     (3) 스풀링 시스템에서 교착상태

         1) 현재 수행중인 여러 작업이 인쇄할 행을 만들어 스풀링 파일로 보내고 있는 도중 이미 스풀링 

            파일 공간이 차버린 경우

         2) 교착상태 해결방법

            - 예상 필요 공간보다 많은 스풀링 파일 공간을 할당

            - 스풀링 파일이 일정한 포화 임계치를 넘지 못하도록 억제

     (4) 무한연기(infinite postpoment)

         1) 정의 - 여러 다른 프로세스들이 시스템에서 스케쥴링되어 처리되는 동안 한 특정 프로세스의

                   스케쥴링이 무기한으로 연기될 수 잇는 현상

         2) 발생원인 - 시스템(운영체제)의 편중된 자원 할당 정책 때문

         3) 노화(aging) 기법 - 프로세스가 자원을 기다리고 있는 시간에 비례하여 우선순위를 부여 기출95

  * 기아상태(starvation)

     - 자원 선점을 이용하여 교착상태를 제거하는데 있어서 희생자 선택을 할 때 동일한 프로세스가 매번

       선택되어 지정된 작업을 결코 완료할 수 없는 경우.


    # 무한연기와 교착상태의 비교

      

     (5) 자원의 종류

         1) 선점형 자원(preemptive resource)

            - 자원이 어떤 프로세스에게 할당되면 도중에 빼앗기는 경우

            - CPU나 주기억 장치

         2) 비선점형 자원(non-preemptive resource)

            - 일단 그 자원이 어떤 프로세스에게 할당되면 도중에 빼앗기지 않는 경우

            - 디스크, 테이프

         3) 전용 자원

            - 디스크나 테이프 같이 특정의 한 프로세스가 독점하여 사용하는 자원

         4) 공용 자원

            - 주기억장치, CPU같이 다수의 프로세스들 사이에서 공동으로 사용되는 자원

         5) 재사용(reusable) 자원

            - 전체 총량이 고정되고 부수적인 자원들이 생성되거나 파괴되지 않는 경우

         6) 소비(consumable) 자원

            - 전체 용량이 고정되지 않고 부수적인 자원들이 생성되거나 파괴되는 경우

     (6) 시스템 모델

         - 프로세스의 자원 사용 순서

         1) 자원요구(resource request)

            - 한 프로세스가 자원을 요구할 때 다른 프로세스가 이미 그 자원을 사용중이면 할당받을 수 

              없으므로 자원을 요구한 프로세스는 그 자원을 사용할 수 있을 때까지 기다린다

         2) 자원할당(resource allocation)

            - 프로세스는 운영체제로부터 자원을 할당받아 그 자원을 사용하여 수행을 계속한다

         3) 자원해제(resource release)

            - 프로세스는 이전의 자원요구에 의해 할당받았던 자원을 사용 후에는 운영체제에게 반납한다


2.3.2 교착상태 발생의 4가지 필요조건

     (1) 상호배제(mutual exclusion) 조건

         - 프로세스가 사용중이면 다른 프로세스는 반드시 기다려야 한다. 프린터

         - 프로세스들이 자원을 배타적으로 점유하고 있어서 다른 프로세스들이 그 자원을 사용할 수 

           없도록 만든다.

     (2) 점유와 대기(block and wait) 조건 : 부분할당

         - 프로세스들은 동일한 자원이나 다른 종류의 자원을 부가적으로 요구하면서 이미 어떤 자원을

           점유하고 있다

         - 대기조건

            : 프로세스가 자원을 요청할 때 그 프로세스는 어떠한 자원도 할당받지 않은 상태여야 한다.

     (3) 비선점(non-preemption) 조건

         - 자원은 사용이 끝날 때까지 이들을 갖고 있는 프로세스로부터 제거될 수 없다.

         - 자원들은 그들을 점유하고 있는 프로세스로부터 벗어나지 못하고 단지 프로세스들 자신이 

           점유한 자원을 해제할 수 있다

     (4) 환형대기(circular wait) 조건

         - 프로세스와 자원들이 원형을 이루며 각 프로세스는 자신에게 할당된 자원을 가지면서 상대방의

           자원을 상호 요청하는 경우


2.3.3 교착상태의 연구분야

     (1) 교착상태의 예방(deadlock prevention)

         - 교착상태의 발생 가능성을 사전에 모두 제거하도록 시스템을 조절

         - 가장 명료한 해결책으로 널리 사용됨

         - 자원의 비효율적인 이용결과를 낳을 수 있음

         - 교착상태 발생 필요조건의 네 가지 중 하나를 부정함으로써 수행 됨

     (2) 교착상태의 회피(deadlock avoidance) 기출94

         - 교착상태 발생 가능성을 인정하고 교착상태가 발생하려고 할 때 이를 적절히 피해가는 방법

         - 예방보다는 좀더 덜 엄격한 조건을 요구

     (3) 교착상태의 발견(deadlock detection) 기출95

         - 불안정 상태가 만들어졌을 때 검출 알고리즘 실행

         - 원하는 것이든지 아니든지 교착상태가 발생하도록 허용하여 교착상태가 일어났는지를 판단하고

           교착상태에 관련된 프로세스와 자원을 조사하여 결정해 내는 방법

         - 프로세스와 자원을 결정해 내면 교착상태를 시스템으로부터 제거할 수 있다

     (4) 교착상태의 회복(recovery from deadlock)

         - 시스템으로부터 교착상태를 제거하여 이후로는 시스템이 교착상태에 빠지지 않고 잘 진행되게 함

         - 교착상태에 빠진 프로세스가 완료되고 그 프로세스에 할당된 자원을 회수할 수 있도록 한다

         - 교착상태 발생 확률이 작거나 회복비용이 적게 소요되는 컴퓨터 시스템에서 사용할 때 유리


2.3.4 교착상태의 해결방안

     (1) 교착상태의 예방

         - 사전에 교착상태의 발생 가능성을 없애는 것(교착상태 발생요건중 1개만 부정)

         - 자원의 낭비가 따른다

         1) 점유와 대기조건의 부정

            - 프로세스는 필요한 모든 자원을 한꺼번에 요청하고, 시스템은 요청된 자원들을 전부 할당하든

              지 전혀 할당하지 않든지 하는 방식

            - 장점 : 프로세스들이 자원을 기다리는 동안은 아무 자원도 점유하지 않으므로 점유와 대기조건

                     이 부정되며 교착상태도 발생하지 않는다

            - 단점 : 자원 낭비와 비용 증가, 자원공유 불가능, 무한 연기 발생 가능

         2) 비선점 조건의 부정

            - 어떤 자원을 가지고 있는 프로세스가 더 이상 자원 할당 요구가 없으면 가지고 있던 자원을

              반납하고, 필요시 다시 자원을 요구하는 방법

            - 문제점 : 비용증가, 무한연기 발생가능(시간낭비)

         3) 환형대기 조건의 부정

            - 모든 프로세스에게 각 자원의 유형별로 할당순서(고유번호)를 부여하는 방법

            - 문제점 : 새로운 자원 추가 시 재구성 해야함

         4) 상호배제 조건 부정

            - 공유할 수 없는 자원을 사용할 때 성립

     (2) 교착상태의 회피

         - 시스템의 운영중 상황을 보아가면서 교착 상태 가능성을 피해 가는 것

         1) 안전 상태와 불안전 상태

            - 안전상태 : 시스템이 특정 순서대로 각 프로세스에게 자원을 할당할 수 있고 교착상태를 

                         방지하여 모든 작업이 완료될 수 있는 상태

            - 불안전 상태 : 교착상태가 발생할 수 있는 상태

         2) 은행가(banker) 알고리즘

            - 알고리즘 구현을 위한 기본 자료구조

              * n : 시스템의 프로세스 수  m : 자원 형태(종류)의 수

              ① Available : 각 자원의 형태별로 사용가능한 자원의 수를 표시하는 길이가 m인 벡터

                            Available[j] = k라면, 자원형태 Rj인 자원이 k개가 남아 있다

                            (사용 가능하다)는 의미(잔여량)

              ② Max : 각 프로세스의 최대 자원의 요구를 정의하는 n×m 행렬 Max[i,j] = k라면

                        프로세스 Pi는 자원 형태가 Rj인 자원을 최대로 k개까지 요구할 수 있다는

                        의미(최대 요구량)

              ③ Allocation : 현재 각 프로세스에 할당된 자원의 수를 정의한 n×m 행렬 

                             Allocation[i,j] = k라면 프로세스 Pi는 현재 Rj라는 자원형태를 k개 할당 

                             받고 있다는 의미(할당량)

              ④ Need : 각 프로세스의 남아있는 자원요구를 표시하는 n×m 행렬 Need[i,j] = k라면 

                        프로세스 Pi는 자신의 작업을 종료하기 위해 자원형태 Rj를 추가로 k개 더 요

                        구한다는 의미(추가 요구량)

            <은행가 알고리즘>

              : Requesti를 프로세스 Pi를 위한 요청 벡터라 함. Requesti[j] = k라면 프로세스 Pi는

                Rj형 자원을 k개 요구한다. 프로세스 Pi가 자원을 요청하면 다음의 조치를 취함

              (ㄱ) Requesti ≤ Needi라면 (ㄴ)으로 가고 그렇지 않으면 최대 요구량을 초과하기

                   때문에 오류(요구량 > 필요량 → error)

              (ㄴ) Requesti ≤ Available라면 (ㄷ)으로 가고 그렇지 않으면 자원이 부족하기 때문에

                   대기(요구량 > 잔여량 → 대기)

              (ㄷ) 시스템은 상태를 다음과 같이 수행하여 요구된 자원들을 프로세스에게 할당되도록 

                   한다

                  Available(잔여량) = Available(잔여량) - Requesti(요구량)

                  Allocationi(할당량) = Allocationi(할당량) + Requesti(요구량)

                  Needi(필요량) = Needi(필요량) - Requesti(요구량)

         2) 안전 알고리즘

            <안전 알고리즘>

              (ㄱ) Work, Finish를 각각 길이가 m, n인 벡터라고 하면, Work = Available로

                   Finish[i] = false, i = 1, 2, 3, ..... , n으로 초기화 한다. Work에는 남아 있는

                   자원 수인 Available의 임시변수이다.

              (ㄴ) 다음과 같이 되는 i 값을 찾는다.

                   a) Finish[i] = false

                   b) Needi ≤ Work

                   이런 i 값이 존재하면 (ㄷ)으로 없으면 (ㄹ)로 간다.

              (ㄷ) 자원을 할당한 후 해제한다.

                   Work = Work + Allocationi 

                   Finish[i] = true

                   (ㄴ)단계로 간다.

              (ㄹ) 만약 모든 i에 대하여 Finish[i] = true면 시스템은 안전 상태

     (3) 교착상태의 발견

         - 시스템 운영중에 교착상태가 발생했는지 결정하고 교착상태에 관련된 프로세스와 자원을 발견

         1) 자원 유형마다 여러 개의 자원이 있는 경우

            - 자료구조 정의

              ① Available : 각 자원의 형태별로 사용가능한 자원의 수를 표시하는 길이가 m인 벡터

              ② Allocation : 현재 각 프로세스에 할당된 자원의 수를 정의한 n×m 행렬

              ③ Request : 각 프로세스의 현재 요구를 표시하는 n×m 행렬

              ④ Request[i,j] = k라면 프로세스 Pi는 자원형태 Rj의 자원을 k개 더 요구


            <발견 알고리즘>

              (ㄱ) Work, Finish를 각각 길이가 m, n인 벡터라고 하면, Work = Available로 초기화

                   한다. i = 1, 2, 3, ..... , n일 때 만약 Allocation ≠ 0이면 Finish[i] = false 이고,

                   그렇지 않으면 Finish[i] = true로 초기화한다.

              (ㄴ) 다음과 같이 되는 인덱스 i 값을 찾는다.

                   a) Finish[i] = false

                   b) Requesti ≤ Work

                   이런 i 값이 존재하면 (ㄷ)으로 없으면 (ㄹ)로 간다.

              (ㄷ) Work = Work + Allocationi 

                   Finish[i] = true

                   (ㄴ)단계로 간다.

              (ㄹ) Finish[i] = false면 1 ≤ i ≤ n인 범위에서 시스템은 교착상태

         2) 자원 유형마다 하나의 자원이 있는 경우 교착 상태 발견

            - 대기 그래프 사용 : 자원할당 그래프에서 자원형태 노드들을 삭제하고 적절히 연결선들을

                                 제거하여 사용

            - 대기 그래프가 사이클을 포함하는 경우 교착 상태 존재

     (4) 교착상태의 회복

         - 시스템이 교착상태에 빠지면 교착상태는 하나 또는 그 이상의 교착상태 필요조건을 제거함으로서 

           회복된다

         1) 프로세스 중지

            ① 교착상태 프로세스를 모두 중지하는 방법

               : 교착상태 사이클 제거시 효과적, 비용이 많이 든다

            ② 교착상태 사이클이 제거될 때까지 한 프로세스씩 중지 : 오버헤드가 걸림

            ③ 한 프로세스씩 중지를 위한 희생자 선택의 원칙(희생자 선택 시 고려사항) 기출96

               - 프로세스의 우선순위

               - 수행된 시간과 종료 시간(얼마나 수행되었고 앞으로 얼마나 수행될 것인가)

               - 사용한 자원의 유형과 수(얼마나 많은 자원을 사용중인가)

               - 종료를 위해 필요한 자원의 수(얼마나 많은 자원을 더 필요로 할 것인가)

               - 복귀하는데 포함된 프로세스의 수(몇 개의 프로세스를 복귀시킬 것인가)

               - 대화식인지 일괄 처리식인지의 여부

         2) 자원 선점

            - 교착상태의 프로세스로부터 자원을 선점하여 다른 프로세스에게 제공

            - 자원 선점 시 고려해야할 문제(교착상태 처리 시 강제해제의 문제점)

               : 희생자 선정문제, 복귀문제, 기아상태 문제


2.4 CPU 스케쥴링

2.4.1 스케쥴링

     (1) 개요

         1) 정의 - 작업을 처리하기 위해 프로세스들에게 중앙처리 장치나 각종 처리기들을 할당하기 위한

                   정책을 계획하는 것

         2) 목적

            - 공정한 스케줄링 : 무한대기에 빠지는 프로세스가 없어야 함

            - 처리능력 극대화 : 단위 시간당 처리량의 최대화

            - 응답시간 최소화 

            - 반환시간 예측가능 

            - 우선순위제 실시

            - 무한대기 상태 회피

            - 응답시간과 자원이용간의 균형유지

            - 균형있는 자원 사용

         2) 스케쥴링의 기준

            - I/O중심 프로세스와 연산중심 프로세스의 적절한 혼용

            - 작업형태 고려  - 우선순위 고려  - 페이지 부재율 고려  - 자원선점 고려

            - 버스트시간 고려  - 잔여 실행시간 고려

         3) 스케쥴링 알고리즘 성능의 기준

            - CPU이용율  - 처리율  - 수행시간  - 대기시간  - 응답시간

     (2) 프로세스 스케쥴링의 분류

         1) 단계별 분류

            ① 상위수준 스케쥴링(high level scheduling)

               - 시스템의 자원을 어느 작업에 할당할 것인가를 결정 = job 스케쥴링 = 승인 스케줄링

            ② 중간수준 스케쥴링(intermediate level scheduling)

               - CPU를 차지할 프로세스를 결정

               - 프로세스들을 일시중지시키거나 활성화시키는 작업을 수행하여 시스템의 부하를 조정

            ③ 하위단계 스케쥴링(low level scheduling)

               - 어느 프로세스에게 CPU를 할당할 것인가를 결정

               - 수행 속도가 빠르다

         2) 방법별 분류 기출96

            ① 선점(preemptive) 스케쥴링 - RR, SRT, 다단계(피드백) 큐

               - 한 프로세스가 CPU를 차지하고 있을 때 우선순위가 높은 다른 프로세스가 현재

                 프로세스를 중지시키고 자신이 CPU를 차지할 수 있는 경우

               - 높은 우선순위를 가진 프로세스들이 빠른 처리를 요구하는 시스템에서 유용

               - 빠른 응답시간을 요구하는 시분할 시스템에 유용

               - 높은 우선순위 프로세스들이 들어오는 경우 오버헤드를 초래

            ② 비선점(nonpreemptive) 스케쥴링

               - 한 프로세스가 CPU를 할당받으면 다른 프로세스는 CPU를 점유못함 

               - 짧은 작업을 수행하는 프로세스가 긴 작업이 종료될 때까지 기다려야 함

               - 모든 프로세스들에게 공정하고 응답시간의 예측이 가능

         3) CPU 스케쥴링 알고리즘별 분류

            ① 우선순위(priority) 스케줄링 - nonpreemptive

               - 프로세스에게 우선순위를 부여하여 우선순위가 높은 순서대로 처리

               - 일반 프로세스는 0~15사이, 실시간 프로세스는 16~31 사이의 우선순위를 받는다.

               ㄱ) 정적(static) 우선순위 방법

                   - 주변 환경 변화에 적응하지 못하여 실행중 우선순위를 바꾸지 않음, 

                     구현이 쉽고 오버헤드가 적다

               ㄴ) 동적(dynamic) 우선순위 방법

                   - 상황 변화에 적응하여 우선순위를 변경, 구현이 복잡, 오버헤드 많다,

                     시스템의 응답속도를 증가시켜 효율적

            ② 기한부(deadline) 스케줄링 - nonpreemptive

               - 작업을 명시된 시간이나 기한내에 완료되도록 계획

               - 작업시간이나 상황등 정보를 미리 예측하기가 어렵다

            ③ FIFO 스케줄링 - nonpreemptive

               - 프로세스들은 대기 큐에 도착한 순서대로 CPU를 할당 받는다

               - 일괄처리 시스템에서 주로 사용, 작업 완료 시간을 예측하기 용이

               - 짧은 작업이 긴 작업을 기다리게 됨

               - 중요하지 않은 작업이 중요한 작업을 기다리게하여 불합리

            ④ 라운드로빈(round robin) 스케줄링 - preemptive 기출94 기출96

               - FCFS에 의해서 프로세스들이 보내지며

               - 각 프로세스는 같은 크기의 CPU 시간을 할당받음, CPU의 타임슬라이스에 의해 제한 받음

               - 시분할 방식에 효과적, 할당시간의 크기가 매우 중요

               - 할당시간이 크면 FCFS와 같게되고, 작으면 문맥교환이 자주 일어난다.

               * SRR(selfish round robin)

                  - 프로세스가 시스템에 들어오면 우선순위가 활성 큐 내의 프로세스의 수준에 도달할

                    때까지 보류 큐에 머물러 있는 스케줄링 기법

            ⑤ SJF(shortest job first) 스케줄링 - nonpreemptive 기출94

               - 준비 큐 내의 작업 중 수행시간이 가장 짧다고 판단되는 것을 먼저 수행

               - FCFS보다 평균 대기 시간을 감소, 큰 작업은 시간 예측이 어렵다

               - 짧은 작업에 유리

            ⑥ SRT(short remaining time) 스케줄링 - preemptive

               - 가장 짧은 시간이 소요된다고 판단되는 프로세스를 먼저 수행

               - 남은 처리 시간이 더 짧다고 판단되는 프로세스가 준비 큐에 생기면 언제라도 실행중인 

                 프로세스가 선점 됨, 시분할 시스템에 유용, 서비스를 받은 시간 기록

               - 긴 작업은 SJF보다 대기 시간이 길다, 이론적으로 대기시간 최소

            ⑦ HRN(highest response ratio next) 스케줄링 - nonpreemptive

               - 긴 작업과 짧은 작업간의 지나친 불평등을 어느 정도 보완한 기법

               - 짧은 작업이나 대기시간이 긴 작업은 우선순위가 높아진다

               - 우선순위 = 

            ⑧ 다단계 큐(multilevel queue) 스케줄링 - preemptive

               - 작업들을 여러 종류의 그룹으로 나누어 여러개의 큐를 이용하는 기법

            ⑨ 다단계 피드백 큐(multilevel feedback queue) 스케줄링 - preemptive 기출95 기출96

               - 입출력 위주와 CPU 위주인 프로세스의 특성에 따라 서로 다른 CPU의 타임 슬라이스 부여

               - 짧은 작업에 유리, 입출력 위주의 작업에 우선권을 줌

               - 하위단계 큐일수록 할당시간은 커진다

            ⑩ FSS(fair share scheduling)

               - 프로세스들 집합간에 프로세스의 스케줄링을 지원

               - UNIX 환경에서 서로 관계 있는 사용자들에게 한정된 비용으로 시스템 자원을

                 사용할 수 있게 해준다.


제3장 기억장치 관리

3.1 주기억 장치 관리

3.1.1 개요

     (1) 용어

        - 주기억 장치 : CPU가 명령이나 자료를 직접 인출 혹은 반환할 수 있는 기억장치의 부분

        - 가상기억장치 : 특정 컴퓨터 시스템에서 주기억 장치의 이용 가능한 기억 공간보다 훨씬 큰 주소

                         지정을 할 수 있도록 하는 기법

        - 단일 사용자 시스템 : 한 사람이 CPU와 모든 주기억 장치를 할당받아 사용하는기법

        - 동적적재 : 기억장치의 효율을 높이기 위해 사용. 사용되지 않는 루틴은 주기억장치에 적재되지 

                     않는다

        - 동적연결 : 언어 서브루틴 라이브러리들과 같은 시스템 라이브러리의 연결이 수행시간까지 지연

        - 절대로더 : 기계어로 된 프로그램을 미리 지정된 주기억 장치에 적재

        - 재배치로더 : 적재시간에 주기억 장치의 사용여부에 따라 주기억 장치의 여러 다양한 곳에 적재

        - 링킹로더 : 프로그램 적재시 필요한 프로그램들을 결합하여 이진 프로그램 이미지를 주기억장치에 

                     적재

        - 링키지에디터 : 링킹로더의 기능과 더불어 이진프로그램 이미지를 디스크에 보관

     (2) 기억장치 관리 정책

        1) 반입정책(fetch strategic) - 프로그램이나 데이터의 주기억장치 적재 시기 결정

           ① 요구 반입정책(demand fetch strategic)

               : 프로그램이나 자료에 대한 요구가 있을 때 주기억 장치로 가져오는 방식

           ② 예상 반입정책(anticipatory fetch strategic) : 요구가 없어도 앞으로 필요한 것이라 예상되는 

                                                        내용을 주기억장치로 미리 가져오는 방식

        2) 배치정책(placement strategic) - 프로그램이나 자료를 주기억장치의 어디에 위치시킬 것인 가를 

                                          결정하는 정책

           ① 최초적합(first-fit) : 주기억장치 공간 중 프로그램을 저장할 수 있는 최초의 유용한 공간에 

                                 우선적으로 할당하는 방법 기출94

              - 장점 : 기억장치 전체를 조사하지 않아 배치결정을 빨리 내릴 수 있다

              - 단점 : 사용되지 않은 작은 크기의 가용공간이 누적될 경우 할당결정이 늦을 수 있다

             * NEXT-fit

                - 최초 적합의 변형으로 이전에 탐색이 끝난 그 다음부터 사용가능한 공백을 탐색

           ② 최적적합(best-fit) : 주기억장치의 가용공간 중 프로그램을 저장할 때 가장 작은 공간이 남는 

                                 분할에 할당

              - 장점 : 가용공간을 반만 탐색해도 필요 공간을 찾음

              - 단점 : 가용공간이 크기 순으로 정렬되어 있지 않으면 모든 가용공간을 검색해야 한다

                     : 기억장소 정렬에 많은 시간 요구

                     : 할당한 후 작은 가용공간이 또 만들어짐

           ③ 최악적합(worst-fit) : 주기억 장치 가용 공간중 가장 큰 공간에 프로그램을 할당

              - 장점 : 할당후 남은 공간은 크므로 다른 프로그램 실행가능

              - 단점 : 가용공간이 크기순으로 되어있지 않으면 모든 공간을 검색해야 함

                     : 큰 프로그램이 적재될 가용공간이 없어진다

        3) 교체정책 - 새로 입력되는 프로그램이나 자료에 필요한 기억장소 확보를 위해 어떤 프로그램을 

                      제거할 것인가를 결정하는 정책

     (3) 기억장소 할당

        1) 연속 기억장치 할당 - 각 프로그램이 주기억장치 내에 인접되어 연속된 하나의 블록을 차지하도록  

                                배치

        2) 불연속 기억장치 할당 - 하나의 프로그램이 여러 개의 블록으로 나뉘어 분산 배치되는 방법


3.1.2 주기억장치 관리 기법

     (1) 단일 사용자 연속 기억 장치 할당

            ① 기억장치 할당 방법

               : 주기억장치 용량을 초과하는 프로그램은 실행할 수 없으며 한 순간에 오직 한 명의

                 사용자만이 주기억장치를 전용하여 사용하므로 다른 사용자는 기다림

            ② 장점 : 단순하며 이해하기 쉽다

            ③ 단점 : 기억장치의 빈 공간을 이용하지 못하기 때문에 기억장치의 낭비

                    : 한 사용자만이 기억장치로 전용하므로 자원낭비가 심하다

                    : 입출력 시 CPU는 유휴상태

                    : 사용하지 않는 프로그램이 기억장치 내에 위치

        1) 상주 모니터 - 어떤 작업이 다음에 수행되어야할 것인지에 대한 정보유지

        2) 오버레이 기법

           - 디스크에 프로그램을 유지하고 운영체제에 의해서 기억장치를 교체시키는 방법

           - 프로그램 수행도중 주기억장치의 프로그램 일부가 더 이상 필요하지 않다면 그곳에 보조기억 

             장치로부터 다른 프로그램을 적재(load)하여 겹쳐서 사용하는 방법

           - 한정된 기억장치를 확장하여 사용할 수 있는 개념 제공

           - 기억장치 할당방법 : 프로그램이 기억장치의 크기보다 클 경우에는 프로그램 수행을 허용

                              : 오버레이 중첩을 이용하여 오버레이 영역보다 커다란 프로그램도 처리 가능

        3) 교체기법(swapping)

           - 다중 프로그래밍 환경에서는 CPU 할당 시간이 초과되면 기억장치 관리자는 실행이 끝난

             프로세스를 보조기억 장치로 보내고 다른 프로세스를 주기억장치의 가용 공간으로 불러와 실행

           - 교체 순서 : 한번에 하나의 사용자 프로세스만 주기억장치를 할당받는다

             ① 사용자 프로세스가 주기억장치에서 수행되다 교체된다

                - 프로세스의 실행도중 입출력 발생 시

                - CPU 사용 할당시간이 초과될 때 

                - 프로세스 수행이 완료될 때 

             ② 교체영역이 보조기억 장치에 복사됨(swap out)

             ③ 다음 사용자 프로세스가 주기억 장치에 들어와 실행됨(swap in)

        4) 시스템의 보호

           - 사용자 프로그램으로부터 운영체제를 보호하기 위해 CPU 내부에 경계 레지스터를 둔다

           - 경계 레지스터는 운영체제의 제일 마지막 명령의 주소 저장

     (2) 고정 분할 기억장치 할당(MFT : Multiple Contiguous Fixed parTition allocation) 기출95

        - 주기억 장치를 일정수의 고정된 크기들로 분할하여 실행중인 여러 프로세스에게 할당하는 기법

           (=고정분할 다중 프로그래밍)

        - 입출력 요구가 생기게 되면 데이터의 입출력 처리가 끝나기 전까지는 작업을 중단해야 한다.

        - CPU 계산과 입출력은 동시에 행해질 수 있다.

        - 입출력 속도는 CPU 속도에 비해 엄청 느리다.

         1) 절대번역과 적재(absolute compile & loading)

            - 한 작업이 실행준비가 되어있다 하더라도 지정된 자신의 분할이 이미 차 있으면 다른 분할이 

              이용가능 하더라도 그 작업은 기다려야 한다

            - 미리 정해진 주기억 장치의 적재 위치에서만 해당 프로그램을 실행할 수 있게 하는 것 

            - 장점 : 간단하고 구현하기 쉽다

            - 단점 : 기억장치의 낭비 발생

         2) 재배치 번역과 적재(relocation compile & loading)

            - 모든 작업을 하나의 작업 큐에 넣어서 어느 분할에서든지 실행 가능하도록 한 기법

            - 장점 : 기억장소의 낭비가 없다

            - 단점 : 재배치 번역과 적재의 설계가 복잡(운영체제가 복잡)

         3) 고정분할 기억장치 할당에서의 보호

            - 여러 개의 경계 레지스터(합당한 사용자 주소범위를 나타내는 하한 레지스터와 상한 레지스터

              로 되어 있다)를 사용

         4) 고정분할 기억장치 할당의 장단점

            - 장점 : 다중 프로그래밍 가능, 수행속도 증가로 CPU를 효율적으로 사용

                   : 한 작업이 입출력을 수행할 때 CPU는 다른 작업의 계산을 처리할 수 있다.

            - 단점 : 단편화에 의해 기억장치의 낭비가 크다

                   : 수행할 프로그램의 크기를 미리 알고 있어야 함

     (3) 가변분할 기억장치할당(MVT : Multiple contiguous Variable parTition allocation) 기출95

         - 고정된 분할의 경계를 없애고 각 작업의 필요한 만큼의 기억장치를 할당

         - 가장 합리적인 분할의 크기를 결정하여 각 작업에게 주기억장치로 할당, 바운드 레지스터 필요

         - 장점 : 단편화방지, 자원의 효율적 사용

         - 단점 : 기억장치 집약시간 낭비

                : 작업의 크기가 기억장치 용량에 의해 제약됨, 외부단편화 심각

     (4) 기억장치의 단편화(Memory Fragmentation) 기출96

         - 단편화 : 작업을 수행하기 위한 기억장소 분할영역이 부족하거나 남는 경우

         - 단편화 종류 : 내부 단편화 - 하나의 분할에 작업을 할당하고 남은 빈 공간 

                       : 외부 단편화 - 대기중인 작업이 분할영역보다 커서 분할 전체가 빈 공간으로 있을

                                       때의 상태

         1) 고정분할 기억장치 할당에서의 단편화

            : 사용자 작업의 크기가 정확하게 분할에 맞지 않거나 작업보다 분할이 너무 작아서 이 분할에 

              대기중인 어떤 작업도 적재될 수 없는 경우 발생

         2) 가변분할 기억장치 할당에서의 단편화

            : 할당초기와 초기작업이 끝나 그들이 사용하던 기억공간이 공백으로 남을 때까지 기억공간의 

              낭비가 거의 없거나 분명하게 나타나지 않는다. 그러나, 실행을 기다리는 작업들에게 이 공백을

              할당하면서부터 기억장치의 단편화가 발생

         - 단편화의 해결 방법

            ① 공백의 통합(coalescing holes) : 가용 공간 중 이웃되는 가용공간을 하나의 커다란

                                             가용공간으로 만드는 것

            ② 기억장소 집약(storage compaction)

               : 가변분할 다중 프로그래밍에서 존재하는 여러 개의 작은 공간을 모아 하나의 커다란

                 기억공간을 만드는 것 = garbage collection

               : 장점 : 모든 미사용 공간을 모으므로 통합보다 메모리를 효율적으로 사용

                 단점 : 집약이 실행되는 동안 모든 일을 중지

                      : 실시간 처리 시스템의 경우 작업에 치명적

                      : 기억장치의 작업들이 모두 재배치되어야 함 

                      : 시스템 효율저하, 생산적으로 사용 가능한 시스템 자원을 소비한다.


3.2 가상 기억장치의 구성

3.2.1 가상 기억장치의 개요

     - 가상 기억장치(virtual memory)

        : 주기억장치에서 이용 가능한 공간보다 더 큰 저장 공간을 보조기억 장치에 생성하여 마치

          주기억장치의 연속된 공간처럼 사용하는 기억장치

        : 사용자의 논리적 기억장치를 실기억 장치로부터 분리시킨 것으로 요구페이징으로 구현

        : 실행중인 프로세스에 의해 참조되는 주소를 기억장치에서 사용할 수 있는 주소와 분리

        : 여러 사용자가 같이 사용

     - 세그먼트(segment) : 블록의 크기가 다를 때 

     - 페이지(page) : 블록의 크기가 같을 때

     - 가상주소(V) : 프로그래머에 의해 쓰여진 보조기억장치 번지

     - 실 주소(R) : 주기억장치의 사용 가능한 주소

     - 주소 사상(address mapping) : 보조기억장치에 존재하는 가상 번지를 주기억 장소의 실제 주소로 변환

     (1) 동적 주소 변환(DAT : dynamic address translation)

         : 프로세스가 수행될 때 가상주소를 실제 주소로 변환하는 기법

     (2) 블록 사상(block mapping)

         : 모든 내용을 한번에 사상할 수 없으므로 가상기억장치의 내용을 블록 단위로 분류하여 가상

           기억장소 블록이 실기억 장치의 어느 곳에 위치하는지 알아내 블록 단위로 사상하는 방법

         : 블록이 크면 - 사상기법 자체가 필요로 하는 기억공간을 줄일 수 있다

                       - 블록 이동시 전송시간이 많이 걸림

                       - 주기억장치가 많이 소요, 실기억 장소는 작아진다.

         : 블록사상을 통한 가상주소 변환


3.2.2 페이징(paging) 기법 기출94 기출95

     - 페이지는 블록단위로 보조기억장치로부터 주기억장치로 옮겨짐

     - 입력되는 페이지는 사용 가능한 페이지 프레임의 어느 곳에나 위치할 수 있다.

     - paging : 가상 메모리를 일정 크기의 블록으로 나눈 페이지를 주기억장치에 사상

              : 고정된 블록 크기로서 페이지와 관련된 가상기억장치 구성

     - 페이지 프레임 : 가상기억장치의 블록과 사상되는 주기억장치의 한 블록

                     : 고정된 페이지 크기의 정수 배에 해당하는 실기억 장치 주소에서 시작

     - 내부 단편화 발생, 페이지 크기의 1/2, 외부 단편화는 없다

     - V = (p, d) : p 페이지 번호, d 변위

     - 주소변환 방법

        1) 직접 사상에 의한 주소 변환 

           - 페이지 사상 테이블의 시작주소(b) + 페이지번호(p) = p'

           - p' + 변위(d) = 실제주소(r)

           - 컴퓨터 시스템의 속도를 절반으로 떨어뜨린다.(이를 보완하기 위해 캐시기억장치 사용)

           - 가상주소와 PMT(page map table)는 시스템 내의 제어프로세서 내에 존재하여 빠르게 실행

        2) 연관 사상 방법에 의한 주소 변환

           - 위치 지정이 아닌 내용지정의 연관 기억장치에 사상 페이지 사상표를 유지

           - 구현하는 비용이 많이 든다(캐시보다 비싸다), 가장 빠르고 융통성이 있음

           - 직접사상보다 구현이 어려움(잘 사용되지 않는다)

           - 실행 프로그램이 가상주소를 참조, 동적 주소변환을 빠르게 할 수 있다.

           - 연관 사상 테이블 내 페이지 p에 해당하는 페이지 프레임(p') + 변위(d) = r

        3) 연관 / 직접 사상에 의한 페이징 기법

           - 가장 최근에 참조된 페이지 항목들만 유지, 일부 사상 테이블만 포함

           - 캐시와 연관 기억장치의 이점을 효과적으로 혼합

           - 연관 사상 테이블을 먼저 찾은 다음 없으면 직접 사상 테이블을 찾는다.

           - 페이지 p가 사상 테이블에 있는 경우

              : 연관 사상 테이블 내 페이지 p에 사상되는 페이지 프레임(p') + 변위(d) = r

           - 페이지 p가 사상 테이블에 없는 경우

              : 페이지 사상 테이블의 시작주소(b) + 페이지번호(p) + 변위(d) = r

           - 연관 사상표(table) : 최근에 가장 많이 참조된 페이지

              페이지 사상표 : 연관 사상표에서 제외된 나머지 모든 페이지


3.2.3 세그멘테이션(srgmentation) 기법

     - segmentation : 가상 메모리를 가변 크기의 블록으로 나누어 주기억장치에 사상

                    : 가변 블록 크기로서 세그먼트와 관련된 가상 기억장치 구성

     - 외부 단편화 발생

     - 논리적 개념, 고정되어 있지 않다, 배열에 사상하는 세그먼트는 배열의 크기와 같다

     - 자료구조가 커지거나 작아짐에 따라 크고 작게 될 수 있다.

     - 프로세스는 현재 세그먼트가 주기억장치에 있을 때만 실행

     - 보호키를 사용하여 기억장치를 보호

     - V = (s, d) : s 세그먼트, d 변위

     - 접근제어(access control)

        : 엑세스 유형 ; read, write, execute, append

        : 세그먼트 엑세스 방법

          1) 엑세스 종류는 R, W, E, A의 4가지

          2) 4가지 엑세스의 조합으로 프로세스가 제한 없이 세그먼트를 엑세스 하는 것을 방지

          3) 16가지 조합 생성

          4) 세그먼트 보호의 기초 방법

     - 주소변환 방법

        1) 직접 사상에 의한 주소 변환

           - 세그먼트 사상 테이블의 시작주소(b) + 세그먼트번호(s) = s'

           - 세그먼트가 시작되는 실기억장치의 주소(s') + 변위(d) = 실제주소(r)


3.2.4 페이징 / 세그멘테이션 혼용 기법 기출96

     - 가상 기억장치의 구조에 중요한 이점을 제공, 크기는 페이지의 정수 배

     - 변환과정이 진행됨에 따라 실패할 수 있는 많은 단계가 존재

     - 참조된 페이지들은 부분적인 연관 기억장치에 있다.

     - 세그먼트 기법의 보완, 세그먼트를 페이지화 하는 것

     - V = (s, p, d) : s 세그먼트번호,  p 페이지번호,  d 변위

     - 내부 단편화 발생, 사상표가 차지하는 공간(table space)의 오버헤드도 증가

     - 주소변환 과정

        ① 연관 사상인 경우 : 연관 사상표를 탐색하여 발견되면 해당 페이지가 들어있는 주기억장치

                              내의 페이지 프레임 p'와 변위d를 더함

        ② 직접 사상인 경우 : 세그먼트 사상표의 시작주소(b) + 세그먼트번호(s) + 페이지 번호(p) + 

                              변위(d) = 실제주소(r)


3.2.5 요구페이징 기법 기출96

     - 보조기억 장치에 페이지들이 저장되어 있다가 실행 중인 프로세스에 의하여 그 페이지가 요구될 때만

        보조기억 장치에서 주기억장치로 옮겨지는 기법

     - 페이지 부재율을 낮게 유지해야 함 : 주기억장치 유효접근시간이 증가하여 수행시간이 늦어지게 된다.

     - 교체시간을 줄일 수 있다, 기억장치 사용량 절감, 많은 프로그램을 동시에 수행시킬 수 있다.

     - PMT필요, 비례할당, Thrashing문제 발생, 많은 테이블과 레지스터 필요, S/W가 복잡해진다.

   * 페이지 부재(page fault)

     - 프로세스에서 원하는 페이지가 주기억장치 내에 존재하지 않는 경우

     - 페이지 부재 처리시간의 구성요소 : 페이지부재 인터럽트 서비스, 페이지 교체, 프로세스 재실행


3.2.6 예상 페이징 기법

     - 예측 결정이 옳으면 프로세스의 실행시간은 대단히 감소

     - 정확한 결정이 내려질 수 있다. 

     - H/W 가격 하락 등 옳지 못한 결정의 결과도 그리 심각하지 않다.


3.3 가상 기억장치의 관리

3.3.1 가상 기억장치의 관리 기법

     1) 반입정책 - 보조기억장치에서 실기억장치로 사상한 페이지나 세그먼트의 적재시기 선택

     2) 배치정책 - 보조기억장치로부터 적재된 내용을 실기억장치의 어느 위치에 배치할 것인가

     3) 교체정책 - 실기억장치로 들어오는 페이지의 기억공간 확보를 위해 실기억장치의

                   어느 페이지를 가상 기억장치로 돌려보낼 것인가를 결정


3.3.2 페이지 교체 알고리즘

     (1) 최적교체 알고리즘

        - 다른 페이지 교체 기법들이 얼마나 최적성을 갖는지 비교하는데 사용

        - 현 페이지가 참조된 시점에서 그 이후로 가장 오랫동안 사용되지 않을 페이지를 교체

        - 장점 : FIFO의 모순을 피할 수 있는 알고리즘(최소의 페이지 부재율)

        - 단점 : 페이지 호출 순서에 대한 모든 상황을 미리 파악하고 있어야 하기 때문에 다루기가 어렵고 

                 비현실적

     (2) 무작위 페이지 교체 알고리즘

         - 교체할 페이지를 무작위로 선택

         - 장점 : 오버헤드가 적은 페이지 교체 기법

         - 단점 : 최악의 경우 바로뒤에 호출될 페이지도 교체될 수 있다

     (3) 선입선출(FIFO) 교체 알고리즘

         - 각 페이지가 참조된 때와 관계없이 주기억장치에 가장 먼저 들어온 페이지를 교체

         - FIFO 모순 : 페이지 프레임의 수가 증가될 때 페이지 부재가 더 증가하는 것

         - 장점 : 이해가 쉽고 설계가 간단

         - 단점 : 중요 페이지가 오랫동안 페이지 프레임을 차지 했다는 이유로 교체될 수 있다

     (4) 2차 기회 페이지 교체 알고리즘(SCR : second chance replacement)

         - 페이지의 참조비트가 0이면 교체하고 참조비트가 1이면 0으로 바꾼 다음 큐로 피드백 시켜

           두 번째 기회를 부여한 후 다음 페이지를 조사

     (5) LRU(least recently used) 교체 알고리즘 기출94

         - 한 프로세스에서 사용되는 각 페이지마다 카운터를 두어 현 시점에서 가장 오랫동안 사용되지

           않은 페이지를 제거

         - 단점 : 시간 오버헤드가 발생, 실제로 구현하기 복잡

     (6) LFU(least fraquence used) 알고리즘

         - 사용된 빈도(호출회수)가 가장적은 페이지를 교체, 구역성 문제 발생

         - 단점 : 바로 불러온 페이지가 교체될 수 있다

     (7) NUR(not used recently) 교체 알고리즘

         - 최근에 사용되지 않은 페이지를 교체. 2개의 bit를 둔다(참조 비트, 변형 비트)

         - 단점 : 현재 실행중인 페이지도 교체할 수 있다

     (8) Working Set - 프로세스가 최근 참조하는 페이지들의 집합에 속하지 않는 페이지를 모아 놓는

                        방법으로 집합에 속하지 않는 페이지를 교체

     (9) 페이지 부재 빈도 (PFF(page fault frequency))

        - 현재 페이지 부재와 바로전의 페이지 부재 사이의 시간을 관찰하여 그 시간이 지금까지의

          최소시간보다 크다면 그 사이에 호출되지 않았던 페이지들을 모두제거


3.3.3 Thrashing 기출94 기출95

     - 페이지 교체가 너무 자주 일어나는 현상

     - 프로세스 처리 시간보다 페이지 교체 시간이 더 많아지는 현상

     (1) 원인 - 실제로 사용하는 수만큼의 충분한 페이지 프레임을 갖지 못한 경우 페이지 부재가 빈번하게 

              발생하며 이 경우 실행중인 프로세스는 계속 페이지 교체를 수행해야 하므로 thrashing 현상이 

              발생

     (2) 방지 법 - 다중 프로그래밍의 정도를 낮추어야 한다(프로세스들에게 충분한 페이지 프레임을 

                  할당하여 주기억장치 내에 working set을 제대로 유지)

* 구역성(locality) = 국부성

 - 프로세스가 기억장치내의 정보를 균일하게 참조하는 것이 아니라 어느 순간 특정 부분을 집중적으로 참조

   ① 시간구역성(temporal locality) - 최근 참조된 기억장소가 가까운 장래에도 계속 참조될 가능성이 높다.

                                    (looping, subroutine, stack, counting, totaling)

   ② 공간구역성(spatial locality) - 임의 기억장소가 참조되면 그 근처의 기억장소가 연속적으로 참조될

                                  가능성이 높다(배열순례(array traversal), 순차적 코드의 수행,

                                                프로그래머가 관련 변수를 상호 이웃하게 선언하는 경향)

   - 기억장치에서 구역성이 중요한 이유 : 각 프로그램이 자주 참조하는 페이지들(working set)이

                                         주기억장치에 있으면 프로그램의 수행을 효율적으로 할 수 있다


3.3.4 Working Set 기출94

     - working set : 한 프로세스가 일정 시간동안 참조하는 페이지들의 집합

     - 프로그램이 효율적으로 수행되기 위해서는 working set이 주기억장치 내에 유지되어야 함


3.4 보조 기억장치

3.4.1 보조 기억장치의 개요

     * 보조 기억장치 ? 주기억장치에 저장되어 있는 정보를 제외한 모든 정보가 저장되어 있으며 필요에

                       따라 주기억장치에 전송

        1) 순차 기억 매체(SASD:Sequential Access Storage Device)

           - 자기 테이프 장치처럼 적절한 레코드가 찾아질때까지 차례차례 검색

        2) 직접 기억 매체(DASD:Direct Access Storage Device)

           - 자기 디스크 장치처럼 주소를 통해 직접 적절한 레코드를 찾아 가는 매체


3.4.2 자기 테이프(Magnetic Tape)

    (1) 개요

        1) 원리 - 자성 물질이 칠해진 테이프가 자기 테이프 구동장치의 헤드를 지날 때 전류를 변화시켜 

                  테이프에 정보를 기록

        2) 구성 - 총 9트랙 중 8개의 트랙은 데이터를 저장하는데 사용되고 나머지 1트랙은 데이터 전송 시

                  에러 여부를 검사하기 위한 패리티 비트를 저장하는데 사용

    (2) 특성 - 많은 양의 데이터 저장 가능

             - 속도가 느리고 순차접근을 하므로 데이터 보관용으로 사용

             - 순차처리만 가능(SASD:Sequential Access Storage Device)

             - 가격이 저렴하여 Backup용으로 많이 사용

             - 데이터를 읽기 위한 시간이 많이 걸린다

    (3) Label의 구성

        

        1) BOT(Beginning of Tape) : 테이프의 시작 부분

        2) VOL(Volume of Label) : 볼륨 레이블

        3) File Label : 파일의 앞과 뒤에 붙임

        4) TM(Tape Mark) : 레이블과 파일을 구분

        5) DATA : 실제 자료

        6) EOT(End of Tape) : 테이프의 끝 부분

    (4) 데이터의 구성

        

        󰠉<󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏󰠏>󰠋

                   물리 레코드 = BLOCK

        1) 논리 레코드(logical record) : 실제 저장되어 있는 레코드

        2) 물리 레코드(physical record) : 입출력 단위로 취급. 1개 이상의 논리 레코드로 구성 = block

        3) IRG(inter record gap) : 논리 레코드 사이의 간격

        4) IBG(inter block gap) : 블록간 데이터가 기록되지 않은 부분으로 테이프가 정상주행 속도에 

                                 이를 때까지의 시간과 멈출 때까지의 시간을 확보하기 위한 부분

        5) Blocking : 레코드의 입출력 효율을 높이기 위해 여러 개의 논리레코드를 하나의 블록으로

                      묶는 것

           * 블록화 하는 이유

              - 런 비용이 적게 든다, 물리적인 레코드의 기어용량을 절약, 입출력 실행 시 시간 절약

        6) 블록화 인수(blocking factor) : 한 물리 레코드 안에 있는 논리 레코드의 수


3.4.3 자기 디스크(Magnetic Disk)

    (1) 개요 기출94

        1) 구조 - 원형 금속판에 자성체를 입힌 것으로 트랙, 섹터, 실린더로 구성

           ① 트랙(track) - 디스크의 중앙을 중심으로 그려진 동심원

           ② 섹터(sector) - 트랙을 부채꼴 모양으로 분할한 것

           ③ 실린더(cylinder) - 각 면의 같은 위치에 있는 트랙들의 모임 또는 디스크 중앙으로부터 

                                같은 거리에 있는 트랙의 모임

        2) 접근시간

           ① 탐색시간(seek time) - 헤드를 적정 트랙으로 이동하는데 걸리는 시간

           ② 회전지연시간(rotational delay time) - 헤드가 트랙으로부터 데이터가 있는 섹터에

                                                  접근하는데 걸리는 시간

           ③ 헤드활성화시간(head activation time)

           ④ 전송시간(transmission time) - 데이터를 주고 받는데 걸리는 시간

    (2) 디스크 장치의 종류

        1) 이동 헤드 디스크 기출96

           - 판독/기록 헤드가 원하는 트랙에 위치하도록 액세스 암을 이동시켜 데이터를 읽거나 씀

           - 데이터 전송률 = 탐색시간 + 회전지연시간 + 헤드활성화시간 + 전송시간

           - 탐색 시간이 가장 많이 소요

        2) 고정 헤드 디스크

           - 각 트랙마다 읽기/쓰기 헤드를 가지고 있어 탐색시간을 없앰

           - 데이터 전송률 = 회전지연시간 + 헤드활성화시간 + 전송시간

    (3) 디스크 인터리빙(interleaving)

        - 디스크 제어기에게 기억장치로 데이터를 전송하기 위한 시간을 주기 위해 블록을 건너뛰도록 

          하는 기법

        - 지연시간 때문에 인접한 디스크 블록 사이에 두는 일정한 간격 : 인터리빙 인수

    (4) 그 외 디스크 장치

        1) 자기드럼 - 원통형 표면에 자성 데이터를 입힌 것

                    - 헤드가 움직이지 않으므로 탐색시간이 없다

                    - 저장 데이터량이 적고 부피에 비해 용량이 적다

                    - 자기디스크보다 접근시간이 빠르다

        2) 자기코어 - 환상형의 강자성체 물질로 되어 자화방향에따라 0,1을 표시

        3) 광 디스크 - 레이저 빔 이용. 처음 데이터 접근 시간은 느리나 연속된 데이터의 엑세스는 빠르다

                     - 접근시간은 자기 디스크보다 빠르다

    * 캐시(Cache)

       1) CPU 캐시 기억장치

          - CPU와 주기억장치의 속도차이를 완화시키기 위한 장치

          - 개념적으로 CPU와 주기억장치 사이에 존재하나 실제 CPU 내부에 있다

          - CPU는 캐시 기억장치와 주기억장치를 직접 접근할 수 있다

       2) 디스크 캐시

          - 국부적 휴리스틱 기법 사용 : 빈번히 사용되는 레코드가 무엇인지 알기 위해

          - 주기억장치와 디스크의 속도차이를 개선하기 위한 장치

          - 번번이 사용되는 기록을 주기억장치의 디스크 캐시 버퍼에 저장하여 사용

    (5) 디스크 가용공간 관리

        1) 비트 백터

        2) 연결 리스트 - 모든 가용 공간 블록들을 함께 연결

        3) 그룹핑(grouping) - 첫 번째 가용블록 내에 n개의 가용 블록들의 번지를 저장

        4) 카운팅(counting) - 첫 번째 가용블록의 주소와 그 첫 번째 블록에 연속된 가용 블록들의 개수를

                             보존


3.4.4 디스크 스케쥴링 기법

    (1) 개요

        1) 탐색시간 최적화 알고리즘(seek time optimization algorithm)

        2) 회전지연시간 최적화 알고리즘(rotational latency optimization algorithm)

        3) 스케쥴링 분류 기준

           ① 처리율(throughput) - 단위 시간에 디스크의 헤드가 찾을 수 있는 데이터의 수를 최대화

           ② 평균응답시간(mean response time)

           ③ 응답 시간의 편차(variance of response time)

              - 평균 응답시간을 줄이고 예측할 수 있도록 하는 것


    (2) 디스크 스케쥴링 기법

        1) FCFS(First Come First Served) 스케줄링

           - 가장먼저 입력된 요구가 우선적으로 서비스를 받는 방법

           ① 구현 - 대기 큐에 입력된 요구 순서대로 서비스 진행

           ② 특징 - 대기 큐의 순서대로 서비스하며 더 높은 우선 순위의 요청이 입력되어도 순서가

                     바뀌지 않아 공평성이 보장 됨

                   - 디스크 오버헤드(부하)가 커지면 응답시간이 길어진다

        2) SSTF(Shortest Seek Time First) 스케쥴링

           - 탐색 거리가 가장 짧은 요청을 먼저 처리하는 방법

           - 탐색 시간의 극소화, 극단적일 경우 기아상태 발생 가능

           ① 구현 - 현재 위치에서 가장 가까운 거리에 있는 요청을 서비스한다

                   - 대기 큐의 우선순위에 관계없이 다음 최단 거리 요청을 서비스

           ② 특징 - 실린더 지향 기법

                   - 가장 안쪽이나 바깥쪽의 트랙은 가운데 트랙보다 서비스를 받지 못하기 때문에 

                     응답시간의 편차가 크다

                   - FCFS보다 처리량이 많고 평균 응답시간이 짧다

                   - 일괄처리 시스템에 유용하고 응답시간의 편차가 크므로 대화형 시스템에 부적합

        3) SCAN 스케쥴링(엘리베이터 알고리즘)

           - Denning이 개발, SSTF가 갖는 응답시간의 편차와 차별을 극복하기 위한 방법

           - 오버헤드가 적은 경우

           ① 구현 - 헤드진행 방향과 같은 방향의 가장 짧은 거리에 있는 요청을 먼저 서비스하고 진행 중 

                     가장 바깥쪽까지 갔거나 더 이상 요구가 없으면 반대쪽으로 방향을 바꾸어 서비스

           ② 특징 - 디스크 오버헤드가 적어야 가장 좋은 효율을 가짐

                   - 대부분의 디스크 스케줄링의 기본 전략

                   - 밀도가 높은 쪽의 요청은 상당히 오랜 시간 대기하게 됨

        4) C-SCAN(Circular) 스케줄링 기출94 기출95

           - 가장 안쪽이나 가장 바깥쪽 실린더에 대한 차별을 제거

           ① 구현 - 바깥쪽 실린더에서 안쪽으로 진행하면서 최단거리의 요구를 서비스

                   - 더 이상 요구가 없으면 가장 바깥쪽에서 서비스하지 않은 요구로 이동하여 서비스

           ② 특징 - 진행도중 도착한 요청은 다음 수행 시 서비스

                   - 응답시간의 편차가 매우 적다

                   - 회전 시간의 최적화가 가능하며 부하(overhead)가 많이 걸리는 경우 효과적

        5) N-step SCAN 스케줄링

           - 서비스가 한쪽 방향으로 진행될 때 대기 중이던 요구들만 서비스

           ① 구현 - SCAN과 동일

                   - 진행 중 입력된 요청들은 한데 모아 반대방향 진행 때 서비스한다

           ② 특징 - 처리량과 평균응답시간에 있어 효율적

                   - SSTF 나 SCAN 방법보다 응답시간의 편차가 적다

                   - 한 실린더에 많은 요청이 도착해도 대기중인 요청만 처리하므로 무한대기가 없다

        6) 에센바흐 기법(Eshenbach scheme)

           ① 구현 - 헤드는 C-SCAN처럼 움직이는데 예외로 모든 실린더는 그 실린더에 요청이

                     있든 없든 전체 트랙이 한 바퀴 회전할 동안 서비스 받는다

           ② 특징 - 부하가 큰 항공예약 시스템을 위해 개발

                   - 탐색시간과 회전지연시간을 최적화

        7) SLTF(Shortest Latency Time First) 스케줄링

           - 회전지연시간의 최적화를 위한 기법

           ① 구현 - 디스크 헤드가 특정 실린더에 도착하면 여러 트랙을 가리키게 된다

                   - 이 여러 트랙에 대한 많은 요구들 중 가장 짧은 회전지연시간을 갖는 요청에

                     대해 먼저 서비스

           ② 특징 - 구현하기 쉽다. 이론적 최적값과 거의 일치

                   - 회전지연시간 최적화는 디스크 주변의 가장 가까운 섹터가 가장먼저 서비스되므로

                     섹터큐잉(sector queueing)이라 불림

                   - 고정헤드 디스크를 위한 스케쥴링 기법


3.4.5 실시간 처리 디스크 스케쥴링 알고리즘

     1) EDF(Earliest Deadline First) 스케쥴링

     2) P-SCAN(Priority SCAN) 스케쥴링

     3) FD-SCAN(Feasible Deadline SCAN) 스케쥴링

     4) SSEDO(Shortest Seek and Earlist Deadline by Ordering) 스케쥴링 

     5) SSEDV(Shortest Seek and Earlist Deadline by Value) 스케쥴링 

     6) SCAN-EDF 스케쥴링

     7) GSS 스케쥴링


제4장 정보관리

4.1 파일 시스템

4.1.1 개요

    (1) 파일의 개념

        - 프로그램과 데이터로 구성된 작성자에 의해 정의된 상호 관련 있는 정보의 집합체

        - 이름에 의해 참조되고 파일의 형태, 작성시기, 작성자, 길이 등의 속성을 갖는다

    (2) 파일의 종류

        1) 수행되는 기능에 따라 - 마스터, 트랜잭션, 보고서, 작업, 프로그램 파일

        2) 파일 구성에 따라 - 순차, 인덱스 된 순차, 인덱스, 직접, 다중 링 파일

    (3) 파일의 형태

        1) 원시파일   2) 목적파일   3) 텍스트파일

    (4) 디렉토리 개념

        - 디렉토리 구조는 파일 시스템에 있는 여러 파일을 구성하기 위한 기법을 제공

        - 디렉토리에 포함되는 정보 : 파일이름, 파일형태, 파일위치, 파일크기, 현재위치,

                                     보호, 사용 수, 시간, 날짜, 처리식별

    (5) 파일조작

        - 운영체제가 할일 : open, create, write, read, rewind, delete, insert, rename, close

        * 파일 단위 작업 - open, close, create, destroy, copy, rename, list

          레코드 단위 작업 - read, write, update, insert, delete

    (6) 파일 시스템의 기능

        1) 상위기능 - 디렉토리구조제공, 디스크공간할당 및 회수, 파일보호, 데이터 무결성

        2) 하위기능 - 오류검출, 디스크 스케줄링, 암호화, 블록전송

    (7) 파일 시스템의 요소

        1) 엑세스 방식 - 파일에 저장되어 있는 데이터에 대한 접근 방식

        2) 파일 관리 - 파일을 저장, 참조, 공유, 보호할 수 있는 기법 제공

        3) 보조기억장치 관리

        4) 무결성 유지 - 파일의 정보가 소실되지 않도록 보장

    (8) 파일의 특성 결정 기준

        1) 소멸성 - 파일에 자료를 추가하거나 제거하는 작업의 빈도 수

        2) 활성율 - 프로그램이 한 번 수행되는 동안 처리하는 레코드 수

        3) 크기 - 파일에 저장되어 있는 정보의 양


4.1.2 파일의 구조 및 접근방법

    (1) 파일의 구조

        1) 순차파일(sequential file) - 순차적으로 저장되며 일괄처리에 주로 사용

                                  - 테이프 장치와 천공카드, 프린터 등에 주로 쓰임

        2) 인덱스 된 순차파일(indexed sequential file)

           - 레코드가 각 레코드의 키에 따라 논리적 순서대로 배열되어 있는 것

           - 순차데이터 파일과 이 파일에 대한 포인터를 가지고 있는 인덱스로 구성

           - 정적 인덱스와 동적 인덱스방법을 사용하며 디스크 장치에 많이 사용

           - 파일 설계 시 고려해야 할 사항이 많다

        3) 직접파일(direct file)

           - DASD의 상세한 물리적 구조를 알아야 한다.

           - 다른 레코드를 참조하지 않고 어떤 임의의 레코드도 접근 가능

           - 대화형 처리에 이용되며 순차검색은 어렵다

    (2) 파일 접근 방법 기출95

        1) 순차접근(sequential access)

           ① 판독(read) - 테이프의 파일을 순차적으로 읽어 나가며 포인터는 자동 증가

           ② 기록(write) - 파일의 맨 뒤에 추가하며 파일 포인터는 추가된 내용의 끝으로 이동

        2) 직접접근(direct access)

           - 파일이 연속된 블록이나 레코드의 집합으로 간주, 키 값 필요, 가변길이 레코드에 부적합

           - 어떠한 블록도 직접 판독 또는 기록할 수 있다, 접근시간 빠르고 수정용이

        3) 색인순차접근(indexed sequential access method : ISAM)

           - 키 값에 따라 순차적으로 정렬되어있는 레코드에 대한 색인을 사용하여 접근

           - 색인 탐색 후 레코드 영역에서는 순차접근이 수행


4.1.3 기억장소 할당과 회수 방법

    (1) 연속할당(contiguous allocation)

        - 파일들이 디스크 내의 연속적으로 인접된 공간에 할당되는 것

        1) 장점 - 액세스 속도가 빠르고 파일 디렉토리가 단순하다

        2) 단점 - 새로 생성되는 파일의 기억공간의 크기를 미리 결정하며 단편화 발생

                - 원하는 만큼의 기억공간이 확보되지 않으면 그 파일은 생성되지 못함

                - 주기적 압축이 필요

    (2) 연결할당(linked allocation) - 파일이 저장되는 섹터들이 연결 리스트로 구성되고 각 섹터간에는

                                   연결을 위한 포인터를 가지고 있는 형태

        1) 장점 - 단편화가 일어나지 않으며 생성되는 파일의 크기가 문제되지 않는다

        2) 단점 - 논리적으로 연속된 블록의 검색에 긴 시간 요구

                - 연결리스트 구축에 추가시간이 요구되며 포인터를 위한 기억장소가 낭비

                - 포인터가 손상되면 데이터를 찾을 수 없다

    (3) 블록단위할당

        1) 블록체인 기법 - 연결할당과 비슷하나 할당단위가 블록 단위로 이루어지는 방법

           ① 장점 - 삽입과 삭제는 포인터만 수정하므로 간단

           ② 단점 - 속도가 느리다

        2) 색인 블록 체인 기법 - 파일마다 하나의 색인 블록을 두고 이 색인 블록에 포인터를 모아두어 

                                 직접접근을 가능하게 한 기법

           ① 장점 - 탐색 시간이 빠르다. 여러 개의 색인 블록을 서로 연결하여 사용 가능

           ② 단점 - 삽입 시 색인 블록을 재구성해야 함. 기억장치 낭비

        3) 블록지향 파일 사상 기법 - 포인터 대신 블록 번호를 사용


4.1.4 파일의 보호

    - 물리적인 손상으로부터 보호와 파일에 대한 무제한 접근을 방지하는 것

    (1) 보호방법 기출94

        1) 접근제어(access control) - 사용자에 따라 접근 대상을 다르게 구별

        2) 파일이름 명명(naming) - 파일의 이름을 알지 못하는 경우 접근대상에서 제외

        3) 암호(password) - 파일 접근 시 암호를 입력하여 접근하는 방법

    (2) 백업과 복구 - 주기적으로 시스템 파일을 복사하여 안전한 곳에 보관


4.2 보호와 보안

4.2.1 보호(Protection)

    (1) 보호 - 컴퓨터 시스템에 의하여 정의된 자원에 대하여 프로그램, 프로세스, 사용자의 접근을

               제어하는 기법

        1) 보호의 이유

           - 사용자가 자원에 대한 접근 제한을 의도적으로 위반하는 것을 방지

           - 시스템 내에서 동작중인 각 프로그램 요소가 시스템 자원의 정해진 사용정책대로 자원들을 

             사용하도록 보장

           - 시스템의 자원들이 무자격 사용자에 의하여 잘못 사용되는 것을 방지

        2) 보호영역

           - 한 프로세스는 하나의 보호영역에서만 동작하며 보호영역은 프로세스가 접근 가능한 자원을

              의미

           - 하나의 영역은 접근권한의 집합이고 접근권한은 어떤 프로세스가 객체에 대한 조작을 수행할

              수 있는 능력

    (2) 보호기법과 정책

        1) 보호기법

           - 접근제어, 이름부여(naming), 암호화(password), 해독화(cryptography), 사용자 인증

        2) 접근행렬에 의한 보호기법

           ① 전역 테이블(global table)

               - 접근행렬의 가장 단순한 구현으로 3개의 순서쌍<영역, 객체, 권한집합>들의 집합으로 구성

               - 주기억 공간에 보관 시 기억장소 낭비

               - 보조기억 장치로부터 추가적 입출력 필요

           ② 접근제어 리스트(access control list)

               - 접근행렬의 각 객체와 열을 결합하여 <영역, 권한집합>의 순서쌍을 갖는 접근 리스트로 

                 표현하는 방법

           ③ 권한 리스트(capability list) - 객체와 그 객체에 허용된 조작 리스트

           ④ Lock-Key 기법 - 접근제어리스트와 권한리스트의 절충

                             - 각 객체는 lock이라 불리는 유일한 비트 패턴 리스트를 갖고 각 영역은

                                key라는 독특한 비트열을 가지고 있다

                             - 수행중인 프로세스는 해당 영역이 객체의 lock과 일치하는 key가

                                있을 때 만 그 객체에 접근


4.2.2 보안(Security)

    (1) 개요

        1) 보안이란?

           - 컴퓨터 시스템 내에 저장된 프로그램과 데이터에 대하여 통제된 접근 방식을 어떻게 제공할

             것인가를 다루는 문제

           - 적절한 보호 시스템뿐만 아니라 시스템이 동작하는 외부 환경에 대해서도 고려

           - 시스템과 시스템 데이터가 결함 없이 보존

           - 정의된 자원에 대해 프로세스 또는 사용자의 접근을 제어

        2) 종류

           ① 외부보안 - 불법 침입자나 천재지변으로부터 시스템을 보호

             - 시설보안 : 감지기능을 통해 외부 침입자나 천재지변으로부터의 보안

             - 운용보안 : 시스템운영자, 관리자, 경영자들의 정책과 통제절차를 통해 이루어지는 보안

           ② 내부보안 - 하드웨어나 운영체제의 내장된 보안 기능을 통해 신뢰성을 유지

           ③ 사용자 인터페이스 보안 - 사용자의 신원을 운영체제가 확인하는 절차를 통해 불법 

                                       침입자로부터 시스템을 보호

     (2) 보안의 위험을 줄이는 방법

         1) 모니터 기법

            - 허락한다는 신호가 나오면 감시 프로그램이 그 파일을 액세스하고 그 결과를

               사용자 프로그램에 알려준다.

         2) 위험감시 기법

            - 중요한 작업에 대한 제어권을 사용자가 직접 갖지 못하게 하고 운영체제가 갖는 방법

            - 사용자는 운영체제에 요구만 한다.


제5장 분산 운영체제

5.1 개념 및 특징

    (1) 분산처리 시스템(distribute processing system)

        1) 분산처리 시스템이란? - 중앙으로부터 분산되어있는 컴퓨터로 모든 데이터의 처리 작업을 

                                  수행하여 그 결과를 상호 교환하도록 연결되어 있는 시스템

        2) 장점

           ① 제한된 자원의 공유 가능

           ② 시스템의 능력에 비해 업무량이 과중되어도 시스템을 바꿀 필요가 없다

           ③ 업무량 증가에 따라 컴퓨터를 네트워크에 투입하여 시스템의 성능을 향상

           ④ 하나의 컴퓨터가 고장시에도 다른 컴퓨터가 작업을 계속 수행하므로 작업에 대한 신뢰도를 

              높일 수 있다

           ⑤ 한 작업을 병렬로 처리하므로 전체적인 처리율(throughput)을 향상 시킨다

        3) 단점

           ① 분산처리 시스템에 투입되는 컴퓨터 비용 및 시스템의 구축이 쉽지 않다

           ② 여러 시스템간의 호환성을 고려하여 표준을 정해야 한다

    (2) 일반적인 형태

      1) 서브시스템을 중심으로 여러 노드들이 연결되어 있으며 각 노드에는 단말기가 설치 

      2) 통신서브 시스템 - 노드들 사이의 통신을 연결해주는 시스템으로 LAN, WAN


5.2 분산 운영체제

5.2.1 분산처리 시스템의 개발동기

        1) 자원공유(resource sharing)

           - 서로 다른 기능을 가진 많은 수의 사이트들이 서로 연결되어 있다면 한 사이트의 사용자는 

             다른 사이트의 이용 가능한 자원을 사용할 수 있다

        2) 연산속도 향상(computation speed-up)

           - 특정 연산이 동시에 수행 가능한 부분 연산들로 분할될 수 있다면 이들 연산들을 여러

             사이트에 분산시켜 연산 속도를 높일 수 있다

        3) 신뢰성(reliability)

           - 분산체제 내에서 한 사이트가 고장이 발생해도 나머지 사이트들은 계속 동작

        4) 통신(communication)

           - 다수의 사이트가 통신 네트워크를 통해 서로 연결되었을 때는 다른 사이트에 있는 사용자들이 

             정보를 서로 교환할 수 있다.

   * 분산 운영체제 구성동기(설계 이유) 기출95

      - 신뢰성 향상, 작업의 신속한 처리, 여러 자원들의 공유, DB의 공동 이용, 통신 이용


5.2.2 분산처리 시스템의 형태

    (1) 프로세서 모델에 따라

        1) 클라이언트-서버 모델 - LAN을 기본으로 구성되며 응용 프로그램이 사용자의 워크스테이션이나 

                                  PC 환경에서 수행

        2) 프로세서 풀(pool) 모델 - 응용프로그램들이 프로세서 서비스로서 관리되는 컴퓨터에서 수행

        3) 혼합모델 - 사용자의 요구와 자원처리가 매칭 된다

    (2) 위상(topology)에 의한 분류

        1) 완전 연결형 - 각 노드가 시스템내의 모든 다른 노드와 직접 연결된 상태이며 노드 및 회선에 

                         대한 비용 증가는 노드수의 제곱에 비례

                       - 전송속도가 빠르고 신뢰성이 높으나 비용이 많이 든다

        2) 부분 연결 구조 - 직접 연결되지 않은 노드가 존재하여 비용은 완전연결 구조보다 싸나 신뢰성은 

                            떨어진다

        3) 계층 구조형 = 트리 구조형 - 트리 형태로 연결되며 비용은 부분연결형보다 싸다

                                     - 부모노드가 고장나면 자식노드들은 통신이 두절

        4) 링(ring)형 = 환상형

           - 이웃 노드간의 단방향 및 양방향 통신이 가능하며 노드의 고장 발견이 쉽다

           - 보안 문제가 발생하며 새 노드 추가 시 통신회선을 절단해야하며 각 노드에서 전송지연 발생

        5) 성형(star) 구조

           - 각 노드들이 point-to-point 형태로 중앙 컴퓨터에 연결되고 중앙 컴퓨터를 경유하여 통신

           - 보수와 관리가 용이하고 노드의 고장이 다른 노드에 영향을 주지 않는다

           - 중앙컴퓨터 고장 시 전체 네트워크가 정지되며 통신망 전체가 복잡

        6) 버스(bus) 구조

           - 통신회선이 1개이므로 물리적 구조가 간단하고 노드의 추가와 삭제가 용이

           - 데이터 비밀 보장이 어렵고 통신회선의 길이에 제한이 있다

    (3) 분산 범위에 의한 분류

        1) WAN(wide area network) - 원거리 시스템을 연결하므로 통신속도가 느리고 신뢰성이 낮다

        2) LAN(local area network) - 근접 시스템을 연결하므로 속도가 빠르고 오류 발생률이 낮다

    (4) 운영체제 형태에 따른 분류

        1) 네트워크 운영체제(network operating system)

           - 각 노드가 독자적인 운영체제를 가지며 필요시 네트워크를 통해 통신

           - 설계와 구현이 쉽다

           - 자원의 공유가 번거롭고 프로세서의 운영체제가 모두 다를 때 곤란

        2) 분산 운영체제(distributed operating system)

          - 하나의 운영체제가 모든 네트워크, 프로세서 및 시스템내의 자원과 작업을 총괄

          - 사용이 편리하고 시스템간 자원공유가 쉽다

          - 설계와 구현이 어렵다


5.3 병렬처리 시스템(Parallel Processing)

5.3.1 병렬처리 시스템의 개요

    (1) 의미 - 다중처리 시스템에서 하나 또는 그 이상의 운영체제가 여러 개의 프로세서를 관리하며 동시에 

              수행하는 시스템

    (2) 병렬처리 시스템의 발전단계

        1) 1단계 - 단일 프로세서 컴퓨터에 병렬기법 도입

                 - RISC(reduced instruction set computers)

        2) 2단계 - 운영체제를 단일 컴퓨터의 운영에서 벗어나 복수의 연산소자 및 네트워크까지도 운영

                 - 알고리즘 기술 발달

        3) 3단계 - 병렬화를 묵시적으로 나타내는 새로운 언어의 개발 요구

        4) 4단계 - 사용자와 같은 레벨에서 통신할 수 있도록 높은 레벨의 사용자 인터페이스 제공


5.3.2 병렬 처리 시스템의 분류

    (1) Flyne에 의한 컴퓨터 구조의 분류

        1) SISD(Single Instruction stream Single Data stream)

           - 한번에 하나의 명령수행, 가장 일반적인 구조로 폰 노이만 방식

        2) SIMD(Single Instruction stream Multi Data stream)

           - SISD보다 빠르다, 배열처리기

        3) MISD(Multi Instruction stream Single Data stream)

           - 이론적일 뿐 실제 사용하지 않는다

        4) SISD(Multi Instruction stream Multi Data stream)

           - 진정한 의미의 병렬 프로세서(멀티 프로세서라고도 함)

    (2) 자료와 명령어의 흐름에 따른 병렬처리 시스템

        1) 파이프라인 - 하나의 프로세서를 서로 다른 기능을 가진 여러 개의 부 프로세서로 나누어

                         각 부 프로세서가 동시에 서로 다른 데이터를 취급하도록 하는 기법

                       - 한번에 여러 명령어가 실행되게 해서 성능을 향상시키는 방법

        2) 벡터(vector) - 벡터 명령어가 실행되면 벡터(피 연산자)의 각 항목들은 하나씩 파이프라인에 

                         나눠지고 파이프라인의 한 단계가 완성되는 동안 연기되는 기법

        3) 배열 처리기(array processor) - SIMD 컴퓨터로 한 배열의 각 항목에 동시에 같은 명령어를 수행

        4) 데이터 흐름 프로세서(data flow)

           - 많은 연산을 병렬적으로 수행하며 요구되는 데이터가 이용 가능한 명령어를 실행하기 때문에

             데이터 구동방식(data driven) 이라고 한다

        5) 다중 처리기(multiprocessor)

           - 기억장치나 데이터베이스 등의 자원을 공유하며 상호 작용하는 다중 프로세서들을 통하여

              비 동기적 병렬성을 얻는다

           - 2개 이상의 프로세서를 사용하므로 하나가 고장나더라도 다른 프로세서들은 가동할 수 있다

    (3) 기억장치 결합도에 따른 분류

        1) 강결합(tightly coupled)

           - 여러 프로세스가 하나의 저장장치를 공유하며 하나의 운영체제가 모든 프로세스들과 시스템

             하드웨어를 제어

           - 전송속도가 기억장치의 대역폭에 의해 결정

           - 공유 메모리를 차지하기 위한 프로세스간 경쟁이 치열

           - 결합 스위치(combining switch)로 프로세스간 경쟁 해결

        2) 약결합(loosely coupled)

           - 각 프로세스는 각자의 기억장치를 가지고 있다

           - 자체 운영체제를 갖고 있다

           - 프로세스간 통신은 메시지전달과 원격 프로시져 호출로 이루어진다

    (4) 연결방식에 따른 분류

        1) 공유버스(shared bus)

           - 프로세서, 기억장치 및 입출력 장치들간에 하나의 버스만 존재

           - 간단하며 경제적이고 융통성이 있다, 새로운 장치를 연결하기 쉽다.

           - 한번에 한가지 전송만 가능하고 버스에 이상이 생기면 전체 시스템이 중단

           - 시스템이 바빠지면 효율성이 저하된다

        2) 크로스바 교환행렬(crossbar-switch matrix)

           - 공유버스 구조에서 버스의 수를 기억장치의 수만큼 증가시킨 시스템

           - 모든 기억장치 모듈로 동시 전송이 가능

           - 하드웨어가 크고 복잡, 인터페이스는 간단

        3) 하이퍼 큐브(hypercube)

           - 비교적 경제적인 방법으로 많은 프로세서들을 연결하는 방법을 제공

           - 많은 노드가 연결될 경우 비용이 급속도로 증가

        4) 다단계 네트워크(multistage network) = 다중 입 출구 기억장치

           - 한 노드가 어떠한 다른 노드에라도 연결할 수 있도록 하여 여러 프로세서의 연결을 쉽게 한다

           - 교환기의 수가 매우 적으며 단일 경로지만 다양한 연결이 가능

           - 교환 네트워크의 비용을 증가시키며 전송 시간이 비교적 느리다

    (5) 다중처리 시스템의 운영체제 형태에 따른 분류

        1) 주/종 관계(master/slave)

           - 하나의 프로세서가 master로 지정되어 범용 프로세서로서 연산 및 입출력을 담당하고

             나머지들은 slave로 연산만을 담당하고 사용자 프로그램만 수행

           - 구현이 쉬우나 하드웨어의 비 대칭성이 발생하고 하드웨어를 최적으로 사용하지 못한다

        2) 분리수행(separate executives) 

           - 각 프로세서가 독립적으로 자원을 가지는 단일프로세서 시스템처럼 독자적인 운영체제와

             기능을 가지는 형태

           - 각 프로세서에서 발생하는 인터럽트는 해당 프로세서에서 해결

           - 주/종 관계보다 신뢰도가 높아 한 프로세서의 고장이 전체 시스템에 영향을 주지 못한다

           - 일부 프로세서가 유휴 상태로 될 수 있다

        3) 대칭처리

           - 모든 프로세서가 동등한 입장의 대칭성을 가지고 있으며 구현 및 수행이 매우 복잡한 형태

           - 가장 강력한 능력의 시스템

           - 한 운영체제를 동시에 수행할 수 있게 하므로 재진입 코드와 상호배제가 필요

           - 다른 기법에 비해 작업을 효과적으로 분산시킬 수 있다

           - 모든 프로세서들은 동등한 입장에서 입출력 장치와 기억장치를 사용

           - 기억장소를 여러 프로세스가 동시에 엑세스 하려할 경우 보통 하드웨어로 해결

           - 시스템 테이블을 여러 프로세스가 동시에 엑세스 하려할 경우 보통 소프트웨어로 해결

           - 신뢰도가 가장 높다.


제6장 운영체제의 실제

6.1 UNIX

6.1.1 기본 개념 기출95 기출96

     - UNIX 운영체제의 파일 시스템이 관리하고 있는 디렉토리 구조 : 다단계 트리구조

     - CPU 스케줄링 방식 : 기본 우선순위 지정 후에 우선순위 조정

     - I-node : 파일에 할당된 data list의 I번째 node를 의미

     - 파이프(pipe) : UNIX에서 프로세스간의 통신과 동기를 위해 사용

반응형

'연구개발 > Etc..' 카테고리의 다른 글

mac port kill  (0) 2024.01.31
[Docker] 생성 및 실행  (0) 2018.07.04
지표 관련 용어  (0) 2016.08.22
unity key  (0) 2016.05.07
RAID 1+0 과 0+1의 차이점  (0) 2011.07.11

+ Recent posts

반응형