Background

  • 야구 : 20명 정도의 선수들이 시합 -> 각자의 역할이 있음(투수가 공을 던져야 시작, 타자가 공을 치거나 포수가 공을 받음, 공이 어느 방향으로 가느냐에 따라 달라짐)
  • 각 선수들을 스레드로 보면 각 스레드들은 독립적으로 하는 일이 정해져 있음
  • 스레드들 간의 일부 순서가 있고 상호 순서가 지켜져야만 한다.
  • 시스템 내의 상호 협조 프로세스 -> 다른 프로세스 실행에 영향을 받음, 주소 공간을 공유하거나 파일에 의해서 데이터의 공유가 허용됨
  • 공유 데이터에 대한 동시 접근은 데이터의 불일치로 이어짐 -> 반드시 해결해야 됨

Bounded-Buffer

  • Producer process

  • in과 out이 같은지를 비교했을 때와 달리 정해진 크기의 BUFFER_SIZE와 같은지를 비교하도록 바꿨음
  • count변수로 loop를 반복시킴
  • Consumer process

  • 값을 꺼낼 때 counter를 줄임 -> 포인터 대신 개수로 비교
  • 수정된 알고리즘에는 counter라는 공유 변수가 있음
  • 두 프로세스는 counter값을 변화시키면서 사용, 비교
  • 어느 한순간의 counter가 5라고 가정
    • 두 프로세스가 한 번씩 counter에 접근한다면 5->6->5로 값이 변하는 것이 맞음
    • 그러나 count++와 count--는 CPU입장에서 하나의 명령인가?
  • assembly에서 본 count++
  1. register1 = counter -> CPU가 값을 레지스터에 읽어옴
  2. register1 = register1 + 1 -> 그 레지스터 값을 1 증가시킴(아직 counter값은 5)
  3. counter = register1 -> counter에 6을 저장
  • count--
  1. register2 = counter -> CPU가 값을 레지스터에 읽어옴
  2. register2 = register2 - 1 -> 그 레지스터 값을 1 감소시킴
  3. counter = register2 -> counter에 레지스터값을 저장
  • 두 프로세스를 동시에 실행시켰다면 어셈블리에서 총 6개의 명령이 실행됨 -> 이것들이 무조건 순서대로 실행이 되는가? (x)
  • 엄청나게 많은 프로세스의 사용이 반복된다면 정말 우연히도 6개의 명령이 섞일 수도 있음

  • counter를 증가시키는 producer의 프로세스가 진행되는 중에 counter의 값을 바꾸기 전에 consumer의 프로세스가 실행되어 버림
  • counter의 값이 6? 4? 나중에 바뀌는 값으로 들어가 버림 -> 오류 발생(counter를 다루는 명령어가 atomic하지 못했다.)

Race Condition

  • 위의 문제점을 레이스 컨디션이라고 함 -> 한 프로세스에서만 접근하도록 만들어야 한다.
  • 분리할 수 없는 명령이라고 생각하는 것이 섞이지 않도록 나누는 것(동기화)

Critical Section Problem(임계 영역)

  • 두 개의 프로세스로 이루어진 시스템
  • 각 프로세스는 임계 영역이라는 code segment내에 가짐
  • 이 임계 구역은 공유 데이터를 처리하는 각각의 프로세스가 가지는 것
  • 한 프로세스가 공유데이터를 처리하는 동안 다른 프로세스가 접근할 수 없는 구역
  • 프로세스가 협조할 수 있도록 프로토콜을 설계
  • 각 프로세스는 임계 구역에 진입하기 위한 허가권을 운영체제에 요청
  • 진입 구역, 임계 구역, 출구 구역, 자유구역으로 나누고 그 구역에 맞게 처리해줌

  1. 위와 같이 구역을 나눠서 생각
  2. 임계 구역에 해당하는 부분은 분리되지 않음
  3. 임계 구역 앞에 있는 것을 entry section, 뒤에 있는 것을 exit section이라고 함
  4. entry section : 필요한 세팅, 설정, 관계없는 일들을 모아둠
  5. exit section : 일부분, 임계 구역에 관련된 나머지 일들을 처리
  6. remainder section : 위와 관련 없는 나머지 일들을 하는 부분

