위키백과



kernel

① 낟알 ② 핵심 ③  

1.

(과실(仁); ( 꼬투리·겉껍질 속의 종자[열매]; ( 낟알.

2.

중심부중핵핵심요점, 요지


컴퓨터 과학에서 커널(kernel)은 운영 체제의 핵심 부분으로서, 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다. 핵심(核心)[1]이라고도 한다.


커널의 역할

커널은 운영 체제의 핵심 부분이므로, 커널의 역할 역시 운영 체제의 핵심 역할이라 할 수 있다.


보안

커널은 컴퓨터 하드웨어와 프로세스의 보안을 책임진다.

자원 관리

한정된 시스템 자원을 효율적으로 관리하여 프로그램의 실행을 원활하게 한다. 특히 프로세스에 처리기를 할당하는 것을 스케줄링이라 한다.

추상화

같은 종류의 부품에 대해 다양한 하드웨어를 설계할 수 있기 때문에 하드웨어에 직접 접근하는 것은 문제를 매우 복잡하게 만들 수 있다. 일반적으로 커널은 운영 체제의 복잡한 내부를 감추고 깔끔하고 일관성 있는 인터페이스를 하드웨어에 제공하기 위해 몇 가지 하드웨어 추상화(같은 종류의 장비에 대한 공통 명령어의 집합)들로 구현된다. 이 하드웨어 추상화는 프로그래머가 여러 장비에서 작동하는 프로그램을 개발하는 것을 돕는다. 하드웨어 추상화 계층(HAL)은 제조사의 장비 규격에 대한 특정한 명령어를 제공하는 소프트웨어 드라이버에 의지한다.


초기의 커널

초창기의 컴퓨터에서 운영 체제 커널은 필수적인 것이 아니었다. 초기의 프로그램은 하드웨어 추상화나 운영 체제의 지원을 받지 않고도 컴퓨터만으로 불러들인 다음 실행될 수 있었으며, 이것은 초창기 컴퓨터들의 일반적인 운영 방식이었다. 다른 프로그램을 실행하기 위해서는 컴퓨터의 전원을 껐다가 켬으로써 다시 입력자료를 읽어들여야 하는 방식이었다. 이러한 과정이 반복되면서 사람들은 로더와 디버거 같은 작은 프로그램들이 상주해 있는 것이, 다른 프로그램으로 교체하거나 새로운 프로그램을 개발하는 데 유리하다는 사실을 알게 되었다. 이와 같은 로더, 디버거들이 초기 운영 체제 커널의 기초가 되었다.


종류

단일형 커널(monolithic kernel) - 커널의 다양한 서비스 및 높은 수준의 하드웨어 추상화를 하나의 덩어리(주소 공간)로 묶은 것이다. 운영 체제 개발자 입장에서 유지 보수가 일반적으로 더 어려우나 성능이 좋다.

마이크로커널(microkernel) - 하드웨어 추상화에 대한 간결한 작은 집합을 제공하고 더 많은 기능은 서버라고 불리는 응용 소프트웨어를 통해 제공한다.

혼합형 커널(hybrid kernel) - 성능 향상을 위해 추가적인 코드를 커널 공간에 넣은 점을 제외하면 많은 부분은 순수 마이크로커널과 비슷하다. 수정 마이크로커널이라고도 한다.

나노커널(nanokernel) - 실질적으로 모든 서비스를 책임진다.

엑소커널(exokernel) - 낮은 수준의 하드웨어 접근을 위한 최소한의 추상화를 제공한다. 전형적으로 엑소커널 시스템에서는 커널이 아닌 라이브러리가 단일형 커널 수준의 추상을 제공한다.




http://www.terms.co.kr/kernel.htm



커널은 컴퓨터 운영체계의 가장 중요한 핵심으로서, 운영체계의 다른 모든 부분에 여러 가지 기본적인 서비스를 제공한다. 비슷한말로는 '뉴클리어스'라는 용어가 있다. 커널은 쉘과 대비될 수 있는데, 쉘은 운영체계의 가장 바깥부분에 위치하고 있으면서, 사용자 명령에 대한 처리를 담당한다. 커널과 쉘이라는 용어는 IBM 메인프레임을 제외하고, 유닉스와 기타 몇몇 운영체계에서 자주 사용된다.


일반적으로, 커널에는 종료된 입출력 연산 등, 커널의 서비스를 경쟁적으로 요구하는 모든 요청들을 처리하는 인터럽트 처리기와, 어떤 프로그램들이 어떤 순서로 커널의 처리시간을 공유할 것인지를 결정하는 스케줄러, 그리고 스케줄이 끝나면 실제로 각 프로세스들에게 컴퓨터의 사용권을 부여하는 수퍼바이저 등이 포함되어 있다. 커널은 또한, 메모리나 저장장치 내에서 운영체계의 주소공간을 관리하고, 이들을 모든 주변장치들과 커널의 서비스들을 사용하는 다른 사용자들에게 고루 나누어주는 메모리 관리자를 가지고 있다. 커널의 서비스는 운영체계의 다른 부분이나, 흔히 시스템 호출이라고 알려진 일련의 프로그램 인터페이스들을 통해 요청된다.


커널을 유지하기 위한 코드는 지속적으로 사용되기 때문에, 보통 커널은 자주 사용되지 않는 운영체계의 나머지 부분에 의해 덮어씌워져 훼손되지 않도록, 보호된 메모리 영역에 적재된다.


커널을 바이오스와 혼동하면 안된다.



https://namu.wiki/w/%EC%BB%A4%EB%84%90


OS의 심장이자, OS를 규정짓는 매우 중요한 부분. 하드웨어의 자원을 자원이 필요한 프로세스에 나눠주고, 덩달아 프로세스 제어(태스크 매니저), 메모리 제어, 프로그램이 운영체제에 요구하는 시스템 콜 등을 수행하는 부분으로 운영체제 맨 하부에서 돌아간다. 쉽게 말해, OS를 하나의 기업체로 비유한다면 커널은 인사담당 부서인 셈이다. 현재 많이 사용되고 있는 OS는 커널 위에 여러 가지 레이어를 올린 것. 이렇기 때문에 커널이 날아가게 되면 운영체제를 못 쓰게 된다. 이 커널도 한번씩 오작동 하여 정지할 때가 있는데, 이를 가리켜 커널 패닉이라고 부른다. 물론, 현재는 억지로 볼 수는 있지만, 일반적인 상황에선 꽤나 보기 힘들다.


어쨌든 커널로 운영체제의 정체성을 결정하기에 매우 중요하다고 볼 수 있다. 페도라, 우분투등이 다 리눅스로 묶이는 것도 이들이 리눅스 커널을 사용하고 있기 때문.


아직 와 닿지 않는다면, NT 커널 기반에서 KERNEL32.dll, Hal.dll, ntdll.dll, ADVAPI32.dll, KERNELBASE.dll(윈7) 등을 날려보면 된다. 이제 부팅이 되지 않는다. 정말로 망했어요 그리고 재부팅하고 비명을 지르면 된다. 자신이 리눅스를 쓴다면 실행 중인 init 프로세스를 날려보자 근데 요즘은 init 에다가 kill 날려도 안 죽는다 

1.2. 커널의 종류






---


원본 출처 

http://blog.naver.com/quwoo/120029090135


리눅스 커널이란? 
majoR/Sp/Os | 2006/05/25 14:46

리눅스를 만지면서 커널 커널 하지만 의외로 커널이 뭐야? 라고 물으면 모르는 사람들이 많다. 간단히 정리해보자

커널은 시스템에 존재하는 자원을 효율적으로 관리하는 자원 관리자로, 그 기능을 간단히 살펴보면

프로세서 관리 - 처리 속도를 향상시키기 위해 여러 프로세서를 병렬로 연결하여 사용한다. 시스템에서 동작하는 프로세스도 커널에서는 관리해야할 자원이고, 운영체제의 처리 요구에 맞춰 동작할 수 있도록 각 프로세스에 필요한 프로세서를 효율적으로 할당하고 수행하도록 관리한다.

프로세스 관리 - 운영체제에서는 최소한 하나 이상의 프로세스가 동작한다. 프로세스는 다른말로 태스크라고도 하며, 주어진 일을 수행하는 기본 단위다. 커널은 스케줄러를 이용하여 여러 프로세스가 동작할 수 있도록 각 프로세스를 생성하고 제거하며, 외부환경과 프로세스를 연결하고 관리한다.

메모리 관리 - 각각의 프로세스가 독립적인 공간에서 수행할 수 있도록 가상 주소 공간을 제공한다. 가상메모리를 바탕으로 물리적인 한계를 극복할수 있는 기능을 제공한다. 

이외에도 파일 시스템 관리, 디바이스 제어, 네트워크 관리 정도가 있다.



리눅스 커널은 운영체제에서 가장 중요한 부분이다. 프로세서와 시스템 메모리에 상주하면서 디바이스나 메모리 같은 하드웨어 자원을 관리하고, 프로세스의 스케줄을 관리하여 다중 프로세스를 구현하고, 시스템에 연결된 입출력을 처리하는 운영체제의 핵심 역할을 수행한다.

그렇다면 리눅스 커널의 특징은 무엇일까

모놀리식 커널 - 리눅스 커널은 대부분 유닉스 커널과 같은 모놀리식(monolithic)이다. 모놀리식이기 때문에 논리적으로 구분되는 여러 구성요소들이 상호간에 연결되어 동작한다. 

비선점형(커널 2.4)과 선점형(커널2.6) - 비선점형 커널은 프로세스의 동작 상태가 사용자 모드에서 커널 모드로 진입하면 외부에서 해당 프로세스를 중지시키지 못한다. 반대로 프로세스가 커널 모드로 동작하더라도 스케줄링 정책이나 다른 외부적인 접근을 통해 프로세스를 강제로 중지시킬 수 있는 경우를 선점형이라고 한다. 2.6커널은 선점형과 비선점형을 선택할 수 있다.

가상 메모리 시스템(VM) - 리눅스 커널은 다양한 플랫폼에서 동작하는 운영체제이므로 i386에서 동작되던 메모리 관리 시스템을 표준화 하여 다양한 MMU 디바이스에 적용할 수 있도록 구성되어있다. 

No MMU 지원 - 리눅스 커널은 주로 MMU를 이용한 메모리 관리를 수행하지만 임베디드 시스템에서 사용하는 프로세서의 경우는 MMU디바이스가 없는 경우도 있다. 커널 2.6에서는 MMU가 없는 시스템도 지원한다. 

가상 파일 시스템(VFS) - 리눅스에서는 ext2를 비롯 다양한 파일 시스템을 사용할수 있고, 윈도우에서 동작하는 NTFS파일 시스템과 FAT32도 처리할 수 있다. 

모듈을 이용한 커널 확장 - 운영 체제가 동작하는 중에도 커널 코드를 추가하거나 삭제할수 있다.

커널 스레드 - 커널 2.4이전에는 매우 제한된 커널 스레드를 지원했지만, 2.6에서부터는 NPTL(Native POSIX Threading Libray)과 NGPT(Next Generation POSIX Threading Package)를 지원한다. 

멀티스레드 지원, 멀티 프로세서 지원, GPL 라이센스 

[출처] 리눅스 커널이란?|작성자 quwoo





http://software-engineer.gatsbylee.com/%EB%A6%AC%EB%88%85%EC%8A%A4-linux-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EA%B8%B0%EC%B4%88%EA%B3%B5%EB%B6%80/

커널 ( Kernel ) 이란 무엇인가?

쉽게 말하면, 소프트웨어와 하드웨어간의 커뮤니케이션을 관리하는 프로그램이다.

구체적으로 말하면, 커널이란 운영체제 ( Operating System )에서 가장 중요한 구성요소로서 입출력을 관리하고 소프트웨어로부터의 요청 ( System Call ) 을 컴퓨터에 있는 하드웨어 ( CPU, 메모리, 저장장치, 모니터 등등 )가 처리 할 수 있도록 요청(  System Call )을 변환하는 역할을 한다.

( User는 Shell을 이용하여 Kernel을 통해 하드웨어를 사용 할 수 있다. )

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=69&MAEULNO=28&No=11050


커널은 실제적으로 CPU를 제어는 S/W 로 생각 하시면 되겠네요.
그다음 OS 서비스(스케줄링,IPC,동기화)및 드라이버가 올라가죠 실제적으로 OS 포팅할떄에 
IPC 및 메모리 ,동기화관련 서비스는 뺴고 포팅이 되는
Embeded OS 도 있습니다.
자세한건 책한건 사시던가 OS 포팅 한번 해보시면 감이 오실듯 합니다.

추천 하는 OS 는 uCOS2 입니다 시중에 책(Micro C/OS-II)도 있죠.




저는 임베디드쪽을 공부했고 지금은 단말기 디바이스 개발일을 하고 있습니다 

질문하신 내용으로 봐서는 커널의 기능 및 역활을 잘 이해를 못하시는 부분이 있으신거 같네요..

운영체제만 전공으로 해서 공부해도 스케줄링 기법등.. 많은부분이 있지만..

윈도우 아키텍처에서 OS 부팅 모드가 크게 3가지 레벨이이 있는거로 알고 있습니다..

Ring 0 모드 ( 일반적으로 커널모드라고 함 ) Ring 3 모드 (일반적으로 유저모드라고 함)

(Ring 모드 개념은 리눅스에도 비슷해요 부팅 옵션에서 3이면 유저, 0이면 커널 모드

참고로 제가 많이 사용했던 ubuntu linux 의경우 0-5 Level 이 있었고요 3,4,5 레벨이 유저 레벨,

각 레벨의 차이는 콘솔 모드로 부팅할것인지 GUI로 할것인지 차이 정도 였던거 같네요..;)

그외 레벨들도 존재 했던 거 같은데 이론을 놓은지가 좀돼서 가물가물 하네요..

여튼 중요한건 윈도우라는 OS를 예로 설명 한다고 할때..

OS 에서도 엄연하게 유저 영역과 커널 영역으로 구분이 되어 있습니다..

이건 윈도우를 설계한 개발자들이 만든 아키텍처가 그렇기 때문이죠..

위사항을 확인 하기 위해서 Ring 레벨 대해서 검색해보시면 보다 자세한 설명을 보실수 있고요..

실제 윈도우에서 파일로 존재하는 라이브러리를 확인 해보시려면 (xp 기준)

C:\WINDOWS\system32\kernal32.dll

C:\WINDOWS\system32\user32.dll

위 두가지 dll 파일이 존재 합니다 파일명에서 보시면 아시겠지만 ..

위에서 말씀드린 커널 모드 부분은 kernal32.dll 파일에 구현되어 있고, 유저 모드는 user32.dll 파일에서

구현 되어 있습니다..

커널 모드와 유저 모드는 윗분들 께서 간략하게 설명 해놓으셨는데요..

가장 간단하게 설명 해드리면 커널 모드는 유저모드를 포함한 윈도우 OS 의 모든 부분을 제어할수가 있습니다

반면 유저모드의 경우 일정부분만 제어가 가능하며 커널모드로 작업이 필요 한부분은 커널모드에 작업을 

요청하는 방식으로 이루어지며 유저모드에서 직접적으로 커널모드의 크리티컬한 작업을 할수없습니다 (권한이 없음)

위 처럼 커널모드가 OS의 실질적인 모든 작업을 관리 하기 때문에 보안쪽 회사에서는 커널모드 쪽 작업을 베이스로

하게 되어집니다..

그리고 위에서 말씀 드린 dll 을 이용하여 Win32 API 를 통하여 사용 되고 있습니다 

Window 쪽으로 일하시려면 API 는 기본이죠 .. 특히 보안쪽 가시려면 Native API 까지 알아야..

하는거로 알고 있습니다 실제 Native API 들이 해킹, 보안 의 주축이 되는 함수들이 많이 들어 있기 때문에..

모든 보안제품들, 공격 루틴들이 Native API 들을 통해서 많은 해킹기법으로 이용되는거로 알고 있어요..


커널의 역활설명을 간략히 드렸는데요..



책보다 사이트가 좀더 공부하시는데 도움 되실꺼 같네요

http://kldp.org/ 

리눅스에 관심이 있으시면 잘 아실테지만 .. 우리나라 리눅스 포럼중 가장 큰 규모이며 업데이트가 잘되고 있습니다

고수분들도 많으시고요.. ^^ 윈도우쪽은 저도 그닥 잘모르겠네요..

(참고로.. 전 임베디드쪽을 공부하면서 윈도우도 시스템 공부를 했지만 리눅스쪽을 좀더 많이 공부를 해서요..^^;;)

윈도우쪽은 API 는 윗분들 의견에서 나온 winapi 사이트에서 기본 베이스 공부하시기 좋고요

Native API 는 블로그나 검색으로 찾으셔야 할꺼에요.. 영어 압박이 좀 있을꺼에요..^^;

그리고 많은 OS 종류들이 존재 합니다.. 윈도우, 리눅스, RTOS 등..

이 중 사람들이 리눅스에 관심을 많이 가지며 작업하는거중 하나가 open 소스 기반이기 때문에..

리눅스의 라이센스 GNU 정책 때문에 open 소스 기반으로 개발 되어서 커널이 공개 되고 있습니다.

리눅스 장점중 하나죠.. 윈도우 같은경우 철저히 소스 공개를 하지 않기 때문에 지금 알려진 대부분의

내용들은 많은 해커들이 해킹을 통해서 알아낸것 입니다. 물론 Microsoft MVP 자격을 얻으면 windows 소스를

열람할수 있는 기회가 주어지는 것도 있더군요.. ;; (요즘은 해킹을통해서 윈도우가 많이 공개 된거로 알고 있어요..)

쓸데 없는 얘기가 길어졌는데요.. 커널 내부를 공부하시기에는 윈도우 보다는 리눅스가 접근하기 용이 합니다..

하지만 중요한건 윈도우와 리눅스는 아키텍처가 틀린 부분이 많기 때문에.. 리눅스를 공부했다고 윈도우를 다 아는게

아니죠.. 그점을 유의 하셔야 하고요.. 윈도우 같은경우 처음부터 접급해서 공부하기 어려운 부분이 많습니다..

그래서 전 리눅스 기반에서 공부를 많이 했고요.. 핵심적인 개념들은 비슷한게 많아요..;; 

RTOS 중에서도 보시면 아시겠지만 리눅스 기반으로 개발 된것들이 많이 있습니다..

어느 부분을 공부하시던지 공통적인 부분은 나오길 마련이죠..^^

































윈도우쪽에 보시면 rootkit 이란 사이트가 있고요..

www.rootkit.com // 윈도우 쪽애서 고급 기법들이 많이 공개 되고 있습니다.

최근에 루트킷 이란 책으로 발간된 국내 서적도 있습니다..

http://book.naver.com/bookdb/book_detail.php?bid=4298506 링크 참조

저도 WDK 쪽이나 rootkit 쪽은 관심이 많아서.. ^^

책은 구입해뒀는데 .. 시간상.. 이런 저런 핑계로 못보고 있네요..

평은 좋은거로 알고 있는데요 .. 기초가 없으면 처음 보기는 다소 어려운 내용 이지만..

기본적인 내용이 많아서 보시면 도움 될꺼 같네요..

해킹 기법적인 내용이 많지만.. 커널을 공부하는데 있어서 해킹 기법 만한게 없죠..ㅎ

그럼 수고하세요..ㅎ



커널이라고 하면 보통 운영체제에 많이 쓰이는 개념인데요.

다른말로 뉴클레어스, 코어라고도 합니


OS의 핵심부분을 의미하고요, 가장빈번하게 프로세스를 제어하는 부분이라고 할 수 있습니다.

대부분의 인터럽트가 처리되기 때문에 오퍼레이팅시스템에서 중요한 부분이고요,

때문에 주로 메인 메모리에 상주됩니다. 

제가 전공이 거의 OS라서요.

오에스 책보시면 자세히 알 수 있어요.

뭐 책들은 많습니다. 일단 기본적인 운영체제론 만 보셔도 확실할듯..
















커널(Kernel)

커널은 운영체제의 핵심을 이루는 요소로서 컴퓨터내의 자원을 사용자 프로그램(User Application)이 사용할 수 있도록 관리하는 프로그램이다.

커널은 프로세스, 파일 시스템, 메모리, 네트워크의 관리를 맡는다. 사용자 프로그램은 이러한 기능들을 정해진 규칙에 따라서 커널에 요구하게 되며, 커널은 이러한 요구들을

만족시켜 주도록 구성되어 있다. 사용자 프로그램은 시스템 라이브러리(System Library)의 도움을 받거나 아니면 직접적으로 소프트웨어 인터럽트(Softw are Interrupt)를 이용해서 트랩(Trap)을 걸어 커널에

접근하게 되며, 이러한 모든 접근은 시스템 콜 인터페이스(System Call Interface)를 통하여 이루어진다.



커널은 대부분이 C 코드(Code)로 작성되어 있으며, 프로세스의 구조에 의존적인(Processor Architecture Dependent) 부분들과 속도를 요하는 부분만 기계어 코드

(Assembly Code)로 작성되어 있다. 따라서 커널의 구조에 의존적인(Architecture Dependent) 부분을 고침으로 해서 새로운 프로세스로의 포팅(Porting)이 가능해진다.

[참고] Add-on L i nu x Ke rne l P rogrammi ng[2001. 11 이귀영 著]

이하 내용은 `Running Linux 4rd` 에서 발췌하였습니다. 06. 5. 15 - subz ero


커널은 운영체제의 핵심에 해당한다. 커널은 사용자 프로그램과 하드웨어 장치간의 인터페이스를 제어하고, 다중 작업을 지원하려고 프로세스 스케쥴링을 하며, 기타 시스템의 다양한 측면을 관리하는 소스 코드이다. 커널은 시스템에서 동작하는 어떤 개별 프로세스가 아니라, 항상 메모리에 존재하면서 모든 프로세스가 사용할 수 있는 루틴(routines)들의 집합이라고 할 수 있다. 커널 루틴은 여러 가지 방법으로 호출된다. 커널을 사용하는 직접적인 방법은 시스템 호출(system call)을 사용하는 것으로 커널이 호출

한 프로세스를 위해 특별한 코드를 실행한다. 예를 들어, read 시스템 호출은 파일 기술자(file descriptor)로부터 자료를 읽는다. 프로그래머에게는 C 함수처럼 보이지만 read 의 실제 코드는 커널 안에 있다.


커널 코드는 다른 상황에서도 실행된다. 예를 들어, 하드웨어 장치가 인터럽트(interrupt)를 발생시키면 커널 내부의 인터럽트 처리기를 찾는다. 어떤 프로세스가 어떤 행동을 취하고 결과를 기다려야 할 때는 커널이 개입하여 그 프로세스를 잠들게 하고 다른 프로세스가 활동할 수 있게 스케쥴링한다. 마찬가지로 커널은 한 프로세스에서 다른 프로세스로 이동할 때 클럭 인터럽트를 사용하여 프로세스간의 제어권을 신속하게 옮긴다. 다중 작업은 대개 이런 방식으로 이루어진다.


리눅스 커널은 단일(monolithic) 커널 방식으로, 모든 핵심 함수와 장치 드라이버가 커널의 일부다. 일부 운영체제는 장치 드라이버와 다른 코드가 필요할 때 적재되고 실행되는 마이크로 커널(micro kernel) 아키텍처를 사용하고 있다. 따라서 이 코드는 항상 메모리에 있을 필요가 없다. 두 방식에는 각각 장 · 단점이 있다. 


대부분의 유닉스 구현에서는 일반적으로 단일 커널 아키텍쳐가 사용되며, 이는 시스템 V, BSD 와 같은 전통적인 커널에서 채택한 방식이다. 하지만 리눅스는(사용자의 명령에 따라 메모리에 적재하거나 빼

낼 수 있는) 적재 가능한 장치 드라이버도 지원하고 있다.


인텔 플랫폼에서 동작하는 리눅스 커널은 인텔 x86 프로세서(80386 부터 현재의 펜티엄 4 가지)의 특별한 보호모드 특성을 사용하도록 개발되었다. 특히 리눅스는 보호모드, 기술자 기반의 메모리 관리 정책과 기타 수많은 인텔 프로세서의 향상된 기능을 활용한다. x86 보호 모드 프로그래밍에 익숙한 사람은 이 프로세서가 유닉스 같은 다중 작업 시스템용(사실은 멀틱스의 영향을 받은 것이다)으로 설계된 것을 알고 있을 것이다. 리눅스는 이 기능을 십분 활용한다.


대부분의 현대적인 운영체제와 마찬가지로 리눅스는 다중 프로세서(M ulti Processing) 운영체제다. 메인보드에 하나 이상의 CPU 가 있는 시스템을 지원한다. 이 기능을 통해 동시에(또는 `병렬로`) 다른 프로그램을 서로 다른 CPU 에서 실행할 수 있다. 리눅스는 또한 하나의 프로그램 안에서 메모리의 데이터를 공유하고 있는 `제어 스레드`를 다중으로 생성하는 프로그래밍 기법인 스레드(thread)도 지원한다. 리눅스는 여러 가지 커널-레벨 그리고 사용자-레벨 스레드 패키지를 지원한다. 리눅스의 널 스레드는 다중 CPU에서 동작하므로, 하드웨어 병렬 처리 능력을 제대로 활용한다고 할 수 있다. 리눅스 커널 스레드 패키지는 POSIC 1003.1c 표준과 호환된다.


리눅스 커널은 필요에 따라 페이징하고, 적재하는 실행 파일을 지원한다. 즉 프로그램 세그먼트 중 실제로 쓰이는 부분만 메모리로 읽어들인다. 그리고 한 프로그램이 동시에 여러번 실행 중일 때에는 프로그램의 복사본 하나만 메모리에 적재한다. 실행 프로그램은 동적으로 링크된 공유 라이브러리를 사용한다. 즉 실행 프로그램들은 디스크에 있는 라이브러리 파일 내의 공용 라이브러리 코드를 공유할 수 있다. 이렇게 하면 실행 파일이 차지하는 디스크 공간을 줄일 수 있다. 또한 라이브러리 코드 복사본 하나가 메모리에 올라가므로, 전체 메모리 사용량을 줄일 수 있다. 물론 공유 라이브러리에 의존하지 않고 `완전한` 실행파일을 가지고 싶은 사람들을 위해 정적 링크 라이브러리도 있다. 리눅스 공유 라이브러리는 실행 중 동적으로 링크되므로, 프로그래머는 실행 파일을 변경하지 않고도 라이브러리 모듈을 자신이 만든 루틴으로 변경할 수 있다.


시스템 메모리를 최대한 활용하기 위해, 리눅스는 디스크 페이징이라는 기능으로 가상 메모리(virtual memory)를 구현한다. 즉 일정량의 스왑 영역(sw ap space) 을 디스크에 할당할 수 있다. 애플리케이션이 머신에 실제 설치되어 있는 물리적인 메모리보다 많은 메모리를 필요로 하는 경우, 리눅스는 사용하지 않는 페이지를 디스크에 스왑시킨다(페이지page란 운영체제가 메모리를 할당하는 단위다. 대부분의 아키텍처에서는 4KB다). 그리고 스왑아웃시킨 페이지에 다시 접근할 때는 디스크에서 페이지를 읽어와 메인 메모리에 다시 넣는다. 이 기능을 통해 큰 애플리케이션을 실행할 수 있고, 동시에 더 많은 사용자를 지원할 수 있다. 물론 스왑으로 물리적인 RAM 을 대신할 수는 없다. 


이는 메모리보다 디스크에서 페이지를 읽는 것이 더 느리기 때문이다. 리눅스 커널은 메모리보다 디스크에 자주 접근하는 것을 피하기 위해, 최근 접근한 일부파일을 메모리에 보관한다. 커널은 디스크 접근 캐시를 위해 시스템에 남은 모든 메모리를 사용하므로, 시스템 부하가 적을 때는 여러 파일에 접근해도 메모리에서 재빨리 처리한다. 만약 사용자 애플리케이션이 더 많은 물리적인 메모리를 요구하면, 디스크 캐시의 크기를 줄인다. 물리 메모리를 쓰지 않고 방치하는 경우는 절대 없다.

또한 디버깅을 쉽게 하기 위해 잘못된 메모리 주소에 접근하는 등의 잘못된 연산을 수행한 프로그램의 코어 덤프(core dump)를 발생시킨다. 프로그래머는 프로그램을 실행시

킨 디렉토리에 저장된 core 라는 코어 덤프를 사용하여 비정상 종료의 원인을 판단한다.

----------

커널의 버전 번호

major.minor.patchlevel

리눅스 커널에는 항상 두 개의 `최신` 커널이 존재한다. 하나는 `안정(stable) 버전`이고 다른 하나는 `개발(development) 버전`이다. 안정 버전은 가장 최신의 실험적인 기능을

해킹하기 보다는 안정적이며 잘 작동하는 시스템을 원하는 대부분의 리눅스 사용자를 위한 것이다. 반면 개발 버전은 인터넷을 통해 개발자들이 새로운 기능을 추가하고, 테스

트하기 때문에 빠르게 변화한다. 안전 버전의 변화는 주로 버그 수정이나 보안 패치인 반면, 개발 버전의 변화는 완전히 다른 커널 하부시스템에서부터 좀더 나은 성능을 위해

장치 드라이버를 개선한 것까지 모든 것이 그 대상이다.

안전 버전이 짝수 마이너(minor) 버전 번호(예를 들어, 2.4)를 가지는 반면, 개발 버전은 홀수 마이너 버전 번호(예를 들어, 2.5)를 갖는다. 따라서 현재 안정 버전이 2.6 이라

면 개발 버전은 2.7 이 된다.

각 커널 버전은 2.4.19 또는 2.5.12 와 같이 셋째 `패치 레벨(patch level)` 버전 번호를 사용한다. 패치 레벨은 각 커널 버전의 갱신 횟수를 나타내며 높은 번호일수록 최신판이다.




Posted by GENESIS8

댓글을 달아 주세요

출처 : 

http://www.terms.co.kr/reentrant.htm


재진입성은 메모리 내의 동일한 사본이 다중 사용자들에 의해 공유될 수 있도록 작성된 컴퓨터 프로그램이나 루틴을 설명하기 위한 형용사이다. 재진입 코드는 통상 다중사용자 시스템 내에서 공유될 목적으로 작성된 운영체계와 응용프로그램에서 필요하다. 프로그래머는 어떠한 명령어도 프로그램 내의 다른 명령어들을 위한 변수 값을 수정하지 않는다는 확신을 가지고 재진입 프로그램을 작성한다. 프로그램이 한 사용자를 위해 진입할 때마다, 그 사용자를 위한 모든 변수 값들을 유지하기 위해 데이터 공간이 확보된다. 프로그램 그 자체의 데이터 공간은 메모리의 또다른 부분에 들어 있다. 다른 사용자에게 순서를 넘기기 위해 그 프로그램이 중단될 때, 그 사용자와 관련된 데이터 공간에 관한 정보는 저장된다. 중단된 사용자의 프로그램이 다시 재개될 때, 데이터 공간에 저장된 정보가 복원되며, 그 프로그램은 프로그램 내의 다른 명령어가 변수값을 변경했을지도 모른다는 우려 없이 재진입할 수 있다.



https://ko.wikipedia.org/wiki/%EC%9E%AC%EC%A7%84%EC%9E%85%EC%84%B1


컴퓨터 프로그램 또는 서브루틴에 재진입성이 있으면, 이 서브루틴은 동시에(병렬) 안전하게 실행 가능하다. 즉 재진입이 가능한 루틴은 동시에 접근해도 언제나 같은 실행 결과를 보장한다. 재진입이 가능하려면 함수는 다음 조건을 만족하여야 한다.


정적 (전역) 변수를 사용하면 안 된다.

정적 (전역) 변수의 주소를 반환하면 안 된다.

호출자가 호출 시 제공한 매개변수만으로 동작해야 한다.

싱글턴 객체의 잠금에 의존하면 안 된다.

다른 비-재진입 함수를 호출하면 안 된다.


여러 '사용자/객체/프로세스'와 멀티프로세싱이 대개 재진입 코드의 제어를 복잡하게 만든다. 또한 입출력 코드는 디스크나 터미널과 같은 공유 자원에 의존하고 있기 때문에 보통은 재진입성이 없다.


재진입성은 함수형 프로그래밍의 핵심 개념이다.



다음 C 코드에서 f g 함수는 재진입이 불가능하다.

int g_var = 1;

int f()
{
  g_var = g_var + 2;
  return g_var;
}

int g()
{
  return f() + 2;
}

위 코드에서 f 함수는 전역 변수 g_var에 의존하고 있다. 만약 두 개의 스레드가 이 함수를 실행하여 g_var에 동시에 접근할 경우, 결과는 실행되는 시점에 따라서 바뀌게 된다. 그러므로 f는 재진입성을 가지지 않는다. g 함수는 비-재진입 함수 f를 호출하기 때문에 역시 재진입이 불가능하다.

이 함수를 다음과 같이 고치면 재진입이 가능하다.

int f(int i)
{
  int priv = i;
  priv = priv + 2;
  return priv;
}

int g(int i)
{
  int priv = i;
  return f(priv) + 2;
}


http://www.jiniya.net/wp/archives/1197/trackback


재진입 함수의 의미
by 신영진(YoungJin Shin), codewiz at gmail.com, @codemaruhttp://www.jiniya.net

‘윈도우 메시지 프로시저는 재진입 가능한 함수다.’

그렇게도 많은 책에서 위와 같은 말들을 하고 있다. 하지만 딱 한 줄뿐 저 말이 무엇을 의미하는지를 자세히 설명하고 있는 책은 드물다. 그래서 그런지 저 말을 쓰면서도 저 말이 무슨 의미인지 모르는 경우도 많고, 자신의 의미대로 해석해버리는 경우도 있다. 그렇게 많이들 오해하는 이 재진입 함수의 의미에 대해 한번 제대로 이해해 보자.

재진입이라는 말은 말 그대로 함수 내부로 다시 진입하는 것을 의미한다. ‘다시’라는 말이 의미하듯이 함수 코드가 처리되는 와중에도 다시 함수 내부로 진입됨을 의미한다. 여기까지 설명하면 대부분의 윈도우 개발자는 다음과 같이 잘못된 생각을 가진다. <리스트 1>과 같은 간단한 메시지 처리 루틴에서 WM_PAINT 메시지가 처리되는 동안 Sleep 상태일 때에도 키보드가 눌리면 다시 MyWindowProcedure가 실행되어 WM_KEYDOWN 이벤트가 처리된다고 생각하는 것이다.

<리스트 1> 간단한 메시지 처리 루틴

  1. LRESULT CALLBACK MyWindowProcedure(HWND Window, UINT MsgId, WPARAM W, LPARAM L)  
  2. {  
  3.     switch(MsgId)  
  4.     {  
  5.     case WM_PAINT: Sleep(1000); break;  
  6.     case WM_KEYDOWN: OutputDebugStringA("WM_KEYDOWN"); break;  
  7.     }  
  8.   
  9.     return DefWindowProc(Window, MsgId, W, L);  
  10. }  

뭔가 이벤트 드리븐 개념에도 부합하는 게 그럴듯해 보인다. 하지만 이는 완전 엉터리 설명이다. 실제로 테스트해 보면 알겠지만 Sleep 상태인 동안에 키를 아무리 눌러본들 디버그 메시지는 출력되지 않는다. 이유는 무엇일까? 답은 메시지를 처리하는 방법에 있다. 많은 윈도우 프로그래밍 책들이 마치 메시지 프로시저를 운영체제가 알아서 호출해 주는 것처럼 설명하지만 실제로 운영체제는 메시지 프로시저를 호출하는 일 따위는 하지 않는다. 해당 일은 <리스트 2>에 나타난 것과 같은 메시지 처리 루틴에 의해 이뤄진다. DispatchMessage 함수 내부에서 해당 윈도우에 맞는 메시지 프로시저를 찾아서 호출되는 일이 진행된다. 따라서 해당 메시지 처리가 완료되어서 다음 GetMessage가 호출되기 전까지 메시지 프로시저는 새로운 것을 처리하고 싶어도 할 수 없는 상태인 것이다.

<리스트 2> 메시지 처리 루틴

  1. wehile(GetMessage(&Msg, NULL, 0, 0))  
  2. {  
  3.     TranslateMessage(&Msg);  
  4.     DispatchMessage(&Msg);  
  5. }  

그렇다면 다시 본론으로 돌아가서 재진입이란 말이 내포하고 있는 실제 의미에 대해 살펴보자. 이 말이 실제로 하고자 했던 이야기는 윈도우 프로시저는 스레드에 안전하며 병렬적으로 호출이 가능하도록 작성되어야 한다는 것을 나타낸다. 다시 설명한 내용도 무슨 말인지 선뜻 이해하기가 쉽지 않다. <리스트 3>과 <리스트 4>를 보면 무슨 의미인지가 분명해진다. <리스트 3>의 코드는 한 스레드에서 윈도우가 실행될 때와 두 스레드에 윈도우가 실행될 때 동작이 달라진다. 윈도우 의존적으로 처리되어야 하는 데이터가 정적 변수로 되어 있어서 다른 윈도우의 동작에까지 영향을 미치기 때문이다. 이를 제대로 처리하기 위해서는 윈도우 의존적인 변수는 윈도우 프로퍼티로 설정해서 참조하도록 변경해야 한다. <리스트 4>의 코드는 윈도우 프로시저가 글로벌 크리티컬 섹션에 묶여 있어서 메시지가 처리되는 과정이 서로 다른 스레드에 있는 윈도우의 동작에까지 영향을 미치게 된다. 다시 말하면 서로 다른 스레드의 윈도우는 상호 동작에 간섭을 받지 않아야 함에도 이 메시지 프로시저는 한 스레드의 메시지 프로시저가 완료되기 전까지는 다른 스레드의 메시지 프로시저가 처리될 수 없게 됨으로써 서로 원활하게 동시 실행이 처리되지 못하는 문제가 있다는 것이다. 이는 윈도우 운영체제가 의도하는 바가 아니기 때문에 이러한 식의 메시지 프로시저를 작성하는 것은 옳지 않다.

<리스트 3> 스레드에 안전하지 않은 메시지 프로시저

  1. LRESULT CALLBACK MyWindowProcedure(HWND Window, UINT MsgId, WPARAM W, LPARAM L)  
  2. {  
  3.     static int Count = 0;  
  4.     switch(MsgId)  
  5.     {  
  6.   case WM_KEYDOWN:  
  7.     ++Count;  
  8.     if(Count % 2)  
  9.       OutputDebugStringA(“WM_KEYDOWN”);  
  10.       break;  
  11.     }  
  12.   
  13.     return DefWindowProc(Window, MsgId, W, L);  
  14. }  

<리스트 4> 병렬적으로 호출이 불가능한 메시지 프로시저

  1. LRESULT CALLBACK MyWindowProcedure(HWND Window, UINT MsgId, WPARAM W, LPARAM L)  
  2. {  
  3.     EnterCriticalSection(&GlobalCs);  
  4.     switch(MsgId)  
  5.     {  
  6.   case WM_KEYDOWN: OutputDebugStringA(“WM_KEYDOWN”); break;  
  7.     }  
  8.     LeaveSection(&GlobalCs);  
  9.   
  10.     return DefWindowProc(Window, MsgId, W, L);  
  11. }  

아직도 무슨 상황에 문제가 생긴다는 건지 잘 이해가 되지 않을 수도 있다. 그렇다면 위와 같은 메시지 핸들러를 가지고 다음과 같은 세 가지 경우를 모두 테스트해 보도록 하자.

1. 한 스레드에서 해당 메시지 핸들러를 사용하는 윈도우를 하나만 생성한 경우
2. 한 스레드에서 해당 메시지 핸들러를 사용하는 윈도우를 여러 개 생성한 경우
3. 여러 스레드에서 해당 메시지 핸들러를 사용하는 윈도우를 생성한 경우

올바로 디자인된, 다시 말하면 재진입 가능하도록 만들어진 메시지 프로시저라면 1, 2, 3의 경우에 모두 동일한 동작을 보장해야 한다. 만약 세 가지 중에 한 가지 경우라도 동작이 다르다면 해당 메시지 핸들러는 잘못 작성된 것으로 범용적으로 사용할 수 없음을 의미한다.

 0  0 



Read more: http://www.jiniya.net/wp/archives/1197#ixzz40KVbEKvT







Posted by GENESIS8

댓글을 달아 주세요

출처 : 위키 백과


중앙 처리 장치


CPU는 여기로 연결됩니다. 다른 뜻에 대해서는 CPU (동음이의) 문서를 참조하십시오.


중앙 처리 장치(中央處理裝置, 문화어: 중앙처리소자) 또는 CPU(영어: central processing unit)는 소프트웨어 명령의 실행이 이루어지는 컴퓨터의 부분, 혹은 그 기능을 내장한 칩을 말한다. 컴퓨터 안의 중앙 처리 장치(CPU)는 외부에서 정보를 입력 받고, 기억하고, 컴퓨터 프로그램의 명령어를 해석하여 연산하고, 외부로 출력하는 역할을 한다. 따라서 중앙 처리 장치(CPU) 는 컴퓨터 부품과 정보를 교환하면서 컴퓨터 시스템 전체를 제어하는 장치로, 모든 컴퓨터의 작동과정이 중앙 처리 장치(CPU)의 제어를 받기 때문에 컴퓨터의 두뇌에 해당한다고 할 수 있다. 실제의 CPU 칩엔 실행 부분뿐만 아니라 캐시 등의 부가 장치가 통합된 경우가 많다.


CPU에는 MCU(Micro Control Unit)와 주변 장치(외부 확장 장체에 관한 IC)가 다 들어있는 Soc(System One Chip)가 있다. 주변 IC가 따로 달려 있을 경우, 그것은 MCU라고 할 수 있다.


CPU는 기계어로 쓰인 컴퓨터 프로그램의 명령어를 해석하여 실행한다. CPU는 프로그램에 따라 외부에서 정보를 입력하고, 기억하고, 연산하고, 외부로 출력한다. CPU는 컴퓨터 부품과 정보를 교환하면서 컴퓨터 전체의 동작을 제어한다.


기본 구성으로는 CPU에서 처리할 명령어를 저장하는 역할을 하는 프로세서 레지스터, 비교, 판단, 연산을 담당하는 산술논리연산장치(ALU), 명령어의 해석과 올바른 실행을 위하여 CPU를 내부적으로 제어하는 제어부(control unit)내부 버스 등이 있다.


각종 전자 부품과 반도체 칩을 하나의 작은 칩에 내장한 전자 부품을 마이크로프로세서라고 한다. 마이크로프로세서는 전기 밥통에 쓰이는 낮은 성능의 제품부터 컴퓨터에 쓰이는 높은 성능의 제품까지 매우 다양하다. 마이크로프로세서들 가운데 가장 복잡하고 성능이 높은 제품은 컴퓨터의 연산 장치로 쓰인다. 이것을 중앙 처리 장치(CPU)라고 한다.


CPU의 출현

'고정된-프로그램 컴퓨터' 라고 불리는 ENIAC같은 컴퓨터는 다른 종류의 작업을 하기 위해 전선을 재배열 하는 과정이 필요했다. "CPU" 라는 용어가 소프트웨어의 실행을 위한 장치로 불리게 된 이래로, CPU라고 불릴 수 있는 장치의 출현은 프로그램 내장 방식 컴퓨터의 출현 덕분이었다.


프로그램 내장 방식 컴퓨터는 J.Presper Eckrt와 John Willian Mauchly's의 ENIAC 설계에도 이미 어느 정도 드러나 있다. 하지만 ENIAC을 빨리 제작하기 위해서 생략되었다. ENIAC이 만들어지기 전인 1945년 6월 30일 수학자 폰 노이만은 'EDVAC 초안에 대한 보고' 라는 논문을 발표했다. 이것은 프로그램 내장 방식 컴퓨터의 개요로써 1949년에 완전히 정립되었다. EDVAC은 일정한 수의 다양한 작업을 수행하기 위해 고안되었다. 확실한 것은, EDVAC 프로그램은 물리적 선의 연결이 아니라 빠른 속도의 컴퓨터 메모리에 저장된다는 것이다. 이것은 새로운 작업을 수행하기 위해서는 상당한 시간과 노력이 필요한 ENIAC의 한계를 이겨내는 데 도움을 주었다. 폰 노이만의 디자인은 소프트웨어(프로그램)을 단순히 메모리에 있는 내용을 바꾸는 것 만으로 손쉽게 실행할 수 있게 만들어 주었다. 하지만 EDVAC은 최초의 프로그램 내장방식 컴퓨터는 아니었다. 맨체스터 대학교의 SSEM(Small-Scale Experimental Machine)과 마크 1이 프로그램 내장 방식 컴퓨터의 초기 버전이다.


트랜지스터와 집적회로 CPU의 등장[편집]

트랜지스터 CPU는 트랜지스터가 발명된 이후 생긴다.


마이크로프로세서[편집]

페드리코 페긴이 1970년대에 발명한 것은 CPU의 설계와 구현에 대한 전반적인 기초를 완전히 바꾸어 놓았다. 1970년에 등장한 최초의 상업용 마이크로프로세서(Intel 4004)와 1974년의 최초의 범용 마이크로프로세서(Intel 8080) 이후로,생겼다 


연산[편집]

모든 CPU에서 메모리에 저장된 명령어들을 순서대로 불러와서 실행한다는 사실은 물리적형태와는 관계없이 동일하다. 그리고 CPU가 이 동작을 수행하기 위해서는 꺼내고, 해독하고, 실행하는 5단계가 필요하다. 마지막 단계에서 명령어를 실행하고난 이후에는 다시 이 다섯 단계의 명령 주기가 반복되며, 프로그램카운터의 변화된 위치에서 실행될 명령어를 불러오게 된다.


인출(Fetch)[편집]

첫번째 단계인 인출은 프로그램의 메모리에서 명령어를 불러오는 역할을 한다. 프로그램 내부의 명령어의 위치(주소)


해독(Decode)[편집]

두번째 단계인 해독은 인출 단계에서 가져온 명령어를 해독하여 명령어 내의 데이터 정보와 연산 정보를 추출한 뒤, 중앙처리 장치 내의 각 장치에 적절한 제어신호를 보내 연산, 처리에 대한 준비를 하는 단계이다.


실행(Execute)[편집]

명령어에서 추출한 두 데이터와 연산 정보를 이용해 실제로 연산을 하는 단계를 말한다. 연산이 끝난 결과는 곧바로 다음 명령어에서 사용될지, 그렇지 않을지에 따라 메모리 단계로 가던지, 라이트백 단계로 가던지 결정된다.


메모리(Memory)[편집]

네번째 단계인 메모리는 연산결과가 다음 명령어에 바로 사용되지 않는다면, 결과를 메모리에 저장하는 것을 말한다.


라이트백(Write-Back)[편집]

연산의 마지막 단계인 라이트백은 이전 명령어의 연산 결과가 다음 명령어의 입력 데이터로 사용될 경우, 계산 결과를 레지스터에 다시 쓰는 것을 말한다.


설계와 구현[편집]

CPU의 내장회로는 CPU가 수행할 수 있는 기본적인 연산들의 집합인 '명령어 집합'으로 이루어져있다. 예를 들면 두 개의 숫자에 대한 가감연산 혹은 비교연산 같은것이 있다. 각각의 기본 연산은 옵코드라고 불리는 특정한 비트의 조합으로 나타내진다.


모든 명령어의 실제 수학적인 연산은 CPU 내부의 산술논리장치(ALU, arithmetic logic unit)이라는 조합논리회로에서 담당한다. CPU는 대부분 산술논리장치가 연산을 수행하기 위한 명령어를 메모리로부터 불러오고, 연산의 결과값을 저장하는 일을 한다. 메모리로부터 데이터를 불러오는 연산의 명령어 집합의 종류와 동작은 확연한 차이를 보인다.


성능[편집]

싱글 코어[편집]

싱글 코어는 하나의 코어로 이루어진 CPU이다. 일반적으로 멀티 코어에 비해 경비가 싸고 프로그래밍도 간단하지만 보수 작업이나 고장의 경우에는 시스템이 완전히 멈추고 멀티 코어에 비해 처리 속도가 느리다는 단점이 있다.


멀티 코어[편집]

 이 부분의 본문은 멀티 코어입니다.

최근에 나오는 중앙 처리 장치의 성능은 크게 클록(Clock) 속도와 코어 수로 결정된다. CPU에서 클록이라고 하는 수치는 중앙 처리 장치 내부에서 일정한 주파수를 가지는 신호로 이 신호에 동기화되어서 중앙 처리 장치의 모든 명령어가 동작되게 된다. 예를 들어, 클록 수가 3.0GHz이면 초당 30억 번의 명령어 처리를 할 수 있다는 말이다. 따라서 클록 주파수가 빠를수록 제한된 시간에 더 많은 명령을 처리할 수 있기에 더 좋은 성능의 중앙 처리 장치라고 할 수 있다. 또, 중앙 처리 장치안의 코어의 수로도 성능의 차이가 난다. 코어는 중앙 처리 장치의 역할을 하는 블록으로 예전에는 한 개의 칩 안에는 한 개의 코어의 구조를 가졌으나, 최근에는 한 개의 칩 안에 여러 개의 코어를 가지는 구조를 채택하고 있다. 이렇게 한 개의 칩 안에 여러 개의 연산을 처리할 수 있는 장치를 병렬적으로 연결한 멀티 코어 시스템을 통하여 더 좋은 성능의 중앙 처리 장치를 얻을 수 있게 된다..


싱글 코어 및 다중 코어를 칭하는 명칭은 다음과 같다.


코어의 개수 명칭

1 싱글 코어

2 듀얼 코어

3 트리플 코어

4 쿼드 코어

6 헥사 코어

8 옥타 코어

10 데카 코어

12 도데카 코어

16 헥사 데시멀 코어





'프로그래밍 > 프로그래밍 공부' 카테고리의 다른 글

커널(kernel)  (0) 2016.02.17
재 진입성(re-entrant)  (0) 2016.02.16
CPU  (0) 2016.02.15
스레드(Thread)의 기본적인 특성  (0) 2016.02.15
프로세스(Process) , 스케쥴링(Scheduling)  (0) 2016.02.15
스트림(Stream)이란  (0) 2016.02.05
Posted by GENESIS8

댓글을 달아 주세요

원본 출처 :
http://egloos.zum.com/sweeper/v/2815395

1. 기본적인 특성

프로세스 단위의 컨텍스트 스위칭은 그 비용이 아주 비싸다.
왜냐면, [Code - Data - Heap - Stack]으로 이루어진 메모리가 모두 스위칭 되어야 하기 때문이다.

아주 다른 목적이 아닌, 하나의 프로세스 내에서 실행의 흐름을 바꾸면서 컨텍스트 스위칭 비용을 줄이기 위해서 고안된 것이 Thread 이다.
컨텍스트 비용을 줄이기 위해 고안되었다고 하는데, 아래 차이점을 보면 감이 올 것이다. 쓰레드는 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델이다.
  • 쓰레드는 프로세스처럼 완벽히 독립적인 구조가 아니다. 쓰레드들 사이엔 공유하는 요소들이 있다. 쓰레드는 공유하는 요소가 있는 관계로 컨텍스트 스위칭이 걸리는 시간이 프로세스보다 짧다. 위 내용은 아래 프로세스와 쓰레드의 메모리 구조의 차이점을 그린 그림을 보면 더 이해가 편할 것이다.

프로세스는 자식 프로세스를 생성하더라도 자식 프로세스들은 모두 완전한 프로세스의 메모리 구조를 가진다.
이에 비해레드는 해당 프로세스와 [Code - Data - Heap] 영역은 공유하고, 자신만의 Stack 영역만 별도로 소유한다.
이는 쓰레드를 생성하는 함수의 파라미터 중 스택 사이즈를 지정하는 파라미터가 있음만 봐도 명확하다.

쓰레드는 프로세스 내 다른 실행 흐름을 가지기 위해 사용한다고 하였다.
실행 흐름을 다르게 가져가기 위해선 다른 함수 호출 시퀀스를 가져야 하고, 스택 영역이 별도로 있어야 하는 이유이다.

암튼, 위에서 보듯이 쓰레드는 Stack 영역만 별도로 소유함으로써 프로세스 대비 쓰레드간 컨텍스트 스위칭은 비용이 적은 것이다.

특히 캐쉬 메모리의 활용 측면으로 넘어가면 그 비용의 차이는 더 커진다.
프로세스 컨텍스트 스위칭시에는 모든 데이터 영역이 갈아엎히기에 캐쉬 메모리가 싹 비워져야 하지만, 쓰레드의 경우엔 그렇지 않다. 

다시 한번 정리하면 메모리 관련 쓰레드의 특성은 다음과 같다.
  • 쓰레드마다 독립된 스택을 할당해 준다.
  • 쓰레드마다 고유의 CPU 레지스터값 세트를 가진다. (그래야 쓰레드 스위칭 이후 실행하던 지점으로 돌아갈 것 아닌가?)
  • 코드 영역을 공유한다.
  • 힙 & 데이터 영역을 공유한다.
    : 이로 인한 동기화 문제는 후~


2. 프로세스와 쓰레드

사실 Windows OS에서 프로세스는 단순히 쓰레드를 담는 상자에 불과하다고 해도 과언이 아니다. 모든 프로세서는 별도의 쓰레드를 생성하지 않더라도 Main 쓰레드를 통해 동작하기 때문이다.

프로세스 챕터(http://sweeper.egloos.com/2814918)에서 정리했던 스케쥴링은 사실 쓰레드에 적용되는 것들이다.


3. Kernel Level 쓰레드

(이 내용은 음...굳이 뭐...그냥 적어봄)

쓰레드를 누가 생성하고 관리하느냐에 따라 커널 레벨 vs 유저 레벨 쓰레드로 나눌 수 있다. 우리가 사용하는 Windows이든 Linux이든 우리가 흔히 접하는 모든 OS는 커널 레벨 쓰레드를 사용한다.

즉, 쓰레드를 생성하고 스케쥴링하는 주체가 커널인 것이다.

쓰레드를 생성하는 것만 보아도 쉽게 알 수 있다.
우리는 쓰레드 생성시 쓰레드 커널 오브젝트의 오브젝트 핸들을 넘겨 받는다.


'프로그래밍 > 프로그래밍 공부' 카테고리의 다른 글

재 진입성(re-entrant)  (0) 2016.02.16
CPU  (0) 2016.02.15
스레드(Thread)의 기본적인 특성  (0) 2016.02.15
프로세스(Process) , 스케쥴링(Scheduling)  (0) 2016.02.15
스트림(Stream)이란  (0) 2016.02.05
압축  (0) 2016.01.28
Posted by GENESIS8

댓글을 달아 주세요

원본 출처 :
http://sweeper.egloos.com/2814918

프로세스에 대해 간략하게 리마인드 차원에서 정리한다.

사실 Windows OS에서 프로세스는 쓰레드를 감싸고 있는 박스떼기에 불과하다고 해도 과언이 아니지만,
개념적으로 접근하기 위해 쓰레드보다는 프로세스를 주인공 취급하여 설명토록 하겠다.

귀찮아서 정리할 지 안할 진 모르겠지만, 이후 쓰레드 기초 내용 정리에서 다시 이에 관련된 내용들이 나올 것이다.

------------------------------------------------------------------------------

1. 프로세스란?


실행중인 프로그램의 instance


2. 프로세스의 구성 요소

1) 프로그램 실행시 메모리 구조

Code : 실행 파일을 구성하는 명령어(기계어)들이 올라가는 공간
Data : 프로그램이 종료될 때까지 지워지지 않는 데이터를 저장하는 공간. 대표적으로 전역/Static 변수가 있다.
Heap : 동적으로 할당되는 메모리를 위한 공간
Stack : 함수 내 지역 변수 및 함수 매개변수, 함수 반환 주소

2) Register set

실행 중인 프로세스에 관련된 데이터들고 CPU 내 레지스터들이 채워지기에 역시 구성 요소로 포함할 수 있다.


3. 프로세스 스케쥴링

멀티 프로세스 운영체제에서 하나의 CPU가 복수의 프로세스를 실행하기 위해선 스케쥴링이 필요하다.

프로세스 스케쥴링 방식에 따라 OS를 크게 두 가지 방식으로 나눌 수 있다.

1) Non-Preemptive OS

비선점형 OS는 현재 실행 중인 프로세스보다 높은 우선순위를 가지는 프로세스가 실행된다고 해서 실행 대상을 바로 변경하지 않는다.
새로 실행된 보다 높은 우선순위의 프로세스가 실행되기 위해서는 현재 실행 중인 프로세스가 명시적으로 CPU를 양보할 때까지, 혹은 I/O 작업 등으로 블로킹 상태가 될 때까지 기다려야만 한다.

과거 Windows95 이전, 그리고 Mac OS X 이전의 OS들이 비선점형 OS 였으며, 그 이후의 모든 OS는 선점형 OS 이다.

2) Preemptive OS

