Programs, Processes and Threads

난1렙이요·2024년 9월 27일
0

시스템 프로그래밍

목록 보기
4/22

Processes, Thread 개요

  • 유닉스에서는 Concurrent하게 실행할 수 있다.
    • 프로세스를 fork function을 이용하여 여러개를 만든다.
    • 똑같은 부모를 가지고 있는 프로세스들은 서로 통신할 수 있다. 가장 간단한 커뮤니케이션 방법으로, pipe라는 것을 통해서 통신한다.
    • 만약 부모가 다르다면 signal, FIFO, semaphore, address space, message등을 이용한다.
  • 스레드는 실행흐름이다. 프로세스 안에서의 실행 흐름은 없어선 안된다. 그러므로 적어도 하나의 스레드는 있어야 한다. 여기서 스레드를 여러개 둘 수도 있다. 이를 Multiple threads라고 한다.

Program vs Process

  • Program
    • 정의된 일을 수행하기 위해서 나열된 명령어들이다.
    • 컴파일러가 source file을 object file로 바꾸고, 외부 라이브러리와 링크를 하여 실행 가능한 파일을 만든다. 이것이 프로그램이다.
  • Process
    • 실행되고 있는 프로그램을 의미한다.
    • OS가 여러가지 정보들(process ID, state, etc.)을 읽어온다. 그 후 프로세스를 다른 프로세스와 겹치지 않게 생성해주고, ready queue에 넣어서 실행 대기 상태로 만든다.
    • 프로세스는 주소를 가지고 있으며, 기본적으로 하나 이상의 thread를 가지고 있다.

스레드와 스레드의 실행

  • Program counter : 프로그램 카운터는 다음에 실행할 instruction의 주소가 들어가 있다. CPU가 다음에 실행할 명령어의 주소를 Program counter를 읽고 실행한다. 스레드는 명령어들이 실행되는 하나의 흐름이다. CPU는 이 흐름을 읽고 실행하므로, 스레드는 적어도 1개 이상이 필요하다.

멀티 스레드의 이점

스레드는 추상적인 흐름을 적어논 것으로, 프로세스보다 가지고 있는 데이터가 적다. 그렇기 때문에 스레드 간 스위칭을 하는 것이 프로세스 간 스위칭을 하는 것보다 필요한 데이터의 양이 적으므로 효율적으로 데이터를 주고받을 수 있다. 또한 2개의 프로세스가 통신하려면 OS의 도움을 받아야하지만, 스레드는 서로간의 공유하는 데이터를 이용하기 때문에 효율이 더 나온다. 하지만 스레드들 간의 세심한 제어를 하지 않으면 공유하는 데이터를 동시에 이용할 수 있기 때문에 정상적인 실행이 불가능해질 수 있다. 이를 해결하기 위해 스레드 동기화를 하는 추가적인 과정이 필요하므로 프로그래머의 부담이 높아진다.

Program image

하나의 프로세스가 사용하는 공간도 여러가지고 분리하여 사용할 수 있다. 분리된 블록들을 program image라고 부른다. 용도별로 분리된 블록들을 잘 이해하면 프로그램에 대해서 더 잘 이해할 수 있고, 오류를 줄일 수 있다.

  • command-line arguments and environment variables : argc, argv, 환경 변수 등을 저장한다. argc, argv는 main함수의 파라미터로 사용된다. 이것들은 main함수에 부가적인 설정을 하는 파라미터다. 환경 변수에는 프로그램에 대한 여러가지 정보가 들어있다.
main(int argc, char *argv[]/char **argv)
  • stack : activation record를 저장한다. activation record는 동적인 객체로, 함수 호출마다 그 함수 호출에 필요한 정보를 담고 있는 객체를 말한다. 함수가 실행 될 때 stack에 쌓이며, 함수 호출이 끝나면 삭제된다.
  • heap : malloc같은 동적인 데이터를 저장한다. malloc, alloc, calloc등의 함수로 인해서 동적 메모리를 할당할 때 이 영역에 할당하며, 나중에 free 함수를 통해 메모리를 해제해줘야한다.
  • unintialized static data
  • initialized static data
  • program text

Library function calls

SYNOPSIS box : 어떤 함수의 요약본이다. 이 함수를 이용하기 위해 필요한 헤더파일, 함수의 이름, 파라미터, 리턴값 등의 프로토타입 등을 알려준다.
Error : 전통적으로 유닉스 함수는 에러가 나면 -1(이거나 NULL)을 반환하며, 무엇때문에 에러가 났는지를 알려주는 에러 코드를 errno에 알려준다. 요즘에는 에러 코드를 바로 반환해주는 함수도 많아지고 있다.
Error handling function

  • void perror(const char *s) : #include <stdio.h>를 해야한다. 사용자가 입력한 매개변수(string)을 먼저 출력해주며, 그 후 마지막에 발생한 에러 메세지를 출력해준다.
  • char* strerror(int errnum) : #include <string.h>를 해야한다. 에러 코드를 넘겨주면, 에러코드에 해당하는 에러 메세지를 출력해준다.

Argument arrays

Argument array는 문자열들에 대한 포인터로 이루어진 집합이다. 무슨 말이냐면, 문자열이 있고, 그것을 가르키는 포인터가 있으며, 그 포인터가 여러개가 있다는 뜻이다. argument array는 main에 전달하는 파라미터이며 여러가지 설정을 할 수 있게 해준다.

Process environment

환경 변수는 프로세스가 실행하기 전 참조하는 변수이다. 프로세스는 실행하기 전 환경 변수를 읽어 여러가지 설정을 한다. char **environ으로 구성이 되어 있으며, string의 array로 구성되어 있다. 이 말은 여러가지 환경 변수를 담을 수 있다는 말이다.

profile
다크 모드의 노예

0개의 댓글