공부/데이터베이스2011. 7. 19. 15:24


SELECT status FROM my_contacts
GROUP BY status
ORDER BY status;

ORDER BY는 항상 맨 마지막에 온다.

문자열 추출
UPDATE my_contacts
SET interests = SUBSTR(interests, LENGTH(interest1)+2); 

 
3개 쿼리는 같은 결과
1)
CREATE TABLE profession
(
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    profession varchar(20)
);
INSERT INTO profession (profession)
    SELECT profession FROM my_contacts
    GROUP BY profession
    ORDER BY profession

2)
CREATE TABLE profession AS
    SELECT profession FROM my_contacts
    GROUP BY profession
    ORDER BY profession;
ALTER TABLE profession
ADD COLUMN id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (id);

3)
CREATE TABLE profession
(
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    profession varchar(20)
) AS
    SELECT profession FROM my_contacts
    GROUP BY profession
    ORDER BY profession
 
별명(Alias) 사용
열이름을 간단하고 사용하기 쉽게 한다. 

CREATE TABLE profession
(
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    profession varchar(20)
);
INSERT INTO profession (profession)
    SELECT profession AS mc_prof FROM my_contacts
    GROUP BY mc_prof
    ORDER BY mc_prof

결과 테이블의 열의 이름이 alias값, 즉 mc_prof로 나온다.
원래 열의 이름은 변하지 않음. 저렇게만 보여주는 것임.

테이블 별명
SELECT profession AS mc_prof
FROM my_contacts AS mc
GROUP BY mc_prof
ORDER BY mc_prof;

AS는 생략 가능하다.

Inner join(내부 조인)
1) Cartesian 조인
한 테이블의 모든 행과 다른 테이블의 모든 행을 짝지워 반환한다.

SELECT t.boy, b.boy
FROM toys AS t
CROSS JOIN
boys AS b;

다음 쿼리도 같은 결과
SELECT toys.toy, boys.boy
FROM toys, boys;

2) equijoin(동등 조인)
같은지를 테스트하는 내부 조인
SELECT boys.boy, toys.toy
FROM boys
   INNER JOIN
   
toys
ON boys.toy_id = toys.toy_id;

3) non-equijoin(비동등 조인)
내부 조인이 같지 않은지를 테스트.
SELECT boys.boy, toys.toy
FROM boys
    INNER JOIN
    toys
ON boys.toy_id <> toys.toy_id
ORDER BY boys.boy

4) natural join (자연조인)
두 테이블에 같은 이름의 열이 있을 때
SELECT boys.boy, toys.toy
FROM boys
    NATURAL JOIN
    toys;
 

'공부 > 데이터베이스' 카테고리의 다른 글

2장 introduction to Database Design  (0) 2011.08.06
9. 서브 쿼리 (subqueries)  (0) 2011.07.19
7. 테이블이 여러개인 데이터베이스 설계  (0) 2011.07.17
6. 고급 SELECT문  (0) 2011.07.17
5장 ALTER  (0) 2011.07.16


Posted by skyjumps
공부/데이터베이스2011. 7. 17. 19:01


테이블에서 원자적이지 않은 열을 새로운 테이블로 옮기기.

데이터베이스 내의 데이터(열들과 테이블들), 그리고 데이터들 사이의 연결 방식에 대한 표현을 스키마라고 한다.

테이블의 연결
테이블을 연결하기 위해서는 테이블에 기본키와 같은 유일한 열이 필요하다.
테이블은 참조키를 통해 다른 테이블의 기본키를 가리킨다.
참조키에서 참조하는 기본키를 부모키(parent key)라고도 한다.
참조키는 한 테이블의 열들이 다른 테이블의 열과 연결 되도록 하는데 사용할 수 있다.
기본키는 null일 수 없지만 참조키는 null일 수 있다.(부모 테이블의 기본키(primary key)를 안가리키는 것) 
제약조건(constraint)를 사용해서 null을 갖게 하지 못하도록 할 수 있다.
참조키는 유일할 필요가 없다.

