Running
: CPU Scheduling 대상 ⇒ CPU를 받을 수 있는 상태Not Runnable
: CPU Scheduling 대상에서 제외 ⇒ CPU를 받지 않는 상태Running
상태로 접어든다.Running
상태는 실행하고 있는 상태 뿐만 아니라, CPU를 받을 수 있는 상태이기도 하다. Running
상태로 돌아갈 수 없다.thread.join()
을 하면 thread가 종료할 때까지 main 스레드가 대기한다.Thread.sleep(3000)
OS가 프로세스나 스레드의 명령을 가져와서 CPU에 넣어서 실행한다.
명령어들을 CPU에 가져와서 실행하는 것
OS가 CPU 스케쥴링 실행 상태에서 작동
선점형 운영체제: CPU 사용을 OS가 온전히 점유하여 관리
운영체제가 CPU를 프로세스에게 줬다가 뺐다가 스레드에게 줬다가 뺐다가 하며 관리한다.
여러 프로세스나 스레드들이 CPU 사용권을 놓고 경쟁하는 것
→ 실체! OS가 CPU 스케줄링 정책에 따라 결정한다.
프로세스 스케줄링 → Round Robin 또는 Priority+Aging
모든 스레드는 이름이 존재한다.
사용자가 설정하지 않으면 내부에서 알아서 생성된다.
여러 스레드가 동시에 같은 변수에 접근할 때 다른 스레드의 작업을 덮어쓰는 문제가 발생한다!
public class ExamThread {
static class MyList {
int[] values = new int[100];
int size;
public void add(int value) {
// 여러 스레드가 동시에 이 메서드에 진입하면
// 배열의 값을 덮어쓰는 문제가 발생한다.
// 이렇게 여러 스레드가 동시에 접근했을 때 문제가 발생하는 코드 부분을
// "Critical Section" 또는 "Critical Region" 이라 부른다.
if (size >= values.length) {
delay();
return;
}
delay();
values[size] = value;
delay();
size = size + 1;
delay();
}
...
}
static class Worker extends Thread {
...
@Override
public void run() {
for (int i = 0; i < 20; i++) {
list.add(value);
}
}
}
public static void main(String[] args) throws Exception {
MyList list = new MyList();
Worker w1 = new Worker(list, 111);
Worker w2 = new Worker(list, 222);
Worker w3 = new Worker(list, 333);
w1.start();
w2.start();
w3.start();
Thread.sleep(10000);
list.print();
}
}
예를 들어, 인덱스 23에 w1과 w3이 동시에 접근해서 배열 값을 삽입하려고 한 것이다.
w1이 값을 넣고 Delay에 걸려서 size를 증가시키지 못했는데 w3에게 cpu 사용권을 뺏겼다. 그래서 인덱스 23의 값이 최종적으로 333으로 덮어지게 된다.
그 다음에 w3에서 size가 커지고, 다시 cpu 사용권을 w1에게 뻇겨서 size가 또 커져서 인덱스가 건너뛰게 된다.
예)
Semaphore(3)
Semaphore(1) ⇒ Mutex
자바에서는 Mutex를 문법으로 지원해준다!
→ synchronized
synchronized로 설정한 스레드는 한 번 실행에 한 스레드밖에 불가능하지만,
순서는 운영체제 맘이라 다른 애가 start() 먼저해도 순서는 뒤섞일 수 있다. 단지 한 번 시작한애가 있으면 다른애가 동시에 실행이 안되는 것이다.
한 번에 한 스레드만 진입하도록 메소드 전체가 아니라 일부 코드만 설정할 수도 있다.
// 동기화 블록
synchronized(스레드가 공유하면 안되는 객체){
}
클라이언트에서 요청을 보내면, 서버에서 각각의 클라이언트들에게 각각의 스레드를 생성해주고, 각각의 클라이어트들은 이 스레드와 통신하게 된다.
데이터 관리(CRUD)
DataBase Management System (데이터 관리 전문 서버 어플리케이션)
ex)
Oracle - Oracle DBMS
MS - MS SQL
IBM - DB2
Oracle - MySQL
개발 커뮤니티 - Maria DB(MySQL 오픈 소스)
한국 - Cubid, Altibase, Tibero
명령 문법을 통일 → SQL(Structed Query Language) 구조를 갖춘, DBMS에 명령을 내릴 때 사용하는 문법
→ DBMS마다 특별한 기능이 있다. → DBMS만의 특별 기능을 사용할 문법이 필요하다.