반응형



 

 

 

 

 

 

0. 프로세스는 다음의 순서로 자원을 이용한다.

자원 요청 -> 사용(점유) -> 해제

 

1. 교착 상태란?

: 프로세스에 의해 발생할 사건(Event)을 프로세스들이 서로 기다리고 있는 상태이다.

둘 이상의 작업이 보류 상태에 놓여 자원을 이용하기 위해 서로 기다린다.

 

 

 

 

 

 

 

 

2. 교착 상태 발생의 네가지 조건

1) 상호배제 : 한 번에 한 프로세스만 해당 자원을 사용할 수 있어야 한다.

2) 점유와 대기 : 최소한 자원 하나를 보유하고, 다른 프로세스에 할당된 자원을 얻기 위해 기다리는 프로세스가 있어야 한다.

3) 비선점 : 자원을 갖에로 빼앗을 수 없다.

4) 순환대기(환형대기) : 교착상태를 따라가면 원이 만들어진다.

 

 

 

 

-> 이 중 하나라도 발생하지 않으면 교착 상태가 발생하지 않는다 !

 

 

 

 

 

 

2. 자원 할당 그래프, G = (V, E)

 

V = 정점들의 집합 (시스템 내의 모든 자원 R 과 프로세스 P )

E = 간선들의 집합( 요청 / 할당 간선 )

 

 

ex 1)

 

 

 

 

-> P1은 R2를 보유하고 있고, R1을 기다리고 있다.

-> P2는 R1을 보유하고 있고, R3를 기다리고 있다.

-> P3는 R3 하나를 보유하고 있다.

 

 

< 교착 상태 발생 여부 확인 >

상호 배제 : O

점유와 대기 : X -> P3가 다른 프로세스에 할당된 자원을 기다리고 있지 않다.

비선점 : O

순환대기 : X

-> 순환대기를 만족하지 않기 때문에 교착상태가 아니다.

 

 

 

 

ex 2)

: P1 -> R1 -> P2 -> R3 -> P3 ->R2 -> P1

: P2 -> R3 -> P3 -> R2 -> P2

-> 두 개의 사이클 

 

< 교착 상태 발생 여부 확인 >

상호 배제 : O

점유와 대기 : O

비선점 : O

순환대기 : O

-> 모든 조건을 만족하기 때문에 교착상태이다.

 

 

 

 

 

ex 3)

: 사이클이 있지만, 모든 프로세스가 참여하는 것은 아니므로 교착상태가 아니다.

 

< 교착 상태 발생 여부 확인 >

상호 배제 : O

점유와 대기 : X -> P2, P4가 만족하지 않는다.

비선점 : O

순환대기 : X

-> 교착상태가 아니다.

 

 

 

 

 

 

 

 

3. 교착 상태 처리 방법

 

1) 운영체제가 관여하여 프로토콜을 사용한다.

- 교착 상태 예방 (정적 - 현재 상황에 영향을 안 받음 )

- 교착 상태 회피 (동적 - 현재 상황에 영향을 받음 )

 

2) 운영체제가 교착 상태에 들어가도록 허용한 다음 회복한다.

- 교착 상태 탐지 및 회복 (어렵고 비용 많이 소요)

 

3) 교착 상태가 시스템에서 발생하지 않은 것처럼 무시한다. ( 운영체제가 관여하지 않는다. 제일 많이 사용하는 방법 )

- UNIX 등 대부분의 운영체제에서 사용한다.

- 응용 프로그래머가 자체적으로 해결한다.

 

 

 

 

 

 

4. 교착 상태 예방

: 교착 상태 네 가지 조건 중 하나만 성립하지 않도록 한다.

 

1) 상호 배제 

- 결정성 (같은 입력값에 대해 항상 같은 결과가 나오는 것)이 위배될 가능성이 높다.

- 주변 장치의 특성 때문에 상호 배제를 피하기는 힘들다.

 

 

2) 점유와 대기

: 프로세스가 자원을 요청할 때에는 언제나 다른 자원을 점유하지 않도록 한다.

- 각 프로세스는 수행 전에 필요한 모든 자원을 요청하여 할당한다. (자원 활용의 효율성 감소)

- 프로세스가 자원을 가지고 있지 않은 상태에서만 자원 요청을 할 수 있도록 허용한다. (기아 상태 유발)

 

 

