운영체제
*이 내용은 인프런 그림으로 쉽게 배우는 운영체제를 수강하며 정리한 내용입니다.
program과 process
하드디스크등과 같은 저장장치에 저장된 명령문의 집합체를 말해.
애플리케이션이나 앱이라고도 불리고 windows 운영체제에서는 .exe 의 모습을 하고있지.
그럼 process는 뭘까?
간단히 말하면 실행중인 프로그램이야.
하드디스크에 저장된 프로그램이 메모리에 올라갔을 때 실행 중인 프로그램, 즉 프로세스라고 불려.
프로그램은 수동적, 프로세스는 수동적인 존재라고 할 수 있어.
process의 구조
Code
Data
Heap : 프로그래머가 동적으로 메모리를 할당하는데에 쓰인다. ( malloc, free )
Stack
컴파일 과정
멀티프로그래밍과 멀티프로세싱
유니프로그래밍 : 메모리에 오직 하나의 프로세스가 올라온 것
멀티프로그래밍 : 메모리에 여러 개의 프로세스가 올라온 것
멀티프로세싱 : CPU가 여러 개의 프로세스를 처리하는 것
PCB (Process Control Block)
프로세스가 만들어지면 운영체제는 해당 프로세스의 정보를 가지고있는 PCB를 만들고 저장해.
PCB들은 연결리스트라는 자료구조로 저장돼.
운영체제는 프로세스가 종료되면 해당 프로세스의 PCB를 연결리스트에서 제거해.
프로세스 상태
실행상태에 있는 프로세스의수는 CPU의 개수만큼 입니다.
대기상태
프로세스가 입출력 요청을 하면 입출력이 완료될 때까지 기다리는 상태야.
CPU에 비해 입출력작업은 상당히 느려.
특정 프로세스가 입출력 요청을 하면 입출력이 완료될 때까지 CPU를 기다리게 하는건 굉장히 비효율적이야.
대신 입출력 요청을 한 프로세스를 "대기상태"로 두고 다른 프로세스에게 CPU를 할당해
그러다가 시간이 지나서 입출력 작업이 완료되면 "대기상태"에 있던 프로세스에게 CPU 할당 기회를 줘
컨텍스트 스위칭
프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스의 상태를 저장하고 다른 프로세스의 상태값으로 변경하는 작업이야.
컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경돼. 실행 중인 프로세스의 작업 내용을 PCB에 저장하고 실행될 기존 프로세스의 PCB의 내용대로 CPU가 다시 세팅돼.
컨텍스트 스위칭이 일어날 때 PCB에 변경하는 값들로는 아래와 같아.
운영체제에서 프로세스 A와 프로세스 B사 컨텍스트 스위칭을 하는 법을 알려줄게.
먼저 CPU에서 프로세스 A를 실행해.
시간이 지난 후 운영체제에서 CPU가 프로세스 A를 너무 오래 실행했다고 판단하면
프로세스 A는 하던 일을 멈추고, 현재 CPU의 레지스터 값 등을 PCB A에 저장해.
이제 PCB B를 참조해서 이전 프로세스 B의 상태로 CPU의 레지스터값을 설정해.
여기에는 다음 실행할 명령어의 주소를 가지고있는 프로그램 카운터(PC)를 가지고있기 때문에 바로 프로세스 B의 명령어를 실행할 수 있어.
프로세스 B가 점유시간동안 CPU를 사용하다가 점유시간이 다되면 운영체제는 다시 인터럽트를 발생시키는거지.
컨텍스트 스위칭은 CPU 점유시간이 다됐거나, I/O 요청이 발생하거나, 다른 종류의 인터럽트가 있을 때 등의 상황에서 발생해.
프로세스 생성과 종료
일반적으로 프로세스가 생성될 때의 방법에 대해 설명할게.
.exe 파일을 더블클릭으로 실행하면 운영체제는 해당 프로그램의 코드영역과 데이터영역을 메모리에 로드하고 빈 스택과 빈 힙을 만들어 공간을 확보해.
그리곤 이 프로세스를 관리하기 위한 PCB를 만들어서 값을 초기화해줘.
지금 설명한 프로세스 생성과정은 운영체제가 부팅되고 0번 프로세스가 생성될 떄 딱 한번 실행돼.
그리고나서 나머지 모든 프로세스는 새로 생성하지않고 0번 프로세스를 복사해서 사용하게 돼.
이때 fork() 함수를 사용해.
복사해서 사용하는 이유는 새로 생성하는 것보다 복사를 하는게 더 빠르기 때문이야.
0번 프로세스를 복사해서 생성된 프로세스들을 자식 프로세스라고 해. 그럼 0번 프로세스는 부모 프로세스가 되겠지?
자식 프로세스는 부모 프로세스의 코드영역, 데이터영역, 스택영역과 PCB의 내용을 전부 복사해.
0번 프로세스의 코드와 데이터를 모두 복사해서 실행하면 0번 프로세스가 똑같이 실행되는거 아닌가?
맞아...
그럼 자기가 원하는 함수를 어떻게 실행시킬까? 바로 exec() 함수를 이용하면 돼.
fork() 함수로 프로세스를 복사 후 exec() 함수를 실행시키면 자식 프로세스의 코드와 데이터 영역을 원하는 값으로 덮어쓰게 돼.
그럼 이때부터 자식 프로세스는 부모 프로세스와 완전히 다르게 동작하게되는거지!
쓰레드
참조 : 그림으로 쉽게 배우는 운영체제
3주차 회고
칭찬하고 싶은 점 : 기한을 지켰다 😅
아쉬웠던 점 : 권장 커리큘럼을 지키지 못했다.
댓글을 작성해보세요.