일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Operating System
- TCP/IP
- 운영체제
- redis
- HTTP
- 김영한
- Operating System.
- 토마토
- OS
- 10026번
- 스프링 핵심 원리
- 윤성우 저자
- BOJ
- 우아한레디스
- Four Squares
- 이펙티브코틀린
- n타일링2
- 열혈 tcp/ip 프로그래밍
- Window-Via-c/c++
- C++
- C#
- 제프리리처
- Spring
- 스프링 입문
- FIFO paging
- 우아한 테크 세미나
- inflearn
- 열혈 TCP/IP 소켓 프로그래밍
- 2475번
- 에러핸들링
- Today
- Total
나의 브을로오그으
#10. 프로세스 동기화 본문
- 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 |