'Education/Operating System'에 해당되는 글 16건

  1. 2009.10.12 Trace of Process by 초상큼발랄 2
  2. 2009.10.07 HAL(Hardware Abstraction Layer) by 초상큼발랄
  3. 2009.10.07 프로세스 by 초상큼발랄
  4. 2009.10.06 운영체제 by 초상큼발랄
  5. 2009.09.10 1. 운영체재 개요 by 초상큼발랄
  6. 2009.09.04 운영체제 개요 by 초상큼발랄
프로세스의 Trace를 위한 추적 Utility

* ltrace(Library trace)
- strace보다 한단계 추상 수준을 높인 도구로 library call을 보여줌
- Dynamic libary link에 대해서만 추적이 가능
-> object file 내부에서 이뤄지는 자체적인 호출은 추적 불가능
[root@localhost Example]# vi hello.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 main()
  5 {
  6     FILE* fp;
  7
  8     printf("Hello World!\n");
  9
 10     fp =fopen("hello.c", "rw");
 11
 12     fclose(fp);
 13     exit(0);
 14 }


[root@localhost Example]# ltrace ./hello

__libc_start_main(0x8048464, 1, 0xbfb07104, 0x80484c0, 0x80484b0 <unfinished ...>
puts("Hello World!"Hello World!)                                              = 13
fopen("hello.c", "rw")                                                             = 0x812b008
fclose(0x812b008)                                                                  = 0
exit(0 <unfinished ...>
+++ exited (status 0) +++




[root@localhost Example]# vi hello1.c
  1 #include <stdio.h>
  2
  3 main()
  4 {
  5     printf("Hello World!\n");
  6
  7 }

[root@localhost Example]# ltrace ./hello1

__libc_start_main(0x80483b4, 1, 0xbfdb8bb4, 0x80483e0, 0x80483d0 <unfinished ...>
puts("Hello World!"Hello World!)                                          = 13
+++ exited (status 13) +++
*strace(System Call trace)

- 프로그램이 커널과 상호작용하는 모든 system call 내역을 보여줌
- 프로그램 규모가 커지면 strace 결과가 많아지므로 filtering해서 해석하는 방법 숙지
- system call을 많이 사용하지 않고 알고리즘 위주로 작성한 프로그램의 경우에는 strace로 추적해도 소용없음
- system call interface를 이용해 system call을 추적
- kernel에서 제공하는 system call은 개념상으로 일반적인 function call과 유사하지만 system call를 한 시점에서
kernel mode로 전환해서 실제 system call routine을 실행한다는 중요한 차이점



[root@localhost Example]# vi hello.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 main()
  5 {
  6     FILE* fp;
  7
  8     printf("Hello World!\n");
  9
 10     fp =fopen("hello.c", "rw");
 11
 12     fclose(fp);
 13     exit(0);
 14 }

[root@localhost Example]# gcc -o hello hello.c
[root@localhost Example]# strace ./hello

 <결과 화면>
execve("./hello", ["./hello"], [/* 34 vars */]) = 0
brk(0)                                  = 0x811e000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=137077, ...}) = 0
mmap2(NULL, 137077, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb8073000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300\2531\0004\0\0\0\304"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1803388, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb8072000
mmap2(0x304000, 1513768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x304000
mprotect(0x46f000, 4096, PROT_NONE)     = 0
mmap2(0x470000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16b) = 0x470000
mmap2(0x473000, 10536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x473000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb8071000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb80716c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0x470000, 8192, PROT_READ)     = 0
mprotect(0x300000, 4096, PROT_READ)     = 0
munmap(0xb8073000, 137077)              = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb8094000
write(1, "Hello World!\n"..., 13Hello World!)       = 13
brk(0)                                  = 0x811e000
brk(0x813f000)                          = 0x813f000
open("hello.c", O_RDONLY)               = 3
close(3)                                = 0
exit_group(0)                           = ?



[root@localhost Example]# vi hello1.c
  1 #include <stdio.h>
  2
  3 main()
  4 {
  5     printf("Hello World!\n");
  6
  7 }

[root@localhost Example]# gcc -o hello1 hello1.c
[root@localhost Example]# strace ./hello1


 <결과 화면>
execve("./hello1", ["./hello1"], [/* 34 vars */]) = 0
brk(0)                                  = 0x98cc000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=137077, ...}) = 0
mmap2(NULL, 137077, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f0e000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300\2531\0004\0\0\0\304"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1803388, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f0d000
mmap2(0x304000, 1513768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x304000
mprotect(0x46f000, 4096, PROT_NONE)     = 0
mmap2(0x470000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16b) = 0x470000
mmap2(0x473000, 10536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x473000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f0c000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7f0c6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0x470000, 8192, PROT_READ)     = 0
mprotect(0x300000, 4096, PROT_READ)     = 0
munmap(0xb7f0e000, 137077)              = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f2f000
write(1, "Hello World!\n"..., 13Hello World!)       = 13
exit_group(13)                          = ?


 

'Education > Operating System' 카테고리의 다른 글

Scheduling  (0) 2009.10.22
Scheduling(1)  (1) 2009.10.22
HAL(Hardware Abstraction Layer)  (0) 2009.10.07
프로세스  (0) 2009.10.07
운영체제  (0) 2009.10.06
Posted by 초상큼발랄
l

- 운영체제를 구성하는 한 부분으로 API처럼 사용
  (엄밀히 기술적인 면에서 분류를 하면 HAL은 device level에 있기때문에 API level보다는 하위구조)
- 컴퓨터의 물리적인 하드웨어와 컴퓨터에서 실행되는 소프트웨어 사이의 추상화 계층
- 추상적인 계층에서 하드웨어 서비스와 상호작용할 수 있게 해주는 프로그램 계층
- 운영체제의 커널이나 장치 드라이버로부터 호출
- OS 이식성 향상의 목적
  다른 아키텍처의 하드웨어마다에 HAL을 교환하는 것만으로 커널의 프로그램 코드 전부를 변경하지 않고도 OS를 이식가능

'Education > Operating System' 카테고리의 다른 글

Scheduling(1)  (1) 2009.10.22
Trace of Process  (2) 2009.10.12
프로세스  (0) 2009.10.07
운영체제  (0) 2009.10.06
1. 운영체재 개요  (0) 2009.09.10
Posted by 초상큼발랄
l

* Process( 프로세스) 정의
- 수행 중인 프로그램
- 컴퓨터 상에 수행 중인 프로그램의 인스턴스
- 처리기에 할당되어 수행 될수 있는 개체(Entity)
- 명령들의 순차수행, 현재 상태, 연계된 시스템 자원들의 집합등에 의해 특징지어지는 활동 단위( a unit of activity) 

cf) Process : 사용자 관점(동적 변화 상태)
     Task : CPU관점(작업 단위)


* 운영체제의 요구사항
- 적절한 응답시간을 제공하면서 처리기 이용률을 극대화 할 수 있도록 여러 프로세스 수행을 인터리빙한다.
인터리빙(interleaving): 복수 모듈이 효과적으로 작동되기 위해서는 메모리 모듈을 번갈아 가면서 접근하는 방법
인터리빙 기법에서는 메모리 모듈을 Bank라고 하며, 짝수와 홀수 Bank로 나누어 번갈아 검색
- 교착상태를 회피함과 동시에 특정정책에 부합하도록 자원을 프로세스에 할당한다.
IPC(Inerprocess Communication) 프로세스 간 통신과 사용자의 프로세스 생성을 지원하는데 도움,
공유 파일을 이용한 통신
파이프(특수 File을 이용한 Data 교환)
- Named Pipe
- Unnamed Pipe
˙ 세마포어(Semaphore)
- Countable Semaphore: 세마포어 값이 2이상인 경우
- Binary Semaphore: 세마포어 값이 0, 1인 경우
˙ 공유 메모리(Shared Memory)
˙ 메세지 큐(Message Queue)

* Process의 구성요소
- 식별자(Identifier): 각 프로세스를 구별해 주는 유일한 식별자
- 상태(State): 여러 프로세스 수행가능 상태에서 다른 프로세스는 중단된 상태일 경우를 대비해서 상태 정보 확인
- 우선 순위(Priority): 상대적인 우선순위, 긴급처리 요청시 처리 요구를 위함
- 프로그램 카운터(Program Counter): 다음에 수행될 명령어의 주소
- 메모리 포인터(Memory Pointer): 공유되는 프로세스의 메모리 블록들에 대한 포인터 포함 (가상M주소 + 물리M주소)
- 문맥 데이터(Context Data): 프로세스가 수행중일때, 처리기의 레지스터에 존재하는 데이터
- 입출력 정보(I/O Information): 미해결 입출력 요청, 프로세스에 할당된 입출력 장치, 프로세스에 사용중인 파일들의
리스트 등을 포함
- 어카운팅 정보(Accounting Information)

* PCB(Process Control Block): Process의 구성 요소를 포함하고 있는 자료구조
- 역할
˙ 프로세스 구성 요소들을 포함
˙ 운영체제로 하여금 다수의 프로세스를 지원하고 다중처리를 제송할 수 있게 해주는 주요 도구

< /include/linux/sched.h >
task_struct {
}


cf) Dispatch(디스패치): 처리기를 한 프로세스부터 다른 프로세스로 교체(

* Process 상태 전이


Running(수행): 현재 수행 중인 프로세스
Ready(준비): 수행될 준비가 되어있는 프로세스
Blocked/Waiting(블록/대기): 입출력 연산 완료 등과 같은 어떤 이벤트가 발생할 때까지 수행될 수 없는 프로세스 
New(생성):
방금 생성되었지만, 프로세스 풀(pool)로의 진입이 아직 허용되지 않은 프로세스,
새로운 프로세스는 자신의 프로세스 제어블록이 생성되었다고 할지라도 그 당시까지 주기억장치에 적재되지 않는다
Exit(종료): 프로세스 수행이 중지되거나 어떤 이유로 중단된 프로세스,
운영체제에 의해 수행가능 프로세스 풀에서 방출된 프로세스


'Education > Operating System' 카테고리의 다른 글

Trace of Process  (2) 2009.10.12
HAL(Hardware Abstraction Layer)  (0) 2009.10.07
운영체제  (0) 2009.10.06
1. 운영체재 개요  (0) 2009.09.10
운영체제 개요  (0) 2009.09.04
Posted by 초상큼발랄
l

운영체제

2009. 10. 6. 18:33 by 초상큼발랄

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


1.1 기본 구성
1) 처리기(processor) : 컴퓨터 동작을 제어, 데이터를 처리
처리기가 하나만 있을 경우 중앙처리장치(CPU)라고 부름
메모리와 데이터를 교환

- MAR(Memory Address Register) : 다음에 읽거나 기록할 메모리 내 주소를 명시
- MBR(Memory Buffer Register) : 메모리에 기록되거나 메모리로 부터 읽힐 데이터를 저장
- I/O Address Register
- I/O Buffer Register : 입출력 모듈과 처리기 간의 데이터 교환을 위해 사용

- 메모리 모듈 (Memory Module) : 일련 번호로 주소가 부여된 장소 공간
-> 이진수로 저장 : 명령어 또는 데이터로 해석
- 입출력 모듈 (I/O Module) : 외부 장치로부터 처리기와 메모리로 데이터를 전송
또는 역방향으로 데이터 전송
-> 데이터가 전달 될 때 까지 일시적으로 데이터를 보관하기 위한 내부 버퍼를 가짐
2) 주기억장치 (main memory) : 데이터와 프로그램을 저장
(1) 휘발성 (Volatile) : 컴퓨터가 shutdown 될 경우 메모리의 내용이 사라짐 <ㅡ> 디스크 내용은 유지
(2) 실기억장치(Real memory) 또는 주메모리 (Primary memory)라고 부름
3) 입출력 모드 (I/O module) : 컴퓨터와 외부 환경간의 데이터 이동 담당
(1) 보조기억장치(Secondary memory device)
(2) 통신 장비(Communications equipment)
(3) 단말기(Terminal)
4) 시스템 버스 (system bus) : 처리기, 주기억장치 그리고 I/O 모듈간의 통신 제공

