본문 바로가기
TIL (Today I Learned)/컴퓨터 시스템(CS)

[CS] 쉽게 배우는 운영체제 Chapter03 #1

by 둥굴프 2022. 12. 17.
이 문서는 유튜브 '널널한 개발자 TV'님의 강의를 토대로 작성되었습니다.

 

프로세스 스케줄링에서 부족한 학습을 위해서 키워드를 추가 학습하여 정리했다.

 

Context Switching

프로세스 큐에서 구별해야 할 3가지의 상태가 있다.

1. Ready-Queue : 자원을 사용하기위해 대기열에서 기다리는 상태

2. Sleep(ms) : 자발적으로 ms 시간만큼 대기열(ready-queue)에서 이탈하고 Queue에 합류.

3. Suspend : 타의적으로 대기열(ready-queue)에서 이탈됨

- swap 시점

- 오류로 인해서 프로세스가 죽었을 때

- 등등 의 이유로 suspend상태가 된다.

 

프로세스가 중단된 이후 다시 흐름을 이어가기 위해서 필요한 것이 '문맥'이다.

문맥이 바뀌는 것을 Context Switching이다.

문맥 교환이 일어날 때 교환되는 프로세스 상태(문맥)는 해당 프로세스의 PCB에 저장되고, 불러와진다.

 

 

Process의 생성과 복사

프로세스가 생성 된다면, 이를 사용하기 위해서 Memory에 복사한다.

Memory에는 실행 코드(.text)가 복사된다. 이 순산 Virtual Memory Space(heap, stack, data)가 확보된다. PCB도 생성된다.

 

이와 관련된 두 가지 리눅스 명령어가 있다.

fork() , exec()

fork() 시스템 콜은 부모 프로세스에 설정되어 있는 모든 정보를 카피하여 새로운 프로세스를 만드는 것이다.

부모 프로세스의 환경변수 등 모든 것을 우선 카피한 다음 초기화 하는 것으로 새로운 자식 프로세스를 생성하는 것이다.

 

반면, exec()는 새로운 메모리를 할당하지 않고 부모 프로세스를 죽이고, 부모 프로세스가 사용하던 자원을 그대로 자식 프로세스가 사용하게 한다.

 

 

fork()의 경우 자원을 PID가 완전히 다른 또 하나의 프로세스가 생긴다. (새로운 프로세스를 위한 자원할당을 해준다.)

exec()의 경우 호출한 프로세스의 PID가 그대로 새로운 프로세스에게 적용된다.

만약 호출한 프로세스가 없어지고 새로운 프로세스를 생성해야 하는 경우에는 exec()을 사용하는 것이 효율적이다.

 

exit() 시스템 콜은 호출한 프로세스를 종료한다.

 

wait() 시스템 콜은 대기상태로 빠진다. 보통 프로세스 수준에서 콜하면 멈추기 때문에 스레드 수준에서 콜한다.

 

 

멀티 스레드와 동기화 기본

 

OS는 Process에게 권한을 부여한다.

CPU를 사용하는 주체는 스레드이다 > 연산 단위는 스레드이다.

 

stack은 통상적으로 1mb를 갖는다.

스레드는 레지스터를 가지고있는데, 이는 Process Control Block 처럼 Thread Control Block을 따로 가지고 있다.

스레드는 실행을 하고, 이는 연산을 한다는 듯인데 즉 CPU의 Core를 사용하게 된다. 이 시점에 CPU의 레지스터 값에 접근 및 저장 등 상태를 스레드의 TCB에 저장한다.

 

멀티 스레드를 사용하게 되면서 계속 나오는 단어는 '우연'이다.

동기화 개념이 없다면 각각의 스레드는 자원을 사용하기 위해서 경쟁한다.

경쟁하는 과정에서 스레드 서로의 상태를 알 수 없고, 원자성이 보장되는 기계어 instruction 명령을 제외하고 뒤죽박죽 엉킨다. 즉, 우연에 맡긴 코드가 완성된다.

 

이를 해결하기 위해서 '동기화'를 해야한다.

동기화를 하기 위해서 리눅스에서 '시그널'이라는 개념을 사용한다.

(윈도우에서는 이벤트라는 개념이 있다.)

 

시그널은 커널 오브젝트여서 한번 열면 반드시 닫아줘야한다.

https://blockdmask.tistory.com/23

위 블로그를 참고하여 함수를 익히자.

 

 

 

 

스레드 기본 개념 참고 자료 :

http://csys.yonsei.ac.kr/lect/os/o4.pdf

POSIX THREAD EXAMPLE :

https://www.joinc.co.kr/w/Site/Thread/Beginning/Example_pthread

 

 

 

 

글을 마치며,

스레드는 위에 링크연결한 POSIX THREAD EXAMPLE을 학습하여 코드로 활용하는 방법을 익혀야할 것 같다.

내 글은 낙서와 같다.

학습하며 중요하다고 생각하는 것만 적어서 다른사람이 이해하기 힘들고 불친절하다고 느낄 것이다.

참고자료와 참고영상을 확인해서 학습하기를 바란다.

 

 

 

긴 글 읽어주셔서 감사드립니다.

22.12.16

댓글