CPU Scheduling

  • 프로그램은 CPU burst와 I/O burst의 연속
  • 혹은 프로그램의 특성상 CPU를 자주 사용하는 혹은 I/O를 많이 필요로 하는 프로그램이 있을 수 있음

  • 여러 종류의 Job(=Process)이 섞여 있기 때문에 CPU 스케줄링이 필요
    • Interactive job에게 적절한 response 제공
    • CPU와 I/O 장치 등 시스템 자원을 효율적으로 사용

프로세스의 특성 분류

  • I/O-bound process
    • CPU를 잡고 계산하는 시간보다 I/O에 많은 시간이 필요한 job
    • many short CPU bursts
  • CPU-bound process
    • 계산 위주의 job
    • few very long CPU bursts

CPU Scheduler & Dispatcher

  • CPU Scheduler
    • Ready 상태의 프로세스 중에서 어떤 프로세스에게 CPU를 줄지 고름
  • Dispatcher
    • CPU의 제어권을 CPU Scheduler에 의해 선택된 프로세스에게 넘김
    • 이 과정을 Context switch라고 함
  • CPU 스케줄링이 필요한 경우는 프로세스에게 다음과 같은 상태 변화가 있는 경우
    1. Running -> Blocked(ex: I/O 요청 시스템 콜)
    2. Running -> Ready (ex: 할당 시간 만료로 timer interrupt)
    3. Blocked -> Ready (ex: I/O 완료 후의 Interrupt)
    4. Terminate
  • 1, 4에서의 스케줄링은 non-preemptive(비선점)
  • 다른 스케줄링은 preemptive(선점)

스케줄링 성능 척도

  • 시스템 입장
    • CPU utilization(이용률)
      • keep the CPU as busy as possible
    • Throughput(처리량)
      • number of processes that complete their execution per time unit
  • 프로세스 입장
    • Turnaround time(반환 시간)
      • amount of time to execute a particular process
    • Waiting time(대기 시간)
      • amount of time a process has been waiting in the ready queue
    • Response time(응답 시간)
      • amount of time it takes from when a request was submitted until the first response is produced(not output) for time-sharing env.
    • Waiting time은 프로세스가 대기했던 총 대기 시간, Response time은 프로세스가 최초로 CPU를 얻기까지의 시간

스케줄링 알고리즘

FCFS (First-Come First-Served)

  • 현실 세계에서 보편적인 처리 과정
  • 비선점(non-preemptive) 알고리즘이자, 효율적이지 않은 알고리즘
  • Convoy effect: CPU를 짧게 쓰는 프로세스들이 CPU를 길게 쓰는 프로세스 뒤에 배치되는 것

SJF (Shortest Job First)

  • 각 프로세스의 다음 번 CPU burst time을 가지고 스케줄링에 활용
  • CPU burst time이 가장 짧은 프로세스를 가장 먼저 스케줄링
  • Two schemes

    • Non-preemptive: 일단 CPU를 잡으면 이번 CPU burst가 완료될 때 까지 CPU를 선점 당하지 않음
    • Preemptive
      • 현재 수행 중인 프로세스의 남은 burst time보다 더 짧은 CPU burst time을 가지는 새로운 프로세스가 도착하면 CPU를 빼앗김
      • 이 방법을 Shortest-Remaining Time First(SRTF)라고도 부름
    • Preemptive가 average waiting time이 더 짧음
  • SJF is optimal
    • 주어진 프로세스들에 대해 Minimun average waiting time을 보장(가장 짧은 평균 대기 시간)
  • SJF의 문제점
    • CPU 사용 시간이 긴 프로세스들에 대한 Starvation의 문제가 있음
    • 다음 CPU Burst time의 예측
      • 다음 번 프로세스의 CPU Burst time을 어떻게 예측할 것인가? (input data, branch ...)
        • 과거의 CPU Burst time을 이용해서 추정(exponential averaging)

Priority Scheduling

  • A priority number is associated with each process
  • highest priority를 가진 프로세스에게 CPU 할당
  • SJF는 일종의 priority scheduling
  • 문제
    • Starvation: low priority processes may never execute
  • 해결 방안
    • Aging: as time progresses increase the priority of the process

Round-Robin

  • 각 프로세스는 동일한 크기의 할당 시간(time quantum)을 가짐
    • 일반적으로 10-100 milliseconds
  • 할당 시간이 지나면 프로세스는 선점 당하고, ready queue의 제일 뒤에 가서 다시 줄을 섬
  • n개의 프로세스가 ready queue에 있고, 할당 시간이 q time unit인 경우, 각 프로세스는 최대 q time unit 단위로 CPU 시간의 1/n을 얻음
    • 어떤 프로세스도 (n-1)q time unit 이상 기다리지 않음!
  • Performance
    • q large -> FCFS
    • q small -> Context Switch 오버헤드가 커짐
  • 극단적 예
    • 같은 수행 시간을 지닌 프로세스들을 짧은 Time quantum으로 쪼개면 긴 Waiting time, Turnaroun time을 지니게 되어 굉장히 비효율적이 될 수 있음
    • 어느 하나의 프로세스도 빨리 빠져나가지 못하고 계속 짧은 구간을 반복적으로 수행해야 하기 때문!

Multi-Level Queue

  • Ready Queue를 여러 개로 분할
    • foreground(interactive)
    • background(batch - no human interaction)
  • 각 Queue는 독립적인 스케줄링 알고리즘을 가짐
    • foreground - RR
    • background - FCFS
  • Queue에 대한 스케줄링이 필요
    • Fixed priority scheduling
      • serve all from foreground then from background
      • possibility of Starvation
    • Time slice
      • 각 queue에 CPU time을 적절한 비율로 할당
      • 80% to foreground in RR, 20% to background in FCFS

Multi-Level Feedback Queue

  • 프로세스가 다른 queue로 이동이 가능
  • Aging을 이와 같은 방식으로 구현 가능
  • Multilevel Feedback queue Scheduler를 정의하는 Parameters
    • Queue의 수
    • 각 Queue의 Scheduling Algorithm
    • 프로세스를 상위/하위 queue로 보내는 기준

Multiple-Processor Scheduling

  • CPU가 여러 개인 경우 스케줄링은 더욱 복잡해짐
  • Homogeneous processor인 경우
    • Queue에 한 줄로 세워서 각 프로세서가 알아서 꺼내가게 할 수 있음
    • 반드시 특정 프로세서에서 수행되어야 하는 프로세스가 있는 경우에는 문제가 더 복잡해짐
  • Load sharing
    • 일부 프로세서에 Job이 몰리지 않도록 부하를 적절히 공유하는 메커니즘 필요
    • 별개의 Queue를 두는 방법 vs. 공동 Queue를 사용하는 방법
  • Symmetric Multiprocessing
    • 각 프로세서가 각자 알아서 스케줄링 결정
  • Asymmetric Multiprocessing
    • 하나의 프로세서가 시스템 데이터의 접근과 공유를 책임지고, 나머지 프로세서는 거기에 따름

Real-Time Scheduling

  • Hard real-time systems
    • 정해진 시간 안에 반드시 끝내도록 스케줄링
  • Soft real-time computing
    • 일반 프로세스에 비해 높은 우선순위를 갖도록 해야 함

Thread Scheduling

  • Local Scheduling
    • User level thread의 경우 사용자 수준의 thread library에 의해 어떤 thread를 스케줄링할지 결정
  • Global Scheduling
    • Kernel level thread의 경우 일반 프로세스와 마찬가지로 Kernel의 단기 스케줄러가 어떤 thread를 스케줄링할지 결정

Algorithm Evaluation

  • Queueing models
    • 확률 분포로 주어지는 arrival rate와 service rate 등을 통해 각종 performance index 값을 계산
  • Implementation & Measurement
    • 실제 시스템에 알고리즘을 구현하여 실제 작업에 대해서 성능을 측정 비교
  • Simulation
    • 알고리즘을 모의 프로그램으로 작성 후, trace를 입력으로 하여 결과 비교
    • 다양한 Test case를 사용하여 돌려봐야 함


'Software Convergence > OS, Linux ' 카테고리의 다른 글

6. Process Synchronization (2)  (0) 2018.09.25
6. Process Synchronization (1)  (0) 2018.09.20
4. Process Management  (0) 2018.09.16
3. Process  (0) 2018.09.16
2. System Structure & Program Execution  (0) 2018.09.16

Process Management

프로세스 생성

  • 부모 프로세스가 자식 프로세스 생성
  • 프로세스의 Tree(계층 구조) 형성
  • 프로세스는 자원을 필요로 함
    • 운영체제로 부터 받음
    • 부모와 공유
  • 자원의 공유
    1. 부모와 지식이 모든 자원을 공유하는 모델
    2. 일부를 공유하는 모델
    3. 전혀 공유하지 않는 모델(common)
  • 수행(Execution)
    • 부모와 자식이 공존하며 수행되는 모델
    • 자식이 종료될 때 까지 부모가 기다리는 모델
  • 주소 공간(Address space)
    • 자식은 부모의 공간을 복사(binary & OS data)
    • 자식은 그 공간에 새로운 프로그램을 올림
  • UNIX의 예
    • fork() 시스템 콜이 새로운 프로세스 생성
      • 부모를 그대로 복사 (binary + OS data except PID)
      • 주소 공간 할당
    • fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림

프로세스 종료

  • 자발적: 프로세스가 마지막 명령을 수행한 후, 운영체제에게 이를 알려줌(exit)
    • 자식이 부모에게 output data를 보냄(via wait)
    • 프로세스의 각종 자원들이 운영체제에게 반납됨
  • 비자발적: 부모 프로세스가 자식의 수행을 종료시킴(abort)
    • 자식이 할당 자원의 한계치를 넘어섬
    • 자식에게 할당된 Task가 더 이상 필요하지 않음
    • 부모가 종료(exit)하는 경우
      • 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않음
      • 단계적 종료: 최하단 자식 프로세스부터 윗 단계로 단계적 종료

fork() 시스템 콜

  • A process is created by the fork() system call
  • create a new address space that is a duplicate of the caller
  • 자식 프로세스는 fork() 이후부터의 프로그램 실행
    • 부모 프로세스의 문맥(PC)이 fork() 실행 이후로 저장되기 때문!
int main()
{
    int pid;
    pid = fork();
    if (pid == 0) // this is child
        printf("\n Hello, I am child!\n");
    else if (pid > 0) // this is parent
        printf("\n Hello, I am parent!\n");
}

exec() 시스템 콜

  • A process can execute a different program by the exec() system call
  • replaces the memory image of the caller with a new program
int main()
{
    int pid;
    pid = fork();
    if (pid == 0) // this is child
    {
        printf("\n Hello, I am child! Now I'll run date \n");
        execlp("/bin/date", "/bin/date", (char *) 0);
    }
    else if (pid > 0) // this is parent
        printf("\n Hello, I am parent\n");
}
  • 반드시 자식을 만들어서 exec()을 할 필요는 없음
    • 부모 프로세스도 exec()으로 다른 프로그램 실행 가능