참조키 제약조건
부모 테이블에 존재하는 키의 값만을 넣을 수 있도록 할 수 있다. 참조 무결성(referential integrity)
기본키가 있는 테이블에서 행을 지우거나 바꾸려고 할 때 제약조건으로 인해 삭제 수정이 맘대로 안된다.
참조키의 값이 부모 테이블의 기본키일 필요는 없지만 그 값이 유일(unique)해야 한다.

UNIQUE 키워드
열의 값이 유일하도록.

참조키가 있는 테이블 생성

CREATE TABLE interests (
int_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
interest VARCHAR(50) NOT NULL,
contract_id INT NOT NULL,
CONSTRAINT my_contacts_contact_id_fk
FOREIGN KEY (contact_id)
REFERENCES my_contacts (contact_id)

);
CONSTRAINT my_contacts_contact_id_fk
제약조건.
my_contacts : 참조키가 어느 테이블을 참조하는지.
contact_id : 키의 이름
fk : 참조키이다.

FOREIGN KEY (contact_id) 
contact_id가 참조키이다.

REFERENCES my_contacts (contact_id)
참조키가 my_contacts 테이블을 참조하고 contact_id 열을 참조한다.

테이블간의 관계

1. 일대일
테이블 A의 레코드가 테이블 B에 많아야 한 개의 레코드와 연결된다.
자주 이용되지는 않음.
보안목적. 일부 데이터를 위한 테이블.
큰 데이터 따로 저장.
모르는 값을 따로 저장.
따로 때어냄으로써 데이터 조회 속도 향상 등.

2. 일대다
테이블 A의 한 레코드에 테이블 B의 레코드 여러개가 연결되고 B의 레코드는 테이블 A의 한 레코드만 연결될 수 있다.
예) 한 직업에 여러명의 사람들. 사람들마다 직업이 많아야 하나.

3. 다대다
여러 레코드에 여러 레코드 연결.
신발가게의 신발과 고객과의 관계. 
중복데이터가 생겨 연결테이블을 만든다.

연결테이블
다대다관계일 때는 중간에 테이블을 추가하여 일대다의 관계로 단순화.
두 테이블의 유니크키들을 열로 가지는 연결 테이블

이전까진 테이블의 데이터가 다른 테이블과 서로 어떻게 연결되는지(일대일, 일대다)에 대한 것.
이제부턴 한 테이블 내의 열들이 어떻게 연결되는지에 대한 것.

합성키
여러 개의 열들로 구성되어 유일무이한 키를 만드는 기본키.

Functionally dependent
열의 데이터가 변경되면 다른 열의 데이터도 변경될 때. 한 열이 다른 열과 종속관계에 있다.

Independent
다른 열에 종속되지 않는 열

Partial functional dependency
키가 아닌 열이 합성키의 일부에 종속되는 경우.
기본키로 테이블 인덱스용 id 필드를 사용하면 다른 열이 이 열에 종속되지 않기 때문에 부분 종속 관계를 피할 수 있음.

transitive functional dependency
키가 아닌 열이 변경될 때 키가 아닌 다른 열이 변경될 경우

제2정규형
제1정규형이고
Partial functional dependency가 없어야 한다.

제3정규형
제2정규형이고 transitive functional dependency가 없다. 

'공부 > 데이터베이스' 카테고리의 다른 글

9. 서브 쿼리 (subqueries)  (0) 2011.07.19
8 조인과 다중테이블 연산  (0) 2011.07.19
6. 고급 SELECT문  (0) 2011.07.17
5장 ALTER  (0) 2011.07.16
4. 좋은 테이블 설계, 정규화.  (0) 2011.07.16


Posted by skyjumps
공부/데이터베이스2011. 7. 17. 11:59


UPDATE에 CASE사용 (SELECT, INSERT, DELETE에도 사용할 수 있다)
category 열에 조건에 따라 다른 값 넣기
UPDATE movie_table
SET category
CASE
    WHEN drama = 'T' THEN 'drama'
    WHEN comedy = 'T' THEN 'comedy'
    WHEN cartoon = 'T' AND rating='G' THEN 'family'
    ELSE 'misc'