선점형 OS는 실행 중인 프로세스보다 높은 우선 순위의 프로세스가 실행되면, 스케쥴러에 의해 실행 순서가 적극 조정되는 OS를 얘기한다.

또한, 비선점형 OS에 비해 훨씬 더 스케쥴링이 복잡하게 처리가 되어 있는데, 우선 순위가 같은 프로세스들간 실행 배분에도 관여를 하기 때문이다.

최근의 모든 OS는 선점형 OS이며, Windows OS에서 선점형 스케쥴링 알고리즘으로 채택하고 있는 두 가지를 소개하겠다.

1. Priority Scheduling Algorithm

뭐 말 그대로 각각의 프로세스마다 우선 순위를 부여해서 우선 순위가 높은 프로세스를 먼저 실행시키는 알고리즘이다.

우선순위 10 프로세스와 1 프로세스가 동시에 실행중이라고 가정해 보자.
10 짜리가 더 높으니 거의 모든 CPU 타임을 10 프로세스가 차지하고 있을 것이다.

그럼 1 짜리 프로세스는 언제 실행되는가?
10 짜리 프로세스가 I/O Busy나 다른 프로세스를 기다리는 등의 블로킹 상태가 되어야만 한다.

2. Round-Robin Scheduling Algorithm

우선 순위 스케쥴링 방식의 예외를 처리하기 위해 고안된 알고리즘.
우선 순위가 같은 프로세스간에는 어떻게 해서 CPU를 분배하는가에 대한 스케쥴링 방식이다.