3) 비선점

: 선점을 허용한다.

- 구현 복잡

 

 

4) 순환 대기

: 모든 자원에 번호를 부여한다.

: 한 프로세스는 자신이 가진 자원보다 번호가 큰 것만 요청한다. 

- 새로운 자원이 시스템에 추가되면 프로그램과 시스템을 재구성해야 한다.

- 사용자가 손쉽게 응용 프로그램을 작성하는데 어려움이 있다.

 

 

 

 

 

 

5. 교착 상태 회피

: 교착 상태 예방보다 덜 엄격한 조건을 요구한다. 자원의 효율성도 향상된다.  비행기 테러를 방지하기 위해

 

- 예방 : 자원 사용 제약 조건을 정적으로 사전에 설정한다. (상대적으로 경직)   비행기를 안 타고 배를 탄다.

- 회피 : 자원 사용 제약 조건을 동적으로 실행중에 결정한다. (상대적으로 유연)   탑승자에 아랍 사람이 있는지 여부로 탑승여부 결정한다.

 

 

: 자원 요청 시, 자원할당으로 인해 교착상태 유발 가능성 검사한다.

 

- 유발 가능성이 전혀 없으면 안정 상태, 자원 할당

- 유발 가능성이 존재하면 불안정 상태, 자원 할당 연기

 

 

 

 

 

1) 안정 상태 vs 불안정 상태

시스템이 안전 상태에 있다는 것은 교착 상태가 유발되지 않았다는 것이다.

불안정 상태에서 안정 순열이 존재하지 않을 경우, 교착 상태 가능성이 존재한다.

 

교착상태 회피란?

시스템이 불안정 상태가 아님을 보장하는 것

 

 

 

2) 안정 상태

: 안정 순열의 존재를 의미한다.

 

 

안정 순열 <P1, P0, P2>

 

 

 

 

 

3) 불안정 상태

: 사용 가능한 자원 1개를 어느 프로세스에 할당해도 프로세스를 만족시킬 수 없다.

 

 

 

 

만약, P2가 자원 1개를 더 요구할 경우,

P1 종료 이후 잔여량이 4로 종료시킬 수 있는 프로세스가 없어 불안정 상태에 놓이게 된다.

 

 

 

 

 

 

 

 

 

 

6. 자원 할당 그래프 알고리즘을 활용해보자

 

예약 간선 : 프로세스가 자원을 요청할 것을 의미한다. 점선으로 표시한다.

예약 간선은 프로세스가 자원을 요청할 때에 요청 간선으로 변환된다.

자원은 시스템에서 미리 예약되어야 한다.

 

 

- 자원 할당 후에 사이클이 존재하면 불완전 상태이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

운영체제가 없어도 컴퓨터 하드웨어는 사용이 가능하다. 다만, 운영체제는 컴퓨터의 사용을 용이하게 해주는 역할을 한다.

 

1. 운영체제 서비스

: 프로그래머와 사용자들에게 편리한 서비스 제공

: 자원관리의 효율성을 위한 서비스

 

 

2. 운영체제의 구성요소

: 인터페이스 / 자원관리 / 자체관리기능

 

- 인터페이스

: 명령어 해석기 시스템

 

- 자원관리 -> 전통적 의미의 운영체제

: 프로세스

: 메모리, 보조 기억 장치

: 입출력, 파일, 네트워크

 

-자체관리

: 부팅 및 초기화

: 시스템 생성 및 튜닝

운영체제의 구성요소

 

 

 

 

 

 

3.  사용자 인터페이스

명령 라인 해석기(Command Line Interpreter) : Shell

Graphic User Interface 

 

 

시스템 호출

: 프로세스와 운영체제 간의 인터페이스(API)

- 프로그램에서 명령 또는 서브 루틴의 호출 형태로 실행한다.

- 시스템에서 명령 해석기를 통해 대화 형태로 호출한다.

 

시스템 호출의 원리

 

 

 

 

 

4. 자체 관리

- 부트스트래핑(부팅)

: 운영체제에서 자기 자신을 적재하는 과정

 

1) 부트스트랩 로더

: 전원 입력시 ROM에 있는 작은 로더가 실행된다.

