'이론'에 해당되는 글 18건

01 시스템 소프트웨어

 

시스템 소프트웨어는 시스템 전체를 작동시키는 프로그램이다. 프로그램을 주기억 장치에 적재시키거나 인터럽트 관리 장치 관리 언어어 번역등을 담당한다.

 

분류 - 제어프로그램, 처리 프로그램

 

제어프로그램 - 시스템 전체의 작동 상태 감시, 작업의 순서 지정, 작업에 사용되는 데이터 관리

 

작업 제어 프로그램 예) job scheduler(프그램 실행 순서 정하고 준비), master scheduler(사용자가 명령을 입력한 후 엔터누르면 마스터 스케쥴러가 명령 받아들여 명령에 대한 프로그램 찾아 실행)

 

처리프로그램 - 제어 프로그램의 지시를 받아 사용자가 요구한 문제 해결

 

ex) 언어 번역 프로그램, 서비스 프로그램

 

02 운영체제 개념

 

컴퓨터시스템의 자원관리

 

컴퓨터개론 파트 참고

 

03 운영체제 운용 기법

 

1) 일괄처리 시스템

 

일정량 또는 일정기간 동안 데이터를 모아서 한꺼번에 처리하는 방식이다.

 

2) 다중 프로그래밍 시스템

 

다중 프로그래밍 시스템은 하나의 CPU와 주기억장치를 이용하여 여러 개의 프로그램을 동시에 처리하는 방식이다.

 

3) 시분할 시스템

 

시분할 시스템은 여러 명의 사용자가 사용하는 시스템에서 주 컴퓨터가 사용자들의 프로그램을 번갈아가며 처리해 줌으로써 각 사용자에게 독립된 컴퓨터를 사용하는 느낌을 주는 것이다.

 

4) 다중 처리 시스템

 

여러개의 cpu와 하나의 주기억 장치를 이용하여 여러개의 프로그램을 동시에 처리하는 방식

 

5) 실시간 처리 시스템

 

실시간 처리 시스템은 데이터 발생 즉시, 또는 데이터 처리 요구가 있는 즉시 처리

 

6) 분산 처리 시스템

 

여러 개의 컴퓨터를 통신 회선으로 연결하여 하나의 작업을 처리하는 방식이다.

 

 

04 컴파일러와 인터프리터

 

저급언어 - 기계어, 어셈블리어(기게어와 1:1로 대응되는 기호)

 

고급언어(컴파일러 언어) 

 

1) 컴파일러와 인터프리터

 

- 컴파일러

 

컴파일러는 고급언어로 작성된 프로그램 전체를 목적 프로그램으로 번역한 후 링킹작업을 통해 컴퓨터에서 실행 가능한 실행 프로그램을 생성한다.

 

- 인터프리터

 

인터프리터는 고급 언어로 작성된 프로그램을 한 줄 단위로 받아들어 번역하고 실행.

 

05 어셈블리어와 어셈블러

 

1)어셈블리어 개요

 

사용자가 이해하기 어려운 기계어 대신에 명령기능을 쉽게 연상할 수 있는 기호를 제공

 

어셈블리어 명령어 형식은 Label OP Operand 로 구성(명령코드, 피연산자)

 

Label은 데이터를 기억할 기억장소, 또는 분기할 위치, 기호 상수 등에 대한 기호를 기술하는 부분

 

2) 어셈블러와 어셈블 과정

 

어셈블러는 어셈블리어로 작성된 원시 프로그램을 기계어로 된 목적프로그램으로 어셈블하는 언어 번역 프로그램이다

 

 

06 매크로의 개념 및 특징

 

* 매크로는 프로그램 작성 시 한 프로그램 내에서 동일한 코드가 반복될 경우 반복되는 코드를 한 번만 작성하여 특정 이름으로 정의한 후 그 코드가 필요할 때마다 정의된 이름을 호출하여 사용하는 것이다.

 

* 매크로는 문자열 바꾸기와 같이 매크로 이름이 호출되면 호출된 횟수만큼 정의된 매크로 코드가 해당 위치에 삽입되어 실행된다.

 

* 사용자의 반복적인 코드 입력을 줄여준다.

 

07 컴파일러 링커 로더

 

컴파일러 - 고급언어를 컴퓨터가 인식할 수 있도록 기계어로 번역된 목적파일로 바꿔주는 것

링커 - 목적파일을 실핼가능 한 파일로 만들어 주는 프로그램