END; 


하나의 열로 순서매기기
SELECT title, category
FROM movie_table
WHERE
category = 'family'
ORDER BY title;

여러 열을 사용하여 정렬 할 수 있다.
ORDER BY category, purchased, title;

내림차순 정렬
ORDER BY purchased DESC;

SUM함수
SELECT SUM(sales)
FROM cookie_sales;

평균함수
AVG(column);

GROUP BY
first_name으로 그룹을 짓고 각 그룹별로 SUM을 하기
SELECT first_name, SUM(sales)
FROM cookie_sales
GROUP BY first_name
ORDER BY SUM(sales) DESC;

MIN과 MAX함수
SELECT first_name MAX(sales)
FROM cookie_sales
GROUP BY first_name;
 
열의 행 수 반환
SELECT COUNT(sale_date)
FROM cookie_sales;

DISTINCT 키워드
중복된 값을 없애기
SELECT COUNT(DISTINCT sale_date) 
FROM cookie_sales; 

결과의 갯수를 제한하기
first_name으로 그룹을 짓고 각 그룹별 합을 구하고 합들을 내림차순으로 정렬하고 정렬된 값들 중에 2개를 보여준다.
SELECT first_name, SUM(sales)
FROM cookie_sales
GROUP BY first_name
ORDER BY SUM(sales) DESC
LIMIT 2;

두번째만 보여주기
LIMIT m,n (m은 시작 번호(0부터 시작), n은 보여줄 결과 갯수)
LIMIT 1,1
 

'공부 > 데이터베이스' 카테고리의 다른 글

8 조인과 다중테이블 연산  (0) 2011.07.19
7. 테이블이 여러개인 데이터베이스 설계  (0) 2011.07.17
5장 ALTER  (0) 2011.07.16
4. 좋은 테이블 설계, 정규화.  (0) 2011.07.16
3. DELETE와 UPDATE  (0) 2011.07.16


Posted by skyjumps
공부/데이터베이스2011. 7. 16. 15:00


my_contacts 테이블에 contact_id를 추가하고 첫번째에 위치시키고, PRIMARY KEY로 변경하기

ALTER TABLE my_contacts
ADD COLUMN contact_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY(contact_id); 

FIRST, AFTER, BEFORE, LAST, SECOND, THIRD 등등을 사용하여 테이블의 원하는 위치에 열을 놓기

ALTER TABLE my_contacts
ADD COLUMN phone VARCHAR(10)
AFTER first_name

테이블 이름 바꾸기

projekts --> project_list

ALTER TABLE projekts
RENAME TO project_list;

ALTER와 CHANGE

number 열이름을 proj_id로 바꾸고, INT형, NOT NULL, 자동 증가 설정하기 
ALTER TABLE project_lsit
CHANGE COLUMN number proj_id INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY(proj_id);

MODIFY

열의 데이터 타입을 바꾸고 이름은 그대로 사용하고 싶을 때.
ALTER TABLE project_list
MODIFY COLUMN proj_desc VARCHAR(120);

DROP

열 삭제하기
ALTER TABLE project_table
DROP COLUMN start_date;

기본키 삭제하기

ALTER TABLE your_table DROP PRIMARY KEY;

AUTO_INCREMENT 제거하기

your_id가 원래 auto increment였을 때, CHANGEauto increment 없는걸로 다시 설정하기.

ALTER TABLE your_table CHANGE your_id your_id INT(11) NOT NULL;

문자 함수

RIGHT(), LEFT() - 문자열의 일부를 추출할 수 있다.
location열에서 오른쪽부터 2개의 문자를 선택하기
SELECT RIGHT(location, 2) FROM my_contacts;
 
SUBSTRING_INDEX() - 문자열의 일부를 추출할 수 있다.
첫번째 ','를 찾는다.첫번째 ',' 앞의 모든 문자열을 반환한다.
SELECT SUBSTRING_INDEX(location, ',' , 1) FROM my_contacts;
 