: 로더는 디스크에 있는 부트스트랩 로더를 메모리에 적재하고 실행시킨다.

: 운영체제를 적재하고 초기화시킨다.

2) 운영체제의 초기화

: 시스템 장치의 초기화

: 명령어 해석기 등을 적재하여 실행시킨다.

 

 

 

 

 

 

4. 운영체제 구조

1) 단순 구조

: 모듈로 분할되지 않는다.

: 수행효율은 높으나 기능 추가 및 유지 보수에 어려움이 있다.

: MS-DOS, 초기의 UNIX

 

 

 

2) 계층 구조

- 모듈성

: 하나의 프로그램을 서로 영향받지 않는 부분들로 분리한다.

: 시스템 오류 제거와 검증에 용이하다.

 

- 계층 기법(Layer)

: 운영체제를 여러 계층으로 나눈다.

: 각 계층은 하위 계층에서 제공되는 기능과 서비스만을 사용한다.

 

- 계층 구조의 어려움

: 계층의 정의 또는 결정

: 계층 정의에 위배되는 경우가 자주 발생한다.

 

 

 

3) 마이크로커널 구조

: 커널로부터 많은 기능을 제거하고 "사용자"공간으로 이전

: 커널은 최소한의 프로세스 및 메모리 관리와 통신 기능을 담당한다.

MACH, QNX, Windows NT

 

[ 장점 ] 

- 운영체제 확장의 용이성

- 운영체제를 새로운 하드웨어로 포맷하기가 쉽다.

- 보안과 신뢰성

 

 

 

 

 

 

 

4) 가상 기계(Virtual Machine)

: 하드웨어와 운영체제 커널을 모두 하드웨어처럼 취급한다.

: 각 프로세스는 실제 컴퓨터의 사본을 제공함으로써 마치 실제 컴퓨터를 사용하는 것과 같은 환경을 제공한다.

-> 조금 더 진화된 것이 "도커"

 

- 자바 가상 기계(JVM)

 

 

 

 

 

 

 

5. 운영체제의 발전 과정

1970년대 UNIX 개발

1980년대 개인용 컴퓨터를 위한 운영체제의 발전

 

 

 

 

1) 일괄처리 시스템(Batch System)

: 유사한 작업들을 묶어서 순차적으로 처리한다.

 

- 상주 모니터

: 메모리에 상주하여 CPU 등 자원의 비효율적 사용을 해결한다.

: 입출력 관리 또는 인터럽트 처리 루틴들의 집합

 

- 제어 카드

: 상주 모니터의 프로그램 수행을 지시한다.

 

- 오프라인 처리

: 위성 컴퓨터, 테이프, 카드, 프린트, 장치 독립성 보장

 

 

 

 

 

 

2) 다중 프로그래밍

: 동시에 실행 상태에 있는 프로세스가 여러 개

-> 자원의 공유가 필요하다. (CPU, 메모리, 주변장치 등)

 

 

 

 

 

 

3) 시분할 시스템(Time Sharing) = 대화형 처리 시스템

: 시간을 나누어서 처리한다.

-> 다중 프로그래밍을 통해 각 사용자가 컴퓨터를 분할하여 사용

-> 메모리와 디스크 사이에 교체 필요

 

 

 

대화형 처리 시스템 vs 일괄 처리 시스템

- 일괄 처리 시스템

: 한 사용자가 주문을 끝까지 받고, 그 다음 사람이 순서대로

: 작업을 준비하여 제출하면 일정 시간 내 결과가 나온다 .

: 반환 시간이 길다. 대화가 거의 필요없는 대형 작업에 적합하다.

 

- 대화형 처리 시스템

: 여러 사용자를 이 사람, 저 사람 번갈아가며 동시에

: 사용자와 시스템 간에 온라인 통신 마련

: 사용자가 컴퓨터에 직접 명령을 주고 응답을 받는다.

 

 

 

 

 

 

 

 

4) 입출력 버퍼링

: 입출력 데이터를 버퍼에 미리 담아오는 것

: 입출력장치와 CPU의 속도 차이를 해소시킨다.

: 한 작업의 계산과 함께 입출력을 동시에 수행한다.

: 버퍼를 사용하여 문자나 데이터를 미리 읽어온 후, 필요할 때마다 사용하게 하면 효율적이다.

 

 

 

 

 

 

 

 