링킹 - 이때 여러개의 목적파일을 하나의 파일로 합치는 작업을 수행하여 실행프로그램을 만든다

로더 - 실행프로그램을 주기억 장치에 로드해서 실행하게 한다.

 

 

 

 

 

'이론 > 운영체제' 카테고리의 다른 글

데이터 통신 개요  (0) 2015.09.28
파일과 파일 시스템  (0) 2015.09.27
기억장치 관리  (0) 2015.09.27
프로세스 개요  (0) 2015.09.26
운영체제 개요  (0) 2015.09.26
운영체제 3학년 최종 텀프로젝트.  (0) 2015.03.19
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

01 프로그래밍 언어 구문의 정의

 

 

BNF 표기법

 

규칙 1 : <식별자> :: = <영문자> | <식별자><영문자> | <식별자><숫자>

규칙2 : <영문자> ::= A | B | C | ... | Y | Z

규칙3 : <숫자> ::= 0 | 1 | 2 | ... | 8 | 9

 

규칙 1 : <배정문> ::= <식별자> = <식>

규칙 2 : <식> ::= <식>+ <식> | <식> - <식> | <식별자> | <수>

규칙 3 : <식별자> ::= <영문자> | <식별자><영문자> | <식별자><숫자>

규칙 4 : <수> ::= <수><숫자> | <숫자>

규칙 5 : <영문자> ::= A | B | C ... | Y | Z

규칙 6 : <숫자> ::= 0 | 1 | 2 ... | 8 | 9

 

 

<배정문>

<식별자> = <식>

<식별자><영문자> = <식>

<영문자><영문자> = <식>

<영문자><영문자> = <식>-<식>

<영문자><영문자> = <식별자> - <식>

<영문자><영문자> = <영문자> - <식>

<영문자><영문자> = <영문자> - <수>

<영문자><영문자> = <영문자> - <숫자><숫자>

A<영문자> = <영문자> - <숫자><숫자>

AA = <영문자> - <숫자><숫자>

AA = B - 2<숫자>

AA = B - 20

'이론 > 컴퓨터개론' 카테고리의 다른 글

프로그래밍 언어  (0) 2015.09.26
운영체제  (0) 2015.09.26
컴퓨터 구조  (0) 2015.09.26
부울대수 논리회로  (0) 2015.09.26
수의체계  (0) 2015.09.26
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

01 운영체제 개요

 

1) 운영체제 시작

 

컴퓨터가 부팅되면 ROM에 저장된 바이오스라는 프로그램이 실행되고 바이오스는 하드웨어 장치의 상태를 검사한 후 보조기억장치의 부트섹터에 저장된 부팅 프로그램을 주기억 장치로 이동시킨다.

 

부팅 프로그램은 보조기억장치의 운영체제를 주기억장치로 이동시키고 운영체제의 첫 번째 명령어가 실행되도록 분기한다.

 

2) 운영체제 기능

 

컴퓨터 시스템의 자원관리  - 1.프로세스 관리(스케쥴링 등) 2. 주기억 장치 관리 3. 파일관리

 

 

02 프로세스 관리

 

프로세스는 주기억장치에 있으며 하드웨어르 동작시키는 능동적인 존재.

 

1) 프로세스 제어블록

 

프로세스는 PCB라는 프로세스 제어블록을 가진다.

 

임의의 프로세스가 생성되면 이 프로세스의 정보를 저장하는 새로운 프로세스 제어 블록이 생성되고 이 프로세스가 종료될때 같이 사라진다.

 

2) 프로세스의 상태

 

프로세스 상태에 대한 이미지 검색결과

 

 

2) 문맥전환(context swithing)

 

- 프로세스가 종료된경우

-> 다른 프로세스의 제어블록이 준비큐의 가장 앞에 위치하게 된다. B의 PCB의 일부 정보가 cpu의 레지스터에 저장된다.

 

- 프로세스가 cpu를 오래 차지하고 있는 경우

-> 프로세스A를 멈춰 준비상태가 되게 하고 프로세스B의 제어블록을 준비큐의 가장 앞에 위치시킨다. 중앙처리장치의 일부 레지스터에 저장되어 있는 프로세스A의 정보를 프로세스A 제어 블록으로 저장하고 , 프로세스 B의 프로세스 제어 블록의 일부 정보를 중앙처리장치의 레지스터에 저장한다.

 