Solution to Critical-Section Problem

  • 상호 배제(Mutual Exclusion) - p1가 임계 구역에서 실행된다면 다른 프로세스들은 임계 구역에서 실행될 수 없다.(단 하나만)
  • 진행(Progress) - 임계구역에서 실행되는 프로세스가 없는 상태에서 임계 구역으로 진입하려는 프로세스가 있으면 잔류 구역에서 실행되지 않고 있는 프로세스들만 다음에 임계 구역으로 진입할 수 있는 대상이 되고 이 구역은 무한하게 연기할 수 없다.
  • Bounded Waiting(한계 대기) : 프로세스가 임계 구역으로의 진입을 요청한 후에 그 요청이 허용될 때까지 다른 프로세스들도 임계 구역에 진입하도록 허용하는 시간 간격에도 한계를 두어야 한다.(무한하게 대기하면 안 됨)
  • 각 프로세스들은 무조건 대기하는 것이 아니라 진행되고 있어야 한다.

  • P0, P1은 turn이라는 공유 변수를 가짐
  • 만약 turn이 i다 라는 조건을 만족하면 임계 구역으로 들어갈 수 있음
  • i = 0, j = 1
  • Pi : turn값이 i와 다르면 무한루프 -> 처음에는 같기 때문에 critical section으로 들어감
  • 끝난 후 turn을 j로 바꿈 -> 나머지를 수행 -> 반복
  • Pj : i가 실행되는 동안 while문에서 대기 -> turn이 j가 되는 순간 탈출 -> 임계 영역에 들어감
  • 두 프로세스가 동시에 진행된다면? -> i와 j값이 다르므로 어쨌든 하나는 대기, 하나는 실행됨
  • 상호 대기 만족
  • turn은 0으로 초기화되었는데, P1이 먼저 들어왔다면 P0이 들어오기 전까지 기다려야 하므로 진행(Progress)과 한계 대기(Bounded Waiting)를 만족하지 못함
  • 반드시 번갈아서 진행되는 알고리즘이므로 하나의 프로세스 실행 후 다음 프로세스가 응답하지 않을 시 대기해야 한다.

  • 플레그 2개를 선언함 -> flag[i]를 true, j를 flase로 정함
  • Pj는 플레그가 flase이므로 while문을 통과하여 Pi가 실행됨 -> Pj가 응답하지 않더라도 계속 Pi가 실행될 수 있음
  • Pj는 flag[i]는 ture일 때 임계 구역에 들어가지 못하고 대기 -> Pi가 실행된 후 flase가 되는 순간 Pj가 실행됨
  • Pj가 실행되는 동안, Pi 역시 임계 영역에 들어가지 못함
  • 번갈아서 실행할 필요가 없어짐
  • 상호 배제 만족, 그러나
  • 두 프로세스가 타이트하게 문맥 교환을 하는 경우
    1. 한 줄씩 번갈아가며 실행된다고 가정해보자
    2. flag를 각각 true로 바뀌면 두 플래그가 전부 true로 바뀐 후 while문에 접근하므로 두 프로세스 모두 대기
    3. 두 플레그 중 하나가 바뀌어야 프로세스 하나가 실행될 수 있음
  • 마지막 알고리즘 - Peterson's Solution
  • 앞의 두 가지의 문제를 잘 종합하여 둘 다 쓰면서 아무 문제없이 진행될 수 있음

  • 프로세스가 하나씩 실행되는지
  • 대기하는 경우가 발생하는지
  • 타이트하게 문맥 교환이 이루어질 경우
  • Process Creation
  • 생성중인 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라 한다.
  • 이런 새로운 프로세스 각각은 다른 프로세스들을 생성할 수 있다.
  • 프로세스는 실행 도중에 프로세스 생성 호출을 통하여 여러 개의 새로운 프로세스들을 생성할 수 있다.
  • 자원의 공유(Resource sharing) 방법
    1. 모든 자원을 공유하는 경우
    2. 자식 프로세스가 부모의 자원을 일부 공유하는 경우
    3. 공유하지 않는 경우
  • 프로세스가 새로운 프로세스를 생성할 때
    1. 부모와 자식은 동시에 실행
    2. 부모가 자식이 끝날 때까지 기다림
  • A Tree of Processes in Linux

  • 부모 -> 자식(부모) -> 자식... 이렇게 트리 형태로 연결되어 있음
  • ex) 로그인을 하는 경우 자식 프로세스를 만들어서 실행
  • C Program Forking Separate Process

  1. fork를 만나면 하나를 복사
  2. 둘 중 하나를 부모, 자식으로 만듦
  3. 둘 중 하나에는 pid에 0을, 다른 하나에는 0과 다른 어떤 값을 주는데 이 값이 0보다 작으면 error
  4. pid가 0인 것은 자식, 0이 아닌 것은 부모
  5. 따라서 서로 조건문에 걸려서 다른 기능을 수행

  • 부모가 자식을 만들어서 자식이 exec()로 작업을 수행할 때, 부모 프로세스는 보통 자식 프로세스가 끝날 때까지 대기함
  • 부모 프로세스는 wait() 하지 않고도 끝낼 수 있는데 이러한 경우 자식 프로세스가 끝나지 않았다면 exit()를 받기 전까지 유령 프로세스로 남아있음
  • windows의 경우는 LINUX와 다름 -> 좀 더 복잡하고 함수 이름이 길다
  • Process Termination
    • 마지막 문장을 끝내고 나면 exit()를 실행 -> 부모 프로세스는 이를 기다림 - wait()
    • 부모 프로세스가 종료되면 자식 프로세스가 계속 실행하지 못하도록(허용 x) 하는 것이 원칙
    • 모든 프로세스는 밑에서 같이 끝나게 됨 - cascading termination
  • 프로세스들의 커뮤니케이션
  • 협업하지 않는 프로세스들은 독립 프로세스(Independent process), 협업을 하도록 만든 프로세스들을 협력 프로세스(Cooperating process)라고 함 -> 만들기 나름
  • 협업을 하게 된다면?
    1. 정보를 공유
    2. 프로세스의 연산속도가 상대적으로 증가
    3. 모듈성이 높아짐 -> 가격이 저렴해짐
    4. 편리함, 안정성 up
  • 커뮤니케이션 모델

  1. 신호(메시지)를 주고 받는 방식
    • 약속된 큐(queue)에 데이터를 집어넣고 가져가는 방식
  2. 메모리를 공유하는 방식
    • 두 프로세스 사이에 두 프로세스만 접근할 수 있는 공유 메모리를 가짐
  • Shared memory : Producer-Consumer model

  • 왼쪽은 생산자, 오른쪽은 소비자 -> 생산자는 데이터를 버퍼에 넣고 소비자는 뽑아내어 쓴다
  • 원형 큐를 사용
  • 예시

  1. in과 out이 0이라는 것은 비어있다는 뜻
  2. 이 말은 in과 out이 같아지면 비어있다는 의미가 되며 따라서 버퍼는 항상 1칸을 비워놔야 함
  • 생산자의 알고리즘 - 데이터를 만들어서 버퍼에 저장

  1. in + 1 이 out과 같아지면 리셋
  2. out은 생산자와 소비자가 함께 사용하기 때문에 늘었다 줄었다 할 수 있음
  • 소비자의 알고리즘 - 데이터를 뽑아감

  • 서로 다른 프로세스가 같은 값을 사용하므로 협조적으로 수행할 수 있음
  • Message Passing
  • send로 메시지를 보내고 receive로 받음
  • 교려 할 점
    1. 연결을 어떻게 해야 하는가
    2. 프로세스 두 개만 하는가 그 이상 해야 하는가
    3. 한 쌍의 프로세스 사이에는 큐가 하나만 있는가 여러 개 있는가
    4. 용량의 크기
    5. 방향은 단방향인가 양방향인가
    6. 길이는 고정인가 가변인가
  • Direct 방식
    1. send(P, message) : P에게 보내겠다.
    2. receive(Q, message) : Q에게 받겠다. 받기 전까지 다른 곳에서 받지 않음
  • Indirect 방식
    1. 받는 것은 메일박스(우편함)로부터 받음
    2. 접근할 수 있는 누구든지 가져갈 수 있음 - 동시에
    3. 누구에게 보낼지, 받을지가 아니라 사서함 번호를 사용한다. -> send(A-사서함 번호, message)
  • 동기화
  • 메시지를 주고받을 때의 동기화는 기다린다는 것
  • Blocking : send후 상대가 받을 때까지 기다림 - ex) 전화를 상대가 받으면 그때부터 말을 함
  • non-Blocking : 보내 놓고 다른 작업을 수행할 수 있음 - ex) 카카오톡 메시지
  • 랑데부 프로토콜(rendezvous) : 보내는 쪽, 받는 쪽 모두 Blocking을 사용 -> 1:1로 연결하여 명확해짐 -> 중간에 버퍼가 필요 없음(zero capacity)
  • 일반적인 것은 사서함이 필요함 - Bounded capacity -> 정해진 크기의 용량의 버퍼가 필요
  • 무한대의 크기도 있을 수 있으나 이론적으로 불가능
  • 프로세스 간의 통신(Communications in Client-Server Systems)
  • 컴퓨터 내에서만 일어나는 것이 아니라 여러 컴퓨터끼리도 통신을 함
  • 소켓(socket) 통신 : (IP주소 + 포트 번호)를 가지고 연결 -> IP주소가 일치하는 컴퓨터는 같은 포트번호를 열어놓고 있어야 주고받을 수 있음

 

