프로그램에 끼친 기술의 영향 2

ChoRong0824·2022년 9월 9일
2

System Programming

목록 보기
3/3

애플리케이션에서의 병행성

사례

  • 시그널 처리, 연산과 I/O의 중첩, 통신 등

프로세스 내 다수의 스레드가 존재하고 병행 실행
시스템 내 다수의 프로세스가 병행 실행

병행성 : 인터럽트 (Interrupt)

  • 주변기기 등 외부 사건에 의해 발생 : 비동기적
  • 실행 중인 프로그램에서 인터럽트 핸들러로 제어가 넘어감

병행성 : 시그널 (Signal)

프로세스에게 이벤트 발생을 알리는 통지 기법이다.

  • 비동기 시그널
    예) 키보드에서 Ctrl C 키를 누를 때 발생

  • 동기 시그널
    예) 프로그램 내의 부적절한 행위(illegal address 접근 시도)나 오류
    (divide by zero 등)로 인해 발생 한다

  • 시그널을 받은 프로세스는 일시적으로 병행 수행 상태가 됨
    실행 중인 프로그램과 시그널 핸들러(Handler)

병행성 : 연산과 입출력

  • 프로세스는 입출력이 시작되면 끝날 때까지 기다려야 함
    동기식(Blocking) I/O 기법을 사용

  • 하나의 Application이 두 개 이상의 입력 채널을 감시할 때
    -동기식(Blocking) I/O 기법 사용 시 문제점

    • 특정 채널로부터 입력을 기다리는 동안 다른 채널의 이볅을 처리하지 못할 수도 있음
  • 대안 : Non-Blocking I/O 기법의 활용

  • 프로세스가 입출력 시작 후 완료될 때까지 기다리지 않는 방법
    - 비동기식 I/O 기법이나 입출력 전담 스레드를 사용

병행성 : Process와 Thread

  • UNIX 시스템에서 병행 실행을 위한 전통적인 방법
    - 자식 프로세스를 생성하여 실행함 : fork() 함수 활용

  • 프로세스 간 통신(OPC) 방법
    - 부모가 동일한 프로세스들 : Pipe
    -그 외 : signal, semaphore, message passing 기법 활용

  • 하나의 프로세스에서 다수의 실행 흐름 제공
    - 스레드 (Thread) 사용

병행성 : 다중 처리기 시스템

  • 시스템의 성능 향상 방안
    - 병목 발생 지점 파악 후 해당 장치를 개선함
    -장치를 여러 개사용 : 병렬처리
    • 예) CPU, (비디오,디스크) 컨트롤러 등
  • 예) CPU의 병목 현상 제거 방법 (병목현상== Bottle neck)
    -Grace Murray Hopper

    Grace Murray Hopper
    "황소 한마리로 하지 못하는 일이 있으면 더 큰 황소를 활용하지 말고 두 마리의 소로 처리 하라"

Seymour Cray
"넓은 밭을 갈아야 한다면 두 마리의 소를 쓸 것인가 ? 아니면 1024마리의 닭을 쓸 것인가?"

  • 다중 처리기(Multiprocessor) 시스템
    - 다수의 처리기(CPU)를 활용하여 작업을 병행 처리함

참고, 병렬성은 하드웨어 기준으로 여러개 처리하는 것, 병행성은 소프트웨어 기준으로 처리하는 것이다.

병행성 : 분산 컴퓨팅

  • 분산 컴퓨팅 : (병행성 + 통신) 형태
    - PC처럼 저렴하고 킉가 작은 컴퓨터들을 묶어서 대형 컴퓨터의 능력에 버금가는 시스템을 만들 수 있게 됨
    - 네트워크 상에 분산된 다수의 컴퓨터로 작업을 처리하고 결과를 상호 교환함

침입을 위한 버퍼 오버플로우

  • 버퍼 오버플로우(Buffer Overflow)
    - 프로그램이 충분한 공간이 할당되지 않은 메모리 영역(예 :변수)에 데이터를 기록할 때 발생
  • 버퍼 오버플로우의 발생 가능성 존재
scanf("%s", buf);
  • 버퍼 오버플로우의 발생 가능성 제거
sacnf("%79s", buf);

버퍼 오버플로우의 중요성

  • 스택(Stack) : 지역 변수의 저장 공간
    - 주소 체계 : 상위 주소에서 시작, 하위 주소로 커짐
    - 함수 호출 시 스택의 공간 할당
    • 전달된 인자와 반환 주소 : 높은 주소에 할당 (저장)
    • 함수의 지역변수 : 낮은 주소에 할당 (저장)
  • 변수의 한계를 넘어서는 값의 저장 : 버퍼 오버플로우 발생
    - 결과는 예측 불허 (덮어쓰기 or 영향 X)

// 코드의 다운로드 여부 확인
ls Downloads

// 작업 디렉토리("usp") 생성 및 예제 코드 이동
mkdir usp
cd usp
mv ../Downloads/usp_all.tar .

// 예제 코드의 아카이브 풀기
tar xvf usp_all.tar

// 예제 코드 확인
ls

// 예제 코드 디렉토리로 이동 및 내용 확인
cd chapter01

// READ 파일 내용 확인 (Under Linux 부분)

// 리눅스 환경에 부합하는 예제 코드 컴파일 환경 설정
ls
./convertlinux

// 예제 코드 컴파일 : make 이용
make
ls -l

불편함 없이 원활한 코드 확인 및 진행을 위한 메이크, gcc 두개 다 추가설치 해야한다.

버퍼 오버플로우의 중요성

  • 암호를 검사하는 함수(checkpasstest.c)
#include <stdio.h>
#include <string.h>

int checkpass(void) {
	int x;
	char a[9];
    
    x = 0;
    //  stderr : 표준 오류채널, fprintf는 방향지정 해줌<->printf
    fprintf(stderr, "a at %p and \n x at %p\n", (void*)a, (void*)&x);
    	printf("Enter a short word : ");
        scanf("%s", a);
        if(strcmp(a, "mypass") == 0)
        	x=1;
			return x;
        }
        int  main(void)
        {
        	int x;
            
            x = checkpass();
            fprintf(stderr, "x= %d\n",x);
            if(x)
            	fprintf(stderr, "Password is correct!\n");
            else
            	fprintf(stderr, "Password is not correct!\n");
            return 0;
        }
profile
컴퓨터공학과에 재학중이며, 백엔드를 지향하고 있습니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글