5) 스풀링

: 버퍼를 하드디스크로

: 디스크의 일부 공간을 스풀 공간이라고 부르는 매우 큰 버퍼처럼 사용한다.

: 입출력장치와 CPU의 속도 차이 해소해준다.

 

- 다중 프로그래밍 환경에서 스풀링을 사용한다.

: 다수의 프로세스들이 동시에 입출력을 요구하거나 입출력 장치 수에 제한이 있기 때문에 스풀링을 사용한다.

: 다수의 프로세스에게 각각 독립적인 입출력 장치를 제공한다.

 

 

 

 

 

 

 

 

 

 

6) 병렬 시스템 = 다중 처리기

: 고만고만한 CPU가 여러개 있는 시스템

 

<장점>

- 처리율 증가

- 다양한 주변 장치 공유

- 신뢰성 향상 

 

<단점>

- 프로그래밍 작성이 어려움

 

연결구조

 

 

 

 

7) 분산 시스템

: CPU와 메모리가 각각 별도로 존재 (병렬 시스템은 CPU만 여러개이고, 메모리와 입출력장치는 하나이다)

: 느슨하게 결합

<장점> 자원공유, 계산의 신속화, 신뢰성, 통신

 

 

 

 

 

 

 

 

 

8) 실시간 시스템

: 실행 완료 데드라인이 있다.

-> 특수 목적 시스템에 이용 (공정 제어, 의료 영상, 자동차 엔진 제어)

 

- 경성 실시간 시스템 : 데드라인 반드시 만족

ex) 항공 제어

- 연성 실시간 시스템 : 데드라인 일정 수준 이상 만족

ex) 멀티미디어 서비스

반응형
반응형

 

 

 

 

0. 관리자 모드에서 gcc 설치

$ su

암호 : 

$ yum install gcc

y/n 물을 때마다 y

 

 

1. gcc란?

GNU에서 만든 컴파일러

: C or C++에서 작성된 프로그램을 CPU가 이해할 수 있는 실행파일로 변경

 

 

 

2. 한 개의 소스파일을 이용하여 실행파일 만들기(컴파일하기)

: gcc hello.c    -> 아무런 옵션이 없으면 a.out 이라는 이름의 실행파일이 자동으로 생성

: gcc hello.c -o hello ->hello라는 이름의 실행파일이 생성

 

 

 

4. 두 개 이상의 소스파일을 이용하여 실행파일 만들기

: gcc -c test1.c     -> test1.o 라는 오브젝트 파일 생성

: gcc -c test2.c  -> test2.o 라는 오브젝트 파일 생성

: gcc test1.o test2.o -o run

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

1. 동작모드

 

1) 입력모드 : 명령 모드에서 <a> or <i> 키를 누르면 시작

2) 명령모드 : 처음 vi편집기 열면 명령 모드에서 시작, 입력모드에서 명령모드로 돌아오려면 esc

3) 최종라인모드 : esc키를 누르고 프롬프트에서 명령을 입력하여 저장, 편집, 검색 기능

-> 명령모드에서  콜론(:) 입력 -> wq 명령어 입력(write & quit)

 

4) vi편집기 열기 : vi [파일명]

 

 

2. 명령모드에서 커서 이동하기 

 

1) h, j, k, l(왼, 아, 위, 오른)

2) left or backspace : 왼

down

up

right or space : 오른

 

3) nG : 줄번호 n번으로 이동

1G : 편집버퍼의 첫 줄로 이동

G : 편집버퍼의 마지막 줄로 이동

 

 

 

 

 

3. 명령모드에서 입력모드로 전환

 

 

 

 

4. 삭제 명령 

 

x : 커서가 있는 문자 1개 삭제

dd : 커서가 있는 곳부터 1행 삭제

ndd : 커서가 있는 곳부터 n행 삭제

p(소문자) : 삭제한 행을 현재 커서가 있는 행의 아래에 붙여넣기

P(대문자) : 현재 커서가 있는 행의 위에 붙여넣기

 

 

5. 복사 명령

 

yy : 커서가 있는 행을 복사

nyy : 커석 있는 행부터 n행을 복사

 

 

 

 

 

6. 편집기 종료

 

:q : 변화가 없을 때 저장없이 종료하고 빠져나옴