즉, 같은 우선 순위의 프로세스들간 형평성 유지를 위해 정해진 시간 간격 만큼만 실행을 하고 우선 순위가 동일한 다른 프로세스에게 CPU의 할당을 넘기는 방식을 뜻한다.

실행의 최소 단위 시간 간격을 우리는 Quantum 또는 Time Slice 라 하는데, 동일한 우선 순위의 모든 프로세스들은 이 타임 슬라이스를 기준으로 CPU의 할당을 넘기게 된다.

타임 슬라이스 간격이 관건인데...

1) 너무 길면 인터랙티브한 시스템에서 문제가 될 수 있다. 입력에 대한 반응이 늦는 등...
2) 너무 짧으면 컨텍스트 스위칭이 너무 많이 발생해서 성능 저하 문제가 심각해 진다.

최근 OS들은 보통 15~20ms 간격으로 스케쥴링을 수행한다고 한다.
Windows7의 경우 약 15ms 단위 (정확하게 15.6001ms)로 스케쥴링한다.

따라서, 우리가 만든 쓰레드가 임의로(::Sleep 등) 쓰레드 컨텍스트 스위칭을 시키지 않았다 하더라도,
항상 수행되고 있다고 가정해서는 안 된다는 것을 반드시 기억해야 한다.

특정 쓰레드가 모든 프로세서를 점유하고 있다면 다른 쓰레드가 어떻게 수행될 수 있겠는가?

