2010년 6월 30일 수요일

명령어 하나로 여러대 자원 관리하기 (SSH 인증키 사용)

문제의 요점은 여러대의 동일한 시스템을 관리하는데 있어서 반복되는 작업이 잦다는것..
이걸 어떻게하면 좀더 편리하게 할수 있느냐에서 출발한다.

물론 주기적으로 반복되는 명령어 작업이라면 CRON을 통해서 스케줄을 걸어두면 되겠지만 문제는 비정기적인 작업이다.

원리는 SSH 인증키를 가지고 스크립트를 만들어서 작업하면 100대, 1000대라도 문제 없다는것!!
SSH 인증키란 간단히 말해서 나와 서버간의 약속된 키이다.


인증키 생성하기
인증키는 ssh-keygen를 통해서 만든다. 키를 생성할때 사용할 키의 형태를 지정해 주는데 원격 서버가 SSH 프로토콜 버전 2를 지원한다면(요즘은 기본지원한다.)  rsa, dsa  프로토콜 1만을 지원한다면 rsa1 을 사용하면 된다.
컨트롤할 서버에서 인증키를 생성한다.

키가 저장될 곳과 이름을 물어 오는데 디폴트로 그냥 엔터를 치고 넘어가면, 다음과 같이 인증키 암호를 물어온다. 원하는 암호를 두번 반복해서 입력해주면 키가 생성된다.
인증키 생성시 인증키 암호를 공백으로 (passphrase 를 물어올때 그냥 엔터를 치면 된다) 만들경우에는 ssh 접속시 암호를 입력하지 않아도 그냥 접속이 되므로 편리하나 키관리에 주의를 기울여야 한다...

우리는 암호없이 접근하려고 하니깐 그냥 엔터 (Enter)  