SELECT UPPER('uSa'); 대문자 변환
SELECT LOWER('spaGHEtti'); 소문자 변환
SELECT REVERSE('spaGHEtti'); 문자열 역순으로 만들기
SELECT LTRIM(' spaGHEtti '); 왼쪽 공백 제거
SELECT RTRIM(' spaGHEtti '); 오른쪽 공백 제거
SELECT LENGTH('San Antonio, TX'); 문자열의 문자수 반환 

UPDATE와 SET이 함께 동작

문자열에서 오른쪽에 있는 두개 문자를 state에 설정하기
UPDATE my_contacts
SET state = RIGHT('Chester,NJ',2); 

'공부 > 데이터베이스' 카테고리의 다른 글

7. 테이블이 여러개인 데이터베이스 설계  (0) 2011.07.17
6. 고급 SELECT문  (0) 2011.07.17
4. 좋은 테이블 설계, 정규화.  (0) 2011.07.16
3. DELETE와 UPDATE  (0) 2011.07.16
2장 Select 문  (0) 2011.07.15


Posted by skyjumps
공부/데이터베이스2011. 7. 16. 14:08


데이터를 어떻게 사용할 것인가에 따라 테이블을 만든다.

SQL은 관계형 데이터베이스 관리시스템(RDBMS)를 위한 언어.
관계형은 여러 테이블의 열들의 관계.
테이블을 잘 설계하려면 정보를 나타낼 때 여러 테이블 사이의 열들이 서로 어떠한 관계에 있는지를 고려해야 한다. 
 
테이블 생성 과정.

1. 테이블로 표현하려는 것을 찾는다.
2. 테이블을 사용할 때, 표현하려는 것에 대한 정보들의 리스트를 만든다.
3. 리스트를 이용해서 그 정보들을 조각들로 쪼개고, 조각들은 테이블을 잘 만드는데 이용된다.

 쪼개는 방식

원자적으로 쪼갠다.
효율적인 테이블을 만드는데 필요한 한도 내에서 가능하면 작은 조각으로 나눠야 한다.
쿼리가 짧아지고 정확해진다.

원자적 데이터에 대한 규칙
1. 원자적 데이터로 구성된 열은 그 열에 같은 타입의 데이터를 여러 개 가질 수 없다.
2. 원자적 데이터로 구성된 테이블은 같은 타입의 데이터를 여러 열에 가질 수 없다.

정규화 첫단계

데이터를 원자적으로 만들기.
정규테이블은 중복데이터가 없어 데이터베이스 크기를 줄여주고, 찾아야 할 데이터가 적어 쿼리가 더 빨라진다.

정규화 두번째 단계

각 행은 기본키(primary key)를 가지고 있어야 한다.
각 레코드를 다른 레코드와 구분할 수 있는 열. 예 id
기본키는 NULL이 될 수 없다.
값이 반드시 있어야 한다.
간결해야 한다.
기본키 값은 변경할 수 없다.

SHOW 명령어

SHOW CREATE TABLE my_contacts;
테이블 생성 코드
SHOW COLUMNS FROM tablename;
테이블의 모든열 표시. 데이터 타입과 열의 세부사항
SHOW CREATE DATABASE databasename;
데이터베이스 생성 코드
SHOW INDEX FROM tablename;
인덱스 정보

경고 메시지 확인
SHOW WARNINGS;

기본키가 있는 테이블 생성하기
 