:q! : 변화가 있음에도 저장없이 종료하고 빠져나옴

:w : 현재의 파일 이름으로 저장

:wq : 현재의 파일 이름으로 저장하고 빠져나옴

 

 

 

 

7. 최종라인 모드에서 vi 환경설정

:set nu   행 번호 보이게

:set nonu    행 번호 안보이게

반응형
반응형

 

 

파일 및 디렉토리 관리


 

ls : 현재 디렉토리에 저장된 내용을 확인하는 명령이다.

ls -a : all의 뜻, 시스템이 숨겨져 일반 사용자에게 보이지 않는 파일을 포함한 모든 파일 및 디렉토리를 보여준다.

ls -l : long의 뜻, 파일 및 디렉토리 표시, 접근에 대한 허가사항, 링크 수, 사용자, 등록명(그룹명), 파일 크기, 최종 수정시간


mkdir [새로운 디렉토리명] : 새로운 디렉토리를 만들어주는 명령이다.

pwd : 현재 디렉토리의 절대 경로를 알려주는 명령이다.

 

cd [변경하고자 하는 디렉토리명] : 다른 디렉토리로 이동하는 명령

-> cd . : 현재 디렉토리로 이동

-> cd ~ : 계정 홈 디렉토리로 이동

-> cd .. : 상위 디렉토리로 이동

-> cd / : 루트로 이동

-> cd ./a/b : 상대경로를 이용해 하위 경로로 이동

-> cd /home/na/a/b : 절대경로를 이용해 하위 경로로 이동

 

cat > [새로 만들 파일이름] : 새로운 파일에 텍스트 문자를 입력하는 명령이다.

: ctrl + D 로 문자 입력을 종료한다.

cat [파일이름] : 기존 파일에 저장된 내용을 확인하는 명령이다.

cat >> [기존 파일이름] : 기존 파일에 저장된 내용을 변경하는 명령이다.

: ctrl + D 로 문자 입력을 종료한다.

 

cp [옵션][복사할파일] [복사될파일 또는 디렉토리] :  파일 또는 디렉토리를 복사하는 명령이다.

1) cp source copy_source : 같은 디렉토리 안에 다른 파일이름으로 복사하는 경우

2) cp source /home/naeun/work : 다른 디렉토리에 같은 파일이름으로 복사하는 경우

3) cp source copy_source /home/naeun/test : source와 copy_source 파일을 동시에 test 디렉토리에 복사

4) cp -r test /home/naeun/test2 : test 디렉토리 안의 파일을 test2에 복사

[옵션] : -f (기존 파일을 강제로 덮어쓰기), -i (덮어쓰기 전에 여부를 물음)

 

mv [옵션][원본파일명] [변경파일명] : 파일을 이동시키는 명령어이다.

ex) mv source source2

mv [옵션][다수의 원본 파일명][이동 디렉토리] : 현재 디렉토리에서 다른 디렉토리로 파일을 이동시키는 명령

[옵션] : -i : 파일을 이동하기 전에 겹쳐쓰기 여부를 확인한다. 

          -f : 강제로 이동시킨다.

 

 

rm [옵션][삭제할 파일명 또는 디렉토리명] : 파일 또는 디렉토리를 삭제하는 명령어이다.

[옵션] : -i : 파일 삭제하기 전에 삭제 여부를 확인한다.

          -f : 강제로 삭제한다.

          -r : 파일이면 삭제를 하고, 디렉토리일 경우 경로와 파일을 함께 삭제한다.

          -v : 파일 지우는 정보를 세세하게 알려준다.

          -rf : 다수의 파일이 존재하는 디렉토리를 한번에 삭제한다.

 

ln -s [원본파일명][대상파일명] : 바로가기 기능

-> 링크로 생성된 파일의 내용은 존재하지 않으며, 다른 파일이 어디를 가리키고 있는지 알려주는 역할이다.

 

 

 

반응형
반응형

1. 상호배제를 위한 세마포 원리 및 코드

상호 배제의 기능을 수행한다.

 

 

< 원리 >

 

 

< 함수 내부 >

 

 

mutex가 양수이면 들어갈 수 있다.

S.value = mutex 이다.

0 또는 음수이면 사용중이라는 의미이다. (ex) -1이면 대기자가 1명이라는 뜻

 