-   프로세스A에 디스크 입출력 명령이나 sleep 명령이 발생한 경우

-> 준비 큐에서 제거하여 대기큐로 보내고 준비 상태에 있는 한 프로세스를 실행하게 한다.

 

3) 프로세스 스케쥴링

 

- FCFS

 

먼저 도착한 프로세스를 먼저 서비스하는 방법이다.

 

- SRT(선점형 SJF)

 

현재 실행중인 프로세스의 남은 시간과 준비상태 큐에 도착한 프로세스의 실행시간을 고려하여 가장 짧은 실행시간을 요구하는 프로세스에게 cpu를 할당 

 

- SJF(비선점형 SJF) Shortest Job First

 

현재 실행중인 프로세스의 남은 시간(버스트 시간) 중 가장 짧은 프로세스에게 cpu 할당하고 준비큐에 새로운 프로세스가 도착하여도 현재 진행중인 작업을 끝낸다.(비선점)

 

- RR

 

시간 할당량 동안 중앙처리장치를 할당받아 실행된다.

 

- Priority

 

우선 순위가 가장 높은 프로세스에게 cpu를 할당한다.

 

기아현상이 문제가 될수 있으므로 에이징기법을 사용해 해결한다.

 

에이징 - 일정 시간 동안 실행되지 않으면 우선순위를 한 단계씩 높이는 방법이다.

 

 

 

03 주기억장치 관리

 

주기억장치는 1. 현재 실행중인 프로그램과 2. 이 프로그램이 필요로 하는 데이터를 일시적으로 저장하는 장치이다.

 

 

1) 단순한 구조의 주기억장치 관리

 

단일 연속 주기억장치 관리

 

주기억장치에 운영체제 외에 한개의 사용자 프로그램만 저장하는 관리 기법.

 

분할 주기억장치 관리

 

대부분의 시스템은 단일 프로그래밍이 아니라 다중 프로그래밍 방식으로 동작하여 여러개의 프로세스를 주기억장치에 저장해서 동작시킨다.

 

운영체제 이외에 영역을 분할하여 프로세스를 저장한다.

 

이때 새롭게 생성된 프로세스를 주기억장치에 할당하려면 세가지 방식을 사용한다.

 

할당방식 - 최초 적합, 최적 적합, 최악 적합

 

2) 가상메모리

 

실행될 프로그램이 주기억장치 보다 크거나 여러 개인 경우에는 주기억장치 공간의 부족으로 인해 프로그램이 제대로 실행되지 못할 수 있다.

 

-> 당장 실행에 필요한 부분만 주기억 장치에 저장하고 나머지는 보조기억장치에 두고 동작하도록 하여 문제해결.

 

프로그램을 일정한 크기의 페이지로 나누고 페이지단위로 주기억장치에 올리며 동작하는 페이징을 구현한다.

 

3) 페이징

 

가상 메모리(보조기억장치, 하드또는 ssd) 공간을 일정한 크기의 페이지로 나누어 관리하는 방법으로 주기억장치의 페이지에 해당하는 부분을 페이지 프레임이라고 한다.

 

각 페이지가 주기억장치의 어느 프레임에 저장되는지를 나타내는 테이블을 운영체제가 관리하는데, 이를 페이지 테이블이라고 한다.

 

 

4) 페이지 교체 알고리즘

 

새로운 페이지를 주기억장치에 저장할 때 비어있는 프레임이 없으면 새로운 페이지를 저장하기 위해 주기억장치에서 제거할 페이지를 결정해야 한다. 이렇게 제거할 페이지를 결정하는 동작을 페이지 교체라고 한다.

 

- FIFO

 

가장 먼저들어온 페이지를 제거

 

- LRU(Least Recently Used)

 

가장 오랫동안 사용되지 않았던 페이지를 선택해서 제거하는 기법

 

- LFU(Least Frequently Used)

 

가장 사용 빈도가 낮은 페이지를 선택해서 제거하는 방법.

 

 

04 파일관리

 

 

1) 윈도우의 파일시스템

 

FAT, NTFS

 

- FAT

 

시스템영역과 데이터영역으로 구분하고 시스템영역은 부트레코드, FAT, 루트디렉토리로 구성된다.

 

시스템영역 설명

 

* 부트레코드는 컴퓨터를 처음 켰을때 동작하는 프로그램을 저장하고 있는 영역 운영체제를 주기억장치로 올리는 역할.

 

