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
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에 관하여 (0) | 2023.11.02 |
[시스템프로그래밍] 디렉토리 엔트리, hard/symbolic link, stat에 관하여 (0) | 2023.11.02 |
[시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 2 (1) | 2023.10.26 |
[시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 1 (0) | 2023.10.26 |