본문서는 아래 링크의 강의를 듣고 요약한 글입니다.
https://www.inflearn.com/course/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B3%B5%EB%A3%A1%EC%B1%85-%EC%A0%84%EA%B3%B5%EA%B0%95%EC%9D%98?srsltid=AfmBOoph9c9wgfx2gbeUCEE-RD1n9AbtKjdbkB07G3iT8rrpS1Psl_26
프로세스 는 실행중인 프로그램이다.
프로세스는 작업을 수행하기 위해, CPU 시간, 메모리, 파일, 입출력 장치등 특정 자원들을 요구한다.
즉 보조장치에서 메인 메모리에 적재되어, CPU를 점유하고 있어야 프로세스라 할 수 있겠다.
즉 OS의 가장 주된 임무는 프로세스를 관리하는 것이다.
프로세스의 레이아웃은 다음과 같이 나뉜다.
프로세스의 생애주기
PCB(Process Control Block) or TCB(Task Control Block): 프로세스를 관리하는 구조체.
각 프로세스의 정보가 PCB에 저장되고, PCB는 특정 프로세스와 관련된 많은 정보를 가지고 있음
프로세스란
멀티프로그래밍의 목적은 CPU 유틸을 최대화하기 위해 프로세스들을 동시에 실행하는 것이다.
시간 공유(time sharing)은 CPU 코어를 프로세스간 전환을 빠르게 해서 유저로 하여금 각 실행중인 프로그램과 상호작용할 수 있다.
스케줄링 큐(Scheduling Queues)

Context Switch
Context는 PCB에 나타난 프로세스다. 인터럽트가 발생하면 실행중인 프로세스의 context을 저장하고, 다시 복귀한다.
문맥 교환이란 작업이 CPU 코어를 다른 프로세서로 전환하고, 현재 프로세스의 상태를 저장하고, 다른 프로세스의 상태를 복원하는 것이다.
운영체제는 반드시 프로세스 생성, 프로세스 종료 메커니즘을 제공해야한다.
프로세스는 새로운 프로세스를 생성할 수 있다. 이때, 부모-자식 관계가 형성된다. 부모-자식은 서로 동시에 실행될 수 있으며, 부모 프로세스가 자식 프로세스가 종료될 떄까지 대기(wait)할 수도 있다.
주소 측면에서 자식 프로세스는 부모 프로세스의 복제일 수 있다. 아니면 새로운 프로그램을 적재하는 것일 수 있다.
프로세스 종료는 exit() 시스템 콜등을 통해 리소스들을 회수하면서 이뤄진다.
zombie 프로세스: 부모 프로세스가 wait()하지 않은경우
orphan 프로세스: 부모 프로세스가 wait() 하지않고 + 종료(terminated)된 경우
유닉스 기반 시스템에서 새로운 프로세스는 fork()를 사용한다. 자식 프로세스는 부모 프로세스의 주소공간을 복사하여 구성된다. 두 프로세스는 fork() 시스템 콜 이후 명령어에서 실행된다. fork() 반환이 0이면 자식, 아니면 부모 프로세스다.
fork() 시스템 콜을 수행하면 부모 프로세스는 계속 실행되거나; 자식 프로세스 종료까지 ready que에서 자신을 제거한다.
다음은 연습문제중 일부의 코드다.
int main()
{
pid_t pid, pid1;
pid = fork();
if (pid == 0){
pid1 = getpid();
printf("child: pid = %d\n", pid); // 자식 프로세스는 pid 0
printf("child: pid1 = %d\n", pid1);// A:자식 프로세스의 부모 프로세스 아이디
}
else if (pid > 0){
pid1 = getpid();
printf("parent: pid = %d\n", pid);// 자기 자신의 프로세스 아이디, A와 같아야함
printf("parent: pid1 = %d\n", pid1);//0 이 아닌게 맞음
wait(NULL);
}
}
int main()
{
pid_t pid;
pid = fork();
if (pid == 0){
execlp("/bin/ls","ls", NULL);
printf("LINE J\n");
}
else if(pid > 0){
wait(NULL);
printf("Child Complete\n");
}
}