* FAT 은 데이터영역의 어느 부분이 사용되고 있는지의 여부를 나타낸다.

 

* 디렉토리는 디스크에 저장된 파일들에 대한 정보를 보관하는 장소이다.

 

데이터영역 설명

 

* 클러스터로 나누어진다.

 

저장방법

 

디렉토리 아래에 파일이나 디렉토리를 생성하고 클러스터에 용량에 해당하는 만큼 배정한다.

FAT 테이블에는 클러스터 번호를 저장하고 파일의 끝이면 대응되는 FAT 테이블 클러스터 번호에는 끝을 의미하는 값을 저장한다.

 

2) 유닉스 파일시스템

 

부트블록, 수퍼블록, inode List, 데이터블록 으로 구성된다.

 

* 부트블록 : 운영체제를 주기억장치에 올리는 역할을 하는 프로그램이 들어있다.

 

* 수퍼블록 : 디스크에 대한 다양한 정보를 저장(inode 리스트 크기, 사용중인 블록수)

 

* inode_List : inode들을 모아놓은 곳이다. 한 블록에 여러개의 inode를 저장하고 있다.

 

* 데이터블록 : 일반적인 파일과 디렉토리 그리고 간접블록을 저장하는 영역이다.

 

- inode

 

파일 및 디렉토리에 대한 다양한 정보를 저장하는 곳으로 파일마다 하나씩 부여된다.

 

저장정보 : 파일형식, 접근권한, 10개의 직접 블록포인터, 간접블록 포인터(단일,이중,삼중)

 

- 저장방법

 

A디렉토리 아래에 B파일을 생성하고 데이터블록에 B 파일 블럭을 생성하고 B 파일의 정보를 inode에 저장한다.

그리고 A디렉토리에 B파일의 이름과 inode번호를 저장하고 B파일 블럭에는 . ..과 해당하는 inode번호를 저장한다.

 

파일의 크기가 큰 경우에는 직접블록포인터 10개로 할당된 모든 데이터블록을 가리킬 수 없으므로 간접 블록포인터를 이용하여 데이터블록에 할당된 간접블록을 가리키게 하고 간접블록에 포인터를 저장한다.

 

 

 

 

 

 

 

 

 

'이론 > 컴퓨터개론' 카테고리의 다른 글

프로그래밍 언어  (0) 2015.09.26
운영체제  (0) 2015.09.26
컴퓨터 구조  (0) 2015.09.26
부울대수 논리회로  (0) 2015.09.26
수의체계  (0) 2015.09.26
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

01 하드웨어 구성

 

1) 중앙처리장치(cpu)

 

제어장치 연산장치 레지스터로 구성

 

제어장치 - 명령어 해석, 동작 지시

연산장치 - 산술연산, 논리연산 ALU

레지스터 - 명령어, 데이터, 연산결과 저장

 

 

명령어 처리 3단계

 

fetch - decode - execute

 

2) 레지스터

 

범용 레지스터 - 연산 관련 데이터 저장

특수 목적 레지스터 1. 프로그램 카운터 - 다음 실행 명령어 주기억장치 주소 저장

                             2. 명령어 레지스터 - 현재 실행 중인 명령어를 저장한다.

                             3. 스택 포인터 - 스택의 주소

 

 

3) 주기억장치

 

 

중앙처리 장치와 사이의 버스

 

1. 주소버스 - 주기억장치의 어느 위치에서 데이터를 읽을지 쓸지

2. 데이터버스 - 주기억장치로 부터 읽거나 쓸 데이터

3. 제어버스 - 읽을지 쓸지

 

 

02 프로그램 명령어

 

명령어 종류 - 1.데이터 전송 명령어 2. 연산 명령어 3. 분기 명령어

 

1) 데이터 전송 명령어

mov A B - b의 값을 a로 전송

push ax - 레지스터 ax에 저장된 값을 스택에 삽입

pop bx - 스택 포인터 값을 1감소시키고 스택의 데이터를 bㅌ에 저장

 

 

2) 연산 명령어

 

add ax bx - ax bx 레지스터 값 더해 ax에 저장

and ax bx - ax bx 를 and 논리연산 후 ax에 저장

cir ax 2 - ax를 오른쪽으로 2비트 순환 시프트(오른쪽에서 빠져나간 비트를 왼쪽에 위치시킴) 하고 ax에 저장

shr ax b - ax를 오른쪽으로 b이동 하고 왼쪽의 비는 곳에 0 저장

 

 