'운영체제' 카테고리의 다른 글

Chapter 4 - Threads(6주차)  (0) 2019.04.09
Chapter 4 - Threads  (0) 2019.04.06
Chapter 3 : Processes  (0) 2019.03.28
Chapter 2 - 디스크, system call, 운영체제의 구조  (0) 2019.03.23
Chapter 2 - 시스템 구조  (0) 2019.03.14
  • Process Concept
  • 운영체제는 다양한 프로그램들을 실행
  • 일괄처리 시스템(Batch system)은 작업(job)을 실행
  • 시분할 시스템(Time-shared systems)은 사용자 프로그램이나 태스크(tasks)를 수행
  • 우리가 배우는 운영체제 과목에서는 작업, 프로세스, 태스크 모두 같은 것으로 봄
  • 프로세스란? - 간단하게 수행, 실행 중인 프로그램
  • 실행 중이지 않은 프로그램은 저장되어 있는 프로그램 -> 보조기억장치에 저장(디스크)
  • 운영체제 입장에서 프로세스는 로딩(적제)되어 메인 메모리를 차지하고 동작하고 있거나 바로 직전인 상태(수행)
  • 순차적인 방식(sequential fashion) : 하나씩 정해진 순서대로 실행되어야 함
  • 수행 중인 프로그램은 우리 눈에 보이는 소스 프로그램이나 소스 프로그램이 바뀐 코드 형태 자체만은 아님(부분)
  • 프로세스란 단순히 프로그램 그 자체를 의미하는 것이 아니라 다음을 포함한 능동적인 실체이다.(환경까지 모두)
    1. Program counter
    2. stack
    3. data section
    4. 레지스터
    5. 프로그램 코드
    6. ex) 프로그램 코드 실행 -> 실행되는 동안 생성된 데이터들이 저장됨(스택이나 데이터 섹션) -> CPU가 가지고 있는 변화되는 값들이 레지스터에 저장 -> 많은 코드 중 어느 위치에서 실행하는지에 대한 프로그램 카운터
    7. 위의 항목에 다른 것들을 추가한 것을 프로세스 컨트롤 블록이라 한다.
  • Process in Memory

  • text : 코드와 상수 값들이 들어감, 프로그램이 실행되면 정해진 만큼만 가질 수 있음
  • stack, heap : 변화되는 공간
  • stack은 높은 번지에서 낮은 번지로 내려오고 heap은 낮은 번지에서 높은 번지로 올라감
  • 그렇게 되면 파란색 공간이 버퍼링 공간이 되어 stack과 heap 둘 다 될 수 있음
  • overflow도 될 수 있음
  • Memory Layout of a C Program(C프로그램에서는 메모리에 어떻게 배치되고 설정이 되고 동작이 되는지)

  • x값과 y값이 data에 저장됨
  • 메인 함수 안에 변수 2개는 지역변수, stack에 저장
  • value에 int형태로 메모리를 할당
  • 처음 실행파일을 실행할 때, 메인에 값을 줌(커멘드 창에서)
  • 비주얼 스튜디오에서 환경변수를 주는 설정을 사용하여 줄 수도 있음
  • argc는 입력하는 값들의 수, argv는 입력한 값들을 순차적으로 저장
  • 전역 변수는 data영역으로 - 시스템마다 다를 수 있지만 여기서는 분리되어 저장됨, 0으로 초기화되어 저장될 수도 있음 -> 어떤 환경인지 체크하여 방식을 달리 함
  • main함수의 argment들은 가장 위에 저장
  • 로컬 변수(지역 변수)는 stack영역으로 - 어떤 시스템도 초기화하지 않는 변수
  • value는 포인터이기 때문에 가리키는 주소는 stack에, 할당한 20바이트는 heap영역에 저장된다.
  • 예제

  1. rose라는 텍스트 자체는 텍스트에 저장되고 읽기만 할 수 있음
  2. a안에 r, o, s, e값이 각각 하나씩 배열로 저장되고 마지막에 NULL값이 저장 총 5개(가변 x)
  3. p는 지역 변수에 포인터 stack에 저장-> grace라는 값을 가리킴(text에 저장되어 있음)
  4. b []도 지역 변수이지만 포인터가 아닌 배열. 역시 stack에 저장(stack에 text값 복사)
  5. 따라서 b의 값은 stack에서 얼마든지 바꿀 수 있지만, p의 값은 바꿀 수 없다.
  • Process state

  • 프로세스는 실행되면서 자신의 상태가 계속 변하게 됨
  • new : 모든 프로세스는 만들어지는 과정이 필요. 만들어진 후의 상태
  • running : CPU를 차지하고 있는 상태. 동작중인 상태
  • waiting : 기다리는 상태. CPU를 차지하기 위한 것이 아니라 외부 입출력(I/O)을 기다리는 상태. 따라서 CPU를 사용하지 않음
  • ready : 동작하려 하고 있으나 아직 CPU를 차지하지 않은 상태. 기다림
  • terminated : 프로세스가 모드 끝난 상태
  • 프로세스가 생성된 후 실행되기 전까지 ready -> CPU를 차지하고 running -> 실행이 끝났으면 terminated -> I/O를 기다려야 한다면 waiting -> 적당한 시간을 두어 끝나지 않는다면 다시 ready로 돌아가 다른 프로세스와 CPU를 차지하기 위해 경쟁하며 끝날 때까지 반복됨
  • Process Control Block(PCB)

  • 각 프로세스는 운영체제에서 프로세스 제어 블록(PCB)에 의해 표현된다.
  • 프로세스의 컨텍스트가 만들어지고 그것들 끼리의 교환이 이루어짐
    1. 프로세스 상태(Process state) : 생성, 준비, 수행, 대기, 정지 상태
    2. 프로그램 카운터(Program counter) : 다음에 실행될 명령어의 주소
    3. CPU 레지스터(CPU registers) : CPU 레지스터는 컴퓨터 구조에 따라 다양한 수와 형태를 갖는다.(다른 작업으로 넘어가기 전에 모든 상태를 저장)
    4. CPU 스케줄링 정보(CPU scheduling information) : 프로세스 운선 순위, 스케줄 큐의 포인터와 다른 스케줄 매게 변수들을 포함
    5. 메모리 관리 정보(Memory-management information) : 기준과 한계 레지스터의 값, 운영체제가 사용하는 기억장치 시스템의 페이지 테이블 또는 세그먼트 테이블의 정보를 포함
    6. 계정 정보(Accounting information) : CPU가 사용된 실시간의 양, 시간 범위, 계정 번호, 작업 또는 프로세스 번호를 포함
    7. 입출력 상태 정보(I/O status information) : 입출력 요구들, 입출력 장치들과 open된 파일의 목록 등을 포함
  • 이 PCB는 프로세스와 프로세스간의 스위칭에 이용된다.
  • CPU Switch From Process to Process

  1. 2개의 프로세스(P0, P1)이 있는데, P0가 실행되는 중에 P1으로 바뀌는 경우의 그림
  2. P1이 실행된 후 다시 P0로 돌아가서 실행
  3. 화살표는 실행된다는 의미, 나머지 검은 선은 쉬고있다는 의미
  4. 상태를 저장하지 않는다면 다시 돌아왔을때, 중간부터 실행하지 못함 -> PCB에 상태 저장
  5. P1의 상태를 불러와서 program counter의 위치부터 실행
  6. P1에게 주어진 시간이 다 되었거나 모든 실행이 끝났다면 다시 현재 상태를 PCB에 저장한 후 P0의 상태를 불러옴
  7. 저장하는 시간과 불러오는 시간이 있으므로 딜레이가 생길 수 있음 -> 이 때는 어느 프로세스도 실행하지 못함
  8. 번갈아서 실행이 되지만 동시에 실행되는 것처럼 보임 -> iIde시간과 스위칭하는 시간을 줄이는 것이 좋음
  9. 이를 context switching이라고 부른다.
  • Threads
  • 프로세스를 이루고 있는 실행단위
  • 하나의 프로세스안에 여러 쓰레드를 둘 수 있음
  • Process Representation in Linux

  • Process Scheduling
  • 프로세스들의 우선순위를 정해서 CPU를 차지 할 수 있도록 하는 것
  • 가장 기본적인 방법인 queue를 사용
    1. ready queue : CPU를 차지하기 위해 대기하고 있는 프로세스들
    2. wait queues : I/O장치를 쓰기위해 대기하고 있는 프로세스들
    3. Device queues : 디바이스들을 기다리고 있는 각각의 프로세스들
  • Ready and wait Queues

  1. 처음에는 head만 있음
  2. queue라고 해서 순서가 있는 것이 아님
  3. 모여있는 것들 중 하나를 스케줄링해서 필요한 것을 CPU에 할당
  • Representation of Process Scheduling한 프로세스가 CPU를 차지하고 돌아가는 과정

  1. ready queue에서 CPU를 할당받아 실행됨
  2. 실행이 끝났다면 그냥 종료하면 되지만 끝나지 않고 시간이 만료됐다면 다시 ready상태로 돌아가 우선순위를 스케줄링 -> I/O 요청, 시간 만료, 자식프로세스 fork, 인터럽트를 받아 대기 등
  • Schedulers
  • 단기 스케줄러 : 실행 준비가 되어 있는 프로세스들 중에 하나를 선택하여 CPU에 할당(ready queue)
  • 장기 스케줄러 : 프로세스를 선택하여 실행하기 위해 기억장치로 적재
    1. new로 만들어지면 ready queue로 가서 단기 스케줄러에 의해 CPU를 할당받음
    2. 이 범위를 넘어가는 시스템이 존재 -> 서버 : 사용자 요청이 오면 프로세스를 각자 생성하기 때문에 사용자의 수가 많을 수록 엄청난 양의 프로세스가 생성됨
    3. 단기 스케줄러로 많은 양을 처리하기에 부담
    4. ready queue로 갈지 말지 판단해주는 역할 -> ready queue에 부담이 가지 않도록 관리
  • 장기 스케줄러는 단기 스케줄러가 효율적으로 작동할 수 있도록 도와줌
  • Addition of Medium Term Scheduling(장기와 단기의 중간)

  1. time sharing 시스템을 가지는 일부 운영체제들은 medium term scheduler를 가짐
  2. 장기 스케줄러는 가지지 않고 단기 스케줄러만 가짐
  3. 프로세스가 많아지는 경우 임시로 우선순위가 떨어지거나 자주 사용하지 않거나 접근한 시간이 없는 프로세스들을 외부로 보냄(swap out)
  4. 밖에서 실행되도록 함
  5. swap in : 밖에서 실행되는 프로세스를 다시 불러오는 것
  • Context Switch(문맥 - 프로세스가 진행되는 흐름)
  • 프로세스의 흐름을 멈춘 후 다른 프로세스를 실행 했다면 다시 원래 상태로 돌아왔을 때, 실행됐던 흐름부터 시작할 수 있도록 해줌
  • Multitasking in Mobile Systems
  • 대부분의 스마트폰은 한번에 한 화면만 나옴 -> 나머지는 뒤에
  • 저장장치도 작기때문에 한 순간에 최상위 하나만 실행
  • 컴퓨터의 요소 4가지 혹은 5가지
    • HW - 눈에 보이는 여러가지 장치(CPU - 중앙 처리 장치, 메모리, 입출력 장치 - I/O)로 구성되어 기본 계산용 자원을 제공
    • 운영체제 - 다양한 사용자를 위해 다양한 응용 프로그램간의 하드웨어 사용을 제어하고 조정(자원 할당자)
    • 응용프로그램 - 컴파일러, 데이터베이스, 오피스 등의 비즈니스 프로그램
    • 유저 - 사용하는 사람, 기계, 또 다른 컴퓨터
    • + 위 네가지를 사용하기 위해 우리는 네트워크를 이용
  • 컴퓨터 시스템 구성 요소에 대한 개략적 구성도

  • 하드웨어 - 운영체제 - 어플리케이션 프로그램 순으로 연결되어 우리가 쓰는 어플리케이션들은 하드웨어를 직접 제어하지는 않는다.
  • 운영체제는 모든 것들의 사이에 존재하고 하드웨어를 제어하고 결과를 돌려주는 역할을 한다.
  • 운영체제란 무엇인가?
    • 컴퓨터 사용자와 컴퓨터 하드웨어 사이에서 매개체 역할을 하는 프로그램이다.
    • 사용자에게 프로그램을 수행할 수 있는 환경을 제공한다.
    • 컴퓨터 하드웨어를 효율적으로 이용할 수 있도록 해준다.
  • 어떤 환경에서 일을 해야하는가?
    • 중, 대형 컴퓨터에서는 동시에 많은 사람들이 사용할 수 있으니 이러한 환경에서도 잘 돌아가야한다.
    • 핸드폰과 같은 환경은 일반 컴퓨터와 전혀다른 환경
    • 임베디드 시스템은 운영체제가 없을 수도 있지만 전용의 아주 작은 운영체제가 있을 수도 있다.
    • 아예 동작은 있지만 인터페이스가 없는 환경도 있다.
  • 운영체제가 하는 일
    • 자원 할당자로서의 역할 - 하드웨어, 소프트웨어적인 자원들을 조정, 할당
    • 제어 프로그램 - 사용자 프로그램의 실행과 I/O장치의 작동
    • Kernel - 운영체제에서 소프트웨어적인 기능, 항상 수행하는 프로그램, 응용 프로그램을 제외한 모든 프로그램
  • 컴퓨터를 이루는 요소들

  • 버스로 연결되어 있음
  • 이러한 각각의 요소들을 운영체제가 다루고 제어한다는 것
  • 컴퓨터 시스템에서 나타나는 여러 동작들
    • 입출력 장치와 CPU는 동시에 동작
    • 각 device controller는 제어를 담당 - device만을 위한 버퍼 메모리를 가지고 있음, 이는 device driver라는 운영체제에 의해 관리됨
    • CPU는 메인메모리의 값과 컨트롤러의 local메모리의 값을 서로 주고 받을 수 있음
    • device controller는 CPU와 데이터 전송을 interrupt로 주고 받는다.(제어를 주고 받음)
  • 인터럽트의 기능
    • 제어를 주고 받음 - 한쪽 끝은 CPU, 다른 한쪽은 I/O장치
    • interrupt vector라는 것을 통해 interrupt service routine이라는 작은 프로그램이 동작할 수 있게 해줌 - 하던 일을 잠깐 중단
    • 내부적으로 문제가 발생해 SW적으로 인터럽트를 발생시킨 것을 trap 혹은 exception 이라고 한다.
  • 출력을 수행하고 있는 단일 프로세스에 대한 인터럽트 시간 일정

  • 인터럽트의 타이밍을 나타낸 것
  • I/O 관점 - 기다리고 있다가 입/출력이 생기면 데이터를 전송하는 것을 반복, 전송이 끝나면 인터럽트를 발생
  • CPU 관점 - 일반 프로그램을 동작시키다가 I/O 장치의 인터럽트가 발생하면 잠깐 멈춰줌(신호를 보내줌), 다시 신호를 받으면 재시작
  • 입/출력 장치가 인터럽트 신호를 보내면 CPU는 잠깐 멈춰서 인터럽트를 수행할 수 있도록 해줌
  • Interrupt Handling
    • 인터럽트가 발생하면 현재의 상태(레지스터 값, 프로그램 카운터 값)를 저장해야 함 - CPU가 어떤 일을 하고 있었는지 기억
    • 인터럽트를 처리(다른 함수를 호출하는 것과 비슷)하고 나면 저장했던 정보를 찾아서 CPU가 하던 일로 돌아와서 다시 시작
    • 어떤 인터럽트가 발생했는지 알아내기 위해서 polling 방식(어떤 것인지 살펴보는 것)이나 vector 방식(정해진 곳으로 jump)을 이용
    • ISR interrupt service routine - 각각의 인터럽트를 처리하기 위한 작은 프로그램들
  • Interrupt-drive I/O Cycle

  1. CPU가 어떤 일을 하고 있음
  2. I/O controller가 작업(전송 같은 것들)을 마치고 마무리로 인터럽트를 발생시킴
  3. 인터럽트가 들어오면 CPU가 하던일을 멈추고 작업중이던 현재 상태을 저장한 후 interrupt handler에게 권한을 넘겨줌
  4. interrupt service routine이 하는 일을 동작
  5. 다 끝나면 다시 끝났다는 신호를 보냄
  6. 신호를 받은 CPU는 저장된 상태를 불러와(resume) 원래 하던 일을 계속 진행
  7. 위 과정 반복
  • 저장장치
    • 운영체제는 저장장치가 꼭 필요함
    • Main memory(RAM) - 휘발성 메모리(전원이 없어지면 내용도 없어짐), 용량대비 가격이 저렴하고 속도가 빠르기 때문
    • Hard Disk Drives(HDD) - 마그네틱(자석) 디스크를 이용해서 데이터를 읽어냄, 비휘발성 메모리, 용량대비 단가가 가장 저렴
    • SSD - 전자장치를 이용한 비휘발성 메모
    • 단위들
      1. bit - 전자적인 방법의 컴퓨터들 중에는 가장 작은 단위
      2. word - 시스템마다 값이 다름, 시스템에 맞춰서 편하게 다룰 수 있도록 맞춤
      3. Byte -> KB -> MB -> GB -> TB -> PB : 1024배씩 차이가 남
    • 속도, 비용, 휘발성 등을 기준으로 계층을 설명할 수 있음

    1. 위로 갈수록 용량은 적고, 속도는 빠르고, 비용이 비싸지는 형태
    2. 위의 세가지는 휘발성, 나머지는 비휘발성 메모리
    3. register - CPU내에 있는 메모리로써 매우 빠른 메모리 -> 이름이 숫자나 알파벳 등으로 정해져 있음
  • 현대 컴퓨터 시스템의 동작

  • A von Neumann (폰 노이만형 방식) - 명령과 데이터를 메모리에 넣고 하나씩 가지고 와서 처리하는 방식
  • 비 노이만형 방식 - 데이터의 처리를 고속, 고도화 하기위해 병렬화를 함, 명령과 데이터 버스를 분리하여 처리하여 빠르게 처리 가능
  • Direct Memory Access
    • I/O 장치에는 버퍼가 존재하는데, 버퍼에 있는 데이터를 메인메모리에 옮겨놓을 필요가 있음
    • 어떤 번지에 있는 메모리를 다른 번지에 옮기는 방법? - CPU가 하나씩 불러와 옮기는 방법이 있지만 너무 단순해서 CPU가 할 필요가 없고 CPU가 원래 하던일을 하지 못하는 경우가 생김 -> 효율이 좋지 않다.
    • 따라서 CPU는 하던 일을 계속하고 다이렉트로 데이터를 옮기는 방식(줄여서 DMA라고 함)
  • 컴퓨터 시스템은 프로세서의 숫자에 따라 구조도 많이 달라진다.
    • 프로세서 : CPU와 같은 물리적인 처리 장치
    • 프로세스 : 프로그램의 실행 단위
    • 하나의 프로세서를 가지는 시스템 - CPU가 메인메모리를 혼자 다 쓸 수 있어서 간단
    • 프로세서가 2개 이상 있는 경우(멀티 프로세서) - 메모리는 하나이기 때문에 효율이 떨어짐
    • 물리적인 프로세서는 하나지만 내부적인 구성(core)은 여러개가 있는 프로세서를 Multicore라고 한다.
  • 멀티 프로세서의 효율을 높이기 위한 방식
    • Non-Uniform Memory Access System(NUMA 구조) - CPU는 4개, 각각의 CPU마다 우선 접근할 수 있는 메모리를 만들어 한쌍으로 만듦(메모리가 4개) -> 다른 CPU들도 각각의 메모리를 사용할 수 있음(버스를 이용)

    • Clustered Systems - 컴퓨터하나가 하나의 CPU인 것처럼 생각하고 연결하여 사용하는 시스템

+ Recent posts