시스템 콜 과 커널

2022. 11. 27. 16:07카테고리 없음

User Mode 

프로그램 실행중에 인터럽트 (interrupt) 가 발생하거나 시스템 콜(systemcall)을 호출하게 되면 커널 모드가 실행된다 .(전환)

Kernel Mode

프로그램의 현재 cpu 상태를 저장한다. 커널이 인터럽트나 시스템콜을 직접처리 즉, cpu 에서 커널 모드가 실행된다.

처리가 완료되면 중단됐던 프로그램의 cpu상태를 복원한다.

 

kernel mode -> user mode

프로그램 이어서 실행된다 

커널?

운영체제의 핵심 시스템의 전반을 관리/감독하는 역할 

하드웨어와 관련된 작업 직접 수행한다. 함부로 하드웨어를 점유해서 사용하고 다른 프로세스 영향받고 붕괴 되기에 시스템을 보호하기 위해서  커널이 있다.

물리적 컴퓨터 ,즉 하드웨어 요소들을 os의 최하단, 기계를 상대하는 최전선에서 직접 다루고 관리 
운영체제라는 소프트웨어의 존재 이유이자 핵심
컴퓨터란 기계에게 명령을 내리고 결과를 받아 올 수 있는 것은 커널 덕분이다.

커널모드?

시스템 전반 적인 것들 하드웨어 관련한 것은 커널이 담당을 하고 우리같은 개발자가 작성한 코드는 커널을 통해서 시스템 기능이나 하드웨어를 사용할수 있게 함으로써 시스템이 안정적으로 돌아갈 수 있게 보호하기 위해 커널 모드가 있다.

 

*Interrupt

시스템에서 발생한 다양한 종류의  이벤트 혹은 그런 이벤트를 알리는 메커니즘 

 

<종류>

전원에 문제가 생겼을때

i/o 작업이 완료 되었을때

시간이 다 됐을때(timer)
0으로 나눴을때 

잘못된 메모리 공간에 접근을 시도할떄 

 

System Call

프로그램이 os커널이 제공하는 서비스를 이용하고 싶을때 시스템 콜 통해 실행 

 

<시스템 콜 종류>

프로세스/ 스레드 관련

파일I/O 관련

소켓 관련

장치( device)관련

프로세스 통신 관련

 

 

 

 

 

ex) 하드웨어 혹은 시스템 관련 기능은 어떤 프로그램이라도 반드시 시스템콜을 통해서만 사용가능하다.

 

멀티태스킹, 시간 오버 

 

Q.우리는 코딩을 통해서  파일 i/o ,네트워크i/o,프로세스/스레드 관련 작업을했다, 시스템콜 호출도 없이  어떻게

한것일까?

 

 

하위레벨 프로그래밍 언어들이 시스템콜을 포장해서 간접적으로 사용 

 

1. 기본적인 운영체제 기능

 

'시스템콜(system call)'이란 것을 알기전에 저희는 먼저 기본적인 운영체제의 기능에 대해서 알고 있어야합니다. 

물론 당연히 이 부분은 알고 계신 분들이 많을거라 생각이 듭니다!(여러분들은 컴퓨터쪽 종사자일테니까요 하핳)

하지만! 잘 모르는 사람들이 있을수도 있기에 그런 분들을 위해 간략하게 알려드리도록 하겠습니다.

기본적으로 '운영체제(Operating System)' Operating(운영)이란 이름에 걸맞게 컴퓨터를 제대로 실행 및 사용하게 해주는 프로그램입니다.

운영체제가 하는 역할과 중요성은 차마 다 쓰지 못할정도로 너무나 많습니다. 

우리 눈에 정~말 간단해 보이는 마우스를 움직이는 것부터(마우스란 하드웨어로부터 오는 신호를 모니터 픽셀과 함께 해석하여 필요한 계산값을 CPU에 전달하고, 계산받은 값을 프로그램에 전달해주거나 화면에 보여주는 것) 

우리가 더블 클릭한 프로그램 실행과 종료까지...(프로그램의 실제 위치를 찾아가고{정확힌 파일시스템 역할}, 데이터가 저장된 디스크 위치를 찾고, 그 위치에 적힌 데이터가 얼마나 메모리를 필요로 할지 계산하고, 프로그램의 코드를 메모리에 올리고{실행하고}, 종료)

지금 딱 운영체제가 하는 수~ 많은 역할 중 딱 2개만 말했지만 사실 그 2개도 각각 엄청 복잡한 과정을 통해 이루어진다 것이죠... 그러니 말하지 않은 운영체제 역할들을 말하려면 끝이 없겠죠?(사실 말한 2가지도 간략하게 설명한 것으로, 실제 과정은 더욱 어마어마 합니다..)