3) 분기 명령어

 

jump 100 - 주기억 장치 주소 100으로 분기하는 명령어

call 100 - pc에 저장되있는 주소를 스택에 저장하고 다른 위치로 분기하는 명령어 다른 위치로 분기하여 실행이 끝나 Return 값을 만나면 스택에 있는 주소를 다시 불러와 그곳부터 실행한다.

 

 

 

03 프로그램 실행동작

 

요약

1) 주소버스에 프로그램 카운터에 저장된 값을 보내고 제어버스에 읽기 제어 신호를 보낸다.

2) 프로그램 카운터 값을 증가 시킨다 (fetch)단계

3) 제어 장치는 IR레지스터를 해독하여 (decode)

4) 해당 명령어 동작을 제어버스 데이터버스 주소버스를 이용해 실행한다.

 

 

주기억장치는 저장된 정보를 관리하기 편하고 각 위치를 구분하기 위해 바이트 또는 워드 단위로 분할해 주소를 할당한다.

 

프로그램 명령어는 명령코드와 피연산자 부분으로 이루어진다.

 

 

 

 

 

 

 

 

 

 

 

 

'이론 > 컴퓨터개론' 카테고리의 다른 글

프로그래밍 언어  (0) 2015.09.26
운영체제  (0) 2015.09.26
컴퓨터 구조  (0) 2015.09.26
부울대수 논리회로  (0) 2015.09.26
수의체계  (0) 2015.09.26
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

1) 중요한 부울대수 법칙

 

(A+B)+C = A+(B+C)

(A*B)*C = A*(B*C)

 

 

A*(B+C) = A*B+A*C

A+(B*C) = (A+B)*(A+C)

 

이다. 이외에 드모르간 법칙도 성립 하는데 + ->* ,*->+로 바뀜

 

 

2) 게이트

 

xor,nor등  생략

 

3) 논리회로

 

반가산기는 바로 아랫자리 연산에서 발생한 자리 올림수는 처리하지 못한다.

자리올림수 비트를 고려하여 입력이 3개인 가산기를 전가산기라고 한다.

 

 

'이론 > 컴퓨터개론' 카테고리의 다른 글

프로그래밍 언어  (0) 2015.09.26
운영체제  (0) 2015.09.26
컴퓨터 구조  (0) 2015.09.26
부울대수 논리회로  (0) 2015.09.26
수의체계  (0) 2015.09.26
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

01 진수변환

 

1) 다른 진수의 10진수로의 변환

 

ex) 27.42(8진수) = 2*8^1 + 7*8^0 + 4*8^-1 + 2*8^-2

 

2) 10진수의 다른 진수로 변환

 

소수점 윗자리는 진수로 계속 나누어 나머지를 구해내고 소수점 아래 자리는 진수를 곱하여 캐리를 구해서 알아낸다.

 

3) 2진수의 2^n 진수로 변환

 

소수점을 기준으로 n자리씩 묶어 변환한다.

 

4) 2^n진수의 2진수로의 변환

 

소수점을 기준으로 n자리씩 풀어준다.

 

   A     1    .   6(16진수)

1010  0001   0110

 

5) p진수를 q진수로 변환하기

 

p진수를 10진수로 변환하고 다시 10진수를 q진수로 변환한다.

 

 

 

02 컴퓨터 문자표현

 

 

1) ASCII

 

아스키코드 - 7비트를 기준으로 문자표현 128개의 문자 표현가능.

 

2) 유니코드

 

문자를 16비트로 표현하므로 최대 65536자 표현가능

 

3) 텍스트 압축

 

- 런렝스 코딩 -> 반복문자*탈출문자*반복횟수 

 

- 허프만 코딩

 

 

 

 

 

03 컴퓨터 정수표현

 

1) 2의보수

 

컴퓨터에서 정수를 표현하는 대표적인 방법은 2의 보수이다.(컴퓨터구조 페이지에 자세한 설명)

 

5-> 0101 -> 0은 1로, 1은 0으로 변환 -> 1010 - > 1을 더함 -> 1011

 

최상위 비트는 부호비트이다.

 

4비트인 경우에 표현할 수 있는 최대값은 2^3-1 최소값은 -2^3 이다

 

즉 -2^(n-1) ~ 2^(n-1)-1 표현가능

 

 

2) 정수의 덧셈과 뺄셈

 