CREATE TABLE `doughnut_list` (
  `doughnut_id` int(11) NOT NULL AUTO_INCREMENT,
  `doughnut_name` varchar(10) NOT NULL,
  `doughnut_type` varchar(10) NOT NULL DEFAULT 'doughnut',
  PRIMARY KEY (`doughnut_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
 
자동 증가 

CREATE TABLE `doughnut_list` (
  `doughnut_id` int(11) NOT NULL AUTO_INCREMENT,
  `doughnut_name` varchar(10) NOT NULL,
  `doughnut_type` varchar(10) NOT NULL DEFAULT 'doughnut',
  PRIMARY KEY (`doughnut_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

'공부 > 데이터베이스' 카테고리의 다른 글

6. 고급 SELECT문  (0) 2011.07.17
5장 ALTER  (0) 2011.07.16
3. DELETE와 UPDATE  (0) 2011.07.16
2장 Select 문  (0) 2011.07.15
1장 데이터와 테이블  (0) 2011.07.14


Posted by skyjumps
공부/데이터베이스2011. 7. 16. 13:24


DELETE

DELETE FROM clown_info

WHERE
activities = 'dancing';

UPDATE

UPDATE doughnut_ratings

SET
type='glazed',
comments='super!'
WHERE type = 'plain glazed';

UPDATE문은 테이블의 여러 레코드에 사용될 수 있다.
숫자 조작에는 기본적인 수학연산과 함께 사용하기.

UPDATE drink_info
SET cost = cost + 1
WHERE
drink_name = 'Blue Moon'
OR
drink_name = 'Oh my Gosh'
OR
drink_name = 'Lime Fizz'; 

'공부 > 데이터베이스' 카테고리의 다른 글

5장 ALTER  (0) 2011.07.16
4. 좋은 테이블 설계, 정규화.  (0) 2011.07.16
2장 Select 문  (0) 2011.07.15
1장 데이터와 테이블  (0) 2011.07.14
Eclipse와 Derby 연결  (0) 2011.07.13


Posted by skyjumps
공부/데이터베이스2011. 7. 15. 13:12


Select * from my_contacts;

조건 붙이기

Select * from my_contacts
where first_name = 'Anne';

*의 의미

모든 열을 보여 달라.

VARCHAR, CHAR, BLOB, DATE, TIME 등 문자열 타입은 작은 따옴표를 사용하고
DEC, INT등 숫자 타입은 작은 따옴표를 사용하지 않는다.
숫자는 빈칸으로 구분되지만 문자열 타입은 중간에 빈칸도 있기 때문에 작은 따옴표같은 구분해주는 뭔가가 있어야 하기 때문.

 문자열에 작은따옴표 사용하려면 \' 또는 '' (작은따옴표 두번)

원하는 열만 SELECT 하기

SELECT drink_name, main, second
from easy_drinks
where main = 'soda';

AND

Select location
From doughnut_ratings
Where type = 'plain glazed'
And
rating = 10; 

And로 쿼리들을 결합.

비교연산자

=, <>(같지않다), < , > , <=, >=

Select drink_name from drink_info
where
cost >= 3.5;
And
calories < 50;

OR

Select drink_name
From easy_drinks
Where
main = 'orange juice'
or
main = 'apple juice'; 

NULL 찾기

Select drink_name
From drink_info
Where
calories IS_NULL; 

LIKE

Select * from my_contacts
Where location LIKE '%CA';

location 열이 CA로 끝나는 모든 값 찾기. 문자열의 일부분

_
하나의 불특정 문자.
Select first_name from my_contacts
where first_name like '_im';

Kim, Jim 등등이 나올 수 있다.

Between 키워드

Select drink_name From drink_info
where calories between 30 and 60 
부등호와 AND를 이용해서 바꿀 수 있다.

IN 키워드

Select date_name
from black_book
where
rating IN ('innovative', 'fabulous', 'delightful', 'pretty good');

열의 값이 괄호안의 하나와 일치하면 그 행이 반환된다.
같은 열에 대해 or로 표현 된 것을 줄일 수 있다.

NOT IN

Select date_name
from black_book
where
rating Not IN ('innovative', 'fabulous', 'delightful', 'pretty good');

괄호 안에 있는 값이 없는 행들을 반환한다.

NOT

Between이나 Like와 함께 사용할 수 있다.
보통 WHERE 바로 다음에 NOT이 나온다.
AND와 OR과 같이 사용하면 And, or 뒤에 not을 붙인다.

NULL하고는 어떻게 동작?
WHERE NOT main IS NULL;또는
WHERE main IS NOT NULL; 
 

'공부 > 데이터베이스' 카테고리의 다른 글

5장 ALTER  (0) 2011.07.16
4. 좋은 테이블 설계, 정규화.  (0) 2011.07.16
3. DELETE와 UPDATE  (0) 2011.07.16
1장 데이터와 테이블  (0) 2011.07.14
Eclipse와 Derby 연결  (0) 2011.07.13


Posted by skyjumps
공부/데이터베이스2011. 7. 14. 11:39


데이터베이스는 테이블과 테이블에 관련된 SQL 구성요소들을 담고 있는 저장소

테이블의 열과 행으로 구성되어 있다.
열은 한 객체에 대한 속성들, 행은 한 객체에 대한 모든 카테고리 정보

MYSQL 기준

Database 생성
CREATE DATABASE gregs_list;

database 사용한다고 알리기
USE gregs_list;

테이블 만들기
CREATE TABLE doughnut_list
(
    doughnut_name VARCHAR(10),
    doughnut_type VARCHAR(10)
);

데이터 타입
CHAR(5) -  5개의 문자가 들어갈 수 있는 공간할당. 1개 문자라도 5개문자 공간 할당. 길이가 고정되어 있을 때 사용.
VARCHAR(10) - 10개의 문자가 들어갈 수 있다. 문자의 갯수에 따라 가변적인 공간 할당. 공간 효율적 사용. 
DEC(6,2) - 6개 자연수자리, 2개 소수자리
INT - 정수
BLOB - 데이터가 클 때
DATE - 날짜. 시간은 없음.
DATETIME - 시간과 날짜.
TIMESTAMP - 보통 현재의 날짜를 나타낼때 사용.

테이블의 구조 보기
DESC doughnut_list

테이블 삭제
DROP doughnut_list

테이블에 데이터 추가하기
INSERT INTO doughnut_list
(doughnut_name, doughnut_type)
VALUES
('Dutchie', 'doughnut');

Insert문 변형
열순서변경 가능
열 이름을 생략 가능
몇 개의 열을 생략 가능, 빠진 열 값은 NULL이 들어간다.

NULL
0이 아님.
비어있는 문자열도 아님.
정의되어 있지 않은 것임.
자기 자신과도 같지 않다. 즉, NULL과 NULL은 같지 않음.

NULL 제어
CREAT TABLE doughnut_list
(
    doughnut_name VARCHAR(10) NOT NULL,
    doughnut_type VARCHAR(10) NOT NULL
);

Not null인데 입력 안하면 에러발생

빈 칸을 Default값으로 채우기

CREATE TABLE doughnut_list
(
    doughnut_name VARCHAR(10) NOT NULL,
    doughnut_type VARCHAR(10) NOT NULL DEFAULT 'doughnut'
);

'공부 > 데이터베이스' 카테고리의 다른 글

5장 ALTER  (0) 2011.07.16
4. 좋은 테이블 설계, 정규화.  (0) 2011.07.16
3. DELETE와 UPDATE  (0) 2011.07.16
2장 Select 문  (0) 2011.07.15
Eclipse와 Derby 연결  (0) 2011.07.13


Posted by skyjumps
공부/데이터베이스2011. 7. 13. 22:47


참고사이트
http://www.eclipse.org/articles/article.php?file=Article-EclipseDbWebapps%2Findex.html

http://db.apache.org/derby/derby_downloads.html
여기서 Derby Plugin for Eclipse (derby_core_plugin_10.2.2.zip and derby_ui_plugin_1.1.0.zip) 다운 받기.

ECLIPSE_ROOT/plugins에다가 압축 푼거 넣기. org. 이런식으로 시작함.
 
 
이클립스 실행시키고 참고 사이트에서 그림따라 하기.

'공부 > 데이터베이스' 카테고리의 다른 글

5장 ALTER  (0) 2011.07.16
4. 좋은 테이블 설계, 정규화.  (0) 2011.07.16
3. DELETE와 UPDATE  (0) 2011.07.16
2장 Select 문  (0) 2011.07.15
1장 데이터와 테이블  (0) 2011.07.14


Posted by skyjumps
공부/운영체제2011. 7. 13. 22:35


I/O hardware

Port : 연결지점. 대개 register.
Bus: 선들과 커뮤니케이션 프로토콜. Data bus, Address bus
Controller : port, bus, 장치 제어

Daisy chain
장치들이 서로 직렬로 연결되어 있는 구조.

I/O Registers

I/O port는 보통 4개의 레지스터로 구성되어 있다. 
1) status register : 현재 명령이 처리되었는지, data-in register에서 읽을 수 있는지, 장치에 문제가 있는지 등이 저장된다.
2) control register : host에 의해 씌여진 명령어가 들어있다.
3) data-in register : host가 읽는 register
4) data-out register : host가 쓰는 register

