[시스템프로그래밍] 프로그램, 프로세스, 스레드에 관하여

2023. 10. 26. 19:10·Study/시스템프로그래밍
Asynchronous operation
  • 비동기식 operation.
  • 사용자가 키보드를 누를 때 등..
  • 사용자가 하는 일은 Asynchronous operation
  • unpredictable time(예측할 수 없는 시간에 일어난다)
Concurrency
  • 스레드: 하나의 실행 흐름
  • 스레드를 하나 띄울 때마다 스레드가 할 일을 구현해야하는데 그 일을 함수가 한다.
  • 2개의 스레드가 돌고 있다. → 2개의 독립적인 실행 흐름이 있다.
  • concurrent와 비슷한 말: simultaneous(뜻은 둘 다 동시에)
  • 어떻게 두 개가 동시에 돌리는 것처럼 보이게 만들 수 있을까
    • → 매우 빠르게 번갈아가면서 실행한다.
Multiprogramming
  • 프로세스가 생성이 되면 메모리에 위치하게 된다. 그 위치는 ready queue(준비 큐)
  • ready queue에는 여러 개의 프로세스가 들어갈 수 있다.(들어가서 대기를 한다.)
  • 어떤 프로세스를 꺼내와서 실행할 지는 CPU scheduling algorithm이 정해준다.
    • → concurrent한 작업을 위한 조건
Time sharing
  • 여러 개의 프로세스가 동시에 돌아가는 것 같은 illusion을 주는 방법.(하나의 CPU로)
  • rapidly하게 process들을 switch하기 때문
  • multiprogramming이 되는데 만약 time sharing이 안된다면? → 동시에 실행이 안된다.
Interrupts
  • 프로세스가 작동하고 있는데 외부 이벤트가 들어 온다면?
  • interrupt가 발생한다.
  • 원래 하던 작업을 멈추고 외부 이벤트를 처리 해준다.
  • OS 내부에 interrupt를 처리해주는 ISR이 있다.
Signals
  • 어떤 이벤트가 발생했을 때 이벤트가 발생했다는 것을 알려주기 위한 software의 통제 수단이다.
  • 누구에게? process에게
  • signal을 누가 발생시키는 지는 이벤트에 따라서 다르다.
프로세스와 스레드
  • 프로그램이 실행되면 프로세스가 된다.
  • 프로세스가 있으면 스레드(실행 흐름)가 있다.
  • concurrent한 task를 프로세스 단위로 할 수도, thread 단위로 할 수도 있다.
  • thread를 번갈아가면서 실행하는 것이 cost가 더 적다.(process가 저장해야 할 양이 더 많다.)
  • 프로세스를 바꾼다. → 맥락을 바꾼다.(context)
  • 하던 작업을 멈추고 나갔다가 다시 실행(resume)해야 한다. → 정보들을 저장해놔야 한다.
  • (threads를 바꿀 때도 마찬가지로 저장해놔야 한다.)

 

Layout of Program

프로그램 레이아웃 이미지

- program text → 프로그램 코드들을 저장하는 곳

 

- (un)initialized static data → 정적 변수들, 전역 변수들이 저장된다.

 

- stack → 함수가 호출이 될 때마다 stack에 함수가 실행되는 데 필요한 정보들(activation records)이 저장된다.(ex. main함수에 대한 정보들)

함수 안에서 선언된 변수들(지역변수)이 저장된다.

 

- heap → 동적으로 메모리를 할당할 때 heap 공간에 할당된다.(수동으로 해제하지 않는 한 계속 남아있는다.)

 

- command-line arguments and environment variables → argc, argv(메인 함수의 파라미터, argc → int, argv → array[]), environment(환경 변수)들이 저장된다.

 

Activation record
  • 프로세스 스택의 맨 위에 할당된 메모리 블록으로, 함수 호출 중에 함수의 실행 컨텍스트를 보관한다.
  • 각 함수 호출마다 새로운 활성 레코드가 생성된다.
  • 반환 주소, 매개변수, 상태 정보, CPU 레지스터 값 중 일부의 복사본, 자동 변수를 포함한다.

 

실행흐름(thread)과 직접적으로 연관되어있는 메모리 → stack