1.2 처리기 레지스터
1) 사용자가 볼 수 있는 레지스터 (User-Visible Registers)
- 레지스터 사용의 최적화를 통해 기계어 또는 어셈블리어 프로그래머에게 주기억장치의 참조를 최소화 할 수 있게 함.
- 처리기가 수행하는 기계어를 통해 참조
- 레지스터의 유형
@ Data (데이터)
@ Address (주소) : 데이터나 명령어의 주기억장치 주소를 저장

 

2) 제어 및 상태 레지스터 (Control and Status Registers)
- PC(Program Counter) : 다음에 수행할 명령어의 주소를 저장
- IR(Instruction Register) : 현재 수행 중인 명령어를 저장
- PSW( Program Status Word) : 상태 정보를 저장하기 위한 레지스터 집합을 포함하도록 모든 처리기는 설계됨

조건코드(Condition codes) 
Flag 라고 불림
Bits set의 단위로 연산의 결과로서 처리기 하드웨어에 의해 설정
ex) 양수, 음수 또는 0, 오버플로우 결과를 만듬
명령어 수행 결과에 대한 피드백의 목적으로 사용

인터럽트(Interrupt enable/ disable)
여러 개의 인터럽트 레지스터를 제공하여, 각각이 인터럽트 처리 루틴에 대한 포인터 역할