음수인 경우에 2의 보수로 표현해서 더해주면 된다

 

그런데 30000 + 30000 인경우에는 2의 보수로 표현하고 더하면 이상한 값이 나오는데 표현할 수 있는 최대값을 넘었기 때문이다

 

이런 오류를 오버플로우라고 한다.

 

 

 

03 컴퓨터 실수 표현

 

 

 

1) 가수(mantissa), 밑수(radix), 지수(exponent) 3개의 부분으로 이루어진다.

 

m*r^e

 

-0.001101*2^2   -> -1.101*2^-1   (정규화)

 

지수 -1 인데 바이어스된 지수를 써야하므로 127 더해준다

 

cf. 바이어스된 지수를 쓰는 이유는 음의 지수를 나타내기 위함이다 .

 

-1+127 = 126

 

따라서 실수표현은

 

1                01111110   101000000000000000000000 이다.

최상위비트  지수(126)   가수

 

 

2) 실수 덧셈 뺄셈

 

작은 지수를 큰 지수에 맞춰 통일하고 가수를 더하고 정규화 시킨다.

 

이때 가수 부분의 자리가 부족해 가수의 일부분이 절단되는 오류를 라운드 오프 오류라고 한다.

 

 

 

 

'이론 > 컴퓨터개론' 카테고리의 다른 글

프로그래밍 언어  (0) 2015.09.26
운영체제  (0) 2015.09.26
컴퓨터 구조  (0) 2015.09.26
부울대수 논리회로  (0) 2015.09.26
수의체계  (0) 2015.09.26
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

 

컴퓨터에서 음수 양수를 구별 하기위해 최상위 비트=MSB를 부호비트로 쓰는것이다.

최상위 비트가 0이면 양수, 1이면 음수로 표현 한다.
 

0001은 1, 1001은 -1

여기엔 문제가 있다.

2진수의 계산이 힘들어 진다는 것이다.

 1001 + 0001 = 1010

 (-1)    (1)    (0 이어야 함)
 

의미상으로 는 0000이나와야 하나 실제는 다르게 나온다
 

이 것을 해결하기 위해 나온것이 1의 보수이다.


1의 보수란, 음수 표현시에 0을 1로, 1을 0으로 바꿔주는 것
 

1의 보수로 표현하자면,

0001은 1, 1110은 -1이 된다.

계산을 다시 해보면
 

1110 + 0001 = 1111

 (-1)   (1)    (0이어야 함)


 

계산 해보면 0000이 아닌 1111이 나왔다.

이렇게 나오는 이유는 1의 보수가 1111,0000의 두가지 의 영을 갖기 때문이다.(이것이 1의 보수의 문제점)


 

1101 + 0001 = 1110

(-2)      (1)      (-1)

계산이 맞다.


 

1의 보수의 문제점을 해결 하기 위해 나온것이 2의 보수이다.

2의 보수란 0을 1로, 1을 0으로 모두 바꿔준후에 1을 더하는 방법이다.

0001은 1, 1111은 -1이된다.


 

다시 계산해 보면
 

1111 + 0001 = 10000

(-1)   (1)      (0이어야 함)
 

의 결과 가 나오는데 이 값은 맞게 된다. 최상위 비트가 1이지만 범위를 벗어났기 때문에

무시하기 때문이다. 따라서 0000 => 0이 된다.
 

1의 보수나 2의보수 는 감산기가 필요 없이 더하기만으로 뺄셈이 가능하다.

1의 보수는 결과에 캐리가 발생시 캐리값을 연산해주어야 한다.

그에 반해 2의 보수는 발생한 캐리를 무시 하기때문에 다른 처리를 할필요 가 없다.


쉽게 2의 보수를 표현하는 방법으로는 밑의 13을 예로 들면
오른쪽에서 왼쪽으로 가는도중 최초로 나오는 일까지 그대로 써주고 나머지는 보수를 취해주면
2의보수가된다.


<컴퓨터가 보수를 쓰는이유>

보수를 쓰는 이유는 컴퓨터가 (-)라는 개념이 없기 때문이다.

컴퓨터가 인식할 수 있는 것은 전기가 들어왔다(ON)전기가 나갔다(OFF)이것만 인식이

가능한데 음(-)이라는 개념은 컴퓨터에서 인식할수 없기 때문에 보수를 씁니다

1의 보수는 0이라는 개념이 없을때는 그냥 사용해도 좋으나

