본문 바로가기
운영체제

Fork & exec

by 세인트킴 2024. 3. 18.

프로그램을 시작하기 보다, 오래된 프로그램을 분기하는 것은 어떨까?

exec() - System call

int exec(char *prog, char **argv);
// 변신할 프로그램 정보, 변신하기 위해 필요한 정보

6가지의 상황에 따른 사용법이 존재한다.


exec() 호출 시

  • 현재 프로세스 중단
  • 인자로 들어온 prog(프로그램)을 address space에 적재
  • PCB를 ready queue에 등록
  • 새로운 프로세스 생성 X, 기존 프로세스 변신

shell에서 exec csh를 사용하면 어떻게 되나?

일반적인 csh

$csh - C shell로 변경
$ls
%exit - Born shell로 돌아옴

exec csh()

$exec csh
%ls
%exit
terminated...
Born shell로 돌아오지 않는다.

 

while(1)을 쓸 때, 0만 아니면 none zero로 받아 들여서 1은 상징적인 숫자일 뿐, 아무 숫자나 들어와도 상관없다.


UNIX shells

int main(int argc, char **argv)
{
  while (1) {
  	char *cmd = get_next_command();
    int child_pid = fork();
    if (child_pid == 0) {
	  manipulate STDIN/STDOUT/STDERR fd’s 
      exec(cmd);
	  panic(“exec failed!”);
    } else {
      wait(child_pid);
      } 
    }
}

Process의 상태

  • ready : CPU만 할당받으면 바로 실행할 수 있도록 준비된 상태
  • running : CPU가 실행하는 상태
  • waiting : 이벤트를 기다리는 상태

운영체제는 일정한 시간만큼 프로세스를 배정해준다. 그 시간이 끝나면 다른 프로세스에게 CPU를 넘겨준다. 

이런 과정을 문맥전환(context switch)라고 한다.

Thread

쓰레드는 공유에 관한 개념이다. 클라이언트로부터 여러 요청이 들어온다면 많은 할당을 할 때 무리가 발생하는데, 그럴 때 쓰레드를 이용하면 해결할 수 있다.

커널 레벨 쓰레드 : 커널(운영체제)이 자체적으로 프로세스를 어떻게 배정하는지 알고 있어서 자동 배정 해준다.

유저 레벨 쓰레드 : 커널은 프로세스만 알고 쓰레드는 몰라서, 유저가 자체적으로 배정해준다.

 

  • code는 쓰레드를 공유할 수 있다.
  • static data도 쓰레드를 공유하기 어렵다.
  • heap은 쓰레드를 공유할 수 있다.
  • stack도 쓰레드를 공유하기 어렵다.

쓰레드는 address sapce에서 영역을 구분해서 사용해야 한다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'운영체제' 카테고리의 다른 글

Critical Section Problem  (0) 2024.03.27
Threads and Process  (0) 2024.03.25