Window 운영체제의 경우 GetSystemTimeAdjustment 함수를 활용하면 정확한 타임 슬라이스 값을 확인할 수 있다.

  1. DWORD timeAdjustment = 0;
  2. DWORD timeIncrement = 0;
  3. BOOL timeAdjustmentDisabled = FALSE;
  4.  
  5. GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement, &timeAdjustmentDisabled);


정리를 하면,
Windows OS에서는 (Linux도 MAX OS X도...거의 모든 OS에서)

1) 우선 순위 스케쥴링과 2) 라운드-로빈 스케쥴링 알고리즘을 혼합한 선점형 스케쥴링을 수행한다.

윈도우 OS에서는 프로세스들의 Priority와 I/O Busy state 등을 토대로 아래 그림과 같이 스케쥴링한다.



4. 프로세스 스케쥴링 발생 시점

이 발생 시점에 대해서는 특별하게 따로 외우거나 할 필요가 있다기 보다, 스케쥴링 방식을 이해하고 있으면 자연스레 습득할 수 있다.

1) 라운드-로빈 방식을 위한 Every Time Slice 

동일 우선 순위의 다른 프로세스에게 CPU를 넘겨줘야 하는지 판단하기 위해 매 타임 슬라이스마다 스케쥴러가 동작해야 한다.