0의 개념이 들어갈 경우 1의 보수로 한다면 (+)0과 (-)0이 나오게 됩니다

분명히 0은 하나밖에 없는데 음, 양의 개념으로 나뉜다면 컴퓨터가 오작동 합니다

이를 방지하기 위해 2의 보수를 사용합니다.

2의 보수는 0의 개념이 단 하나로 지정되기 때문에 컴터가 오작동 할 이유가 없죠

그냥 쓰실때는 1의 보수도 괜찮으나

0의 개념을 쓰실경우는 2의 보수를 이용하여 사용하시는게 낫죠

결론은

음수 계산 및 기타 계산은 1의 보수 또는 2의 보수 둘 다 사용이 가능하지만

0의 개념을 하나로 통합하여 사용하기 위해서는

2의 보수를 사용하는게 좋다.

 

'이론 > 컴퓨터구조' 카테고리의 다른 글

2의 보수를 쓰는이유와 2의 보수 표현법  (2) 2015.05.29
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요

고생 끝에 FAT방식의 파일시스템을 c언어 기반으로 제작하였다.


제작과정에서 문제점과 해결방안을 남긴다.

1. 처음에 파일시스템을 설계할 때 파일이 지워지면 디렉토리의 압축뿐만 아니라 FAT의 압축도 함께 일어나도록 하였다. 하지만 이렇게 되면 처음에 파일을 생성하고 지울 때 는 쉬울지 몰라도 디렉터리를 여러개 생성하고 그 디렉터리 안에 파일이 있는 경우 FAT에 여기저기 흩어져 있을 것이므로 매우 FAT을 재정렬하는 문제는 매우 어렵게 된다. 따라서 fragmentation을 허용하고 다시 파일이나 디렉토리가 생성될 때 fragmentation을 재활용하는 방식으로 수정하였다.

2. create_file 함수를 작성할 때 /* last_sector = 이 디렉토리의 맨 마지막 섹터*/

라는 주석을 보고 이해가 전혀 되지 않았다.

또한 while (FAT[last_sector] != (unsigned short)~0) 이해할 수 없었다.

많은 고민 끝에 last_sector는 현재 디렉토리에서 확장된 디렉터리의 섹터를 나타내는 것으로 보았다. 또한 (unsigned short)~0부분은 처음에 실행하여도 무한 루프를 돌았 다. 이것은 논리적으로 전혀 이해가 안되었고 (unsigned short)0으로 수정하였다.

이렇게 수정하면

while (FAT[last_sector] != (unsigned short)0) {

//(unsigned short)~0에서->(unsigned short)0으로 변경해야 확장된 디렉토리로 넘 어갈 수 있습니다.

last_sector = FAT[last_sector];

}

이러한 코드의 의미는 확장된 다음섹터로 넘어가는 의미가 된다.

3. write_file을 구현 할 때 mini_sh에서 루프를 돌면서 사이즈를 512씩 잘라서 넘겨준다.

이러한 방법도 좋지만 create_file함수에서 매개변수 f_size를 하나를 추가하여 아예 처음 파일을 생성할 때 파일의 속성에 사이즈를 설정하고 오픈파일 테이블에 복사해서 그것을 write_file이 이용하도록 변경하였다. 이렇게 되면 mini_sh의 루프도 사라지고 size를 한번에 넘겨주게 된다.

 

//fs_createfile함수에 파라미터를 추가하였다.

//예를 들어mkfile a 2000 이라고 쉘에 입력하면

//사이즈2000fs_createfile의 파라미터로 전달된다.

int fs_createfile(char *name,int f_size)

 

//파라미터로 전달된 파일의 사이즈를 할당해준다.

ep->size = f_size

//오픈파일 테이블에 복사한다.

open_file_table[fid].size= ep->size;

 

그리고 wrtie_file함수를 쓴다.(위의 3.알고리즘 참조).

 

 

4. remove_file함수를 만들 때 FAT을 변경하는 부분을 만드는 알고리즘을 구현하기가 어 려웠다. 또한 파일의 수가 8개의 n배수였다가 n-1배수로 변경되는 순간 디렉토리를 압 축하는 것도 상당히 애를 먹었다. FAT을 변경하는 것은 파일의 첫 번째 섹터로부터 while문을 따라가며 구현하는 알고리즘을 만들었고 디렉토리를 압축하는 것은

//확장된 디렉토리를 축소하는 함수이다.