이정도로 운영체제가 하는 역할이 사실 많고 중요하기에 그냥 운영체제가 없으면 컴퓨터를 사용 못한다. 라고 생각해도 될 정도죠.

그만큼 복잡하고 중요한 프로그램이 바로 '운영체제'이기 때문에 컴퓨터 사용에 필수적이며, 그래서 운영체제의 가격이 비싼것도 사실 어느정도 이해가 되는 부분입니다.

음... 운영체제가 중요한 건 알겠는데 그게 'system call'이란 것과 무슨 관계가 있나요?

후후.. 무슨 관계가 있냐고요? 바로 시스템 콜(system call)이란 것이 바로 프로세스가 운영체제(system)에게 운영체제 기능 요청하는(call) 것이기 때문이죠!

 


 2. system call이란? 사용하는 이유

 

'시스템콜(system call)'이란 프로세스가 컴퓨터를 관리하는 시스템(system)인 운영체제에게 어떤 기능(서비스)를 사용하게 해달라고 요청(call)할 때 사용하는 방법입니다.

위에서 알려드린대로, 컴퓨터의 대부분의 활동은 운영체제를 통해 실행 및 관리가 됩니다.

실행중인 프로그램인 '프로세스'도 결국 운영체제를 통해 실행이 되고 관리가 되죠. 

예시를 들자면 '운영체제' 회사 관리자 '프로세스'는 말단 직원인겁니다. 

'프로세스3'이란 직원이 자기 자리에 앉아 자신의 프로그램 코드를 실행중이였는데, 만약 자기 프로그램외 특정 파일 데이터를 필요로 한다고 쳐봅시다. 이럴 때 그냥 조용히 독자적으로 파일 데이터를 읽어들일 수 있을까요? 

아니죠~ 멋대로 다른 파일을 읽어들이는 것도 문제지만 기본적으로 파일을 읽고, 메모리에 데이터를 올리는 것은 운영체제의 역할입니다.

이런 경우 '프로세스3(ps3)'는 관리자 운영체제에게 허락을 요청(call)을 할 수 밖에 없습니다.

어떤 뭐뭐 파일 데이터가 필요하니 사용해도 되겠습니까? 라고 말이죠.

비단 특정 파일이 필요한 경우만 해당되는게 아니죠~ 당연히 운영체제가 관리하는 모든 자원(네트워크, 디스크, 메모리 등등등)을 '프로세스'가 필요로 할 경우 전부다 이 '시스템콜(system call)'을 통해 사용해야합니다.

파일을 여는 것(open)도 그렇고, 기존 프로세스를 다른 프로그램으로 바꾸는 것(exec), 똑같은 프로세스를 하나 더 만드는 것(fork) 그리고 다른 프로세스에게 어떤 행위를 지시하는 시그널(신호)을 보낼 때(kill)도 말이죠.  

이런 이미지처럼 말입니다.

 


 

그리고 그런 시스템 콜들은 실제로 운영체제에서 사용하라고 만들어놓은 코드들(함수)로, 프로그래밍을 할 때 시스템콜이 들어있는 헤더파일을 불러와서 사용합니다.

'리눅스인 경우'에는 man 페이지에 '시스템 콜(함수)'가 어떤 헤더파일에 들어있고그 함수에서 사용하는 변수나, 함수의 이름들 또 매개변수를 무엇을 받으며, 어떤 값을 반환하는지 등등 자세하게 정보가 적혀있습니다.



이렇게 말이죠. 

또한 여러분들도 예상하시다시피 프로세스가 실행되면서 실시간으로 필요한 자원들은 정말 어마어마하게 다양하고 많을 겁니다. 그렇기에 당연히 필요할 때마다 사용하라고 만들어놓은 시스템콜(system call)종류도 엄청나게 많습니다.

현대 운영체제들은 보통 수 백개의 시스템콜들을 가지고 있다고 합니다.(리눅스와 OpenBSD는 300개가 넘는 수, NetBSD는 500개에 가까운 수, 윈도우 7인 경우 700개 가까이 있다고 합니다) 출처 : https://en.wikipedia.org/wiki/System_call

그리고 엄청나게 많은 시스템 콜(system call)들중에 위에서 앞서 언급한 우리들이 잘 아는 시스템콜인 "open(), exec(), fork(), kill()"들이 포함되는 것이죠!