2) 우선 순위 방식을 위한 프로세스 생성과 소멸

우선 순위가 가장 높은 프로세서가 CPU를 차지해야 하므로, 현재 실행 중인 프로세스보다 더 높은 프로세스가 새로 생성되었는지, 더 높았던 프로세스가 종료되었는지를 알기 위해서는 프로세스가 생성되고 소멸될 때마다 스케쥴러가 동작해야 한다.

3) 실행 중인 프로세스 블로킹

현재 실행 중인 프로세스가 블로킹 상태가 되면, 다른 프로세스가 대신 실행된다. 따라서, 현재 실행 중인 프로세스가 블로킹 상태에 놓이면 다음 실행될 프로세스 선정을 위해서 스케쥴러가 동작해야 한다.


5. Context switching

CPU가 멀티 프로세스를 수행함에 있어 위 그림과 같이 프로세스 스케쥴링이 발생한다.
이로 인해 프로세스의 잦은 교체가 발생할 수 있다.

현재 실행중인 프로세스가 바뀌는 것은 Context switching이라고 하며, 같은 절차가 필요하다.

1) A 프로세스의 데이터로 채워져 있던 레지스터들의 내용을 B 프로세스의 내용들로 교체.
2) A 프로세스의 데이터들은 컨텍스트 메모리에 백업.


'프로그래밍 > 프로그래밍 공부' 카테고리의 다른 글

CPU  (0) 2016.02.15
스레드(Thread)의 기본적인 특성  (0) 2016.02.15
프로세스(Process) , 스케쥴링(Scheduling)  (0) 2016.02.15
스트림(Stream)이란  (0) 2016.02.05
압축  (0) 2016.01.28
statement란?  (1) 2016.01.27
Posted by GENESIS8

댓글을 달아 주세요


원본 출처 :


http://www.terms.co.kr/


비즈니스 로직이란 업무에 필요한 데이터 처리를 수행하는 응용프로그램의 일부를 말한다. 이것은 데이터 입력, 수정, 조회 및 보고서 처리 등을 수행하는 루틴, 좀더 엄밀히 말하면 보이는 것의 그 뒤에서 일어나는 각종 처리를 의미한다. 대개 클라이언트 프로그램은 사용자 인터페이스와 비즈니스 로직으로 구성되며, 서버 프로그램은 대부분 비즈니스 로직만으로 되어 있다. 특히, 클라이언트/서버 모델인 경우에는 이외에도 통신링크가 추가되지만, 통신과 관련된 인프라스트럭처는 사용자 인터페이스처럼 비즈니스 로직의 일부는 아니다.


http://zetawiki.com/wiki/%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4_%EB%A1%9C%EC%A7%81


비즈니스 로직


business logic, business logic layer, business tier, logic tier

비즈니스 로직, 비즈니스 로직 계층, 비즈니스 티어, 비즈니스 계층, 논리 계층


업무절차를 정보시스템으로 구현하기 위한 자료구조와 알고리즘

데이터베이스와 UI간 정보교환을 제어하는 알고리즘

기술적인 표현이 아니라 개념적 표현임

3계층 소프트웨어 아키텍처에서 가운데 논리 계층













http://okky.kr/article/139274


보통 코딩시

 

action -> manager-> dao

 

방식으로 많이 쓰던데요

 

액션단 매니저단 dao단에서 각각 무엇을하는지

명확하게 좀 가르쳐 주실분 계신지요

 

제 생각으로는

 

액션에서는 파라미터 셋팅하고

매니저 에서는 비지니스 로직?

dao단에서는 당연히.. 쿼리를 날리는걸로 알고있는데

 

 

액션단에서 비지니스 로직도 하고 dao를 바로 콜하면 안되는건가요?

보통 비지니스 로직이 매우 간단하여..

액션단에다 대충 기술하고.. 구지 매니저 클래스에서

다시 dao를 호출할 필요가 없는 경우가 만터라구요

'(매니저 클래스에서 하는일은 그냥dao 호출뿐인데

클래스도 인터페이스까지 2개를 만들어야하구요...)

 

아무튼 위문제에 대해서

다들 어떻게 하시는지

그냥 패턴에 따라 코딩하시는지

아니면 저런 경우에는 액션에서 dao를 바로 콜하시는지

궁금합니다...



Action (controller 역할을 합니다. req의 유입, 분기, res 를 전달합니다)
Service (비즈니스 로직을 구현합니다,)
Dao (DB 자원을 억세스합니다.)



보통 클래스를 분리하는 이유는, 하나의 파일이 너무 많은 책임과 권한을 갖게 되면 당연히 스파게티 소스가 되고, 길어지기 마련이며, 유지보수하기 어렵기 때문입니다.

작은 단위의 unit 테스트나, 디버깅을 쉽게 가져가려는 부분, 서비스 영역의 비즈니스로직만 다이렉트 콜 해야 할 경우, 개발자가 여럿이 한 업무를 개발할 경우, MVC에 충실한 디자인을 고려해야 할 경우, 적절한 추상화를 해야 할 경우 등등등 파일의 영역을 역할에 맞게 분리하는것에 대해서는 oop적인 측면에서 장점이 많기 때문에 영역을 나누는것이죠.

그러면 어떻게 나누어야 하나?, 어떤 정도 레벨까지 추상화를 할것인가?
이건 정답이 없습니다. 각 상황에 맞게, 각 인력의 역량에 맞게 '잘' 하면 되는거죠

  • 퀵님 그렇다면...

    만약 비지니스 로직이 없거나 매우 간단하다면
    Service 단 호출 없이 바로 DAO를 호출해도 되는건지요?

    몇개 클래스만 DB처리후 소켓통신을 하고 나머지 클래스느 죄다 
    서비스단 없이 액션단에서 DAO를 호출해도 될것같아서 말입니다.

    이렇게 해도 되는걸까요 ^^
  • 비지님 struts - ibatis 로 구성된 소스 한번 보시구요..

    각 struts - ibatis의 jar까서 디랙토리 구조와 호출 구조보면 답이 나옵니다.
    왜 디렉토리를 그렇게 이름지었을까 ? 이고민만 하시면 해결됩니다. 

    바로 DAO를 호출해도 되는데요 만약 비지니스 로직이 추가되면?
    그래서 프레임워크 사상을 따르는것이 좋습니다. 악간의 반복코딩이 되더라도
    이미 통상적인 Layer는 존중을 하는게 최고입니다



 