stack에서는 함수가 호출될 때마다 activation records가 생성이 된다.

스레드마다 별도의 stack 공간을 가져야 한다.

 

 

스레드의 강력한점 + 단점: 다중 쓰레드를 많이 쓰면 관리해야 될 부분이 생긴다.

  • 스레드들이 서로 공유하는 메모리가 있다.(프로세스들끼리는 메모리를 공유하지 않는다.)
  • 밑의 heap공간을 포함한 (un)initialized static data, program text 공간을 공유한다.
  • 스레드들끼리는 간단하게 정보를 공유할 수 있다.(정적변수, 전역변수 이용)
  • 스레드 간의 충돌을 조심해야 한다.

 

Argument arrays

Argument array

mine -c 10 2.0 (mine이라는 함수를 실행할 때 main 함수 안에 매개변수의 개수는 4개가 들어온다, 저 매개변수들은 string이다. 10, 2.0 둘 다 string이다.

 

strtok()

문자열을 특정 기준으로 분리하는 함수

strtok() 함수를 멀티 스레드 에서 사용하게 되면 오류가 발생할 수 있다.

-> 내부적으로 static 변수를 사용하기 때문.

-> 같은 프로그램에서 다른 구문 문자열로 strtok을 호출할 때, 해당 문자열의 구문 분석이 상호 간섭이 될 수도 있기 때문.

 

멀티 스레드의 경우 strtok_r()을 사용하자.

-> strtok_r()은 strtok()과 다르게 세 번째 인자인  "lasts"가 있는데, "lasts"는  strtok_r이 다음 구문 분석을 위한 시작 주소를 저장하는 데 사용하는 사용자 제공 포인터이다.

 

프로세스 환경

extern char **environ (ISO C)

-> 프로세스가 실행을 시작할 때 프로세스 환경 목록을 가리킨다.

 

char* getenv(const char* name)

-> 특정 변수가 값을 가지고 있는지 확인하는데 사용

-> 변수가 값을 가지고 있지 않으면 NULL을 반환한다.

 

 

 

저작자표시 비영리 변경금지 (새창열림)

'Study > 시스템프로그래밍' 카테고리의 다른 글

[시스템프로그래밍] Signals  (1) 2023.12.03
[시스템프로그래밍] pipe에 관하여  (1) 2023.11.02
[시스템프로그래밍] 디렉토리 엔트리, hard/symbolic link, stat에 관하여  (0) 2023.11.02
[시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 2  (1) 2023.10.26
[시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 1  (0) 2023.10.26
'Study/시스템프로그래밍' 카테고리의 다른 글
  • [시스템프로그래밍] pipe에 관하여
  • [시스템프로그래밍] 디렉토리 엔트리, hard/symbolic link, stat에 관하여
  • [시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 2
  • [시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 1
퀵차분
퀵차분
Web Developer 🥐
  • 퀵차분
    QC's Devlog
    퀵차분
  • 전체
    오늘
    어제
    • 분류 전체보기 (178)
      • Frontend (31)
      • Fedify (4)
      • Study (42)
        • NestJS (2)
        • Node.js (3)
        • Modern JS Deep Dive (13)
        • SQL (1)
        • Network (1)
        • 프롬프트 엔지니어링 (4)
        • 인공지능 (9)
        • 시스템프로그래밍 (11)
        • 선형대수학 (1)
      • Intern (4)
      • KUIT (21)
      • Algorithm (48)
        • Baekjoon(C++) (26)
        • Programmers(JavaScript) (22)
      • 우아한테크코스(프리코스) (4)
      • Project (10)
        • crohasang_page (3)
        • PROlog (4)
        • Nomadcoder (2)
      • 생각 (4)
      • Event (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머스 자바스크립트
    리액트
    인공지능
    알고리즘
    HTML
    자바스크립트
    백준
    오블완
    타입스크립트
    시스템프로그래밍
    next.js
    react
    javascript
    fedify
    음악추천
    프론트엔드
    티스토리챌린지
    프로그래머스
    KUIT
    typescript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
퀵차분
[시스템프로그래밍] 프로그램, 프로세스, 스레드에 관하여
상단으로

티스토리툴바