wait(S)

S.value = -1이면

if문에 들어가서 add this process to S.L

즉, 진동벨을 나누어주고 다른 일을 수행할 수 있도록 한다.

 

signal(S)

수행이 끝나면 S.value 값을 1 올려준다.

그럼에도 아직 대기자가 남아있다면(즉, S.value가 0보다 작거나 같다면)

remove a process P from S.L;

wakeup(P);

즉, 아까 나눠줬던 진동벨을 울려 대기자들을 다시 불러온다.

 

 

 

 

2. 세마포의 장점

: 간단하게 구현된다.

 

 

 

 

3. 동기화 도구로써의 세마포

: 프로세들간에 실행 순서가 정해져 있을 때 사용한다.

: 세마포는 바쁜 대기를 유발하지 않는 동기화 도구이다. 

 

* 중요 *

0으로 초기화된 flag를 사용한다. 즉 mutex = 0; 으로 초기화

 

 

 

ex) A -> B 의 실행 순서가 지켜져야 할 때

세마포 동작 예시

 

flag = 0 이므로 Pj가 먼저 실행된다고 하더라도 wait 상태에 들어갈 것이다.

Pi에서 A가 실행되고 signal(flag);를 해서 flag를 1로 만들 때까지 절대 B를 실행할 수 없는 것이다.

 

 

 

 

 

4. 세마포의 문제점

: 세모포 변수를 여러 개 두고 실행할 경우 교착 상태와 기아 상태를 유발할 수 있다.

 

1) 교착 상태

: 이상의 프로세스들이 대기중인 프로세스들 단지 하나에 의해서만 야기될 있는 사건을 무한정 기다리는 상황

 

2) 기아 상태

무한 정지, 프로세스들이 세마포 큐에서 제거되지 않고 무한정 대기하는 것

 

 

 

ex) flag가 1로 초기화된 경우

P0

wait(S)에서 flag가 0이 되고

wait(Q)에서도 flag가 0이 되어

기다리는 중

 

P1

wait(Q)에서 flag가 하나 더 감소하여 -1이 되고

wait(S)에서도  flag가 하나 더 감소하여 -1이 되어

기다리는 중....

 

-> 서로가 서로를 기다리느라 무한정 기다리는 상황에 빠지게 된다.

 

 

 

 

 

 

5. 고전적 동기화 문제 : 세마포로 해결해보기

 

* 초기화 : full = 0, empty = n, mutex = 1

 

 

-> full은 생산된 데이터의 개수, empty는 남은 버퍼의 개수

 

 

가운데에

wait(mutex);        wait(mutex);

...                          ...

signal(mutex);      signal(mutex);

는 상호배제를 위한 세마포를 구현한 것

 

생산자 위쪽 wait(empty);

소비자 아래쪽 signal(empty); 

는 생산자 동기화를 위한 세마포

 

생산자 아래쪽 signal(full);

소비자 위쪽 wait(full); 

는 소비자 동기화를 위한 세마포

 

 

 

 

 

 

 

 

6. Readers - Writers 문제

: 리더랑 라이터가 여러 명일 때

 

-> 라이터가 없을 때에는 리더가 여러 명이 들어갈 수 있다.

 

 

 

 

 

7. 모니터(Moniters)

: 세마포 연산자들을 한 데에 모아놓은 객체이다.

: 공통된 객체 내에서 활동하도록 보장한다.

: 오류 디버깅을 쉽게 할 수 있게 한다.

 

-> 많은 세마포 사용시, 잘못된 사용으로 오류가 발생하기 쉽기 때문에 사용한다.

 

 

 

 

 

 

 

 

 

 

 

* 정보처리기사 문제 *  

  1. 프로세스들 간에 상호배제해야한다.
  2. 임계 구역은 여러 사용자가 동시에 사용하지 않도록 하는것
  3. 임계 영역 안에서의 작업은 신속히 이루어져야
  4. 어떤 프로세스가 임계영역 내에서 실행중일때 인터럽트가 발생한다고

하더라도 프로세스는 실행을 멈추지 않는다.

    5. 임계영역에서 무결성을 보장한다.(값이 꼬이지 않음)

    6. 하드웨어 자원이 필요한 : Test&Set 명령어

반응형

+ Recent posts