정보를 좀 더 수집해야할 듯하다.





'프로그래밍 > 웹 프로그래밍' 카테고리의 다른 글

html 중급?  (0) 2016.02.21
HTML 기초  (0) 2016.02.21
비즈니스 로직(Business logic)?  (0) 2016.02.14
웹서버(Web Server) / 웹 서버 어플리케이션(WSA)  (0) 2016.02.14
웹 프로그래밍 기초  (0) 2016.02.14
ASP(Active Server Page)  (0) 2016.01.28
Posted by GENESIS8

댓글을 달아 주세요


출처 : http://round1tko.tistory.com/64




웹 서버와 WAS(Web Application Server)의 정의 ]

웹서버와 WAS는 비슷한 개념이기 때문에 같이 또는 다르게 사용되는 단어 가운데 하나이다. 인터넷 확산 초기에는 웹서버라는 개념으로 통칭해서 사용했지만, 시간이 지남에 따라 WAS를 더 많이 사용하고 있다. 인터넷 사용자가 증가함에 따라, 각 웹 사이트는 보다 많은 사용자에게 원활한 서비스를 제공하기 위해 기능적인 layer를 나누게 되었고 여기서 웹서버와 WAS의 구분점이 생기게 된 것이다.

기능적으로만 본다면, 거의 대부분의 웹 서버가 웹 애플리케이션을 동작시킬 수 있겠지만 모두 웹 서버 혹은 WAS라고 부르는 것보다는 어떤 기능을 수행하는지에 따라, 즉 기능상의 분류를 통해 구분지어 사용해야 할 것이다.

 

구분

웹서버

WAS

설명

1. 웹브라우저(Web Client)에게 컨텐츠를 제공하는 서버이다.  정적인 HTML이나 jpeg, gif같은 이미지를 HTTP 프로토콜을 통해 웹 브라우저에 제공한다.


2. 
최근에는 웹서버에서도 내부 애플리케이션을 동작시킬 수 있는 컨테이너를 내장하고 있다.

서버단에서 애플리케이션을 동작할 수 있도록 지원한다. 일반적으로 컨테이너라는 용어로 쓰인다. 초창기에는 CGI, 그 이 후에는 Servlet, ASP, JSP, ASP, PHP등의 프로그램으로 사용되고 있다.

 

 

[ 웹 서버와 WAS(Web Application Server)의 구성에 따른 분류 ]

 

1.     기본적인 웹 사이트 구성

  

<그림 1> 웹 사이트의 가장 기본적인 구성 환경이다. 모든 콘텐츠를 한 곳에 집중시켜 웹 서버와 WAS의 역할을 동시에 수행한다. 사용자가 많지 않거나 트래픽이 적을 때 효율적이며 간단한 구조로 개발 및 테스트 시스템 구성시 활용의 가치가 높다.

 

장점 : 사용자 증가에 따라 스위치 장비를 통해 로드 밸런싱을 수행하고, 여러대의 WAS를 통해 지원이 가능하다. 필요시에 추가로 WAS를 증설하는 구조라고 볼 수 있다.

단점 : WAS가 정적인 데이터(HTML/Image)의 처리와 동적인 데이터(웹 애플리케이션)의 처리를 동시에 수행하기 때문에 최적화 측면에선 바람직하지 않다. 또한 정적데이터의 입출력 처리를 위해 웹 애플리케이션의 수행을 방해할 수 있고, 그 반대의 경우도 있다.

 

2.     웹 서버와 WAS로 구성된 환경

 


 
<그림 2>는 웹 서버와 WAS의 기능적 분류를 통해 효과적인 분산을 유도한 형태이다. 정적인 데이터는 구조적으로 앞에 존재하는 웹 서버에서 처리하고, 동적인 데이터는 뒷단의 WAS가 처리한다.

사용자의 요청에 대해서 정적 데이터인 HTML과 자바스크립트 파일, CSS, Image 등을 앞단의 웹 서버에 위치시켜 처리함으로써 WAS로 서비스 요청이 넘어가지 않게 한다.

또한 웹 애플리케이션 서비스를 위치적으로 뒤편에 존재하는 WAS에 넘겨줌으로써 WAS는 웹 애플이케이션의 수행이 집중할 수 있다.

웹 서버 단에서 처리할 것과 WAS에게 넘겨질 것을 처리하는 방식은 웹 서버 단의 Configuration을 통해 처리할 수 있다. 특정 확장자나 디렉토리 업무를 WAS로 넘길지 여부는 웹 서버 단에서 처리한다.


 

3.     특정기능에 대한 서버를 별도로 두고 있는 환경


 

점점 화려해지는 UI를 자랑하는 페이지들이 많아짐에 따라 이미지의 비중이 증가하고, 이런 이미지들이 전체 네트워크 비중의 상당부분을 차지한다. 따라서 이미지 서버를 따로 구성해 네트워크 비중도 줄이면서 웹 서버와 WAS를 좀 더 효과적으로 사용할 수 있는 구조라 할 수 있다.

또는 특정 콘텐츠에만 집중적인 요청을 받는 경우도 있다. 예를 들어, 대학 입시 때 경쟁률 조회는 상당히 많은 사용자에 의해 조회가 되고, Reload 또한 빈번하게 일어나므로 특정시간 간격으로 HTML을 생성하고, 페이지를 특정 서버에 위치시켜 적절하게 부하를 분산시켜 해결이 가능하다.

 

장점 : 다양한 환경에 대한 대처가 빠름

 

단점 : 구조를 정확하게 이해하지 않았을 경우에는 개발 및 테스트에 많은 시간이 쓰임

  

 

4.     WAS단을 Logic으로 구분하여 구성

 

      

 

        <그림 4> <그림 2>의 변경된 형태이다. WAS단의 프로그램이 많은 비중을 차지하는 경우, Presentation Logic을 담당하는 프로그램과 Business Logic을 담당하는 프로그램을 구분하는 구성이다.이런 구성은 특정 로직 부분의 부하에 따라 적절한 대응을 할 수 있으나 구조가 복잡해지는 단점이 있다.

  

 

[ WAS 관련 용어 정의 ]

 

1.     자바 서블릿(Java Servlet)

자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히서블릿이라고 한다.

        자바 서블릿은 Java EE사양의 일부분으로, 주로 이 기능을 이용하여 쇼핑몰이나 온라인 뱅킹 등의 다양한 웹 시스템이 구현되고 있다.

        비슷한 기술로는 펄 등을 이용한 CGI, PHP를 아파치 웹 서버 프로세스에서 동작하게 하는 mod_php, 마이크로소프트사의 IIS에서 동작하는 ASP 등이 있다. CGI는 요청이 있을 때마다 새로운 프로세스가 생성되어 응답하는 데 비해, 자바 서블릿은 외부 요청마다 프로세스보다 가벼운 쓰레드로써 응답하므로 보다 가볍다. 또한 자바 서블릿은 자바로 구현되므로 다양한 플랫폼에서 동작한다.

 

2.     엔터프라이즈 자바빈즈(Enterprise JavaBeans, EJB)

EJB는 기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델이다. , EJB는 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션이다. EJB사양은 Java EE의 자바 API중 하나로, 주로 웹 시스템에서 JSP는 화면 로직을 처리하고, EJB는 업무 로직을 처리한다.

EJB의 종류는 세션 빈(Session Bean), 엔티티 빈(Entity Bean), 메시지 구동 빈(Message-driven Bean)이 있다.

 

3.     자바 메시지 서비스(Java Message Service, JMS)

JMS는 자바 프로그램이 네트워크를 통해 데이터를 송수신하는 자바 API이다.

 

4.     자바 가상 머신(Java Virtual Machine, JVM)

JVM 자바 바이트코드를 수행할 수 있는 환경이다. 자바 바이트코드는 주로 자바를 컴파일하여 생성하지만, 다른 언어의 컴파일러에서도 생성할 수 있다. 자바 가상 머신은 자바 플랫폼의 기반을 이루며 다양한 하드웨어 기반 플랫폼에 포팅된다. JVM 자바 플랫폼의 주요한 부분이며 마이크로소프트 윈도(95/98/NT), 리눅스, 유닉스,  오에스  등 대부분의 운영체제는 물론, 인터넷 익스플로러와 넷스케이프 등과 같은 웹 브라우저 등 여러 가지 플랫폼에 설치되어 사용될 수 있으며, 휴대전화나 가전기기에도 설치할 수 있다. 따라서 자바 플랫폼은 여러 플랫폼을 지원하여 미들웨어로서의 역할과 플랫폼 스스로의 역할을 동시에 수행할 수 있다. 사용자는 자바 바이트코드로 컴파일된 자바 프로그램을 실행시키기 위해서 이 자바 가상머신을 이용하면 된다.

원 개발사인 썬 마이크로시스템즈에서 자바 가상 머신의 기준이 되는 표준판(Java SE) 과 표준판을 핸드폰이나 PDA 등 임베디드 기기용인 축소판(Java ME) 으로 구분하여 가상 머신을 배포하고 있다. 기업판(Java EE)의 경우에는 표준판의 자바 가상 머신을 기반으로 확장된 라이브러리 집합을 정의한 것이기 때문에 자바 가상 머신의 종류로 분류하기 애매하다.  마이크로시스템즈에서 제공하는 자바 가상 머신 말고도 각 운영체제 개발사가 제공하는 자바 가상 머신이 있으며, GNUGCJ 아파치 소프트웨어 재단(ASF: Apache Software Foundation) 하모니(Harmony)와 같은 오픈 소스 자바 가상 머신도 존재한다. 이러한 공개 소프트웨어 단체의 움직임에 따라 썬 마이크로시스템즈에서도 자사의 자바 가상 머신 및 개발 도구 킷을 오픈 소스 정책에 맞추어 공개한 상황이다.

 

5.     힙 메모리(heap memory)

프로그램을 사용할 수 있는 자유 메모리. 프로그램 실행 시에 함수로 보내는 데이터 등을 일시적으로 보관해 두는 소량의 메모리와 필요시 언제나 사용할 수 있는 대량의 메모리가 있다. 이때, 소량의 메모리를 스택이라 하고 대량의 메모리를 이라 한다.  이 없어지면 메모리 부족으로 이상 종료하게 된다.

 

6.     자바 서버 페이지(JavaServer Pages, JSP)

HTML내에 자바 코드를 삽입하여  서버에서 동적으로 웹 페이지를 생성하여  브라우저에 돌려주는 언어이다. Java EE 스펙 중 일부로  애플리케이션 서버에서 동작한다. 자바 서버 페이지는 실행시에는 자바 서블릿으로 변환된 후 실행되므로 서블릿과 거의 유사하다고 볼 수 있다. 하지만, 서블릿과는 HTML 표준에 따라 작성되므로 웹 디자인하기에 편리하다. 이와 비슷한 구조인 것인 PHP, ASP, ASP.NET 등도 있다. 아파치 스트럿츠 자카르타 프로젝트 JSTL 등의 JSP 태그 라이브러리를 사용하는 경우에는 자바 코딩없이 태그만으로 간략히 기술이 가능하므로 생산성을 높일 수 있다.

클라이언트에서 서비스가 요청되면, JSP의 실행을 요구하고, JSP  애플리케이션 서버의 서블릿 컨테이너에서 서블릿 원시코드로 변환된다. 그 후에 서블릿 원시코드는 바로 컴파일된 후 실행되어 결과를 HTML 형태로 클라이언트에 돌려준다.

 

7.     Java Database Connectivity(JDBC)

자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다. JDBC Java로 작성된 프로그램을, 일반 데이터베이스에 연결하기 위한 응용프로그램 인터페이스 규격입니다. 이 응용프로그램 인터페이스는 데이터베이스 관리 시스템에 넘겨질 SQL 형태의 데이터베이스 접근요구 문장을, 각 시스템에 맞도록 바꾸어준다. API는 동적으로 올바른 Java 패키지를 로드하고, JDBC 드라이버 매니저에 등록하기 위한 메커니즘을 제공합니다. 드라이버 매니저가, JDBC connection을 생성하기 위한 connection factory로서 사용됩니다.

 

8.     Java Management eXtensions(JMX)

응용 프로그램 소프트웨어/객체/장치 (프린터 등) 및 서비스 지향 네트워크 등을 감시 관리를 위한 도구를 제공하기 위한 자바 API이다. 이러한 리소스는 MBean(Managed Bean)이라는 객체로 표현된다.

 

9.     Java Naming and Directory Interface(JNDI)

디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바API이다.



'프로그래밍 > 웹 프로그래밍' 카테고리의 다른 글

HTML 기초  (0) 2016.02.21
비즈니스 로직(Business logic)?  (0) 2016.02.14
웹서버(Web Server) / 웹 서버 어플리케이션(WSA)  (0) 2016.02.14
웹 프로그래밍 기초  (0) 2016.02.14
ASP(Active Server Page)  (0) 2016.01.28
IIS란?  (0) 2016.01.25
Posted by GENESIS8

댓글을 달아 주세요


출처 : 

http://webcache.googleusercontent.com/search?q=cache:http://kbp.kongju.ac.kr/cg_edu/cnu/web_server_basic.htm&gws_rd=cr&ei=7fK_Vu-JJqiHmgWGq43oAg


http://j2enty.tistory.com/entry/JSP-Chapter1-%EC%9B%B9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EA%B8%B0%EC%B4%88-2



 웹 서 버   구 축 을   위 한   기 초