int main()
{
    printf("\n Hello! Now I'll run date \n");
    execlp("/bin/date", "/bin/date", (char *) 0);
    printf("\n Hello! I am back!\n");
}
  • 위 예제에서 exec()으로 완전히 다른 프로그램으로 바뀌었기 때문에 3번 째 printf문은 실행되지 않음

wait() 시스템 콜

  • 프로세스 A가 wait() 시스템 콜을 호출하면,
    • kernel은 child가 종료될 때 까지 프로세스 A를 sleep 시킴(Blocked)
    • Child 프로세스가 종료되면 kernel은 프로세스 A를 깨움(Ready)
  • 쉘에서 프로그램을 실행시키는 것이 wait() 시스템 콜의 예
    • 쉘이 프로그램을 자식 프로세스로 실행시키고,
    • 해당 프로세스가 종료될 때 까지 wait()

exit() 시스템 콜

  • 자발적 종료
    • 마지막 statement 수행 후, exit() 시스템 콜을 통해
    • 프로그램에 명시적으로 적어주지 않더라도 main 함수가 return 되는 위치에 컴파일러가 넣어줌
  • 비자발적 종료
    • 부모 프로세스가 자식 프로세스를 강제 종료
      • 자식 프로세스가 한계치를 넘엇는 자원 요청
      • 자식에게 할당된 Task가 더 이상 필요하지 않음
    • 키보드로 kill, break 등을 입력한 경우
    • 부모가 종료하는 경우
      • 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

프로세스 간 협력

  • 독립적 프로세스
    • 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
  • 협력 프로세스
    • 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
  • 프로세스 간 협력 메커니즘(IPC: Interprocess Communication)

  • 메시지를 전달하는 방법

    • message passing: 커널을 통해 메시지 전달
    • 주소 공간을 공유하는 방법
      • shared memory: 서로 다른 프로세스 간 일부 주소 공간을 공유하게 하는 메커니즘
        • shared memory의 사용을 위해서는 해당 프로세스들이 신뢰할 수 있는 관계여야 함
  • Thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 프로세스를 구성하는 Thread들 간에는 주소 공간을 공유하므로 협력이 가능

Message Passing

  • Message system
    • 프로세스 사이에 공유 변수를 일체 사용하지 않고 kernel을 통해 통신하는 시스템

'Software Convergence > OS, Linux ' 카테고리의 다른 글

6. Process Synchronization (1)  (0) 2018.09.20
5. CPU Scheduling  (0) 2018.09.17
3. Process  (0) 2018.09.16
2. System Structure & Program Execution  (0) 2018.09.16
1. Introduction to Operating Systems  (0) 2018.09.16

Process

프로세스의 개념

  • Process is a progam in execution
  • 프로세스의 문맥(context)
    • CPU 수행 상태를 나타내는 하드웨어 문맥
      • Program Counter
      • 각종 register
    • 프로세스의 주소 공간
      • code, data, stack
    • 프로세스 관련 커널 자료 구조
      • PCB(Process Control Block)
      • Kernel stack

프로세스의 상태

  • 프로세스는 지속적으로 상태가 변경되며 수행됨
  • Running: CPU를 할당 받아 명령을 수행 중인 상태
  • Ready: 메모리 등 다른 조건을 모두 만족하고 CPU를 기다리는 상태
  • Blocked(wait, sleep)
    • CPU를 주어도 당장 명령을 수행할 수 없는 상태
    • 프로세스 자신이 요청한 Event(ex: Disk I/O)가 즉시 만족되지 않아, 이를 기다리는 상태
  • New: 프로세스가 생성 중인 상태
  • Terminated: 수행이 끝난 상태

  • CPU를 사용하지 못하고 있는 이유는 위와 같이 다양함
  • Ready, Block Queue 관련 정보는 Kernel의 Data 영역에 저장됨

PCB(Process Control Block)

  • 운영체제가 각 프로세스를 관리하기 위해 프로세스 당 유지하는 정보로 구조체로 유지
  • (1) OS가 관리상 사용하는 정보
    • Process state, PID
    • scheduling information, priority..
  • (2) CPU 수행 관련 하드웨어 값
    • PC, registers
  • (3) 메모리 관련
    • code, data, stack의 위치 정보
  • (4) 파일 관련
    • Open file descriptors

Context Switch

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
  • CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
    • CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
    • CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
  • System call이나 Interrupt 발생 시 반드시 문맥 교환이 일어나는 것은 아님



프로세스를 스케줄링하기 위한 Queue

  • Job Queue: 현재 시스템 내에 있는 모든 프로세스의 집합
  • Ready Queue: 현재 메모리 내에 있으면서 CPU를 할당 받아 실행되기를 기다리는 프로세스의 집합
  • Device Queues: I/O device의 처리를 기다리는 프로세스의 집합
  • 프로세스들은 위의 Queue들을 오가며 수행됨

Scheduler

  • Long-term scheduler(Job scheduler)
    • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
    • 프로세스에 memory 및 각종 자원을 주는 문제
    • degree of Multiprogramming을 제어
      • 메모리에 올라가 있는 프로세스의 수
      • 메모리에 너무 적은 혹은 너무 많은 프로세스가 있지 않도록 제어
    • time sharing system에는 보통 장기 스케줄러가 없음
      • 무조건 ready queue로 보냄!
      • Swapper가 degree of Multiprogramming을 제어
  • Short-term scheduler(CPU scheduler)
    • 어떤 프로세스를 다음에 running 시킬지 결정
    • 프로세스에게 CPU를 주는 문제
    • millisecond 단위로 충분히 빨라야 함
  • Medium-term scheduler(Swapper)
    • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
    • 프로세스에게서 memory를 빼앗는 문제
    • degree of Multiprogramming을 제어

  • Swapper로 인해 추가되는 프로세스 상태 Suspended(stopped)
    • 외부적 이유로 프로세스의 수행이 정지된 상태
    • 프로세스는 통째로 디스크에 Swap out 됨
    • 외부에서 resume해 주어야 다시 Active
  • cf. 메모리에 너무 적은 프로세스만 올라가 있으면 왜 안좋은가?
    • 모든 프로세스들이 device queue에 들어가게 되면 CPU는 노는 상태가 되버림

Thread

  • A Thread(lightweight process) is a basic unit of CPU utilization

  • Thread의 구성(독립적으로 가지는 요소)
    • Program counter
    • Register set
    • Stack space
  • Thread가 동료 Thread와 공유하는 부분(Task)
    • Code section
    • Data section
    • OS resources
  • 즉, 공유할 수 있는 것은 최대한 공유하고, CPU 수행단위를 여러 개를 두는
  • Thread의 종류
    • kernel에 의해 지원되는 Kernel Threads
      • Thread가 여러 개 있다는 것을 kernel이 알고 있음
      • 따라서, context switch가 매우 빠름
    • library를 통해 지원되는 User Threads
      • Thread가 여러 개 있다는 것을 kernel은 모르고 사용자 프로그램이 관리해야 함
    • 이 외에도 Realtime thread도 존재

Thread의 장점

  • 응답성: 다중 Thread로 구성된 Task 구조에서는 하나의 서버 Thread가 Blocked(wait) 상태인 동안에도 동일한 Task 내의 다른 Thread가 Running이 되어 빠른 처리를 할 수 있음
    • ex) 웹 브라우저 프로세스를 구성하는 하나의 Thread가 이미지를 불러오는 동안에, 또 다른 Thread가 이미 읽어온 HTML 문서와 같은 것들을 미리 화면에 제공..
  • Resource Sharing: n개의 Threads는 하나의 프로세스의 binary code, data, resource를 공유
  • Economy: 동일한 일을 수행하는 다중 Thread가 협력하여 높은 Throughput과 성능 향상을 얻을 수 있음
    • thread 간 문맥 교환도 같은 process 내에서 일어나기 때문에 빠름
    • ex) Word 프로그램에서 여러 파일을 띄워놓을 때, 각각의 파일을 프로세스를 생성하여 수행하도록 하는 것이 아니라 Thread를 생성하여 성능 향상
  • Utilization of Multi Processor Architectures: 각각의 Thread는 여러 개의 프로세서에서 병렬적으로 running되어 병렬성을 높일 수 있음


'Software Convergence > OS, Linux ' 카테고리의 다른 글

5. CPU Scheduling  (0) 2018.09.17
4. Process Management  (0) 2018.09.16
2. System Structure & Program Execution  (0) 2018.09.16
1. Introduction to Operating Systems  (0) 2018.09.16
Linux Command Line Guide(2)  (0) 2018.09.10

System Structure & Program Execution

컴퓨터 시스템 구조

  • CPU는 매 클록 주기 마다 Memory에서 명령어를 읽어와 명령 수행

  • Memory는 CPU의 작업 공간
  • 사용자 프로그램이 I/O 요청할 때는 운영체제에게 CPU를 넘기고, 요청한 작업이 끝나 결과를 받을 때 까지 대기
    • 그 동안 CPU는 다른 프로그램을 수행
    • CPU는 매 프로그램의 종료 이후, 들어온 Interrupt가 있는지 확인

Mode bit

  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치가 필요

  • Mode bit을 통해 하드웨어적으로 2가지 모드의 Operation 지원

    • 사용자 모드(1): 사용자 프로그램 수행
      • 제한된 접근, 프로그램의 수행만 가능
    • 커널 모드(0): OS 코드 수행
      • 모든 접근, 프로그램의 수행이 가능
  • 보안을 해칠 수 있는 중요한 명령어는 커널 모드에서만 수행 가능한 특권 명령으로 규정
  • Interrupt나 Exception 발생 시, 하드웨어가 mode bit을 0으로 세팅
  • 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 세팅

Timer

  • CPU를 특정 프로그램이 독점하는 것으로부터 보호
  • 정해진 시간이 흐른 뒤, 운영체제에게 제어권이 넘어가도록 Interrupt를 발생시킴
  • Timer는 매 Clock tick 마다 1씩 감소
  • Timer 값이 0이 되면 Timer Interrupt 발생
  • Timer는 Time Sharing을 구현하기 위해 널리 이용됨
  • 또한, 현재 시간을 계산하기 위해서도 사용

Device Controller

  • 각 I/O 장치 유형을 관리하는 일종의 작은 CPU
  • 제어 정보를 위해 Control, Status register를 가짐
  • I/O 장치의 결과를 저장하기 위한 Local buffer를 가짐
  • I/O는 실제 Device와 Local buffer 사이에서 일어남
  • Device Controller는 I/O가 끝났을 경우, Interrupt로 CPU에 그 사실을 알림
  • Device Driver(장치 구동기): OS 코드 중 각 장치별 처리 루틴 -> Software

