나의 브을로오그으

#10. 프로세스 동기화 본문

Computer Science/운영체제

#10. 프로세스 동기화

__jhp_+ 2022. 7. 4. 08:18

- Thread 

Concurrent vs Simultaneous

: Concurrent는 굉장히 빠른 속도로 여러개의 쓰레드를 일정하게 실행함으로써 동시에 실행되는 것처럼 느껴지는것. Simultaneous는 진짜 동시에 실행되는 것. 해당 내용에서는 1 개의 CPU에서 동작하는것으로 가정하기 때문에 Concurrent이다.

 

Thread vs Process

- 한 프로세스에는 기본 1개의 쓰레드

  * 단일 쓰레드 (single thread) 프로그램

- 한 프로세스에 여러 개의 쓰레드

  * 다중 쓰레드 (multi-thread) 프로그램

- 쓰레드 구조

  * 프로세스의 메모리 공간 공유 (code, data)

  * 프로세스의 자원 공유 (file, vo, ...)

  * 비공유 : 개별적인 PC, SP, registers, stack

- 프로세스의 스위칭 vs 쓰레드의 스위칭

 

예제 : 자바 쓰레드

- 맥 만들기

- java.lang.Thread

- 주요 메소드

  * public void run() : 새로운 맥이 흐르는 곳

  * void start() : 쓰레드 시작 요청

  * void join() : 쓰레드가 마치기를 기다림

  * static void sleep() : 쓰레드 잠자기

 

- Thread.run()

  * 쓰레드가 시작되면 run() 메소드가 실행된다.

  * run() 메소드를 치환한다.

class MyThread extends Thread {
    @Override
    public void run() {
        // 코드
    }
}

 

- 예제 : 글자 A와 B를 동시에 화면에 출력하기

  * 모든 프로그램은 처음부터 1개의 쓰레드는 갖고 있다. (main)

  * 2개의 쓰레드 : main + MyThread

class Test {
  public static void Main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();
    while(true) {
      System.out.println('A');
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) { }
    }
  }
}

class MyThread extends Thread {
  @Override
  public void run() {
    while(true) {
      System.out.println('B');
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) { }
    }
  }
}

 

프로세스 동기화

- Process Synchronization

  * cf. Thread synchronization

- Processes

  * Independent vs Cooperating

  * Cooperating process : one that can affect or be affectedby other processes executed in the system

(Cooperating process는 다른 process로부터 영향을 주거나 받는 process) 

  * 프로세스간 통신 : 전자우편, 파일 전송

  * 프로세스간 자원 공유 : 메모리 상의 자료들, 데이터베이스 등

  * 명절 기차표 예약, 대학 온라인 수강신청, 실시간 주식거래 

 

- Process Synchronization

  * Concurrent access to shared data may result in data inconsistency.

  * Orderly execution of cooperating processes so that data consistency is maintained.

(데이터 일관성 유지) 

 

- Example : BankAccount Problem (은행계좌 문제)

  * 부모님은 은행계좌에 입금 : 자녀는 출금

  * 입금(deposit)과 출금(withdraw)은 독립적으로 일어난다.

class BankAccount {
    private int balance;
    public int getBalance() { return balance; }
    public void deposit(int n) {
        int tmp = balance + n;
        System.out.println('+');
        balance = tmp;
    }
    public void withdraw(int n) {
        int tmp = balance - n;
        System.out.println('-');
        balance = tmp;
    }
}

class Parent extends Thread {
    BankAccount b;
    Parent(BankAccount b) {
        this.b = b;
    }
    @Override
    public void run() {
        for(int i = 0; i < 10000; ++i) {
            b.deposit(1000);
        }
    }
}

class Child extends Thread {
    BankAccount b;
    Child(BankAccount b) {
        this.b = b;
    }
    @Override
    public void run() {
        for(int i = 0; i < 10000; ++i) {
            b.withdraw(1000);
        }
    }
}

class Test {
    public static void Main(String[] args) throws InterruptedException {
    
        BankAccount b = new BankAccount();
        Parent parent = new Parent(b);
        Child child = new Child(b);
        parent.start();
        child.start();
        
        parent.join();
        child.join();
        System.out.println(b.getBalance());
        // 정상적인 결과 : 0
    }
}

(입금, 출금 메서드에서 약간의 시간 지연을 주니까 결과값이 0이 나오지 않는다. 따라서 이부분에 동기화가 필요하다.)

 

 

 

 

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

#12. 세마포어  (0) 2022.07.07
#11. 프로세스 동기화  (0) 2022.07.06
#9. CPU 스케쥴링 알고리즘(3)  (0) 2022.07.02
#8. CPU 스케쥴링 알고리즘(2)  (0) 2022.07.01
#7. CPU 스케쥴링 알고리즘(1)  (0) 2022.06.30