웹서버(web Server)란 : 웹서버 간단히 웹을 서비스하는 컴퓨터라고 할 수 있다. 웹페이지는 HTML이므로 웹서버는 "HTML파일들을 모아놓고 서비스하는 컴퓨터"라고 할 수도 있다.  모든 컴퓨터는 서버가 될 수 있으므로 웹 서버가 될 수도 있지만, 어떤 컴퓨터를 웹 서버로 만드려면 먼저 웹 서버 프로그램을 설치해야 한다. 웹 서버 프로그램으로는 PWS, IIS, 아파치 등이 있다.


웹 클라이언트(Web Client)란 : 서버와는 상대되는 개념으로 클라이언트는 어떤 서비스를 요청하는 역할을 하게 된다. 그러므로 웹 클라이언트는 "웹 서버에 자료를 요청하기 위해 "HTTP"를 사용하는 클라이언트 프로그램"이라고 할 수 있다.  웹 페이지를 요청하는 것도 클라이언트라고 할 수 있다. 그런데 웹 페이지 요청은 대부분 웹 브라우저가 하게 된다. 그러므로 일반적으로 웹 클라이언트를 웹 브라우저라고 일컫기도 한다.  


서버 사이드(server Side)란 : 서버사이드(Sever-Side)란 간단히 "웹 서버측에서 하는 작업들"이라고 말할 수 있다.  여기서 말하는 작업이란 구체적으로 웹 브라우저(클라이언트)에서 넘어온 자료를 데이터베이스에 저장 한다든지, 어떤 수학적인 계산을 하여 결과를 만들어 낸다든지 하는 것을 말한다. 이런 작업을 담당하는 것이 웹 프로그램이다. 웹 프로그램의 종류는 PHP, ASP, Perl, Python등이 많이 쓰인다.


클라이언트 사이드(Client Side)란 : 웹 브라우저(클라이언트 사이드)를 사용하면 서버의 작업량을 줄일 수 있다. 서버가 작업해야 할 부분중에서 클라이언트가 할 수 있는 작업을 스스로 처리하기 때문에 서버의 작업량을 줄여줄 수 있어 효율적이다. 이렇게 "클라이언트 스스로 일을 처리할 수 있도록 하여 서버의 효율성을 높일 수 있도록 하는 것"이 클라이언트 사이드 언어이다.  클라이언트 사이드 언어로는 자바스크립트(Java Script)와 이외의 대부분의 스크립트 언어가 있다. 플래시 액션(Action) 스크립트도 클라이언트 사이드 언어라고 할 수 있다. 이런 스크립트 언어는 웹 서버에서 웹 브라우저로 전송된 후 실행된다.



■ 계열별 웹서버의 종류

- Windows : IIS, PWS, httpds, NCSA httpd For Windows, SerWeb, Web4Ham

- Unix, Linux : Apache, CERN httpd, NCSA httpd, EIT httpd, GN Gopher/http, Plexus perl server, WebWorks Enterprise server,

  Netsite Communication Server and Netsite Commercial Server

- Mac : MacHTTP

- NETWare : httpd nlm



■ 각 계열별 대표적인 웹서버

- Windows 계열 : IIS(Internet Information Services)

NT급에서 기본적으로 지원되는 웹서버로 ASP(Active Server Page)라는 개발 언어를 지원한다. 1995년 말 윈도우 NT용 웹서버로 출시 되었으며 윈도우 4.0이 출시되면서 IIS 2.0을 기본적으로 탑재 하였지만 얼마 후 ASP기술이 나오면서 IIS3.0이 새로 출시되었다. 윈도우 NT에서 IIS3.0이상 버전을 설치하기 위해서 별도의 OPTION PACK과 SERVICE PACK을 설치해 주어야 한다.

Windows 2000서버 및 Windows XP Pro에는 IIS 5.0이 포함되어있다.

- Unix, Linux 계열 : Apache, NCSA

아파치 프로젝트의 시작은 처음 1995년경 대중의 사랑을 받던 NCSA의 개발자중 일부가 모여 시작 했습니다. 이것을 시발로 NCSA HTTPD 개발자와 아파치 개발자들이 합류되고 이전에 만들어졌던 아파치 0.6.2를 완전히 개선한 0.8.8을, 그리고 아파치 1.0을 1995년10월에 만들어 냈습니다. 현재(2000년기준)는 60%이상의 사용자를 확보 하고 있다.


■ 웹서버 구축에 필요한 것들 (PHP, APACHE, MySQL)

- PHP(Professional HyperText Preprocessor) : 서버에서 해석되는 HTML에 내장되어 동작하는 스크립트 언어이다.  C, Java, Perl 등에서 많은 문장 형식을 빌려왔으며 웹 브라우저 등으로 실제 코드를 볼 수 없다는 것에 보안상 유리한 점도 있습니다. PHP와 ASP는 근본적으로 서버용 객체 지향적인 스크립트 언어라는 점에서 같지만, ASP의 경우 IIS, PWS와 같은 윈도우 환경에서 움직이는 서버를 지원하는데 반해 PHP는 Apache, IIS, PWS, 서버 등과 유닉스 윈도우 환경에서 움직이는 모든 서버를 지원합니다.

- APACHE : 대중의 힘을 바탕으로 가장 큰 인지도를 얻을 만큼 사용자가 이끌어 가는 무료 웹 서버입니다.

- MySQL : 무료 데이터베이스(DB)

 


웹 프로그래밍 기

1. 웹 어플리케이션과 웹 프로그래밍
 -.웹 어플리케이션 : 웹을 기반으로 실행되는 어플리케이션
 -.일반적으로 웹 브라우저에 기능을 요청하고 요청을 받은 웹 어플리케이션은 요청한 기능에 알맞은 결과 화면을 생성해서 웹   브라우저에 전송한다. 일반적으로 웹 브라우저가 요청한 기능을 제공하기 위해서는 웹 서버, 어플리케이션 서버, 데이터   베이스 와 같은 구성요소들을 필요로 한다. 



-.웹 서버 : 웹 브라우저의 요청을 받아 알맞은 결과를 웹 브라우저에 전송한다. 만약 프로그램의 처리가 필요하다면 어플리케이션 서버를 사용하거나 프로그램을 직접 호출하여 결과를 생성한다. 주로 정적인 HTML, CSS, 이미지 자바 스크립트를 웹 브라우저에 제공할 때 웹 서버가 사용된다. (아파치)

// IIS 등.
-.웹 어플리케이션 서버 (WAS): 게시글 목록, 로그인 처리와 같은 기능을 실행(처리)하고 그 결과를 응답으로 웹 서버에 전달한다.  (톰캣, 웹로직, JBoss 등) // ASP 등이 포함됨
-.데이터베이스 : 웹 어플리케이션이 필요로 하는 데이터를 저장한다. (오라클, MySQL, MS-SQL 등)
-.웹 브라우저 : 웹 서버에 서비스 실행을 요청하며 웹 서버의 처리 결과를 사용자에게 보여준다. (익스플로러, 크롬 등) 


 -.어플리케이션 서버도 웹 서버와 마찬가지로 정적인 HTML, CSS 등을 제공할 수 있다. 하지만 웹 서버에서 정적인 HTML, 이미지 등을 제공하고 어플리케이션 서버가 프로그램을 제공하는 이유는 성능 때문이다. 일반적으로 아파치와 같은 웹 서버는 정적인 HTML, CSS를 제공하는데 초점이 맞춰져 있고, 톰캣이나 웹 로직과 같은 어플리케이션 서버는 JSP, 서블릿과 같은 프로그램을 실행하여 결과를 제공하는 데 초점이 맞춰저 있기 때문이다.

1.1 CGI방식과 어플리케이션 서버 방식
 -. 웹 어플리케이션은 웹 브라우저의 요청을 알맞게 처리하고 그에 대한 결과를 웹 브라우저에 전달한다. 웹 어플리케이
션이 실행되는 과정은 아래의 그림과 같다. (요청-처리-응답)


 위 그림의 2번에서 웹 서버는 웹 어플리케이션 프로그램을 사용해서 우베 브라우저의 요청을 처리한다. 이 때 웹 서버가 웹 어플리케이션을 실행하는 방식에 따라서 CGI방식, 어플리케이션 서버 방식으로 동작방식을 구분할 수 있다.
(Common Gateway Interface, CGI : 웹 서버와 프로그램 사이에 정보를 주고받는 규칙을 의미. 흔히 CGI 프로그래밍이라고 하면 Perl, C/C++언어 등을 사용하여 웹 서버를 통해서 실행할 수 있는 프로그램을 의미한다.)

 CGI 방식과 어플리케이션 서버 방식간의 차이점웹 서버가 직접 프로그램을 호울하는지의 여부에 있다. 먼저 CGI방식은 웹 서버가 어플리케이션을 호출하는 구조를 갖는다. 이에 반해 어플리케이션 서버 방식은 웹 서버가 직접 프로그램을 호출하기보다는 웹 어플리케이션 서버를 통해서 간접적으로 어플리케이션 프로그램을 실행한다.
 접속자가 많은 서비스의 경우 CGI방식보다 어플리케이션 서버 방식의 성능이 좋게 나타난다. 그 이유는 CGI방식의 경우에는 요청 받은 기능이 같은 프로그램을 실행하는 경우라 하더라도 요청이 발생하는 숫자만큼 프로그램을 실행하기 때문에 메모리를 많이 차지하게 된다. 반면에 어플리케이션 서버방식의 경우에는 동시에 여러 웹 브라우저가 동일한 프로그램을 요청하더라도 한 개에 해당하는 메모리만 사용하기 때문에 전체적으로 사용하는 메모리가 적다. 
 
1.2 스크립트 방식과 실행 코드 방식
 웹 어플리케이션 프로그래밍은 구현하는 방식에 따라 실행 코드 방식과 스크립트 방식으로 구분할 수 있다. 

비교 항목 실행 코드 방식 스크립트 방식 
코드 형태  컴파일 된 실행 프로그램  컴파일 되지 않은 스크립트 코드 
실행 방식 컴파일 된 기계어 코드 직접 실행  스크립트 코드를 해석한 뒤 실행 
코드 변경  소스 코드를 다시 컴파일 해야 함  스크립트 코드만 고치면 됨 
종류  C기반 CGI 프로그램 JSP, ASP.net, PHP, Ruby ... 



-.스크립트 코드의 번역은 최초 요청에 대해서 한 번만 발생하며, 이후의 요청에 대해서는 번역 과정 없이 앞서 번역된 코드를 실행하도록 함으로써 번역 횟수를 최소화한다.
-.실행코드 방식의 경우 일반적으로 CGI방식이고 스크립트 코드 방식인 JSP나 ASP는 어플리케이션 서버 방식이기 때문에 전체 처리량에서는 JSP/ASP 기반의 스크립트 코드 방식이 앞선다.
-.기술의 발달로 스크립트 언어를 번역한 코드가 일반 프로그램과 동일한 수준의 성능을 제공하고 있다. 




2. URL과 웹 어플리케이션 주소
 -.사이트에 연결할 때 다음과 같은 형식의 주소를 웹 브라우저에 입력한다.
  이 주소는 자원을 구분할 때 사용되는 문자열로서 이런 문자열을 URL(Uniform Resource Locator)라고 부른다.

http://java.sun.com/javase/6/docs/api./index.html

[프로토콜]://[호스트][:포트][경로][파일명][.확장자][쿼리문자열] 

-.프로토콜 : 서버와 클라이언터의 통신 규약(http. https)
-.호스트 : 클라이언트가 접속할 서버 주소
-.포트 : 서버와 클라이언트가 통신할 때 사용할 포트. 일반적으로 입력하지 않으며 입력하지 않을 경우 기본포트(80)이 사용
-.[경로][파일명][.확장자] : 서버에서 가져올 자원의 위치를 입력하낟. 
-.[쿼리문자열] : 주소 뒤에 붙는 정보로 '파라메터'라고 불리는 데이터를 웹 어플리케이션에 전달할 때 사용된다. [쿼리문자열]은 물음표(?)를 이용하여 경로 부분과 구분되며 1개이상의 파라메터 이름과 값을 같는다. 



3. 자바와 웹 프로그래밍
3.1 서블릿과 JSP
 -.서블릿 : 자바를 개발한 Sun에서 웹 개발을 위해 만든 표준, 이러한 서블릿 규약에 따라 만든 클래스를 서블릿 이라 부름
 -.서블릿을 만들기 위해선 자바 코드를 작성하고 컴파일 하여 클래스 파일을 만들게 된다.(앞서 말한 실행코드 방식) 이런 방식은 데이터를 조금만 바꾸고 싶어도 코드를 수정하고 컴파일하고 클래스를 알맞는 곳에 복사해줘야 하는 작업을 해야한다.

 -.JSP : 위와 같은 서블릿의 단점을 보완하여 만든 스크립트 방식의 표준
 -.JSP는 서블릿 표준을 기반으로 만들어졌다. 때문에 내부적으로 JSP파일이 변역되면 최종 결과물로 서블릿이 만들어진다. 

3.2 JSP (JavaServer Pages) 란?
 -.자바 언어를 기반으로 하는 스크립트 언어로 자바가 제공하는 기능을 그대로 사용 할 수 있다.
 -.HTTP와 같은 프로토콜에 따라 클라이언트의 요청을 처리하고 응답한다.
 -.HTML, XML등 클라이언트가 요청한 문서를 생성하는 데 주로 사용된다.
 -.서블릿/EJB등의 엔터프라이즈 기술들과 잘 융합된다.
 -.표현언어, 표현식, 스크립트릿 등 다양한 스크립트 요소와 액션 태그 등을 제공함으로써 보다 쉽게 웹 어플리케이션을 프로그래밍 할 수 있도록 도와준다.

3.3 웹 컨테이너(Web Container)
 -.웹 컨테이너 : 이름 그대로 웹 어플리케이션을 실행 할 수 있는 컨테이너.
 