I/O의 수행

  • 모든 입출력 명령은 특권 명령 through.OS
  • 사용자 프로그램은 어떻게 I/O를 하는가?
    • System Call
      • 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것
    • Trap을 사용하여 인터럽트 벡터의 위치로 이동
    • 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
    • 올바른 I/O 요청인지 확인 후, I/O 수행
    • I/O 완료 시, 제어권을 System Call 다음 명령으로 옮김
  • 즉, I/O의 수행을 위해서는 2가지 인터럽트가 걸리는 것
    • I/O 요청 시의 Software Interrupt + I/O 완료 시의 Hardware Interrupt

Interrupt

  • 인터럽트 당한 시점의 Register와 PC를 저장한 후, CPU의 제어를 인터럽트 처리 루틴에 넘김
  • Interrupt: 하드웨어가 발생시킨 인터럽트
  • Trap: 소프트웨어가 발생시킨 인터럽트
    • Exception: 프로그램이 오류를 범한 경우
      • ex) 운영체제의 메모리 접근, divide by zero
    • System call: 프로그램이 커널 함수를 호출하는 경우
  • 인터럽트 관련 용어
    • 인터럽트 벡터: 해당 인터럽트의 처리 루틴 주소를 가지고 있음
    • 인터럽트 처리 루틴(인터럽트 핸들러): 해당 인터럽트를 처리하는 커널 함수

동기식 입출력과 비동기식 입출력

  • 동기식 입출력(Synchrounous I/O)
    • I/O 요청 후, 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
    • 구현 방법 1
      • I/O가 끝날 때 까지 CPU를 낭비
      • 매 시점 하나의 I/O만 일어날 수 있음
    • 구현 방법 2
      • I/O가 완료될 때 까지 해당 프로그램에게서 CPU를 빼앗음
      • I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
      • 다른 프로그램에게 CPU를 줌
      • I/O 요청이 끝나면 바로 요청했던 프로그램에게 CPU를 넘겨줌
  • 비동기식 입출력(Asynchrounous I/O)
    • I/O가 시작된 후, 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
  • 두 경우 모두 I/O의 완료는 Interrupt로 알려줌
  • I/O 결과가 다음 명령어 실행에 영향을 미치는 경우, 동기식 입출력을
  • 그렇지 않을 경우, 비동기식 입출력을 사용할 수 있음

DMA(Direct Memory Access)

  • 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
  • CPU의 중재 없이 Device controller가 device의 Buffer storage 내용을 메모리에 Block 단위로 직접 전송
  • Byte 단위가 아니라 Block 단위로 Interrupt 발생시킴

서로 다른 입출력 명령어

  1. Using I/O instruction: 메모리 접근하는 명령어 따로, I/O 장치 접근하는 명령어를 따로 두는 명령어 방식
  2. Memory Mapped I/O: I/O 장치들에 메모리 주소를 메겨, 메모리의 연장 선상으로 사용하는 방식

프로그램의 실행 (메모리 Load)

  • 프로그램은 '실행 파일' 형태로 File System에 저장
  • 각 프로그램은 프로세스로 변환되면서 고유의 Address space 형성
    • code, data, stack 등으로 구성
    • Kernel 역시 주소 공간을 형성하여 메모리에 올라감
  • 각 프로세스는 Address translation을 통해 Physical memory에 탑재
  • 프로그램의 실행을 위해 Memory에 올라가있을 필요가 없는 메모리들은 Swap area(HDD)에 내려 놓음
    • 일종의 Memory 연장 공간

커널 주소 공간의 내용

  • 어떤 사용자 프로그램이 커널 코드를 실행 중인지에 대해 알기 위해 프로세스 마다 커널 스택을 따로 둠

사용자 프로그램이 사용하는 함수

  • 사용자 정의 함수
    • 자신의 프로그램에서 정의한 함수
  • 라이브러리 함수
    • 자신의 프로그램에서 정의하지 않고 가져다 쓰는 함수
    • 자신의 프로그램의 실행 파일에 포함되어 있음
  • 커널 함수
    • 운영체제 프로그램의 함수
    • 커널 함수의 호출 = 시스템 콜


모든 출처는 반효경 교수님 운영체제 강의

'Software Convergence > OS, Linux ' 카테고리의 다른 글

4. Process Management  (0) 2018.09.16
3. Process  (0) 2018.09.16
1. Introduction to Operating Systems  (0) 2018.09.16
Linux Command Line Guide(2)  (0) 2018.09.10
vimtutor 내용 정리  (0) 2018.09.09

Introduction to Operating Systems

운영체제란?

  • 컴퓨터 하드웨어 바로 위에 설치되어 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층
  • 협의의 운영체제(커널): OS의 핵심 부분으로 메모리에 상주하는 부분
  • 광의의 운영체제: 커널 뿐 아니라 메모리에 상주하지 않는 각종 주변 시스템 유틸리티를 포함하는 개념

운영체제의 목적

  • 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공
    • 운영체제는 동시 사용자 / 프로그램들이 각각 독자적 컴퓨터에서 수행되는 것처럼 보이게 함
    • 하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행
  • 컴퓨터 시스템의 자원을 효율적으로 관리
    • 프로세서, 기억장치, I/O 장치 등의 효율적 관리
      • 사용자 간 형평성 있는 자원 분배
      • 주어진 자원으로 최대한의 성능을 내도록 함
        • 실행 중 프로그램들에게 짧은 시간 씩 CPU를 번갈아 할당
        • 실행 중 프로그램들에게 메모리 공간을 적절히 분배
    • 사용자 및 운영체제 자신의 보호
    • 프로세스, 파일, 메시지 등을 관리(소프트웨어 자원)

운영체제의 분류

  1. 동시 작업 가능 여부
    • 단일 작업(single tasking): 한 번에 하나의 작업만 처리
      • ex) MS-DOS 프롬프트 상에서는 한 명령의 수행을 끝내기 전에 다른 명령을 수행시킬 수 없음
    • 다중 작업(multi tasking): 동시에 두 개 이상의 작업 처리
      • ex) UNIX, MS Windows 등에서는 한 명령의 수행이 끝나기 전에 다른 명령이나 프로그램을 수행할 수 있음
  2. 사용자의 수
    • 단일 사용자(single user)
      • ex) MS-DOS, MS Windows
    • 다중 사용자(multi user)
      • ex) UNIX, NT Server
  3. 처리 방식
    • 일괄 처리(Batch processing)

      • 작업 요청의 일정량을 모아 한꺼번에 처리
      • 작업이 완전히 종료될 때까지 기다려야 함
        • ex) 초기 Punch card 시스템
    • 시분할(Time sharing)

      • 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용
      • 일괄 처리 시스템에 비해 짧은 응답 시간을 가짐
      • 사용자 입장에서는 interactive한 방식
    • 실시간(Realtime OS)

      • 정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야 하는(dead-line) 실시간 시스템을 위한 OS
      • 실시간 시스템의 개념 확장
        • Hard Realtime System
          • ex) 미사일 제어, 원자로/공장 제어
        • Soft Realtime System
          • ex) 영화 스트리밍
      • 실시간성을 필요로 하는 어플리케이션이 늘어남에 따라 범용 운영체제 역시 어떻게 '실시간성'을 지켜줄 것인가에 대한 연구를 진행(ex. 블랙박스, 네비게이션)

혼동하기 쉬운 용어

  • Multitasking
  • Multiprogramming
  • Time sharing
  • Multiprocess
  • 위 용어들은 컴퓨터에서 여러 작업을 동시에 수행하는 것을 뜻함
  • Multiprogramming은 여러 프로그램이 메모리에 올라가 있음을 강조
  • Time sharing은 CPU의 시간을 분할하여 나누어 쓴다는 의미를 강조

- Multiprocessor: 하나의 컴퓨터에 CPU가 여러 개 붙어 있음을 의미 


'Software Convergence > OS, Linux ' 카테고리의 다른 글

3. Process  (0) 2018.09.16
2. System Structure & Program Execution  (0) 2018.09.16
Linux Command Line Guide(2)  (0) 2018.09.10
vimtutor 내용 정리  (0) 2018.09.09
Linux Command Line Guide (1)  (0) 2018.09.06

쉘 학습(2)

리다이렉션

표준 입출력과 표준 오류

  • 출력은 두 가지 형식을 포함
    1. 프로그램의 결과. 즉, 프로그램이 출력하도록 설계한 데이터
    2. 프로그램이 어떻게 돌아가고 있는지를 말해주는 상태 및 오류 메시지 형식
  • I/O 리다이렉션 기능으로 출력과 입력의 방향 변경 가능

표준 출력 재지정
  • 화면에 출력하는 대신 다른 파일에 출력하도록 할 수 있음
  • 명령어 출력결과를 파일에 저장하는 것이 종종 유용하기 때문
ls -l /usr/bin > ls-output.txt
  • > 리다이렉션 연산자로 출력 방향을 지정할 때, 목적 파일은 항상 처음부터 다시 작성됨

  • 이러한 트릭을 이용하여 빈 파일을 만드는 방법
> ls-output.txt
  • >> 리다이렉션 연산자를 사용하여 파일에 이어 쓰기가 가능해짐


표준 오류 재지정
  • 표준 오류 재지정할 때는 리다이렉션 연산자가 필요 없음
  • 파일 디스크립터를 참조
    • 0, 1, 2번 파일 디스크립터
    • 순서대로 표준 입력, 표준 출력 , 표준 오류
ls -l /bin/usr 2> le-error.txt

표준 출력과 표준 오류를 한 파일로 재지정
ls -l /bin/usr &> ls-output.txt
  • &> 표기가 표준 출력과 표준 오류를 함께 재지정해주는 역할

원치 않는 출력 제거
  • /dev/null 이라는 특수한 파일로 출력 방향을 지정함으로써 출력 결과 버릴 수 있음
  • 비트 버킷이라고 불리는 시스템 장치로 입력을 받고 아무것도 수행하지 않음

표준 입력 재지정
파일 붙이기
  • cat 명령어는 하나 이상의 파일을 읽어 들여서 표준 출력으로 그 내용을 복사
  • 주로 짧은 텍스트 파일을 표시하거나, 파일을 하나로 합치는 데에도 사용 가능
[me@linuxbox~] cat
The quick fox jumped.
The quick fox jumped. // CTRL + D 눌러 EOF 문자 입력

[me@linuxbox~] cat > lazy_dog.txt
The quick fox jumped.
// CTRL + D 눌러 EOF 문자 입력

[me@linuxbox~]cat lazy_dog.txt
[me@linuxbox~]cat < lazy_dog.txt
는 똑같은 기능 수행

파이프라인

  • command1 | command2를 활용하여 표준 출력을 표준 입력으로 활용 가능
ls -l /usr/bin | less