I/O와 Memory 컨트롤

1) memory-mapped I/O

memory랑 I/O가 Data bus, Address bus, control bus를 공유한다.
그래서 같은 명령어로 접근할 수 있다.
2) Isolated I/O
Data bus와 Address bus를 공유하지만 Control bus는 공유하지 않는다.
그래서 서로 다른 명령어를 사용한다.
3) Data Channel
Data bus, Address bus, Control bus를 다 따로 쓴다.
I/O 전용 프로세서가 있다.

Isolated I/O는 두개의 주소공간을 사용한다.(메모리 주소공간, I/O주소공간)
I/O-mapped I/O라고도 한다.

memory mapped i/o는 주소공간에서 주소공간에서 특정위치를 가지고 있다.
I/O를 읽고 쓰는 건지 메모리를 읽고 쓰는건지 control이 가능해야 한다.

PC는 i/o mapped i/o랑 memory-mapped i/o를 모두 사용한다.
그래픽 컨트롤러는 기본 제어 명령을 위한 i/o ports가 있고 화면 정보를 위한 memory-mapped 영역을 가지고 있다.
memory-mapped는 pointer가 잘못된 주소를 가졌을 때 문제가 발생하기 쉽다. protected memory로 보호해야 한다.

두가지 종류의 I/O