JSP 컨테이너 + 서블릿 컨테이너 = 웹 컨테이너

현재 서블릿 규약의 버전은 2.5이고, JSP 규약 버전은 2.1이다. 이 두 규약의 버전 차이에서 알 수 있듯이 서블릿 규익이 먼저 발표되고 그 후 JSP규익이 발표되었다. 처음 서블릿 규약이 발표되었을 때는 JSP가 존재 하지 않았기 때문에 서블릿이 실행 가능한 서버를 서블릿 컨테이너라고 불렀으며 이후 JSP 규약이 발표될 때는 서블릿과 구분하는 의미에서 JSP가 실행 가능한 서버를 JSP 컨테이너 라고 불렀다. 하지마 이 후 거의 모든 엔진이 서블릿과 JSP를 동시에 지우너하면서 이 두 컨테이너를 구분하는게 무의미 해졌으며, 이 후 부터는 서블릿 컨테이너와 JSP 컨테이너를 웹 컨테이너 라고 부르기 시작했다.


3.4 JSP를 사용하는 이유

-.자바 언어를 기반으로 하고 있기 때문에 플랫폼에 상관없이 사용할 수 있다.
-.자바 언어에 대한 깊은 이해가 없더라도 빠르게 배울 수 있다.
-.대규모 어플리케이션을 구현 할 때 사용되는 스프링, 스트럿츠와 같은 프레임워크와 완벽하게 연동되며, 금융권에서 많이 사용하는 EJB기술과도 완벽하게 연동된다. 






'프로그래밍 > 웹 프로그래밍' 카테고리의 다른 글

HTML 기초  (0) 2016.02.21
비즈니스 로직(Business logic)?  (0) 2016.02.14
웹서버(Web Server) / 웹 서버 어플리케이션(WSA)  (0) 2016.02.14
웹 프로그래밍 기초  (0) 2016.02.14
ASP(Active Server Page)  (0) 2016.01.28
IIS란?  (0) 2016.01.25
Posted by GENESIS8

댓글을 달아 주세요

http://chaoxifer.tistory.com/82


저도 스트림에 대해 그다지 알고 있다는 생각은 들지 않지만 그래도 전혀 모르는 미로인을 위해 약간 적어 보려고 합니다.

프로그램을 실행 할때 키보드를 통해서 입력을 하고, 모니터를 통해서 출력을 하고 있죠? 우리는 별다른 무리 없이 간단하게 입출력을 합니다. 생각을 해보면 키보드에서 입력을 받고, 하드웨어적인 부분을 처리하여야 입력이 되고 화면으로 출력이 되겠죠? 예로 A라는 문자를 눌렀다고 가정해 봅시다. 그러면 키보드에서 신호가 나갈것이고, 그것을 컴퓨터에서 처리하여, 출력 장치인 모니터로 신호를 보내 결과적으로 화면에 A라는 문자가 찍힐것입니다.


그러나, 우리는 이렇게 하드웨어적인 세세한 부분까지 신경을 쓰지는 않습니다. 입출력을 도와주는 스트림( Stream )이란 녀석이 있기 때문이죠.


스트림을 사용하는 입출력 장치( Input/Output Device )는 많죠. 조금 전 예로든 키보드나 모니터 뿐만 아니라 파일, 프린터, 마우스, 네트워크, 메모리 등등 많은 입출력 장치에서 쓰입니다. 물론 스트림의 종류도 입출력 장치의 종류만큼 다양합니다. 파일에 데이터를 쓰고 싶다고 한다면 파일관련 스트림을 찾아서 목표지점으로 삼을 것입니다. 목표지점이란 입력 스트림의 경우 입력받을 데이터가 위치 하는 곳을 말하고, 출력 스트림의 경우 데이터가 저장될 곳을 말합니다.

입출력 장치에 데이터를 입력하거나 출력하는 처리를 하기 위해 스트림이 존재 한다고 했었습니다. 스트림은 방향에 따라 2가지로 나눌수 있는데, 사용자의 입장에서 데이터가 들어오면 입력 스트림( input Stream )이고, 데이터가 나가면 출력 스트림( Output Stream )이 됩니다.


입력 스트림은 데이터를 스트림으로 읽어 들입니다. 그리고 스트림에 존재하는 데이터를 하나하나 읽어들입니다. 예를 들어봅시다. 음료수가 있고, 거기에 빨대가 꽂혀 있네요. 빨대에 입을 갖다대고 쭉 빨아 당기면 음료수가 빨대에 모이게 되고, 계속 빨아 당기면 입안으로 음료수가 들어오게 됩니다.


출력 스트림은 출력될 데이터를 스트림으로 보냅니다. 그리고 스트림에 있는 데이터를 비워 버립니다. 비워진 데이터는 모두 목표지점에 저장이 되는 것 입니다. 위와 같은 예를 들자면, 입안에 들어 있던 음료수를 빨대로 보냅니다. 빨대로 가겠죠? 빨대에 있던 음료수를 불어 버립니다. (fflush) 음료수가 다시 음료수 통으로 들어 갑니다.


정리를 해보자면, 스트림은 데이터의 입출력 처리의 중간자 역할을 합니다. 데이터의 목표지점은 중요치 않습니다. 네트워크건 메모리건 프린터건 전혀 상관이 없습니다. 그저 해당되는 데이터를 스트림으로 읽어 들이거나 스트림으로 내보내면 끝인 것 입니다. 하드웨어적인 복잡한 작업은 스트림이 알아서 해주고 사용자는 편하게 사용만 하면 되는 것입니다

.



출처

http://www.ktword.co.kr/abbr_view.php?m_temp1=1311




1. 스트림(Stream) 이란? 일반적으로 데이터,패킷,비트 등의 일련의 연속성을 갖는 흐름을 의미 - 음성,영상,데이터 등의 작은 조각들이 하나의 줄기를 이루며 전송되는 데이터 열(列) . 호스트 상호간 또는 동일 호스트프로세스 상호간 통신에서 에 의한 메세지 전달방식을 이용한 가상 연결 통로를 의미하기도 함 2. 멀티미디어 스트리밍 기술전송 방식 구분 - 다운로드 방식 : 재생(Play) 전에 데이타를 완전히 다운로드 받는 방식 . (웹 서버)/HTTP/TCP/IP 상에서 동작 - 스트리밍 방식 : 데이타 수신과 동시에 재생. 사용자에게 동시성 제공. 실시간 전송기술 . (미디어 서버)/RTP/UDP/IP 상에서 동작 * [참고] . 비디오 파일 포멧 : 디지털 비디오 데이터를 저장,복원하기 위한 파일 포멧 .. 例) AVI, MKV, MP4, ASF, MOV, WMV 등 . 스트리밍 미디어 : 즉시 재생 가능 미디어 .. 전체 다운로드 없이도, 실시간 실행이 가능한 미디어를 말함 ㅇ 스트리밍 종류 - [RTP 스트림] 인터넷 스트리밍 프로토콜 . RTP/UDP/IP 패킷에 실릴 수 있도록 한 스트리밍 프로토콜 . 오디오,비디오 등의 정보를 담은 일련의 패킷화된 정보 앞에 RTP 헤더를 붙힌 스트림 - [MPEG 스트림] 주로, 디지털 방송용 스트리밍 프로토콜 . MPEG 다중화 방식에 의해 패킷 스트림화된 것 .. 인터넷 상에서는 MPEG 다중화 스트림이 RTP 스트림 위에 또한 실릴 수 있음 . MPEG 스트림 종류 .. PS(Program Stream), TS(Transport Stream), ES(Elementary Stream), PES(Packetized Elementary Stream) 등 ㅇ 스트리밍 관련 프로토콜 - 인터넷 실시간 미디어 흐름 및 제어 관련 프로토콜 . 물리적 정보의 빠른 흐름 및 제어 : RTP(빠른 수송) / RTSP(수송 제어) . 스트리밍 재생 제어 : RTSP(RTP 스트림 전반에 대한 제어) - 디지털 방송용 . 비디오 압축 전송프로토콜 : MPEG-2, H.264 등 . 음성 압축 전송용 프로토콜 : MPEG-2 오디오, AC-3 등 ㅇ 멀티미디어 스트림 재생 Player 例) - RealNetworks社의 RealPlayer, MS社의 Windows Media Player, Apple社의 QuickTime 등 3. 프로그래밍 언어상의 스트림C 언어에서 스트림 - 연속된 문자 또는 데이터 . 크게 텍스트(바이트) 스트림 및 바이너리(이진) 스트림으로 구분 - `ANSI C` 의 표준 파일 스트림 例 : stdin, stdout, stderr 등 ㅇ 스트림 사용 이유 - 물리 디스크상의 파일,장치들을 통일된 방식으로 다루기 위한 가상적인 개념 . 따라서, 스트림은 어디서 나왔는지 어디로 가는지 신경을 쓸 필요없이 자유롭게 어떤 장치 및 프로세스, 화일들과 연결될 수 있어 프로그래머에게 많은 편리성 줌

http://blog.lifeis.gift/101


입/출력은 소스를 제공하는 입력이나 목적지로의 출력을 의미합니다. 스트림은 디스크 파일이나, 장치, 다른 프로그램들, 그리고 메모리 배열들과 같은 많은 종류의 소스들과 목적지들을 표시 할 수 있습니다. 

스트림은 간단한 바이트나 primitive 데이터 타입, 글자들의 모음과 객체들과 같은 많은 종류의 다른 데이터를 지합니다. 어떤 스트림들은 단순히 데이터를 넘겨주는 역할만 합니다. 또 다른 스트림들은 유용한 방법들로 데이터를 변형하고 가공합니다.

내부적으로 어떻게 스트림들이 작동하는지는 중요하지 않습니다, 모든 스트림들은 같은 단순한 모델을 스트림을 사용하는 프로그램으로 표시합니다. 스트림은 데이터들의 연속입니다. 프로그램은 input stream을 사용하여 한개의 데이터를 동시에 소스로 부터 읽어들입니다.



결론적으로 스트림의 메모리가 어떻게 잡히는 지 라던가, 어떤 원리 라던가 같은 내부 구조에 대한 내용은 찾을 수 없었다. 좀 더 찾아봐야할 듯..







'프로그래밍 > 프로그래밍 공부' 카테고리의 다른 글

스레드(Thread)의 기본적인 특성  (0) 2016.02.15
프로세스(Process) , 스케쥴링(Scheduling)  (0) 2016.02.15
스트림(Stream)이란  (0) 2016.02.05
압축  (0) 2016.01.28
statement란?  (1) 2016.01.27
DAO / VO / DTO란?  (2) 2016.01.27
Posted by GENESIS8

댓글을 달아 주세요

http://hellogk.tistory.com/32


MySQL 시퀀스 생성 및 초기화하기

MySQL의 경우 시퀀스 생성이 간단합니다.

테이블 생성 시 auto_increment라는 속성을 시퀀스로 지정해줄 컬럼에 적용만 해주면 됩니다.

예를들어보도록 하겠습니다.


auto_increment를 적용한 임시 테이블생성

CREATE TABLE sequence_table(
   seq int auto_increment primary key,
   title varchar(20)
)

위와같이 임의의 테이블을 생성해보았습니다.



코드를 보시면 seq 컬럼에 auto_increment라는 속성이 지정되어있습니다.

INSERT 문을 통해서 title 컬럼만 데이터 추가를 해주면 알아서 seq 컬럼에는 1씩 자동증가하는 넘버가 부여가 됩니다.



한번 데이터를 삽입해보도록 하겠습니다.


INSERT 데이터

insert into sequence_table(title)
values('제목1');
insert into sequence_table(title)
values('제목2');


실행결과






title 컬럼만 insert함으로써 seq컬럼에 자동으로 1씩증가되어 등록이 되었습니다.

하지만 현재 상태에서 모든 데이터들을 삭제를 한다음에 다시 insert 쿼리를 시도 하게 된다면 

seq컬럼에 insert되는 데이터는 3부터 등록이 되게 됩니다.



하다가 실수로 시퀀스 값을 대입해서 넣어서 이전 자료와 격차가 생겨버렸다던가 할 때

다음의 방법으로 고친다.


http://www.cyberpr.co.kr/community/community.php?act=v&bid=database&seq=1052


MySQL 자동증가, auto increment 값 초기화 하기

 

※ 경고
높이뜬새의 모르는 사람이 없는 팁시리즈 입니다.
이 팁시리즈는 지면낭비라는 항의시에 즉각 중단됩니다.


테이블 생성시에 아래와 같이 auto_increment 라고 지정해주면 그 컬럼(필드)는 
자동 증가 값을 가지게 되는데요..

create table test_table (
idx int NOT NULL auto_increment,
name varchar(255),
... 블라 블라,
... 블라 블라,
... 블라 블라,  
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=euckr;


가끔은 이놈을 초기화 시켜야 할때가 있습니다. 초기화 시키기 위한 꼬라
지는 아래와 같습니다.

ALTER TABLE [테이블명] AUTO_INCREMENT=[시작할려는 순서]


예) test_table의 자동증가를 1부터 시작하게 초기화 
ALTER TABLE test_table AUTO_INCREMENT=1 

'프로그래밍 > MySQL' 카테고리의 다른 글

MySql DB 작성해보기  (1) 2016.03.13
MySQL 저장 프로시져 내에서 발생한 에러 처리 (Error Handling)  (0) 2016.02.23
MySql 설치하기  (0) 2016.02.21
Auto Increment란  (0) 2016.02.05
MySql 주석을 달자  (0) 2016.02.01
MY SQL 데이터 타입  (0) 2016.01.21
Posted by GENESIS8

댓글을 달아 주세요