프로세스(Process)의 상태 전이, 스케쥴링(Scheduling)
프로세스가 생성되면 Ready 상태가 된다.
Ready 상태란, cpu를 기다리는 상태이다.
그리고 곧 Running 상태로 넘어가서 cpu에게 실행된다.
Running 상태란, cpu에게 실행되어지고 있는 상태이다.
그러다가 자신에게 주어진 cpu 단위 사용시간 (cpu time quantum) 을 모두 소비하거나, 혹은 더 높은 우선순위의 작업 (예를들어 인터럽트) 에게 cpu를 선점당할 경우 다시 Ready 상태로 돌아가서 줄을 선다.
만약 Running 상태에 있다가 block I/O 등 시간이 오래 걸리는 함수 (예를들어 fopen) 를 호출한 경우 해당 함수가 리턴될 때까지 Waiting 상태가 된다.
Waiting 상태란 Sleep 상태와 같다. cpu를 기다리는 게 아니라 해당 I/O 의 종료를 기다린다. 신호 수신을 통해 Sleep 에서 깨어나면 Ready 상태가 되어 cpu에게 다시 실행되기를 기다린다.
프로세스가 종료될 때까지 위 과정이 반복된다.
출처 : 2015년 한양대학교 강수용 교수님의 수업 및 내 지식
[Collection] ArrayList vs Vector
결론
* ArrayList 에 대한 Vector 의 이점을 그나마 꼽자면, 멀티 쓰레드 환경에서의 동기화(synchronization) 를 꼽을 수 있다. Vector 의 소스코드를 살펴보면, 모든 동작(함수)에 대해 일일이 synchronized 가 붙어있다. 이것은 2가지 불행한 결과를 낳게 된다.
1. 프로그래머가 생각한 동기화가 이루어지지 않는다.
일반적으로 동기화는 개별 동작이 아닌 일련의 시퀀스에 대해서 이루어져야 한다. 하지만 Vector 는 단순히 개별 동작에 대한 lock 만 걸려있으므로, 대부분의 경우 Vector 를 사용하더라도 어차피 별도의 lock 이 필요하게 된다.
예를들어, 위 코드의 경우 빨간상자 안의 코드만 lock 이 걸릴 뿐 전체적인 시퀀스에는 걸려있지 않다. 따라서 멀티쓰레드 환경이라면 코드 실행 도중에 얼마든지 다른 thread 에 의해서 vector 가 변경될 수 있고 그로 인해 심각한 문제가 발생할 수 있다.
2. 불필요하게 느려진다.
위에서 언급한 것처럼 일련의 시퀀스에 대해 lock을 한다면 한번만 하면 되지만, vector 를 사용할 경우 불필요한 lock 과 unlock 이 반복된다.
또한 lock 을 원하지 않을 때에도 lock 에 의한 오버헤드가 발생하게 되는 이슈도 있다.
출처
1. GrepCode
* http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Vector.java
2. StackOverflow
'뿌리튼튼 CS > Java' 카테고리의 다른 글
생성자를 쓰는 이유. 생성자의 필요성 (Why use constructors) (0) | 2016.08.02 |
---|---|
심심풀이 문제1 - Object.equals() (0) | 2016.07.16 |
String vs StringBuilder vs StringBuffer (2) | 2016.01.28 |
Array size in Loops (0) | 2015.07.31 |
Thread ID로 thread 찾기 (get thread by id) (0) | 2015.07.27 |
String vs StringBuilder vs StringBuffer
결론
* StringBuilder 는 사용할 필요가 없다.
* Thread Safe 가 필요하면 StringBuffer, 그렇지 않으면 String
|
String |
StringBuffer |
저장공간 (Storage Area) |
CSP (Constant String Pool) |
힙 (Heap) |
성능 (Performance) |
빠름 (Fast) |
느림 (Slow) |
Thread Safe |
No |
Yes |
Why (작성중)
* StringBuilder 는 사용할 필요가 없다.
작성중
* Thread Safe 가 필요하면 StringBuffer, 그렇지 않으면 String
작성중
출처
1. GrepCode
* http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java
2. Articles & Blogs
* http://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html
'뿌리튼튼 CS > Java' 카테고리의 다른 글
생성자를 쓰는 이유. 생성자의 필요성 (Why use constructors) (0) | 2016.08.02 |
---|---|
심심풀이 문제1 - Object.equals() (0) | 2016.07.16 |
[Collection] ArrayList vs Vector (0) | 2016.02.01 |
Array size in Loops (0) | 2015.07.31 |
Thread ID로 thread 찾기 (get thread by id) (0) | 2015.07.27 |
베트남 하노이 3박4일 4인가족 배낭여행 일정 (Vietnam Hanoi)
예상비용 통계 (단위 : 원)
항공권 |
1,034,000 |
여행사 비용 (2일차 해상투어) |
420,000 |
숙박비 |
420,000 |
현지 교통비 |
70,000 |
입장료 |
20,000 |
현지 식비, 기념품비, 기타 비상금 |
135,000 |
합계 |
2,079,000 |
※ 환율에 따라 약간의 변동 가능
항공편 정보
No |
항공편 |
출발 |
도착 |
좌석 |
1 |
진에어 (0057편) |
인천 12/11 (금) 10:00 |
하노이 12/11 (금) 12:40 |
4석 |
2 |
진에어 (0058편) |
하노이 12/14 (월) 13:50 |
인천 12/14 (월) 19:40 |
4석 |
일정 정보
1일차 (금) : 하노이 |
|
06:30 |
집에서 인천공항으로 출발 |
12:40 |
하노이 공항 도착 |
12:40 ~ 14:00 |
수속 마치고 공항에서 점심 먹기 |
14:00 ~ 15:00 |
공항을 나와서 택시타고 호텔로 이동 (약 45분, 약 35만동) ↓↓호텔 위치보려면 클릭↓↓ |
15:00 ~ 15:30 |
호텔 도착 후 체크인 및 짐 맡기기 (Somerset Grand Hanoi Serviced Residences) ↓↓숙소 사진보려면 클릭 (여러장임)↓↓ |
15:30 ~ 17:00 |
문묘 관람 (입장료 1만동, 08:00 ~ 17:00) (일정이 지체되면 베트남 민속학 박물관 관람으로 대체. 입장료 2만5천동, 08:30 ~ 17:30) |
17:00 ~ 17:30 |
구시가(Old Quarter)로 이동 (도보 약 30분) |
17:30 ~ 18:30 |
저녁 식사 |
18:30 ~ 19:30 |
구시가 둘러보기 |
19:30 ~ 20:30 |
호안끼엠 호 둘러보기 |
20:30 ~ 20:50 |
숙소 복귀 (도보 약 20분) |
2일차 (토) : 할롱 만 (하롱베이) (여행사 비용 1인당 $90) | |
05:30 ~ 06:30 | 기상 후 간단한 아침식사 및 여행준비 |
06:30 ~ 10:30 | 여행사(Handspan) 셔틀버스 탑승 후 하롱베이로 3.5시간 이동 |
10:30 ~ 12:00 | ? 대기 |
12:00 ~ 16:30 | 나무배 탑승 후 뷔페 점심 식사 및 할롱 만의 아름다운 경치 구경 ↓↓하롱베이 사진보려면 클릭 (여러장임)↓↓ |
16:30 ~ 17:00 | ? 대기 |
17:00 ~ 20:30 | 여행사 셔틀버스 탑승 후 하노이 숙소로 3.5시간 이동 |
3일차 (일) : 하노이 | |
06:00 ~ 07:30 | 기상 후 호치민 영묘단지로 이동 (택시 이용. 약 2만5천동) |
07:30 ~ 10:00 | 호치민 영묘단지. 줄 서서 입장 기다리는 중에 아침 간단히 해결 |
10:00 ~ 11:30 | 호치민 박물관 관람 (입장료 1만5천동) |
11:30 ~ 12:00 | 먹자골목 포 깜찌(Pho Cam Chi) 로 이동 (도보 약 30분) |
12:00 ~ 15:00 | 골목 구경, 점심 식사, 카페에서 휴식 |
15:00 ~ 15:30 | 베트남 민속학 박물관으로 이동 (택시 이용. 약 17분. 약 10만동) |
15:30 ~ 17:30 | 베트남 민속학 박물관 관람 (입장료 2만5천동) |
17:30 ~ 19:00 | 저녁 식사 |
19:00 ~ 21:00 | 자유 |
4일차 (월) : 하노이 | |
06:00 ~ 10:00 | 자유 |
10:00 ~ 10:30 | 호텔 체크아웃 |
10:30 ~ 11:30 | 공항으로 이동 (택시 이용. 약 45분. 약 35만동) |
11:30 ~ 13:50 | 공항 대기 후 비행기 탑승 |
13:50 ~ 19:40 | 인천공항 도착 |
'CGun의 일상' 카테고리의 다른 글
서울근교 드라이브 명소 지도 (1) | 2016.06.16 |
---|---|
애창곡 목록 (상시 작성중) (0) | 2015.04.11 |
튜닝 소개 (0) | 2015.04.11 |
오늘따라 더 이뻐서 한컷 (0) | 2015.04.11 |
첫 물피도주를 당하다 (0) | 2015.04.10 |
Conversions(CONVERT) 정답 코드
난이도 ★☆☆☆☆
힌트
문자열 처리에 주의할 것. |
이하는 코드입니다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 |
#include <stdio.h>
#include <string>
#include <iostream>
#define KG_TO_LB 2.2046
#define LB_TO_KG 0.4536
#define L_TO_G 0.2642
#define G_TO_L 3.7854
#pragma warning(disable:4996)
using namespace std;
int main() {
int N;
scanf("%d\n", &N);
for (int i = 1; i <= N; i++) {
string input;
getline(cin, input);
int pivot = input.find(' ');
string left (input, 0, pivot);
string right(input, pivot + 1, string::npos);
float num = atof(left.c_str());
float resultNum;
string resultUnit;
if (right.compare("kg") == 0) {
resultNum = num * KG_TO_LB;
resultUnit = "lb";
}
else if (right.compare("lb") == 0) {
resultNum = num * LB_TO_KG;
resultUnit = "kg";
}
else if (right.compare("l") == 0) {
resultNum = num * L_TO_G;
resultUnit = "g";
}
else if (right.compare("g") == 0) {
resultNum = num * G_TO_L;
resultUnit = "l";
}
else {
resultNum = 0.;
resultUnit = "";
}
printf("%d %.4f %s\n", i, resultNum, resultUnit.c_str());
}
return 0;
} |
cs |
'뿌리튼튼 CS > Algorithm' 카테고리의 다른 글
codility - OddOccurrencesInArray 정답 및 해설 (0) | 2017.06.06 |
---|---|
codility - BinaryGap 정답 및 해설 (0) | 2017.06.06 |
Endians(ENDIANS) 정답 코드 (0) | 2015.10.09 |
Mispelling(MISPELL) 정답 코드 (0) | 2015.04.10 |
터보모드(TURBOMODE) 정답 코드 (0) | 2015.04.10 |
Endians(ENDIANS) 정답 코드
난이도 ★☆☆☆☆
힌트
오버플로우(overflow)에 주의할 것. |
이하는 코드입니다.
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 |
#include <stdio.h>
#include <math.h>
#pragma warning(disable:4996)
unsigned long convert(const unsigned long num) {
unsigned long first = num / pow(2., 24);
unsigned long second = (num / pow(2., 16)) - (first * pow(2., 8));
unsigned long third = (num / pow(2., 8)) - (second * pow(2., 8)) - (first * pow(2., 16));
unsigned long fourth = num % (unsigned long)pow(2., 8);
return first + second * pow(2., 8) + third * pow(2., 16) + fourth * pow(2., 24);
}
int main() {
int C;
scanf("%d", &C);
while (C-- > 0) {
unsigned long num;
scanf("%lu", &num);
printf("%lu\n", convert(num));
}
return 0;
} |
cs |
'뿌리튼튼 CS > Algorithm' 카테고리의 다른 글
codility - BinaryGap 정답 및 해설 (0) | 2017.06.06 |
---|---|
Conversions(CONVERT) 정답 코드 (0) | 2015.10.09 |
Mispelling(MISPELL) 정답 코드 (0) | 2015.04.10 |
터보모드(TURBOMODE) 정답 코드 (0) | 2015.04.10 |
HOTSUMMER 정답 코드 (0) | 2015.04.10 |
[JavaScript] DOM 엑세스 줄이기 (Reduce DOM Access)
1 2 3 4 5 6 7 8 9 | var obj = document.getElementById("foo"); obj.value = "hi"; ... obj.value = "hello"; ... | cs |
Android 의 ViewHolder 와 거의 같은 개념이다.
DOM 을 뒤져서 get Element 하는 코드는 매우 느리기 때문에, (Android 에서는 findViewById)
해당 element 를 다시 참조할 일이 있다고 예상되면
다시 찾지말고 기존에 찾았던 것을 변수에 저장해놓고 다시 이용한다.
출처 : http://www.w3schools.com/js/js_performance.asp
ps. 드디어 JS Tutorial 정주행 완료! ^^
'뿌리튼튼 CS > Web' 카테고리의 다른 글
[JavaScript(ES6)] Proxy (0) | 2016.05.19 |
---|---|
[JavaScript(ES6)] Iterators and Generators (0) | 2016.05.16 |
[JavaScript] Loose Comparison vs. Strict Comparison (0) | 2015.07.31 |
[JavaScript] 함수에 인자에 default 값을 넣어주자 (Use Parameter Defaults) (0) | 2015.07.31 |
[JavaScript] === 를 쓰자 (Use === Comparison) (0) | 2015.07.31 |
Array size in Loops
for (int i = 0; i < mArrayList.size(); i++) { | cs |
w3schools 에서 JavaScript 를 공부하다가, 이 흔한 반복문에 의문을 제기하는 글을 보았다.
size() 메서드를 매 loop 마다 실행하는 것은 낭비라는 것이다.
그들은 아래와 같이 개선하는 것을 제안했다.
①
1 2 | int n = mArrayList.size(); for (int i = 0; i < n; i++) { | cs |
② 혹은 scope 최소화 측면에서 조금더 개선된
for (int i = 0, n = mArrayList.size(); i < n; i++) { | cs |
하지만.
그렇다면 내가 봐왔던 뛰어난 코드들은 왜 저런식으로 코딩하지 않았을까?
의문이 들어 ArrayList 소스코드를 직접 열어보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package java.util; public class ArrayList<E> extends ... { ... private int size; ... ... public int size() { return size; } ... } | cs |
그렇다. size() 는 단순히 size 변수값을 반환하는 O(1) 의 메서드인 것이다.
당연하게도, 미련하게 처음부터 count 하는 O(n) 이 아닌 것이다.
게다가 JVM 이 똑똑하여서 loop 내에서 size 값이 변하지 않는다는 것을 알고 있으며,
따라서 자동으로 최적화를 한다고 한다.
덧붙여서, ArrayList 객체가 아닌 일반 array (ex. int[]) 의 length 도 같은 방식으로 구현이 되어있다고 한다.
나의 결론 :
좋은 접근이지만 결론적으로는 가독성만 떨어질 뿐이다.
출처들
그들의 주장들:
http://www.w3schools.com/js/js_performance.asp
http://egloos.zum.com/benelog/v/1382604
우리의 주장들:
'뿌리튼튼 CS > Java' 카테고리의 다른 글
생성자를 쓰는 이유. 생성자의 필요성 (Why use constructors) (0) | 2016.08.02 |
---|---|
심심풀이 문제1 - Object.equals() (0) | 2016.07.16 |
[Collection] ArrayList vs Vector (0) | 2016.02.01 |
String vs StringBuilder vs StringBuffer (2) | 2016.01.28 |
Thread ID로 thread 찾기 (get thread by id) (0) | 2015.07.27 |