[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
ea:24:ca:36:af:99:e6:4f:96:d2:b6:0f:25:75:fc:ea mojily@chonnom.com

※ -t : type   Specify type of key to create.


공개키 사용하기
기본 경로에 키를 저장하였다면 /root/.ssh/ 위치에 id_rsa 와 id_rsa.pub가 생성되어 있다.
.pub 확장자가 붙은 것이 공개키로 이 파일을 관리할 원격서버들의 ~/.ssh/ 에 authorized_keys 라는 이름으로 복사해준다.
scp 를 이용해서 파일을 밀어 넣어준다.

[root@localhost .ssh]# scp id_rsa.pub root@xxx.xxx.xxx.xxx:/root/.ssh/authorized_keys
root@xxx.xxx.xxx.xxx's password:
id_rsa.pub                                                                                                                  100%  397     0.4KB/s   00:00


관리대상의 서버들에 접속해서 보면 authorized_keys 부분이 확인된다.

[root@localhost .ssh]# ls -al
total 24
drwxr-xr-x 2 root root 4096 Jan 26 11:29 .
drwxr-x--- 5 root root 4096 Jan 26 11:29 ..
-rw-r--r-- 1 root root  397 Jan 26 11:29 authorized_keys


기본적인 작업은 다 끝났다...
컨트롤할 서버에서 작업대상 원격 서버로 ssh 접근을 시도해보면...암호인증없이 로그인이 되는걸 확인가능하다.

[root@mojily .ssh]# ssh -lroot xxx.xxx.xxx.xxx
Last login: Tue Jan 26 11:32:28 2010 from xxx.xxx.xxx.xxx
[root@localhost ~]#


2010년 6월 21일 월요일

MS 서버제품

  • .NET Framework
  • Antigen(영문)
  • BizTalk Server
    • BizTalk 2009
  • Commerce Server
  • Essential Business Server
  • Exchange Server
    • Exchange 2010
  • Expression
  • Forefront 제품군
  • Forefront Client Security
  • Forefront Edge Security(영문)
  • Forefront 관리 콘솔(영문)
  • Forefront Security for Exchange
  • Forefront Security for SharePoint(영문)
  • Forefront Stirling
  • Forms Server
  • Groove Server
  • Host Integration Server (영문)
  • Identity Lifecycle Manager(영문)
  • Office Communications Server
  • Project Server
  • Search Server
  • SharePoint Server
  • 소규모 기업 센터
  • Speech Server(영문)
  • SQL Server
    • SQL Server 2008R2
  • System Center 제품군
    • System Center Configuration Manager R2(영문)
    • System Center Operations Manager
    • System Center Data Protection Manager
    • System Center Virtual Machine Manager 2008
    • System Center Essentials
    • 그외 시스템센터 제품
    • System Center Capacity Planner(영문)
    • System Center Mobile Device Manager(영문)
    • ystem Center Service Manager (Beta 버전)(영문)  

     

    • 관련제품
    • Microsoft Application Virtualization(영문)  
      Microsoft Desktop Optimization Pack(영문)
    • Systems Management Server

     

  • System Center Configuration Manager(영문)
  • System Center Data Protection Manager
  • System Center Essentials
  • System Center Mobile Device Manager(영문)
  • System Center Operations Manager
  • System Center Virtual Machine Manager
  • Virtual Server
  • Visual Studio
  • Visual Studio Team System
  • Windows High Performance Computing
  • Windows Server
  • Windows Server Update Services
  • Windows Storage Server
  • 2010년 6월 17일 목요일

    Adding Disk, CDROM and DVD Devices to a Running Xen domainU Guest System

    Requirements for Xen domainU Block Device Attachment

    Before a block device can be attached to running domainU guest system there are a number of rules which must be observed. These important rules are as follows:

    • The device to be attached must be mounted on the domain0 host system.
    • The device must not already be attached in write mode to any other domainU systems.
    • The domainU system must possess the appropriate drivers to read the filesystem located on the device. This is not usually an issue for Linux filesystems and CD/DVD devices but may be an issue for more rare and exotic filesystems.
    • The device name by which the domainU system will access the device must begin with xdv (for example /dev/xvda1).

    [edit] An Overview of xm block-attach

    Devices are attached to domainU guest system using the xm block-attach command the syntax for which is as follows:

    xm block-attach <Domain Id> <Backend Device> <Frontend Device> <Mode>
    

    Each of the commandline arguments warrants a brief explanation:

    • <Domain Id> is the id of the domainU to which the device is to be attached (this can be obtained by running xm list)
    • <Backend Device> represents the device as it is represented on the domain0 host system prefixed with the type. For example:
    phy:/dev/sr0
    
    • <Frontend Device> is the device name for access on the domainU guest system. This name must be prefixed with xvd otherwise the device will not be visible to the domainU guest. For example:
    /dev/xvda2
    
    • <Mode> is the read/write mode under which the device is to be attached. Options are r for read-only, w for read/write and w! for read/write with sharing.

    [edit] Attaching a Device to a domainU Guest

    With the above information in mind we can now attach a device to a domainU guest. The first piece of information we need is the ID of the guest domain. This can be obtained using the xm list command. The following output shows only one guest running on our system and it has an ID of 3:

    xm list
    Name                                        ID   Mem VCPUs      State   Time(s)
    Domain-0                                     0   875     1     r-----    790.2
    XenGuest1                                    3   128     1     ------    190.5
    

    Next we need to know the name by which the device to be added is accessed on the domain0 host (otherwise known as the backend device). For the purposes of this chapter we will assume that we are adding a DVD drive that is visible to the domain0 host system as /dev/sr0. This could equally be a disk drive partition such as /dev/hdb1 or /dev/sda3.

    Before performing the attachment, we need to decide on a device name by which the device will be accessible on the domainU system (known as the frontend device). As mentioned previously the device name must be an xvd device (for example /dev/xvda2). Failure to use an xvd device type will result in the device not appearing in the domainU guest. For this chapter we will specify /dev/xvda2.

    With the above information gathered we will attach the device. Since we are attaching a DVD drive we will specify read-only mode:

    xm block-attach 3 phy:/dev/sr0 /dev/xvda2 r
    

    The device is now attached the domainU system with an ID of 3 and should be accessible from within that guest environment as /dev/xvda2.

    [edit] Mounting the Device in the domainU Guest

    Once the device attachment has been performed the next step is to mount the device on the domainU system. Log into the domainU guest and check the new device is visible and configured:

    ls -l /dev/xvda2
    brw-r----- 1 root disk 202, 2 2008-05-02 15:46 /dev/xvda2
    

    With the device attached it is ready to be mounted:

    mkdir /tmp/mount
    mount /dev/xvda2 /tmp/mnt
    

    [edit] Detaching a Device from the domainU Guest

    To detach a block device from the domainU first unmount it from the guest:

    umount /tmp/mnt
    

    Once unmounted from the domainU system move to the domain0 host and detach it using the xm block-detach specifying the domainU ID and the frontend device name (in this case /dev/xvda2):

    xm block-detach 3 /dev/xvda2
    

    Xen shell commands 정리.

    Xen shell commands

    Some more or less commonly used shell commands for managing Xen Virtual Machines (VM, also called Domains). Tested on Xen 3.0, should work also in other versions.

    Basic commands      
    Show the running Virtual Machines: xm list            
    Start a virtual machine (myhost):   xm create myhost            
    Gracefully shutdown (soft-reset) a virtual machine:  xm shutdown myhost            
    Forced power Off (hard-reset) of a virtual machine:  xm destroy myhost            
    Reboot a VM : xm reboot myhost           

    Using the console      
    Start a virtual machine and attach immediately a console:   xm create -c myhost            
    Attach to the console of a VM (sample ID=4 for myhost, as shown in xm list):          
    xm console myhost  or  xm console 4           
    To leave / detach from the xen console press CTRL+5           

    Resources management and usage      
    To alter the RAM assigned to a VM (sample 256 Mb): xm mem-set myhost 256        
    To alter the CPUs assigned to a VM (sample 2 CPUs or cores): xm vcpu-set myhost 2           

    Shows resource utilization of the running hosts:  xm top  or  xentop            
    Shows Virtual Machines uptimes:  xm uptime          

    Saving and Restoring      
    Virtual Machines state can be saved on a file and later restored (sample destination file /var/tmp/myhost.save)        
    xm save myhost /var/tmp/myhost.save        
    Note that after this command the VM is no longer active: you can reboot from start it with xm create myhost or restore the saved machine state with xm restore  /var/tmp/myhost.save        
    Note also that the save file ( /var/tmp/myhost.save ) is only the dump on the VM memory, for backups it's of no use if you copy it to another physical host without copying also the  VM config file and the file/LVM/partition used for the disk) .        

    Block Devices management      
    It's is possible to add block devices (disks) to a running VM:      
    To add a local file ( /var/tmp/data.disk ) as /dev/xvdc to the myhost paravirtualized VM, in write mode:      
    xm block-attach myhost file://var/tmp/data.disk /dev/xvdc w      
    Mode can be: w (read/write), r (read only), w! (shared read/write, when the samer device is attached to two different VMs).    
    The above file can be created (here 4 Gb) with:    
    dd if=/dev/zero of=/var/tmp/data.disk  bs=1024k count=4096    

    To add a local physical disk, partition or LVM (for example an USB stick):      
    xm block-attach myhost phy://dev/sda /dev/xvdc w      
    Note that I/O performances are much better when using physical devices or LVM instead of plain files as block devices for the VMs.    

    To list the currently attached block devices to a VM:      
    xm block-list myhost --long or xm block-list myhost       
    To detach a block device (51744 is the Vdev in xm block-list)      
    xm block-detach myhost 51744      
          
    Bridging management      
    On Linux the bridge utils can be used to show and manage bridging:            
    brctl show            
    brctl showmacs xenbr0            
    To manually create a new xen bridge interface and associate it a physical device.            
    brctl addbr xenbr2            
    brctl addif peth3

    2010년 6월 16일 수요일

    grep 옵션

    출처 : 유닉스 쉘 바이블 (엘리 퀴클리 지음)에서 발췌.
    3.1 grep 명령어

    grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.
    egrep : grep의 확장판으로, 추가 정규표현식 메타문자들을 지원한다.
    fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다. 즉, 정규표현식의 메타문자도 일반 문자로 취급한다.

    3.2 정규표현식을 사용하는 grep의 예제
    # grep NW datafile
    # grep NW d* (d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다.)
    # grep '^n' datafile (n으로 시작하는 모든 행을 출력한다.)
    # grep '4$' datafile (4로 끝나는 모든 행을 출력한다.)
    # grep TB Savage datafile (TB만 인자이고 Savage와 datafile은 파일 이름이다.)
    # grep 'TB Savage' datafile (TB Savage를 포함하는 모든 행을 출력한다.)
    # grep '5.' datafile (숫자 5, 마침표, 임의의 한 문자가 순서대로 나타나는 문자열이 포함된 행을 출력한다.)
    # grep '.5' datafile (.5가 나오는 모든 행을 출력한다.)
    # grep '^[we]' datafile (w나 e로 시작하는 모든 행을 출력한다.)
    # grep '[^0-9]' datafile (숫자가 아닌 문자를 하나라도 포함하는 모든 행을 출력한다.)
    # grep '[A-Z][A-Z] [A-Z]' datafile (대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다.)
    # grep 'ss* ' datafile (s가 한 나오고, 다시 s가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력한다.)
    # grep '[a-z]{9}' datafile (소문자가 9번 이상 반복되는 문자열을 포함하는 모든 행을 출력한다.)
    # grep '(3).[0-9].*1 *1' datafile (숫자 3,마침표,임의의 한 숫자,임의 개수의 문자,숫자 3(태그),임의 개수의 탭 문자,숫자 3의 순서를 갖는 문자열이 포한된 모든 행을 출력한다.)
    # grep '
    (north로 시작하는 단어가 포함된 모든 행을 출력한다.)
    # grep '' datafile (north라는 단어가 포함된 모든 행을 출력한다.)
    # grep '<[a-z].*n>' datafile (소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력한다. 여기서 .*는 공백을 포함한 임의의 문자들을 의미한다.)

    3.3 grep에 옵션 사용
    # grep -n '^south' datafile (행번호를 함께 출력한다.)
    # grep -i 'pat' datafile (대소문자를 구별하지 않게 한다.)
    # grep -v 'Suan Chin' datafile (문자열 Suan Chin이 포함되지 않은 모든 행을 출력하게 한다. 옵션은 입력 파일에서 특정 내용의 입력을 삭제하는데 쓰인다.
    # grep -v 'Suan Chin' datafile > black
    # mv black datafile
    # grep -l 'SE' * (패턴이 찾아진 파일의 행 번호 대신 단지 파일이름만 출력한다.)
    # grep -w 'north' datafile (패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾는다. northwest나 northeast 등의 단어가 아니라, north라는 단어가 포함된 행만 출력한다.)
    # grep -i "$LOGNAME" datafile (환경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. 변수가 큰따옴표로 둘러싸여 있는 경우, 쉘은 변수의 값으로 치환한다. 작은따옴표로 둘러싸여 있으면 변수 치환이 일어나지 않고 그냥 $LOGNAME 이라는 문자로 출력된다.)

    3.4 egrep
    egrep(extended grep) : grep에서 제공하지 않는 확장된 정규표현식 메타문자를 지원 한다. grep와 동일한 명령행 옵션을 지원한다.

    3.4.1 egrep 예제
    # egrep 'NW|EA' datafile (NW나 EA가 포함된 행을 출력한다.)
    # egrep '3+' datafile (숫자 3이 한 번 이상 등장하는 행을 출력한다.)
    # egrep '2.?[0-9]' datafile (숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력한다.)
    # egrep ' (no)+' datafile (패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.)
    # egrep 'S(h|u)' datafile (문자 S 다음에 h나 u가 나오는 행을 출력한다.)
    # egrep 'Sh|u' datafile (패턴 Sh나 u를 포함한 행을 출력한다.)

    3.5 고정 grep 과 빠른 grep
    fgrep : grep 명령어와 동일하게 동작한다. 다만 정규표현식 메타문자들을 특별하게 취급하지 않는다.
    # fgrep '[A-Z]****[0-9]..$5.00' file ([A-Z]****[0-9]..$5.00 이 포함된 행을 출력한다. 모든 문자들을 문자 자체로만 취급한다.)

    2010년 6월 7일 월요일

    eAccelerator설치

    eAccelerator는 PHP가속, 최적화, 동적 컨텐츠 캐시입니다.(PHP Op-Code Caching) 공유 메모리에 컴파일된 상태에서 캐싱으로 PHP 스크립트의 성능을 향상시킵니다. 실행 속도를 높여 스크립트를 최적화합니다.
    tomcat 과 같은 was 에서는 jsp파일을 데몬이 서비스를 올리면서 메모리 상에 올리는것과 같은 역할을 합니다.
    한번 접속된 페이지는 일정시간 메모리에 올리기에 동일 사이트 및 페이지에 접속했을 때 디스크 I/O 가 아닌 메모리 I/O가 일어남으로 빠르게 페이지를 보여줄수 있습니다.

    다운로드
    wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2

    설치
    # yum -y install autoconf-*   를 먼저 설치해준후

    다운받은 파일을 압축을 푼후
    # ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php/bin/php-config
    # make && make install

    make install을 하면 아래와 같이 eacclerator.so 파일의 위치를 알려줍니다.
    Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20060613/

    설치가 완료 되면 캐싱된 파일이 저장될 디렉토리를 지정 해줘야 합니다.
    저는 /var/tmp/eaccelerator 를 사용하겠습니다 혹은 다른위치에 생성해 준뒤에 owner를 http를 실행하는 유저로 바꿔주시고 위치를 바꿨다면 위 php.ini 파일 중 당연히 eaccelerator.cache_dir="/var/tmp/eaccelerator" 항목을 편집해주어야겠죠

    # mkdir /var/tmp/eaccelerator
    # chown nobody.nobody /var/tmp/eaccelerator
    # chmod 700 eaccelerator

    그리고 php.ini을 편집합니다.(추가)
    [eAccelerator]
    extension_dir=/usr/local/php/lib/php/extensions/no-debug-zts-20060613  // 모듈위치
    extension="eaccelerator.so"
    eaccelerator.shm_size="0"  // eAccelerator가 사용할 공유 메모리량. 단위 MBytes. 0을 지정하면 기본값 16MBytes. default = 0
    eaccelerator.cache_dir="/var/tmp/eaccelerator"  // 캐쉬 디렉토리
    eaccelerator.enable="1"  // eaccelerator 사용 여부
    eaccelerator.optimizer="1" // 최적화 여부
    eaccelerator.log_file = "/usr/local/apache/logs/eaccelerator_log"   // 로그 파일 위치
    eaccelerator.check_mtime="1" // php 파일 변경 시간 체크 여부
    eaccelerator.debug="0"  
    eaccelerator.filter=""  // 캐싱할 php 파일을 지정한다. *.php *.html *.php3 처럼 지정할 수있으며 "" 로 비워두면 모든 php 파일이 캐싱된다.
    eaccelerator.shm_max="0" // 자체 함수인 eaccelerator_put() 를 할당할 메모리 크기 (예. 10240, 10K, 1M)
    eaccelerator.shm_ttl="0" // 메모리 공간이 부족할 경우 지정한 시간동안  엑세스가 없다면 스크립트 제거. 0은 삭제 안함
    eaccelerator.shm_prune_period="0" //지정한 초보다 생성이 오래된 스크립트 제거. 0은 삭제 안함
    eaccelerator.shm_only="0" //컴파일된 스크립트를 디스크에 캐싱할 것인지의 여부 판단
    eaccelerator.compress="1" // 캐쉬된 내용 압축 여부
    eaccelerator.compress_level="9"  // 압축 레벨 지정. 9는 최대 압축
    eaccelerator.keys     = "shm_and_disk"
    eaccelerator.sessions = "shm_and_disk"
    eaccelerator.content  = "shm_and_disk"
    eaccelerator.allowed_admin_path = "" // 모니터링 파일이 있는 경로

    extension_dir=/usr/local/php/lib/php/extensions/no-debug-zts-20060613
    위의 경로는 eacclerator.so 파일의 경로를 기술해줍니다.

    저장후 아파치를 재시작한 뒤에 php -v 를 해보면 아래와같이 이전과 다르게 eAccelerator의 내용이 추가 되신걸 보실수 있습니다.

    Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
        with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator    with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
        with Suhosin v0.9.27, Copyright (c) 2007, by SektionEins GmbH
        with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies

    마지막으로 한가지만 더해주면 됩니다
    모니터링 페이지를 생성하는것입니다
    eaccelerator.allowed_admin_path 설정한 디렉토리에 control.php 파일을 복사합니다
    control.php 파일은 압축푼 디렉토리안에 있습니다

    control.php 파일을 편집

    $auth = false;   => false 을 true 로 수정
    $user = "admin";         ----> 사용자 아이디를 원하는것으로 수정
    $pw = "eAccelerator";    ----> 암호도 원하는것으로 변경하면 됩니다

    접속 : http://주소또는IP/control.php

    top 화면 내용중 load average와 PRI : priority(우선순위) 정리

    =============================================================================

    load average

    서버에 걸리는 평균 부하율 1분, 5분, 15분

    load average 는 process 작업의 대기를 의미합니다. 즉, 1분간 평균 load average가 1 이라면, 1분동안 1개의 작업이 대기하고 있다는 얘기입니다.
    즉 값이 높으면 높을수록 대기하는 작업이 많아지게 되고, 이는 곧 서버가 부하를 받고 있다는 얘기가 됩니다.

    즉, 서버가 아주 좋은 상태는 load average 가 1 보다 작은 값이고, 1보다 클 경우 는 서버가 부하를 받기 시작한다고 보게 됩니다.

    평균적으로 4정도를 넘으면 부하를 받는다고 판단을 하며, 이 기준은 관리자마다 주관적인 차이가 있습니다.
    또한 같은 사람이라도, 서비스에 따라, load average 15 가 양호한 상태라고 판단하는 경우가 있습니다.
    즉, load average 는 절대적인 판단 기준이 되는 것은 아니라는 의미입니다.

    예를 들어 서버에서 별로 하는 것이 없는데 15가 넘는다면, 그건 심각한 문제가 있다는 얘기가 될수 있지만, 서버에서 DB 돌리고, ftp 돌리고, 대량메일 발송하고, 웹 동시 접속자가 1000명 정도 되는 서버인데 15라면 잘 버티고 있는 것이라 봐야 겠습니다.

    우리 서비스상의 서버의 load average 값이 5이상이라면 이때는
    커널 튜닝 and or 하드웨어의 업그래이드가 필요한데 이것은 메모리의 사용률을 함께 참조 해야 합니다.

    먼저 필요 없는 프로세스가 실행되고 있나 확인 하고
    필요 없는 프로세스라고 판단되는 경우 과감하게 종료 시킵니다.
    ※ Zombie : process는 죽었는데 자원을 차지하고 있는 것(전염성이 있음)
    반드시 강제 종료해야 한다.
    강제 종료 안 되면 시스템 재부팅 합니다.

    커널의 튜닝의 경우 로그 파일을 확인 하여 file limit과 같이 프로세스 관련 항목을 튜닝해야 하며
    메모리의 자원이 부족하거나 swap메모리의 양이 늘어나면
    메모리를 추가 하여야 하며
    메모리에 여유가 있으나 load average값이 늘어나면 CPU를 업그레이드 해야 합니다.



    PRI : priority(우선순위)

    CPU 스케줄링에서 필요한 순위입니다.

    현재 OS는 한번에 여러개의 프로세스가 동시에 실행되도록 함으로써 CPU의 노는 시간을 줄이고 자원사용의 효율성을 최대화 시키기 위해서 다중프로그래밍이라는 알고리즘을 이용합니다.

    ※ 다중 프로그래밍 : CPU 점유방법

    CPU는 사용자가 계산을 요구하면 그 작업에 대한 header 를 가지고 작업을 메모리에서 수행합니다.
    메모리에서 작업을 하는 동안 사용자가 또다른 요구를 하게 되면 CPU는 우선되는 값을 체크합니다.
    나중에 사용자가 요구한 계산값이 우선권이 더 높으면 CPU는 처음에 사용자가 요구한 계산값을 메모리사용량을 줄이고 나중에 요구한 값에 더 많은 메모리 영역을 분배하여 계산을 하도록 합니다.
    이렇게 작업영역을 배분해주는 것이 스케줄링이라고 보시면 됩니다.

    이 다중 프로그래밍에서 프로세스 순서에서 순위를 나타내는 값을 우선 순위 라고 합니다.