1) Polling (programmed I/O)

CPU가 I/O를 직접 제어한다.
CPU는 I/O모듈이 명령을 완료하길 기다린다.
busy waiting(polling)
루프돌면서 state 레지스터의 busy bit가 clear될 때까지 기다리는 것.
과정
host가 write bit을 set하고 data-out register에 byte 쓰고 command-ready bit을 set한다. controller는 command-ready bit을 보고 busy bit을 셋하고 command register를 읽고 write명령을 알게된다. data-out 레지스터에서 byte를 읽고 장치에 입출력처리를 한다. controller는 status register의 command-ready bit을 clear하고, error bit도 clear해서 I/O가 완료되었음을 알린다. 그리고 busy bit을 clear한다.

2) Interrupts(Interrupt-Driven I/O)

cpu가 read command를 알린다.
I/O 모듈은 데이터를 얻는다. 그동안 CPU는 다른 일을 하고 있고
I/O는 CPU에게 인터럽트를 날린다.
CPU는 데이터를 요청한다.
I/O 모듈은 데이터를 전송한다.

Direct Memory Access(DMA)

interrupt driven과 programmed i/o는 활발한 cpu 사용을 요구한다. cpu가 이러한 일 하기에는 아깝고 해서
DMA가 일을 대신해준다.
I/O 장치와 메모리 사이에서 CPU를 거치지 않고 데이터를 전송해준다.

State Transition
응용프로그램 I/O 요청 -> OS는 그 프로그램을 block 상태에 놓는다. -> DMA에게 맡기고 CPU는 다른 프로그램을 실행한다. DMA가 그 일을 완료했으면 CPU에게 인터럽트를 보내고 OS는 다시 그 중지된 프로그램을 runnable한 상태로 바꾼다.

DMA가 메모리 버스를 쓰고 있더라도 CPU는 캐시를 통해 데이터를 읽을 수 있다.