void curtail_directory(int files_in_dir,int pre_sector) 이러한 함수를 구현함으로써

해결하였다. 인자에 pre_sector을 받음으로 FAT에서 현재 확장된 디렉토리 이전의 디 렉토리의 섹터를 구해내고 이를 수정하고 현재디렉토리도 함께 수정하는 방식.

 

//파일의첫번째섹터를index로받는다.

index=ep->first_sector;

 

/*FAT 테이블에서 삭제할 부분을 수정한다.

FAT연결고리를 따라가면서 수정한다.*/

while(FAT[index]){

int copy_index=index;

index=FAT[index];

FAT[copy_index]=(unsigned short)~0;

}

FAT[index]=(unsigned short)~0;

 

if((files_in_dir-1)%8==0){//파일의 개수가 8개의 배수가 되는 순간 다시 디렉토리를 축소시켜야한다.

curtail_directory(files_in_dir,cur_dir);//curtail_directory함수이용!

}

5. fs_rmdir을 구현할 때 디렉토리를 삭제하면 디렉토리 안의 파일을 추적하면서 파일을 삭제해주어야 한다. 이 부분은 구현할 수 있었다. 하지만 디렉토리안의 디렉토리는 어 떻게 해결할지 막막했다. 디렉토리안의 디렉토리가 있고 그안에 디렉토리가 있고 계속 있을텐데 이 디렉토리들 안의 파일들까지 다 제거하려면 어떻게 함수를 구현해야 하 는가? -> 재귀함수를 통하여 해결하였다. remove_directory 라는 함수를 통하여 현 재 디렉토리안의 파일과 디렉토리를 추적해나가면서 디렉토리이면 그 디렉토리의 첫 번째 섹터를 다시 remove_directory의 인자로 전달하여 recursive하게 계속 call하 도록 하였다.

6. fsck 파일일관성 검사를 inode가 없는 FAT파일 시스템에서 어떻게 구현해야 할지 고 민했다. 두가지 방식으로 파일 일관성 검사를 진행 하도록 하였다.

1. 블록검사

FAT할당테이블을 보고 사용중인 테이블은 BLOCK_IN_USE 배열에 1로 표시하고 사용중이지 않은 테이블은 FREE_BLOCK 배열에 1로 표시한다. 이 때 두 배열중 에 어느 하나는 1이고 어느 하나는 0이여야 한다. 이는 두 배열의 같은 위치의 원 소를 더해서 값이 1이 되는지 확인 함으로써 해결가능하다.

2. 파일검사

디스크를 읽어서 파일의 개수를 알아내고 이는 파일,디렉토리 생성삭제시 카운트되는 변수 fd_number와 비교된다. 이 두 값이 같으면 일관성이 있는 것이고 같지 않으면 파일시스템 오류이다.

 

7. log_area 구현

로그에 실행할 연산 정보를 기록하는 것까지는 문제가 없었다. 하지만 파일시스템이 크러쉬되고 다시 실행 됬을 때 로그정보 뿐만 아니라 전에 만들었던 파일 및 디렉토 리가 모두 복구가 되어야지 만이 로그에 저장된 삭제연산이 가능하다. 그런데 파일 및 디렉토리를 모두 복구하는 것은 종료하기 전에 이 시스템의 FAT정보와 디스크정보를 모두 파일로 남겨야 함을 뜻한다. 처음에는 atexit 함수를 통하여 종료할 때 파일로 정보를 남기도록 하고 다시 실행하면 복구가 되도록 하였다. 하지만 이렇게 하면 크러 쉬가 될 때 atexit는 실행되지 않으므로 이전의 파일 디렉토리 정보가 저장이 안된다. 크러쉬 될 때 실행되는 함수를 정의할 수 있는 함수는 없었다. 따라서 log정보만 파일 로 기록하고 파일시스템이 크러쉬되고 재부팅 될 때 파일로부터 로그정보를 읽고 실 행되지 않은 연산이 있으면 무효화 하는 것으로 하였다.  


파일시스템.hwp


'이론 > 운영체제' 카테고리의 다른 글

데이터 통신 개요  (0) 2015.09.28
파일과 파일 시스템  (0) 2015.09.27
기억장치 관리  (0) 2015.09.27
프로세스 개요  (0) 2015.09.26
운영체제 개요  (0) 2015.09.26
운영체제 3학년 최종 텀프로젝트.  (0) 2015.03.19
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요