필터
  • 파이프라인은 데이터의 복잡한 연산을 수행할 때 종종 사용
  • 하나의 파이프라인에 여러 명령어의 입력이 가능
ls /bin /usr/bin | sort | less
// 두 디렉토리에 있는 실행 프로그램들을 하나의 목록으로 만들어 정렬한 뒤 보여줌

중복줄 제거 및 표시
  • uniq 명령어는 종종 sort와 함께 사용
# 중복된 내용을 제거해서 보고자 할 때
ls /bin /usr/bin | sort | uniq | less
# 중복된 내용만 보고자 할 때 
ls /bin /usr/bin | sort | uniq -d | less

라인, 단어 개수 및 파일 크기 출력
  • wc 명령어는 파일에 들어있는 라인 - 단어 - 파일 크기의 순으로 출력
wc file.txt
  • -l 옵션은 라인 수만 보고 싶을 때 사용 가능
# 정렬된 목록의 항목 개수를 알고 싶을 때 사용
ls /bin /usr/bin | sort | uniq | wc -l

패턴과 일치하는 라인 출력
  • grep 명령어는 파일 내에서 "패턴"을 만났을 때, 그 패턴을 가지고 있는 라인을 출력
    • grep pattern [file...]
ls /bin /usr/bin | sort | uniq | grep zip
  • -i 옵션은 검색 수행할 때 대소문자 구분하지 않도록 함
  • -v 옵션은 패턴과 일치하지 않는 라인만 출력

파일의 처음/끝 부분 출력
  • head, tail 명령어로 첫 / 마지막 10줄 표시 가능
  • head(tail) -n #로 그 수 조정 가능
  • tail에 -f 옵션 지정하면, 실시간으로 파일 확인 가능
tail -f /var/log/messages

표준 입력에서 데이터 읽고, 표준 출력과 파일에 출력
  • tee 프로그램은 표준 입력으로부터 데이터를 읽어서 표준 출력과 하나 이상의 다른 파일에 동시에 출력
  • 작업이 진행되고 있을 때, 중간 지점의 파이프라인에 있는 내용을 알고 싶을 때 유용
ls /usr/bin | tee ls.txt | grep zip



확장과 인용

확장

  • 쉘은 명령어가 실행되기 직전에 모든 한정 문자들을 한정

  • 위 그림에서 쉘은 * 기호를 확장시킨 후, 디렉토리의 이름으로 확장하여 보여주었음

