본문 바로가기

전체 글502

25. 프로세스 - 우선순위 스케줄링 시스템 콜 0. 시작하기전에 - 이번 포스팅에서는 프로세스 스케줄링과 관련된 시스템 콜에 대해서 배울 예정이다. 1. 우선순위 기반 스케줄러 (priority based) - 우선순위를 기반으로 프로세스의 실행순서를 정하는 스케줄링 방식이다. a) 리눅스는 우선순위에 크게 영향을 받지 않는다. - 리눅스는 우선순위에 크게 영향을 받는 스케줄링 방식을 사용하지 않는다. - 당연히, 우선순위를 확인하고 이에 따라 실행되도록 하는 시스템 콜이 존재하지만, b) 그렇다면 왜 리눅스는 우선순위 기반의 스케줄링을 지원하는가? - 리눅스 운영체제 자체가 우선순위에 크게 중점을 두지 않은 방식으로 스케줄링을 하도록 설계되어있다. - 그렇다면 왜 우선순위 스케줄링의 시스템 콜을 제공할까? 이는 POSIX 규격으로 운영체제를 표준화.. 2021. 9. 17.
24. 프로세스 - 프로세스 생성과 종료 총정리 0. 시작하기전에 - 이번 포스팅에서는 이전까지 배운 프로세스 관련 시스템 콜에 대해서 총정리를 할 예정이다. - 추가적으로 wait() 시스템 콜에 대해서 깊이있게 다뤄볼 것이다. 1. 프로세스 생성부터 종료까지 - 아래의 그림을 통해서 전체적인 프로세스 생성 및 종료 과정을 복습해보자. a) 새로운 프로세스를 생성하는 방법 - fork() 시스템 콜을 이용하여 기존의 프로세스를 복사하는 방식으로 새로운 프로세스를 생성한다. - 복사의 대상이 되는 기존 프로세스를 부모 프로세스라고 부른다. - 복사를 통해 새로 생성된 프로세스를 자식 프로세스라고 부른다. - 이를 통해, 프로세스 간의 계층이 형성된다. - fork() 시스템 콜은 PID 값을 반환하는데, 이를 통해서 부모와 자식 프로세스를 구분할 수 .. 2021. 9. 17.
23. 프로세스 - 프로세스 종료(exit) 1. exit() 시스템 콜 - exit()은 프로세스를 종료할 때 사용하는 시스템 콜이다. a) exit()의 원형 #include void exit(int status); - exit() 시스템 콜은 stdlib 라는 기본 라이브러리에 속해있는 함수다. - exit()의 인자(parameter)는 상태를 나타내는 정수를 입력한다. b) exit() 함수를 사용하는 이유 - exit() 함수는 프로세스의 수행과정에서 비정상적인 종료가 필요한 경우에 사용한다. - C언어 코딩을 하다보면 exit(0)함수 보다 return 0;을 입력하는 경우가 많다. - 그렇다면 return 0과 exit(0)함수의 차이는 무엇일까? c) return 0 와 exit(0)의 차이점 - main함수 내부에서의 exit(0.. 2021. 9. 17.
22. 프로세스 - copy on write 0. 시작하기전에 - 리눅스 프로세스 생성 속도를 높이는 copy on write 기술을 알아볼 예정이다. - 이를 이해하기 위해서는 기본적으로 리눅스의 프로세스 구조와 가상메모리 시스템간의 메커니즘을 이해해야한다. - 이 부분은 운영체제 파트에서 깊게 다루었던 내용이기 때문에, 간략하게 복습해보자. 1. 리눅스 프로세스 구조 a) 프로세스의 기본구조 - 모든 프로세스는 4GB의 가상메모리를 할당받는다. - 3GB ~ 4GB의 가상메모리 주소는 OS 코드가 들어있는 커널 영역에 할당된다. - 0GB ~ 3GB의 가상메모리 주소는 응용프로그램의 코드가 들어있는 사용자 영역에 할당된다. - 프로세스 메모리로 알고있는 text, data, bss, heap, stack은 사용자 영역에 존재한다. b) 모든 프.. 2021. 9. 16.
21. 프로세스 - wait & 쉘 만들기 0. 시작하기전에 - 이전에 배운 fork()와 exec()에 대해서 간략하게 복습해보자. ▶ fork() - 기존의 프로세스를 복사하여 새로운 프로세스를 생성한다. - 기존의 프로세스를 부모 프로세스, 새로 생성된 프로세스를 자식 프로세스라고 한다. - 이로 인해서, 프로세스간의 계층이 생성된다. ▶ exec() - 기존의 프로세스를 재활용하는 방식으로 새로운 프로세스를 만든다. - 기존 프로세스의 Text, BSS, Data 메모리를 새로운 코드이미지로 덮어 씌워 새로운 프로세스를 생성한다. - 여기서 한가지 의문점이 생길 수 있다. 왜 프로세스를 만드는 방식을 fork()와 exec(), 두가지가 필요할까? 1. 리눅스의 프로세스 생성 방식 - fork()를 사용하든, exec()를 사용하든 리눅스.. 2021. 9. 16.
20. 프로세스 - 프로세스 생성(exec) 1. exec() - 프로세스를 생성하는 방법 - exec() 시스템 콜을 호출한 프로세스의 Text, BSS, Data 공간에 새로운 프로세스에서 사용할 코드 이미지를 덮어씌운다. - 별도의 프로세스를 생성하는 방식이 아니라, 기존의 프로세스를 재활용하는 방식으로 새로운 프로세스를 생성한다. 2. exec() 시스템 콜의 원형 - exec() 함수는 기존의 프로세스의 공간을 재활용 하는 방식으로, Text, BSS, DATA영역을 재활용 한다. - 그러므로 parameter를 통해 덮어씌울 데이터를 입력받는다. - 하나씩 알아보자. a) execl() 시스템 콜의 구조 excel("파일의 절대주소", "argv[0]", "argv[1]", ... , NULL( - argv는 arguement를 의미하는.. 2021. 9. 15.
19. 프로세스 - 프로세스 생성(fork) 0. 시작하기전에 - 프로세스의 구조가 어떻게 되어있는지 복습해보자. https://devraphy.tistory.com/159 13. 프로세스 구조(1) 프로세스와 컨텍스트 스위칭 스케줄러에 의해 어떤 프로세스에서 다른 프로세스로 바뀌는 과정을 컨텍스트 스위칭이라고 한다. 이 컨텍스트 스위칭을 이해하기 위해서는 프로세스의 구조에 대 devraphy.tistory.com 1. 프로세스 생성 a) 기본적인 프로세스 생성과정 - 5가지 프로세스 메모리 공간(Text, Data, BSS, Heap, Stack)이 생성된다. - 코드 이미지가 각 프로세스 공간에 업로드되고, 실행된다. b) 프로세스 계층의 형성 - 이전 포스팅에서 다룬 내용이므로 간략하게 복습해보자. - 리눅스에서는 프로세스를 생성할 때, 기존.. 2021. 9. 15.
18. 프로세스 - 시스템 콜 0. 시작하기전에 - 지난 포스팅에서는 프로세스에 대해 간략하게 배우면서, 프로세스 ID에 대해서 알아보았다. - 이번 포스팅에서는 프로세스와 관련된 시스템 콜에 대해서 배울 예정이다. 1. 프로세스 관리에 사용되는 시스템 콜 - 프로세스 관리 관련된 시스템 콜을 사용해보기 위해서는 gcc를 설치해야 한다. - 이전 포스팅을 참고하여 gcc(C언어 컴파일러)하는 것을 권장한다. a) getpid() 와 getppid() - 현재 프로세스의 pid와 ppid를 반환하는 함수다. - 프로세스 ID는 커널 영역을 통해 알아낼 수 있는 정보이기 때문에, 시스템 콜을 사용한다. - 우선 함수의 원형부터 살펴보자. #include #indclude pid_t getpid(void); pid_t getppid(voi.. 2021. 9. 15.
17. 프로세스 - 프로세스 ID 0. 시작하기전에 - 프로그램, 프로세스, 스레드에 대해서 간략하게 복습해보자. ▶ 프로그램 - 바이너리, 코드이미지, 응용프로그램, application, 실행파일 등의 다양한 형태로 존재한다. ▶ 프로세스 - 현재 실행중인 프로그램으로, 메모리에 적재되어 있으며 프로세스 상태정보(PCB)를 사용하여 처리한다. ▶ 스레드 - 프로세스 내부에 나뉘어져 있는 세부 작업을 가리킨다. - 리눅스 프로세스는 기본적으로 싱글스레드 형식을 가진다. - 싱글스레드 프로세스: 기본 프로세스 - 멀티스레드 프로세스: 여러 스레드가 존재하는 프로세스 1. 프로세스 ID - 각 프로세스에 부여되는 프로세스 고유번호, PID - PID의 최대값은 32768이다. (2의 15승) - 부호형(signed) 16비트 정수값을 사용.. 2021. 9. 15.
16. 시스템 프로그래밍 - ABI와 표준 1. API - API는 다양한 환경에서 사용될 수 있도록 하위호환이 가능한 인터페이스다. - 하위호환이라는 의미는, 실행파일(= 응용프로그램)의 코드를 변경하지 않고도 다양한 환경에서 동일한 기능을 수행할 수 있도록, - 하나의 기능에 대해서 다양한 인터페이스를 제공한다는 의미다. 2. C 라이브러리 ▶ libc - 유닉스의 C 라이브러리 ▶ glibc(GNU libc) - GNU 프로젝트에서 개발된 리눅스 C 라이브러리 - 시스템 콜, 시스템 wrapper, 기본 응용 프로그램 등이 포함된 라이브러리 3. C 컴파일러 ▶ cc - 유닉스의 C 컴파일러 ▶ gcc(GNU cc) - GNU 프로젝트에서 개발된 리눅스 C 컴파일러 - 우분투 리눅스에는 gcc를 설치하여 사용한다. - gcc 컴파일러를 설치.. 2021. 9. 10.
15. 시스템 프로그래밍 핵심개념 1. 시스템 프로그래밍 기반요소 - 리눅스의 시스템 프로그래밍은 크게 3가지를 기반으로 두고 있다. ▶ 시스템 콜(System call) - 운영체제를 사용자 영역에서 제어하기 위한 명령어 - 사용자가 접근할 수 없는 커널영역을 시스템 콜을 이용해 조작할 수 있다. - 리눅스의 시스템 콜은 C언어를 기반으로 한다. ▶ C 라이브러리 - 여러가지 기능을 묶어놓은 것을 라이브러리라고 한다. - 시스템 콜도 라이브러리 형태로 제공된다. - 라이브러리를 API라고 말하기도 한다. ▶ C 컴파일러 - 리눅스는 C언어로 구성되어 있다. - C언어는 컴파일러를 필요로 하는 언어다. - 그러므로 C 컴파일러는 필수다. 2. System call a) 시스템 콜 - 운영체제 파트에서 깊이있게 배운 개념이므로 간략하게 알.. 2021. 9. 10.
14. shell - 소프트링크와 특수파일 1. 소프트링크 - 소프트링크는 심볼릭 링크라고도 불린다. - 하드링크와 마찬가지로, 소프트링크도 ln 명령어를 통해 사용한다. - 그러나 -s 옵션을 사용한다는 것에서 차이점이 생긴다. a) ln -s 옵션 - s 옵션을 함께 사용하면, 윈도우의 바로가기 기능과 동일한 기능을 수행한다. - 즉, 원본파일이 삭제되면 소프트링크도 함께 삭제되는 것이다. b) ls - al로 소프트링크 확인하기 - 소프트 링크와 하드링크의 차이점은 ls -al 명령어를 통해 이를 확인할 수 있다. - 우선 ln -s 옵션을 이용하여 소프트링크를 생성한다. - 다음 ls -al 옵션을 이용하여 파일의 정보를 출력한다. - 특이한 점은 권한정보가 다르다는 것이다. - 위의 사진에서 가장 좌측에 적혀져 있는 권한 부분을 살펴보자.. 2021. 9. 10.