Application I/O Interface
운영체제가 여러 i/O 장치들을 표준화된 동일한 방식으로 다루게 하는 기술들과 인터페이스들을 살펴보자.

I/O system calls은 장치에 사용될 수 있는 기능들을 캡슐화한 것임.
Device-driver는 i/O controller간의 차이를 못느끼게 해준다.

Device는 다음과 같은 차원에서 생각할 수 있다.
1) Character-stream과 block(byte단위로 전송하냐 block 단위로 전송하냐)
2) Sequential or random-access
3) Synchronous or asynchronous(장치의 데이터 전송시간이 예측가능하냐 아니냐)
4) Sharable or dedicated (여러 프로세스나 쓰레드에 의해 동시에 사용될 수 있나 없나)
5) Speed of operation (일초에 몇 바이트냐, 몇 기가바이트냐)
6) Read-write, read only, or write only

Network devices

Block, character device가 아니다. 예외.
socket 인터페이스 사용.

Clocks and Timers

시간 장치.
현재시간, 경과시간, x명령이 y시간에 발생하도록 하는 타이머 지정 함수 제공
programmable interval timer
특정 시간동안 기다렸다가 인터럽트를 발생시키는 것.
한번, 또는 주기적으로 발생하도록 할 수 있다.
disk I/O subsystem에서는 이것을 dirty bit cache buffers를 disk로 옮길 때 주기적으로 사용한다.
network subsystem이 너무 느리게 진행되는 명령을 취소하는데 사용된다.

Kernel I/O subsystem
I/O를 위해 커널에서 제공하는 서비스들

Scheduling

한 장치에 여러 request가 들어올 때 O/S에서 스케줄링. 보통 FIFO를 하나, 시스템 효율을 위해 바꿀 수도 있다.

Buffering
3가지 목적

device speed dismatch
모뎀에서 데이터를 하드디스크로 보낼 때, 둘이 속도차이가 크기 때문에 모뎀에서 버퍼에 쓰고 일정양이 모이면 하드가 읽어간다. 하드가 읽어가는 게 금방 끝나는게 아니라서 double buffering을 쓴다. buffer가 두개라 모뎀이 한 buffer를 채우면 하드가 그걸 읽고 하드가 읽는 동안 모뎀은 두번째 버퍼를 채운다.

transfer size mismatch
전송 단위가 다를때 버퍼에서 쪼개거나, 합쳐서 단위를 맞춰준다.
컴퓨터 네트워킹에서 긴메시지가 패킷으로 쪼개지고, 쪼개진게 다시 합쳐지는 과정이 버퍼에서 일어난다.

copy semantics
disk에 저장되는 데이터가 어플리케이션에서 시스템콜이 호출될 때의 데이터와 같도록 보장해주는것.
어플리케이션의 버퍼가 write 시스템콜이 호출된 뒤 바뀌더라도 디스크에는 바뀌기 전 버퍼의 데이터가 저장되도록 보장해준다. 어플리케이션의 버퍼를 커널 버퍼로 복사해줌으로써 가능해진다.

caching
데이터의 복사본을 빠른 메모리에 유지하고 있기
성능향상

Spooling
프린터같은 장치를 위해 output을 유지시켜주는 버퍼이다. 프린터는 한번에 한작업밖에 할 수 없기 때문에 운영체제가 여러 프로그램에서 요청한 output을 file로 만들어 큐에다가 저장하고 있다가 printer에게 한번에 하나씩 복사한다. 유저나 관리자가 큐를 볼 수있고, 작업을 제거하거나, 중지시킬 수 있다.

Error Handling
운영체제는 장치의 일시적인 문제로 작동이 안될 때 처리할 수 있는 방법을 제공한다.

 

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

Mass-storage structure  (0) 2011.07.13
File System Implementation  (0) 2011.07.13
File System  (0) 2011.07.13
Virtual Memory  (0) 2011.07.13
8장 Memory-management strategies  (0) 2011.07.10


Posted by skyjumps