경로명 확장
echo D*
echo *s
echo /usr/*/share

틸드 확장
# 현재 사용자의 홈 디렉토리명
echo ~

# foo 계정의 홈 디렉토리명
echo ~foo

산술 확장
  • &((expression)) 으로 산술 확장 사용 가능
echo $(((5**2) *3))

중괄호 확장
  • 중괄호 안에 표현된 패턴과 일치하는 다양한 텍스트 문자열 생성 가능

  • 위와 같이 정렬된 디렉토리 생성에 아주 유용하게 사용 가능

매개변수 확장
  • 매개변수를 확장해서 볼 수 있음
  • ex) echo $USER
  • 사용 가능한 변수 목록 보기
    • printenv | less

명령어 치환
  • 명령어 치환으로 명령어의 출력 결과를 확장해서 사용 가능
    • ex) echo $(ls)

따옴표 활용(Quoting)

따옴표 기호를 활용하여 원치 않는 확장을 선택적으로 감출 수 있음

쌍 따옴표 기호

  • 쌍 따옴표 기호를 이용하여 원치 않는 단어 분할 문제 해결 가능
  • 쌍 따옴표가 사용되면, 커맨드라인에서 하나의 명령 인자로 처리
    • 첫 번째 입력은 38개의 명령 인자를 가진 명령어로 인식
    • 두 번째 입력은 빈칸과 개행 문자 포함하여 하나의 명령 인자로 인식

따옴표 기호

  • 모든 확장을 숨겨야 한다면 따옴표 기호 사용

이스케이프 문자
  • 종종 선택적으로 확장을 막기 위해 쌍 따옴표 안에서 사용
  • 또한 파일명에 있는 어떤 문자가 가진 특별한 의미를 없애고 싶을 때 흔히 사용

고급 키보드 기법

커맨드라인 편집

커서 이동
  • CTRL + A: 줄 맨 앞으로 커서 이동
  • CTRL + E: 줄 맨 끝으로 커서 이동
  • ALT + F: 다음 한 단어로 커서 이동
  • ALT + B: 이전 한 단어로 커서 이동

텍스트 수정
  • CTRL + T: 현재 커서 위치에 있는 글자와 바로 앞글자의 위치 바꾸기
  • ALT + T: 현재 커서 위치에 있는 단어와 바로 앞 단어의 위치 바꾸기
  • ALT + L: 현재 커서 위치에 있는 글자부터 그 단어 끝 부분까지 소문자로 바꾸기
  • ALT + U: 현재 커서 위치에 있는 글자부터 그 단어 끝 부분까지 대문자로 바꾸기

  • CTRL + K: 현재 커서 위치로부터 그 줄 끝 부분까지 텍스트 지우기
  • CTRL + U: 현재 커서 위치로부터 그 줄 처음 부분까지 텍스트 지우기
  • ALT + D: 현재 커서 위치에서부터 그 단어 끝 부분까지 텍스트 지우기
  • ALT + BACKSPACE: 현재 커서 위치에서부터 그 단어 앞부분까지 텍스트 삭제하기
  • CTRL + Y: 잘라낸 데이터는 kill-ring이라고 하는 버퍼에 저장되는데, kill-ring에 있는 텍스트를 현재 커서 위치에 삽입

히스토리 활용

  • bash는 입력된 명령어에 대한 히스토리를 저장
  • 히스토리는 홈 디렉토리에 .bash_history라는 파일로 저장
히스토리 검색
  • 기본값으로 bash는 사용자가 입력한 최근 500개의 명령어 저장
  • 출력 결과 중 필요한 명령어가 포함된 줄만을 찾을 수도 있음
    • 이후 !line_number로 해당 명령어 재실행 가능
  • CTRL + R: 역순 증분 검색으로, 현재 커맨드라인에서 히스토리 목록으로 증분 검색
    • bash에 명령을 주면 각 글자가 추가될 때마다 우리가 원하는 검색 결과를 골라서 보여줌
    • 원하는 결과를 찾으면 CTRL + J를 눌러 현재 커맨드라인에 그 명령어 복사 가능

히스토리 확장
  • !!: 마지막 명령어를 반복하여 실행
  • !string: 이 문자열로 시작하는 가장 최근에 입력된 항목 실행
  • !?string: 이 문자열이 포함된 가장 최근에 입력된 항목을 실행

퍼미션

소유자, 그룹 멤버, 기타 사용자

  • id 명령어 통해 자신의 사용자 ID 정보 확인 가능
  • 사용자 ID(uid)와 주 그룹 ID(gid) 존재
  • 사용자 계정은 /etc/passwd 파일에 정의
  • 그룹은 /etc/group 파일에 저으이
  • 사용자 계정과 그룹이 생성되면, 이 파일들은 사용자 비밀번호에 관한 정보를 가진 /etc/shadow에 덧붙여 수정

파일 모드 변경
8진법 표현
  • 0: ---  1: --x  2: -w-  3: -wx  4: r--
  • 5: r-x  6: rw-  7: rwx

기호 표현
  • u: user의 약자로, 파일이나 디렉토리 소유자

  • g: 그룹 소유자

  • o: othres의 약자로, 기타 사용자

  • a: all의 약자로, u,g,o의 조합

  • chmod 기호 표기법 예제

    • u+x: 소유자에게 실행 권한 추가
    • u-x: 소유자에게 실행 권한 제거
    • +x: 모든 사용자에게 실행 권한 추가
    • go=rw: 그룹 소유자와 기타 사용자가 읽기, 쓰기 권한을 갖도록 함

기본 권한 설정

  • 파일 모드 속성에서 제거할 비트 마스크를 표현하는 umask 설정
  • 일반적인 umask의 기본 값은 0002 혹은 0022

사용자 ID 변경

다른 사용자 ID와 그룹 ID로 쉘 실행
  • su - 명령어로 슈퍼유저로 쉘 시작 가능
  • su -c 'command': 새로운 명령어로 시작하지 않고 단일 명령어 수행 가능

다른 사용자로 명령어 실행
  • 사용자는 하나 이상의 지정된 명령어로 제한되고 나머지는 불가
  • sudo -l: sudo로 허용된 특권을 확인하기 위한 옵션
  • sudo는 슈퍼유저의 비밀번호를 요구하지 않음

파일 소유자와 그룹 변경
  • chown [owner][:[group]] file...
  • chown 인자 예제
    • bob: 파일 소유자를 bob으로 변경
    • bob:users: 파일 소유자를 bob으로 변경하고, 파일 그룹 소유자를 users 그룹으로 변경
    • :admins: 파일 그룹 소유자만 admins 그룹으로 변경
    • bob::파일 소유자가 bob으로 변경되고 그룹 소유자는 bob의 로그인 그룹으로 변경

사용자 비밀번호 변경

  • passwd [user] 명령어 통해 자신의 비밀번호 변경 가능
  • 슈퍼유저 특권을 가지고 있다면 첫 번째 인자에 사용자 이름을 지정해서 해당 사용자의 비밀번호 설정 가능

프로세스

프로세스는 어떻게 동작하는가

  • 시스템이 구동될 때, 커널은 몇몇 프로세스를 초기화하고 init이라는 프로그램 실행
  • init은 차례차례 모든 시스템 서비스를 시작하기 위해 init 스크립트라고 불리는 쉘 스크립트 실행

ps 명령어로 프로세스 보기
  • 프로세스를 보는 가장 일반적인 명령어는 ps
  • tty(teletype): 프로세스용 제어 터미널

  • ps aux 명령어로 모든 프로세스를 보여줌
  • 프로세스 상태
    • R: 실행 상태
    • S: 수면 상태
    • D: 인터럽트 불가능한 수면 상태
    • T: 종료 상태
    • Z: 좀비 프로세스
    • <: 높은 우선순위 프로세스
    • N: 낮은 우선순위 프로세스
  • ps 헤더들
    • USER: 사용자 ID
    • %CPU: CPU 사용량
    • %MEM: 메모리 사용량
    • VSZ: 가상 메모리 크기
    • RSS: 사용 메모리 크기
    • START: 프로세스가 시작된 시각

top 명령어로 프로세스 변화 보기

  • top 프로그램은 프로세스가 활동순으로 나열된 시스템 프로세스들을 지속적으로 갱신하여 보여줌
  • 시스템상의 최상위 프로세스들을 보기 위해 사용
  • top 정보 필드
    • up 19days: 시스템이 마지막 부팅된 시점부터 지금까지의 시간
    • 1 users: 로그인한 사용자의 수
    • load average: 평균부하는 실행 대기중인 프로세스 수 의미
    • Tasks: 프로세스 수와 프로세스 상태별 수
    • 0.0 us: CPU의 0.0%를 사용자 프로세스들이 사용 중
    • 0.0 sy: CPU의 0.0%를 시스템(커널) 프로세스에서 사용 중
    • 0.0 ni: CPU의 0.0%를 nice 프로세스가 사용 중
    • 100.0 id: CPU의 100.0%가 유휴 상태
    • 0.0 wa: CPU의 0.0%가 I/O 대기 중
    • Mem: 물리메모리 사용현황
    • Swap: 스왑 영역(가상 메모리) 사용현황

프로세스를 백그라운드로 전환
  • & 기호를 사용하여 프로그램을 백그라운드로 이동 가능
  • jobs 명령어는 터미널에 실행 중인 작업을 나열해주는 기능
    • jobs에서 지정한 작업 번호(jobspec)을 이용하여 fg로 재전환 가능
    • ex) fg %1

프로세스 정지(일시정지)
  • 포어그라운드 프로세스를 정지하기 위해서는 CTRL+Z를 누름
  • 이후, fg 명령어로 프로그램을 포어그라운드로 복원하거나, bg 명령어로 프로그램을 백그라운드로 이동 가능
    • ex) bg %1

시그널

  • kill 명령어는 프로세스를 종료하는 것이 아니라, 프로세스에 시그널을 보내는 것
kill로 시그널 보내기
  • kill [-signal] PID ...
  • 커맨드라인에 지정된 시그널이 없다면, 기본적으로 종료 시그널을 보냄
  • 주요 시그널
    • 1(HUP): 제어 터미널과 연결이 끊어진 프로그램을 가리키는데 사용
    • 2(INT): Interrupt. 터미널에서 CTRL+C 키를 보낸 것과 동일한 기능
    • 9(KILL): 커널이 프로세스를 즉시 종료. KILL 시그널은 마지막 수단으로 사용되어야 함(진행 중 작업 저장할 기회가 없음)
    • 15(TERM): 프로그램이 시그널을 받을 수 있을 정도로 "살아있다면" 프로그램은 이 시그널을 받고 종료됨
    • 18(CONT): STO 시그널로 정지된 프로세스 복원
    • 19(STOP): 프로세스를 종료 없이 일시 정지 시킴
  • kill 명령어로 프로세스에 시그널을 보내려면 반드시 그 프로세스의 소유자이거나 슈퍼유저여야 함
  • 그 외 주요 시그널
    • 3(QUIT): Quit. 사용자가 종료 키를 입력하면 커널이 프로세스에 SIGQUIT 시그널 보냄
    • 11(SEGV): 프로그램이 잘못된 메모리 사용이 이뤄질 때 보내짐
    • 20(TSTP): CTRL+Z를 눌렀을 때 터미널에 의해 보내짐
    • 28 (WINCH): 윈도우 크기가 변경된 경우 시스템에 보내짐
  • killall로 다수의 프로세스에 시그널을 보낼 수도 있음
    • killall [-u user] [-signal] name ...

기타 프로세스 관련 명령어들

  • pstree: 프로세스 간의 부모/자식 관계를 보여주는 트리 형태로 정렬해서 프로세스 목록 출력
  • vmstat: 메모리, 스왑, 디스크 I/O를 포함한 시스템 자원 사용 현황 출력
  • xload: 시간에 따라 시스템 부하를 그래프로 보여주는 그래픽 프로그램
  • tload: xload 프로그램과 유사하지만 터미널에서 그래프 보여줌


'Software Convergence > OS, Linux ' 카테고리의 다른 글

2. System Structure & Program Execution  (0) 2018.09.16
1. Introduction to Operating Systems  (0) 2018.09.16
vimtutor 내용 정리  (0) 2018.09.09
Linux Command Line Guide (1)  (0) 2018.09.06
sudo 명령어 수행 안되는 경우  (0) 2018.07.25

Vim tutor (ver. 1.7) 정리

Lesson 1

1.1. MOVING THE CURSOR
  • h, j, k, l 키로 커서 이동 가능
  • h는 좌측으로 이동 / l은 우측으로 이동
  • j는 아래로 이동 / k는 위로 이동
  • 화살표 키도 같은 원리로 동작하지만, hjkl을 사용하는 것이 익숙해지면 더 좋은 성능을 보임

1.2. EXITING VIM

  1. 키를 통해 Normal mode로 전환
  2. Type :q!
    • q!를 이용한 종료는 수정 내역을 모두 무시하는 종료

1.3. TEXT EDITING - DELETION

  • x키를 사용하여 cursor가 표시하고 있는 문자 삭제 가능

1.4. TEXT EDITING - INSERTION

  1. Normal mode에서 Insert Mode로 전환하기 위해 [i] 누름
  2. cursor 왼쪽에 문자 추가 가능

1.5. TEXT EDITING - APPENDING

  1. Normal mode에서 Insert Mode로 [a]를 눌러 전환
  2. cursor가 표시하고 있는 오른쪽부터 문자 추가 가능

1.6. EDITING A FILE

  • :wq : 수정 사항을 반영하여 파일을 저장한 후 종료

Lesson 2

2.1. DELETION COMMANDS

  • Normal mode에서 dw 명령어 사용하여 단어 단위로 삭제 가능
  • Normal mode에서 dd 명령어 사용하여 line 단위로 삭제 가능

2.2. ON OPERATORS AND MOTIONS

  • w: 다음 단어의 첫 글자로 이동
  • e: 다음 단어의 마지막 글자로 이동
  • $: line의 맨 마지막 글자로 이동

2.3. USING A COUNT FOR A MOTION

  • 2w, 3e 등 숫자를 활용한 이동 또한 가능
  • 0 입력해서 line의 처음으로 이동 가능

2.4. USING A COUNT TO DELETE MORE

  • d2w, d3w 등으로 단어 여러 개 동시에 삭제도 가능

2.5. THE UNDO COMMAND

  • u 입력하여 마지막 명령 취소 가능
  • U 입력하여 전체 라인에 대한 수정 취소 가능

Lesson 3

3.1. THE PUT COMMAND

  • 무언가를 지우면 Vim register에 저장됨
  • 이를 이용하여 삭제한 특정 line을 p 입력으로 커서 아래에 붙여넣기 가능

3.2. THE REPLACE COMMAND

  • r + <바꿀 글자> 명령어로 커서 아래 글자의 변경 가능

3.3. THE CHANGE OPERATOR

  • ce 입력하여 커서 뒤 글자들 제거 가능
  • 제거 이후 사용자를 Insert mode에 위치시킴
  • Deletion 때와 마찬가지로 cw, c$ 등의 명령어도 적용이 가능

Lesson 4

4.1. CURSOR LOCATION AND FILE STATUS

  • CTRL-G: 현재 자신이 보고있는 파일의 위치와 상태 표시
  • gg: 파일의 맨 처음 line으로 이동
  • G: 파일의 맨 마지막 line으로 이동
  • line # + G: 해당 line 번호로 이동

4.2. THE SEARCH COMMAND

  • / 누른 후 원하는 검색어 입력하여 검색 가능(커서 다음부터 검색)
  • ? 누른 후 원하는 검색어 입력하여 검색 가능(커서 이전부터 검색)
  • n: 다음 검색 결과 확인 가능
  • N: 이전 검색 결과 확인 가능
  • CTRL-O: 검색 이전에 있던 장소로 돌아가기
  • CTRL-I: 다음 장소로 이동

4.3. MATCHING PARENTHESES SEARCH

  • 커서를 (, [, { 위에 올려놓고 % 입력
  • 닫히는 괄호를 찾아주는 기능 수행
  • 괄호가 안맞는 프로그램을 디버깅할 때 매우 유용하게 사용 가능

4.4. THE SUBSTITUTE COMMAND

  • :s/old/new: line 내 첫 번째 old를 new로 교체
  • :s/old/new/g: line 내 모든 old를 new로 교체
  • :%s/old/new/g: 파일 내 모든 old를 new로 교체
  • :%s/old/new/gc: 파일 내 모든 old를 new로 교체하되, 매 번 확인 여부 물음
  • :#,#s/old/new/g: 두 line 번호 사이에 있는 모든 old를 new로 교체

Lesson 5

5.1. HOW TO EXECUTE AN EXTERNAL COMMAND

  • :! 이후에 external command를 입력하여 외부 명령어 실행 가능

5.2. MORE ON WRITING FILES

  • :w file_name 으로 다른 이름으로 저장 가능

5.3. SELECTIONG TEXT TO WRITE

  • v 눌러서 Visual mode로 진입
  • 커서 옮겨서 처리하고 싶은 line들 highlighted 되게 설정
  • :누르면 :'<,'> 를 확인 가능
:'<,'>w TEST

5.4. RETRIEVING AND MERGING FILES

  • r 명령어 통해 파일 읽어와 현재 파일의 커서에 붙여넣기 가능
:r FILENAME

# 아래와 같은 응용도 가능
:r !ls



Lesson 6

6.1. THE OPEN COMMAND

  • o: 커서 아래에 한 공백 line을 추가하고 사용자를 Insert mode에 진입시킴
  • O: 커서 위에 한 공백 line을 추가하고 사용자를 Insert mode에 진입시킴

6.2. THE APPEND COMMAND

  • a: 커서 다음에 새로운 글자 추가하도록 함
  • A: line 마지막에 새로운 글자 추가하도록 함

6.3. ANOTHER WAY TO REPLACE

  • R: Replace mode로 진입
  • 입력한 글자가 이미 존재하는 글자들 지우는 형태의 모드

6.4. COPY AND PASTE TEXT

  • v 눌러 Visual mode 진입한 후, y 버튼으로 highlighted 된 문장 복사 가능
  • p 눌러 복사한 문장 붙여넣기 가능
  • yw: 한 단어 복사
  • V: line 단위로 Visual mode highlight

6.5. SET OPTION

  • :set ic: 대소문자 구분 없이 검색 가능하게 하는 옵션
  • :set noic: ic 옵션 비활성화
  • :set hls: 모든 검색 결과 highlight 되도록 하는 옵션
  • :nohlsearch: 검색 결과 highlight 제거
  • :set is: 부분 매칭되는 결과도 함께 보여주도록 하는 옵션
  • 옵션의 앞에 'no' 붙이면 옵션 해제 가능

Lesson 7

7.1. GETTING HELP

  • [F1] 키 or :help 입력해서 도움 시스템 실행 가능
  • CTRL + W 눌러 서로 다른 창 이동 가능

7.2 CREATE A STARTUP SCRIPT

  • vimrc 파일 수정해서 원하는 옵션 추가하여 사용 가능
    • 위치: ~/.vimrc
  • :r $VIMRUNTIME/vimrc_example.vim
    • 코드 파일 syntax highlight 기능 추가!

7.3 COMPLETION

  • : 누르고 문자 입력한 후, CTRL + D 입력하면 해당 문자로 시작하는 명령어 목록 보여줌
  • 키로 명령어 자동완성 기능 사용 가능

'Software Convergence > OS, Linux ' 카테고리의 다른 글

1. Introduction to Operating Systems  (0) 2018.09.16
Linux Command Line Guide(2)  (0) 2018.09.10
Linux Command Line Guide (1)  (0) 2018.09.06
sudo 명령어 수행 안되는 경우  (0) 2018.07.25
Daemon이란?  (0) 2018.07.19

폰 노이만 아키텍쳐

  • EDVAC 컴퓨터에 대한 보고서에서 처음으로 등장 아키텍쳐

  • 폰 노이만 아키텍쳐 컴퓨터의 구성 요소
    • ALU와 프로세서 레지스터를 지닌 CPU
    • 명령어 레지스터와 PC를 가진 제어 유닛
    • 데이터와 명령어를 저장하는 주기억장치
    • 큰 용량의 외부 보조기억장치
    • I/O 메커니즘
  • 폰 노이만 아키텍쳐는 점차 '프로그램 내장식 컴퓨터(stored-program computer)' 라는 단어로 진화
    • Instruction fetch와 Data operation이 동시에 일어나지 않아야 함
    • 그 둘은 같은 System bus를 공유하기 때문
    • 이러한 특성으로 인해 폰 노이만 병목 현상이 발생되어, 종종 성능 저하 발생
  • 폰 노이만 아키텍쳐와 하버드 아키텍쳐의 가장 큰 차이는 Main memory가 아닌 캐시 아키텍쳐에 적용됨(분산 캐시 구조)

폰 노이만 병목 현상

  • 프로그램 메모리와 데이터 메모리를 공유하는 시스템 버스는 폰 노이만 병목 현상을 야기함
    • CPU와 메모리 사이의 제한된 데이터 전송률로 인해 발생
  • 하나의 버스는 프로그램 메모리, 데이터 메모리 중 하나의 메모리에만 접근 가능하기 때문에, throughput이 CPU의 작업 속도에 한참 미치지 못함
  • 특히, 적은 CPU 사용에 많은 양의 데이터를 필요로 할 때 그 성능 저하가 극에 달하게 됨

병목 현상 완화 방안

  1. CPU와 Main memory 사이에 cache 설치
  2. 분리된 캐시 혹은 명렁어와 데이터에 분산된 접근을 사용(so-called Modified Harvard architecture)
  3. 분기 예측 알고리즘과 로직을 사용
  4. 메모리 접근 횟수를 줄이기 위해 제한된 수의 CPU 스택 혹은 다른 on-chip Local memory를 사용


'Software Convergence > Computer Architecture' 카테고리의 다른 글

기억장치  (0) 2018.09.08
CPU의 구조와 기능  (0) 2018.09.08
시스템 버스, I/O 및 인터럽트  (0) 2018.09.07

기억장치

  • 모든 컴퓨터시스템들은 프로그램과 데이터를 저장하기 위한 장치로서 주기억 장치보조저장장치를 가지고 있음
  • 기억장치는 CPU가 직접 액세스할 수 있는 내부 기억장치와 장치 제어기를 통하여 액세스할 수 있는 외부 기억장치로 구성

1. 기억장치의 분류와 특성

  • CPU가 어떤 정보를 기억장치에 쓰거나 기억장치로부터 읽는 동작을 액세스한다고 말함
  • 기억장치의 액세스 유형
    1. 순차적 액세스: 기억장치에 저장된 정보들을 처음부터 순서대로 액세스. 정보가 저장된 위치에 따라 액세스 시간이 달라짐
    2. 직접 액세스: 읽기/쓰기 장치를 정보가 위치한 근처로 직접 이동시킨 다음에, 순차적 검색으로 최종 위치에 도달하여 액세스 하는 방식
    3. 임의 액세스: 기억 장소들이 임의로 선택될 수 있으며, 기억장치 내의 어떤 위치든 동일한 액세스 시간이 걸리는 방식
    4. 연관 액세스: 각 기억 장소에 포함된 key값의 검색을 통하여 액세스할 위치를 찾아내는 방식
  • 기억장치 시스템을 설계하는 데 있어 고려해야 할 주요 특성은 용량액세스 속도
  • 기억장치에서 용량을 나타내는 단위는 바이트(byte) 혹은 단어(word)
  • 전송 단위: CPU가 한 번의 기억장치 액세스에 의해 읽거나 쓸 수 있는 비트 수
    • 외부 기억장치에서는 데이터가 단어보다 훨씬 큰 단위로 전송되기도 하는데, 그 단위를 블록이라 부름
  • 주소지정 단위: 하나의 주소에 의해 액세스되는 비트들의 그룹
  • 액세스 속도와 관련된 파라미터
    • 액세스 시간: 주소와 읽기/쓰기 신호가 기억장치에 도착한 순간부터 데이터가 저장되거나 읽혀지는 동작이 완료될 때 까지의 시간
    • 기억장치 사이클 시간: 액세스 시간과 데이터 복원 시간을 합한 시간
    • 데이터 전송률: 기억장치로부터 초당 읽혀지거나 쓰여질 수 있는 비트 수
      • (1/액세스 시간) X (한 번에 읽혀지는 데이터 바이트의 수)
  • 휘발성 기억장치: 전력공급이 중단되면 저장된 내요이 사라지는 기억장치
  • 비휘발성 기억장치: 전력공급이 중단되어도 저장된 내용이 그대로 유지되는 기억장치

2. 계층적 기억장치시스템

  • 기억장치들은 유형에 따라 기능, 속도, 용량 및 가격이 매우 다양
  • 컴퓨터시스템에서는 여러 유형의 기억장치들을 계층적으로 구성하여 설치함으로써, 평균 기억장치 액세스 속도를 높이면서 가격대비 성능비도 적절히 유지되도록 하는 계층적 기억장치시스템을 구성함

2-1. 필요성 및 효과

  • 액세스 속도가 높아질수록, 비트당 가격도 높아짐
  • 용량이 커질수록 비트당 가격은 낮아짐
  • 용량이 커질수록 액세스 속도는 낮아짐
  • 지역성의 원리: CPU가 기억장치의 한정된 몇몇 영역들을 집중적으로 액세스하면서 작업을 수행한다는 원리
  • 지역성의 원리로 인해 계층적 기억장치시스템의 효율이 극대화되게 됨

2-2. 기억장치 계층

  • 상위 기억장치 계층으로 올라갈수록...
    • 비트당 가격이 높아지고,
    • 용량이 감소하며,
    • 액세스 시간은 짧아지고,
    • CPU에 의한 액세스 빈도는 높아짐
  • 내부 기억장치: CPU 레지스터 - 캐시 - 주기억장치
  • 외부 기억장치(by. 장치 제어기): 디스크 캐시 - 디스크 - 자기 테이프 및 CD-ROM
    • 주로 프로그램 파일들과 데이터 파일들이 저장되며, 바이트나 단어 단위가 아닌 블록이나 레코드 단위로 액세스 가능
  • 하위 계층으로 내려갈수록 용량이 더 커지고 비트당 가격은 떨어지는 반면에, 지역성의 원리로 인하여 액세스 빈도가 더 낮아짐

3. 캐시 메모리

  • CPU와 주기억장치의 속도 차이를 보완하기 위하여 그 사이에 설치하는 반도체 기억장치
  • CPU가 원하는 데이터가 이미 캐시에 적재되어 있는 상태가 캐시 적중(cache hit)
  • CPU가 원하는 데이터가 캐시에 없는 상태는 캐시 미스(cache miss)
  • 캐시 적중률: H = 캐시에 적중되는 횟수 / 전체기억장치 액세스 횟수
    • 캐시 미스율 = 1 - H
  • 평균 기억장치 액세스 시간, Ta = H x Tc + (1-H) x Tm
    • Tc: 캐시 액세스 시간
    • Tm: 주기억장치 액세스 시간
  • 지역성의 종류
    • 시간적 지역성: 최근에 액세스된 프로그램 코드나 데이터가 가까운 미래에 다시 액세스될 가능성이 높아지는 특성
    • 공간적 지역성: 기억장치 내에 서로 인접하여 저장되어 있는 데이터들이 연속적으로 액세스될 가능성이 높아지는 특성
    • 순차적 지역성: 분기가 발생하지 않는 한, 명령어들은 기억장치에 저장된 순서대로 인출되어 실행됨
  • 캐시 설계의 공통적 목표
    • 캐시 적중률의 극대화
    • 캐시 액세스 시간의 최소화
    • 캐시 실패에 따른 지연시간의 최소화
    • 주기억장치와 캐시간의 데이터 일관성 유지 및 그에 따른 오버헤드 최소화

3-1. 캐시 용량

  • 캐시의 용량이 커질수록 적중률이 높아짐
  • 그러나 비용도 같은 비율로 상승하기 때문에 캐시의 용량은 비용과의 상호조정을 통하여 적절히 결정해야 함

3-2. 인출 방식

  • 요구 인출: 캐시 미스가 발생한 경우 CPU가 필요한 정보만 캐시로 인출해오는 방식
  • 선인출: CPU가 필요한 정보 외에도 그와 인접해 있는 정보들을 함께 캐시로 인출해오는 방식
    • 주기억장치를 액세스할 때 함께 인출되는 정보들의 그룹을 블록이라 부름
  • 캐시 라인: 주기억장치로부터 캐시로 인출되는 단위인 한 블록이 적재되는 캐시 내 공간
    • 캐시의 각 라인은 여러 개의 블록들에 의해 공유됨
    • 태그: 캐시 라인을 공유하는 블록들 중에서 어느 것이 적재되어 있는지를 가리키는 비트들

3-3. 사상 방식

  • 주기억장치 블록이 어느 캐시 라인에 적재될 수 있는지를 결정해주는 알고리즘
  • 캐시 적중률에 많은 영향을 미치는 주요 설계 요소

1) 직접 사상
  • 주기억장치 블록이 지정된 어느 한 라인에만 적재될 수 있는 사상 방식
  • 주기억장치의 블록 j가 적재될 수 있는 캐시 라인의 번호 i는 modulo 함수에 의해 결정
    • i = j % m(캐시 라인의 수)
  • 캐시의 각 라인에는 태그와 데이터 블록이 함께 저장되며, 캐시 적중 여부는 주소의 태그 비트들과 라인에 저장된 태그 비트들을 비교함으로써 결정됨

2) 완전-연관 사상
  • 주기억장치 블록이 캐시의 어느 라인으로든 적재될 수 있는 사상 방식
  • 주기억장치 블록이 캐시의 어떤 레인에든 적재될 수 있으므로, 캐시 적중 여부를 검사할 때 캐시의 모든 라인들의 태귿르과 주기억장치 주소의 태그 필드 내용을 비교하여 일치하는 것이 있는 지 확인해야 함
    • 많은 수행시간이 걸릴 것이므로, 연관 기억장치 등을 이용하여 비교 동작이 병렬로 신속히 이루어질 수 있도록 구성해야 함
  • 완전-연관 사상에서는 새로운 블록이 캐시로 적재될 때 라인의 선택이 자유롭기 때문에, 프로그램 세그먼트나 데이터 배열 전체가 캐시로 적재될 수 있음
    • 이 경우 만약 지역성이 높다면 적중률이 매우 높아질 것
  • 그러나 모든 태그들을 병렬로 검사하기 위하여 복잡하고 비용이 높은 하드웨어를 포함해야 한다는 단점 때문에 실제로 거의 사용되지 않음

3) 세트-연관 사상
  • 주기억장치 블록이 지정된 어느 한 세트로만 적재될 수 있으며, 각 세트는 두 개 이상의 라인들로 구성된 사상 방식
  • 캐시는 v개의 세트들로 나누어지며, 각 세트는 k개의 라인들로 구성
  • 주기억장치 블록이 적재될 수 있는 캐시 세트의 번호 i = j mod v
  • 세트당 라인이 k개씩 있으면 k-way 세트-연관 사상
  • 세트-연관 사상에서 세트의 수가 캐시 라인의 수가 같고(v=m), 세트 내 라인의 수 k=1이라면, 이 방식은 직접 사상과 같아짐
  • 세트의 수 v=1이고, 세트 내 라인 수가 캐시의 전체 라인 수와 같다면(k=m), 완전-연관 사상에 해당
  • 2-way 세트-연관 사상이 가장 보편적으로 사용되고 있는 세트-연관 조직
    • 직접 사상보다 적중률이 훨씬 높음

3-4. 교체 알고리즘

  • 캐시 미스가 발생하여 새로운 블록이 주기억장치로부터 캐시로 올라왔을 때, 그 블록이 적재될 수 있는 라인들이 이미 다른 블록들로 채워져 있다면, 그 블록들 중의 하나는 교체되어야 함
  • LRU(Least Recently Used) 알고리즘: 세트 라인에 적재되어 있는 블록들 중에서 최근의 사용 빈도가 가장 낮은 블록을 선택하여 교체하는 방식
  • FIFO(First in First Out) 알고리즘: 캐시에 적재된 지 가장 오래된 블록을 교체하는 방식
  • LFU(Least Frequently Used) 알고리즘: 캐시에 적재된 이래 사용된 빈도가 가장 낮은 블록을 교체하는 방식
  • Random: 후보 라인들 중에서 한 라인을 임의로 선택하는 방식

3-5. 쓰기 정책

  • 캐시에 적재되어 있는 데이터는 주기억장치에 있는 데이터의 복사본에 불과
  • 따라서 캐시 데이터가 변경되면, 주기억장치에 있는 해당 데이터도 갱신하여 같은 값을 가지고 있도록 해야 함
  • But, 캐시에서 데이터가 변경될 때마다 주기억장치에도 그 값을 갱신하면 기억장치 쓰기 시간이 그 만큼 더 길어짐
  • 캐시의 라인을 교체할 때마다 해당 데이터가 캐시에 적재되어 있는 동안 '수정된'적이 있는 지를 확인
    • 수정된 적이 없다면, 그 데이터가 포함된 라인에 다른 블록 즉시 적재 가능
    • 수정된 적이 있다면, 수정된 데이터가 포함된 라인의 내용을 주기억장치의 해당 블록에 저장한 다음 새로운 블록을 적재
  • 이와 같이 캐시에 적재된 데이터를 새로운 값으로 변경할 때 주기억장치에 갱신하는 시기와 방법을 결정하는 것이 쓰기 정책
    • write-through: 캐시에 쓰기 동작을 수행할 때 주기억장치에도 동시에 이루어지는 방식
      • 주기억장치의 내용들은 항상 유효하지만, 쓰기 동작에 걸리는 시간이 길어짐
    • write-back: 쓰기 동작이 캐시까지만 이루어지는 방식
      • 기억장치에 대한 쓰기 동작의 횟수가 최소화되고 쓰기 시간이 짧아짐
      • 그러나, 새로운 블록 적재 때 라인 데이터가 수정된 경우 주기억장치 갱신에 추가적 시간이 소요됨
      • 또한 캐시에서 수정된 내용이 갱신될 때까지 주기억장치의 해당 블록이 무효 상태에 있게 됨
      • 데이터 불일치 문제: 주기억장치에 저장된 데이터와 캐시들에 적재된 복사본이 서로 다른 값을 가지는 현상

3-6. 다중 캐시

1) 온-칩 캐시와 계층적 캐시
  • 온-칩 캐시: CPU 칩 내부에 포함되어 있는 캐시
  • 인출할 명령어나 데이터가 온-칩 캐시에 있다면 액세스 시간이 더 짧아져서 전체 시스템의 성능 향상에 도움이 됨

  • 계층적 캐시: 여러 레벨의 캐시들을 계층적으로 설치한 구조
    • L2가 L1의 슈퍼-세트
  • L1과 L2에서는 서로 다른 사상 알고리즘과 교체 알고리즘 및 쓰기 정책이 사용되는 경우가 많음
    • 따라서 이러한 계층적 캐시 시스템에서는 데이터 일관성 유지가 더 복잡해짐

2) 분리 캐시
  • 최근에는 온-칩 캐시를 명령어만 저장하는 명령어 캐시와 데이터만 저장하는 데이터 캐시로 분리시켜 용도를 구분
  • 명령어 실행 파이프라인에서 명령어 인출 단계와 오퍼랜드 인출 단계 간에 캐시에 대한 충돌 현상 제거 가능


'Software Convergence > Computer Architecture' 카테고리의 다른 글

폰 노이만 아키텍쳐  (0) 2018.09.09
CPU의 구조와 기능  (0) 2018.09.08
시스템 버스, I/O 및 인터럽트  (0) 2018.09.07

CPU의 구조와 기능

  • CPU는 기억장치에 저장되어 있는 프로그램 코드인 명령어들을 실행하며 '프로그램 수행'이라는 컴퓨터의 기본 기능을 수행
    1. 명령어 인출: 기억장치로부터 명령어를 읽어옴
    2. 명령어 해독: 수행해야 할 동작을 결정하기 위하여 명령어를 해독
    3. 데이터 인출: 명령어 실행을 위하여 데이터가 필요한 경우에는 기억장치 or I/O 장치로부터 그 데이터를 읽어옴
    4. 데이터 처리: 데이터에 대한 산술 or 논리 연산을 수행
    5. 데이터 저장: 수행한 결과를 저장
  • 위 동작들 중 1, 2번 동작은 모든 명령어들에 대하여 공통적으로 수행되지만, 3-5번 동작은 명령어에 따라 필요한 경우에만 수행

1. CPU의 기본 구조

  • CPU의 구성 요소
    • 산술논리연산잔치(ALU): 각종 산술 연산들과 논리 연산들을 수행하는 회로들로 이루어진 하드웨어 모듈
    • 레지스터 세트: CPU 내부에 위치한 기억장치로서, 액세스 속도가 컴퓨터의 기억장치들 중에서 가장 빠름. 그러나 내부 회로가 복잡하여 비교적 큰 공간을 차지하기 때문에, 많은 수의 레지스터들을 CPU의 내부에 포함시키기는 어려워 특수 목적용 레지스터들과 적은 수의 일반 목적용 레지스터들만 포함
    • 제어 유닛: 프로그램 코드를 해석하고, 그것을 실행하기 위한 제어 신호들을 순차적으로 발생하는 하드웨어 모듈
      • 명령어 실행에 필요한 각종 정보들의 전송 통로와 방향을 지정해주고, CPU 내부 요소들과 시스템 구성 요소들의 동작 시간도 결정
      • CPU가 제공하는 명령어들의 수가 많아질 수록 제어 유닛의 내부 회로는 더 복잡해짐
        • 복잡도를 줄이기 위해 제어 유닛의 동작을 SW로 처리해주는 방법이 마이크로프로그래밍
        • 그러나 이 방법을 이용하면 명령어 실행 시간이 길어짐
        • 따라서 최근에는 명령어의 수를 가능한 줄이고 명령어 형식을 단순화함으로써, HW만으로 명령어를 실행할 수 있도록 하는 RISC(Reduced Instruction Set Computer) 설계 개념도 많이 사용되고 있음
  • CPU 내부 버스
    • ALU와 레지스터들 간의 데이터 이동을 위한 데이터 선들과 주소 선들, 그리고 제어 유닛으로부터 발생되는 제어 신호들을 전송하는 선들로 구성
    • 외부의 시스템 버스와 직접 연결되지 않으며, 반드시 버퍼 레지스터나 인터페이스 회로를 통하여 시스템 버스와 접속

2. 명령어 실행

  • CPU가 한 개의 명령어를 실행하는 데 필요한 전체 과정이 명령어 사이클
    • 명령어 사이클은 CPU가 기억장치로부터 명령어를 읽어 오는 명령어 인출 단계와 (인출 사이클)
    • 인출된 명령어를 실행하는 명령어 실행 단계로 이루어짐 (실행 사이클)
  • 명령어 사이클은 CPU가 프로그램 실행을 시작한 순간부터 전원을 끄거나 회복 불가능한 오류가 발생하여 중단될 때 까지 반복 수행
  • 명령어 실행을 위해 기본적으로 필요한 CPU 내부 레지스터
    • 프로그램 카운터(PC): 다음에 인출될 명령어의 주소를 가지고 있는 레지스터
    • 누산기(AC): 데이터를 일시적으로 저장하는 레지스터. CPU가 한 번에 처리할 수 있는 데이터의 비트 수와 크기가 같음
    • 명령어 레지스터(IR): 가장 최근에 인출된 명령어가 저장되어 있는 레지스터
    • 기억장치 주소 레지스터(MAR): 프로그램 카운터에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터
    • 기억장치 버퍼 레지스터(MBR): 기억장치에 저장될 데이터 혹은 이미 읽어온 데이터가 일시적으로 저장되는 버퍼 레지스터

2-1. 인출 사이클

  • CPU는 각 명령어 사이클의 시작 단계에서 PC가 가리키는 기억장치의 위치로부터 명령어를 인출
  • 그런 다음 CPU는 PC의 내용을 1씩 증가시킴으로써 명령어들을 기억장치에 저장되어 있는 순서대로 읽어올 수 있도록 해줌
  • 인출 사이클에서 수행되는 동작의 마이크로 연산(CPU 클록의 각 주기 동안 수행되는 기본적 동작)
    • t0: MAR <- PC // 현재 PC 내용을 CPU 내부 버스를 통하여 MAR로 보냄
    • t1: MBR <- M[MAR], PC <- PC + 1 // 그 주소가 지정하는 기억장치 위치로부터 읽혀진 명령어가 데이터 버스를 통하여 MBR로 적재 + PC 증가
    • t2: IR <- MBR // MBR에 저장되어 있는 명령어 코드가 명령어 레지스터인 IR로 이동
    • cf. t0, t1, t2는 CPU 클록의 각 주기를 가리킴
  • 명령어 인출에는 세 개의 CPU 클록 주기만큼의 시간이 걸림
    • CPU의 클록 주파수가 1GHz라면 클록 주기가 1ns이므로, 인출 사이클은 3ns

2-2. 실행 사이클

  • 인출된 명령어를 CPU가 해독하고, 그 결과에 따라 필요한 연산 수행
  • CPU 수행 연산
    1. 데이터 이동: CPU와 기억장치 간 혹은 CPU와 I/O 장치 간 데이터 이동
      • ex) LOAD addr
      • t0: MAR <- IR(addr)
      • t1: MBR <- M[MAR]
      • t2: AC <- MBR
    2. 데이터 처리: 데이터에 대하여 산술 or 논리 연산 수행
      • ex) ADD addr
      • t0: MAR <- IR(addr)
      • t1: MBR <- M[MAR]
      • t2: AC <- AC + MBR
    3. 데이터 저장: 연산결과 데이터 혹은 입력장치로부터 읽어들인 데이터 기억장치에 저장
      • ex) STA addr
      • t0: MAR <- IR(addr)
      • t1: MBR <- AC
      • t2: M[MAR] <- MBR
    4. 프로그램 제어: 프로그램의 실행 순서 결정
      • ex) JUMP addr
      • t0: PC <- IR(addr)

2-3. 인터럽트 사이클

  • CPU로 하여금 현재 진행 중인 프로그램 처리를 중단하고 다른 프로그램을 처리하도록 요구하는 메커니즘으로서, CPU와 외부장치들 간의 상호작용을 위하여 필요한 기능
  • 인터럽트 서비스 루틴(ISR): 인터럽트 요구를 처리해주기 위해 수행하는 프로그램 루틴
  • 인터럽트 사이클: 인터럽트 요구가 들어왔는지 검사하고, 그 처리에 필요한 동작들을 수행하는 과정
    1. 인터럽트 요구 신호 검사
    2. t0: MBR <- PC // 현재 PC 내용을 스택에 저장(인터럽트 처리 완료 후, 복귀 위함)
    3. t1: MAR <- SP, PC <- ISR의 시작 주소 // PC에 해당 ISP의 시작 주소를 적재
    4. t2: M[MAR] <- MBR, SP <- SP - 1 // 원래 PC의 내용을 스택에 저장 후, SP 감소
  • 프로그램에 따라 **인터럽트 가능 상태(EI)**와 **인터럽트 불가능 상태(DI)**가 있음
  • 인터럽트 사이클로 인해 AC에 저장된 값이 바뀔 수 있기 때문에, 인터럽트 서비스 루틴의 시작 단계에서 레지스터들의 내용을 스택에 저장하였다가, 루틴의 마지막 단계에서 복원시켜주는 절차가 필요함
  • 다중 인터럽트의 처리 방법
      1. CPU가 ISR을 처리하고 있는 도중에는 새로운 인터럽트 요구가 들어오더라도 인터럽트 사이클을 수행하지 않도록 하는 것
      • 이전 루틴을 처리하는 동안 CPU는 DI 상태. 루틴 처리하는 동안 발생한 인터럽트 요구는 대기 상태로 남아 있다가, CPU가 EI 상태로 바뀐 후에 인식됨
      1. 인터럽트 요구들 간에 우선순위를 정하고, 우선순위에 따라 수행 여부 판단
      • 스택에는 원래의 주프로그램으로 복귀하기 위한 주소뿐 아니라, 첫 번째 ISR으로 복귀하는데 사용될 주소도 저장되어야 함

2-4. 간접 사이클

  • 실행 사이클에서 사용될 데이터의 실제 주소를 기억장치로부터 읽어오는 과정
    • t0: MAR <- IR(addr)
    • t1: MBR <- M[MAR]
    • t2: IR(addr) <- MBR
  • 간접 사이클은 항상 수행되는 것이 아니며, 명령어 내의 특정 비트(ex: I 비트)가 1로 세트된 경우에만 수행

3. 명령어 파이프라이닝

  • 명령어를 실행하는데 사용되는 하드웨어를 독립적인 단계로 분할하고, 그들로 하여금 동시에 서로 다른 명령어들을 처리하도록 함으로써 CPU의 성능을 높여주는 기술
  • 분할되는 단계의 수가 많아질수록 처리 속도가 높아짐

3-1. 2단계 명령어 파이프라인

  • 명령어를 실행하는 하드웨어를 인출 단계실행 단계라는 두 개의 파이프라인 단계로 분리 구성
  • 명령어 선인출: 다음에 실핼될 명령어를 미리 인출하는 동작
  • 많은 수의 명령어들을 실행시키는 경우에 얻을 수 있는 최대 속도 향상은 파이프라인 단계의 수와 같은 2배에 접근하게 됨
  • 그러나, 실제로는 실행 단계가 인출 단계보다 더 긴 수행 시간을 보이기 때문에 2배만큼 빨리지지는 못함

3-2. 4단계 명령어 파이프라인

  • 파이프라인 단계들의 처리 시간이 동일하지 않음으로 인하여 발생하는 효율 저하를 방지하는 방법
  • 파이프라인을 명령어 인출(IF) - 명령어 해독(ID) - 오퍼랜드 인출(OF) - 실행(EX)의 4단계로 구성
  • 파이프라이닝을 이용하여 얻을 수 있는 속도 향상의 관계식
    • T = k + (N - 1)
    • 파이프라인 단계의 수 k, 실행할 명령어들의 수 N
    • 첫 번째 명령어를 실행하는 데 k 주기가 걸리고, 나머지 (N-1)개의 명령어들은 각각 한 주기씩만 소요
    • 파이프라이닝을 사용하지 않을 경우, k x N 주기를 소모
  • k-단계 파이프라이닝의 문제
      1. 모든 명령어가 k 단계를 거치지는 않음
      • 어떤 명령어는 실행 과정에서 오퍼랜드의 인출이 필요 없을 수도
      1. 파이프라인 클록은 처리 시간이 가장 오래 걸리는 단계를 기준으로 정해짐 -> 쓸데없는 대기 시간 있을 수 있음
      1. 기억장치 충돌의 문제가 있을 수 있음
      • IF 단계와 OF 단계는 모두 기억장치를 액세스하는데 이 때 기억장치 충돌의 문제 발생
      1. 조건 분기 명령어가 실행된다면, 미리 인출되어 파이프라인에서 처리하고 있던 명령어들이 무효화될 수 있음
  • 슈퍼파이프라이닝: 2번 문제의 해결을 위해 명령어 파이프라인의 단계들을 더욱 잘게 분할하여 처리 속도를 높여주는 기술
    • 최근에는 대부분의 프로세스들이 10 단계 이상의 단계들로 분할된 명령어 파이프라인 구조를 사용
  • 3번 문제의 보완을 위해 IF 단계와 OF 단계가 직접 액세스하는 CPU 내부 캐시를 명령어 캐시와 데이터 캐시로 분리시키는 방법이 사용됨
  • 조건 문기로 인한 성능 저하를 최소화시키기 위한 해결책
    • 분기 예측: 분기가 일어날 것인지를 예측하고, 그에 따라 어느 경로의 명령어를 인출할 지를 결정하는 확률적 방법. 최근 분기 결과들을 저장하여 두는 분기 역사 표를 참조하여 예측하는 방법이 가장 널리 사용
    • 분기 목적지 선인출: 조건 분기가 인식되면, 분기 명령어의 다음 명령어뿐 아니라, 조건이 만족될 경우에 분기하게 될 목적지의 명령어도 함께 인출하는 방법. 이 방법의 사용을 위해서는 분기 목적지 명령어를 별도로 저장해둘 수 있는 기억 장소가 추가되어야 함
    • 루프 버퍼: 파이프라인의 명령어 인출 단계에 포함되어 있는 작은 고속 기억장치로 가장 최근에 인출된 일정 개수의 명령어들이 순서대로 저장됨
    • 지연 분기: 분기 명령어의 위치를 적절히 조정하여 원래보다 나중에 실행되도록 재배치함으로써, 성능 저하를 최소화하는 방법
  • 조건 분기 명령어에서 사용하는 조건들은 CPU 내부의 상태 레지스터에 저장
    • 상태 레지스터: 연산처리 결과 및 시스템 상태를 가리키는 비트들을 저장하는 레지스터

3-3. 슈퍼스칼라

  • CPU 내에 여러 개의 명령어 파이프라인들을 두어, 동시에 그 수만큼의 명령어들을 실행할 수 있도록 한 구조
  • 슈퍼스칼라 프로세서에서 유의할 점으로는 동시에 처리할 명령어들이 서로 간에 영향을 받지 않고 독립적으로 실행될 수 있어야 한다는 것
    • 두 명령어 사이에 데이터 의존성이 존재하지 않아야 함!
    • 명령어들 간 데이터 의존성이 존재하면 파이프라인들의 일부 단계들이 idle 상태에 들어가 속도 향상을 저해
  • m-way 슈퍼스칼라 프로세서가 N개의 명령어들을 실행하는 데 걸리는 전체 시간
    • T(m) = k + N-m/m
    • 처음 m개의 명령어들을 실행하는 k 주기 소요 + 매 주기마다 m개씩의 명령어들이 동시에 실행 완료

3-4. 듀얼 코어 및 멀티 코어

  • 멀티 코어 프로세서: CPU 코어 여러 개를 하나의 칩에 넣은 것
  • 멀티 코어에서는 각 CPU 코어가 슈퍼스칼라의 명령어 파이프라인에 비하여 독립성이 더 높음
    • 별도의 하드웨어 모듈로, 시스템 버스 인터페이스와 내부 캐시만 공유
    • 따라서 각 CPU 코어는 프로그램 실행을 독립적으로 수행하며, 필요한 경우에만 공유 캐시를 통해 정보 교환
  • 독립적인 처리가 가능한 단위로 분할된 태스크 프로그램들이 CPU 코어들에 의해 동시에 처리됨
    • 이와 같은 동시처리 기술을 멀티 태스킹 혹은 멀티 스레딩이라 부름
    • CPU 코어가 많을수록 그 수만큼의 태스크 프로그램들을 동시에 처리할 수 있게 됨


'Software Convergence > Computer Architecture' 카테고리의 다른 글

폰 노이만 아키텍쳐  (0) 2018.09.09
기억장치  (0) 2018.09.08
시스템 버스, I/O 및 인터럽트  (0) 2018.09.07

+ Recent posts