Supervisor / User mode



Fetch stage : Instruction을 메모리로 불러들이는 과정, 명령어를 가져오는 과정 의미


1.3 명령어 수행
1) 명령어 처리 두 단계
(1) 메모리로 부터 한 번에 하나의 명령어를 읽어들임(fetch)
(2) 읽어 들인 명령어 수행


'Education > Operating System' 카테고리의 다른 글

Trace of Process  (2) 2009.10.12
HAL(Hardware Abstraction Layer)  (0) 2009.10.07
프로세스  (0) 2009.10.07
운영체제  (0) 2009.10.06
운영체제 개요  (0) 2009.09.04
Posted by 초상큼발랄
l
 


- System call iinterface : OS의 기능을 호츨하기 위해 사용되는 구조
사용자 모드를 kernel 모드로 전환 발생
- H/W의 메모리는 사용자에게 보이지 않는다 -> 실제 메모리(physical memory)는 감추고 모든 응용 프로그램이 각각 가상주소 0번지에서 시작하여 연속적인 메모리를 사용하는 것으로 느끼게 하는 것이다. 



* 운영체제: 응용프로그램의 수행을 제어하고 컴퓨터 사용자와 컴퓨터 하드웨어 사이의 interface 역할을 하는 프로그램
#기능
1. 사용자에게 편리한 환경 제공
2. 컴퓨터 시스템 자원이 효율적으로 동작 할 수 있도록 제어
# 요소
Processor
Memory
Main Memory
비휘발성
real memory 또는 primary memory 로 여겨짐 
Virtual Memory
만약에 32bits의 CPU를 사용한다면 실제 접근 가능한 Memory는 2^32 = 4G 만큼 사용 가능
          64bits system이라면 2^64bits memory 사용 가능
