본문 바로가기
728x90

Linux14

태스크(task)관리-(2) fork()는 프로세스를 생성하는 함수이고, clone()은 쓰레드를 생성하는 함수인데 커널 내부에서 마지막으로 호출되는 함수 do_fork()로써 동일한데 이런게 가능한 이유는 리눅스는 모두 task를 생성하기 때문이다. fork()는 비교적 부모태스크와 덜 공유하는 task이고 clone()은 비교적 부모태스크와 많이 공유하는 task이다. 즉, do_fork()를 호출할 때 이 함수의 인자로 부모 태스크와 얼마나 공유할지를 정해 줌으로써, fork()와 clone() 함수 둘 다를 지원 할 수 있는 것이다. □ tgid(Thread Group ID) 시스템에 존재하는 모든 태스크는 유일하게 구분이 가능해야 한다. 태스크 별로 유일한 이 값은 task_struct 구조체 내의 pid 필드에 담겨있다... 2016. 8. 30.
fork()와 vfork()에 대해서. vfork() 함수는 fork()의 단점인 오버헤드(ex: 프로세스 구조체를 할당받는 시간과 메모리)를 낮춤으로써 고안되었다. vfork()가 도입됐지만 fork()함수 또한 상당히 개선되었다. 가장 주목할만한 점은, 'copy-onwrite'의 도입이다.프로세스의 주소공간의 복사는 ,같은 물리메모리들이 수정될때까지넌지시 허용되어왔다. 이것은 대략 , vfork()가 생기게된 원인에대해는 정당화되지 않는셈이다. 이것은 실제로 vfork()의 기능적인 면에서 시스템의 중요한 부분의 의미론적인 오류이다. 비록 호환성을 위해 아직 까지 vfork()가 존재하는것일지 모르지만, vfork()의 의미에 상관없이 fork()를 사용한다. 결국 fork()와 vfork()를 차이점에대해 어떨때 사용하는것에대해는 의미.. 2016. 8. 29.
프로세스와 쓰레드의 생성과 수행(부제 : 쓰레드와 프로세스의 차이점) 프로세스 생성 예제 이 예제는 전역변수 g와 지역변수 l을 가지고 있으며 fork()함수를 통해 새로운 프로세스를 생성한다. 그 결과, 16196번 pid를 가지는 부모 프로세스가 16197번 pid를 가지는 자식 프로세스를 생성하였음을 알 수 있다. 또한 이 프로그램에서는 자식 프로세스가 전역 변수와 지역 변수를 각각 1씩 증가시키고 있음을 알 수 있다. 반면, 부모 프로세스에서 g와 l변수 값을 출력하면 각각 원래 값인 2와 3이 출력됨을 알 수 있다. 이를 통해, 프로세스가 생성되면 주소공간을 포함하여 이 프로세스를 위한 모든 자원들이 새로이 할당됨을 알 수 있다. 따라서 자식 프로세스의 연산 결과는 자식 프로세스 주소 공간의 변수에만 향을 줄 뿐 프로세스 주소공간의 변수에는 영향이 없으며, 결국 .. 2016. 8. 29.
태스크(task)관리-(1) 태스크(task) : 자원소유권의 단위 프로세스(process): 동작중인 프로그램(running or runnable program)※ 리눅스는 각 프로세스에게 총 4 GB의 공간을 할당. (0 GB ~ 3 GB 유저공간, 3 GB ~ 4 GB 커널공간) 32bit-cpu 64bit-cpu에서는 2의 64승(16 EB) 크기의 가상 공간중 반은 유저공간, 반은 커널공간, 쓰레드 : 수행의 단위 프로그램(program) : 디스크에 저장되어 있는 실행 가능한 형태의 파일. ※ 실행 가능한 형태의 파일은 컴파일 과정을 거쳐 얻어진 바이너리 기게명렁어와 수행에 필요한 자료들의 집합으로 구성. 프로세스는 동작중인 프로그램이며, 커널로부터 할당받은 자신만의 자원을 가지고,cpu가 기계어 명령들을 실행함에 따라 .. 2016. 8. 29.
728x90