물리M 와 가상 M 는 다를 수도 있다. 사용자가 보는 관점에서는 가상 Memory를 본다.

MMU(Memory Management Unit) : 메모리 관리 
MMU table에서 가상 M와 물리 M를 Mapping 시켜준다. -> 가상M의 주소가 어떤 물리M의 주소인지 매치시킴
가상 메모리 주소   물리 메모리 주소
...   ...
   
   
< MMU Table>
Memory 속도가 늦어서 가급적 접근을 줄임 -> 그래서 cache($)라는 고속 메모리를 사용한다.

TLB(Translation Lookaside Buffer) : 변환 Memory의 주소 cache 


I/O Modules
System Bus
# 목적
편리성
효율성
발전성


@ Race condition : 한정된 자원(H/W, Resource)을 차지하려는 경쟁
다중 프로그래밍 시스템 또는 다중 처리기 시스템에서 두 명령어가 동시에 같은 기억 장소를 접근하려고 하는 상황
@ Muti Tasking : 동시에 여러 개의 processor(Application)이 수행하는 환경
@ SMP(Symmetric Multi Processor) : 한 개 이상의 processor가 장착되고 각 processor에 부하를 똑같이 분배 시킬 수 있는
운영체제가 구비된 컴퓨터 시스템
@ Hibration (동면 발생) : 노트북 사용시, 전원이 나가면 메모리의 데이터를 저장한 후, 전원이 나갔다가 다시 충전 후 데이터들을 메모리에 올려 사용 가능

'Education > Operating System' 카테고리의 다른 글

Trace of Process  (2) 2009.10.12
HAL(Hardware Abstraction Layer)  (0) 2009.10.07
프로세스  (0) 2009.10.07
운영체제  (0) 2009.10.06
1. 운영체재 개요  (0) 2009.09.10
Posted by 초상큼발랄
l