• os

System Call과 Dual Mode

CPU의 사용자 모드와 커널 모드가 나뉜 이유, 시스템 콜의 동작 과정과 유형을 정리한다.

시리즈 · 운영체제2 / 18
  1. 운영체제의 유형
  2. System Call과 Dual Mode
  3. 인터럽트와 폴링
  4. 프로세스와 PCB, 프로세스의 상태 변화
  5. 프로세스 주소 공간과 Stack이 높은 주소부터 할당되는 이유
  6. 스레드: 사용자·커널 수준 스레드와 Thread Pool, Fork-Join
  7. Context Switching
  8. 프로세스 스케줄링: 단계와 알고리즘
  9. Thread Scheduling: 경합 범위 PCS와 SCS
  10. 경쟁 상태와 상호 배제: Thread Safe, 데커·피터슨 알고리즘
  11. 뮤텍스와 세마포, 모니터
  12. 교착 상태: 발생 조건과 해결 방법
  13. 메모리 계층 구조와 캐시 메모리
  14. 메모리 관리: 주소 바인딩과 연속 메모리 할당
  15. 가상 메모리: Paging과 Segmentation, TLB
  16. 요구 페이징과 페이지 교체 알고리즘, Thrashing
  17. File Descriptor와 File System, I-Node
  18. 동기/비동기와 블로킹/논블로킹, I/O Multiplexing

Dual Mode

사용자 프로그램과 운영체제는 시스템 자원을 공유한다. 사용자 프로그램에 제한을 두지 않으면 메모리 안의 운영체제 자원을 망가뜨릴 수 있으므로, 자원 접근을 제한하는 보호 장치가 필요하다. 이 보호 장치가 이중 동작 모드(dual-mode operation) 다.

CPU는 mode bit로 두 모드를 구분한다. 0이면 커널 모드, 1이면 사용자 모드다.

구분 사용자 모드 (mode bit = 1) 커널 모드 (mode bit = 0)
실행 주체 사용자 애플리케이션 코드 운영체제
접근 범위 제한된 영역만 접근. 디스크, I/O 같은 하드웨어에 직접 접근할 수 없다. 하드웨어를 제어하는 특권 명령(privileged instruction)을 실행할 수 있다.
  • 시스템에 나쁜 영향을 줄 수 있는 명령은 특권 명령으로 지정하고, 커널 모드에서만 실행되게 한다.
  • 파일을 읽고 쓰거나 화면에 메시지를 출력하는 등 프로그램 동작의 많은 부분이 커널 모드를 거친다.
  • 사용자 애플리케이션의 각 스레드는 고유의 사용자 모드 스택을 가진다.

프로세스는 사용자 모드에서 실행되다가 시스템 자원이 필요해지면 시스템 콜을 호출해 커널 모드로 전환하고, 작업이 끝나면 다시 사용자 모드로 돌아온다.

시스템 콜 호출 시 사용자 모드와 커널 모드 사이의 전환

System Call

응용 프로그램은 OS가 제공하는 인터페이스를 통해서만 자원을 사용할 수 있다. 이 인터페이스가 시스템 콜(system call) 이다. 디스크의 파일에 접근하거나 화면에 결과를 출력하는 것처럼 특권이 필요한 작업을, 운영체제에 대신 수행해 달라고 요청하는 것이다.

왜 필요한가

사용자 레벨의 프로그램은 사용자 레벨의 함수만으로는 많은 기능을 구현할 수 없어 커널의 도움을 받아야 한다. 그런데 사용자 모드에서는 커널 기능을 직접 쓸 수 없으므로, 커널 모드로 전환해 권한을 얻는 정해진 통로가 필요하다.

실행 과정

  1. 사용자 모드의 응용 프로그램에 하드웨어를 사용해야 하는 작업이 생긴다.
  2. 보통은 언어가 제공하는 라이브러리가 대신 시스템 콜을 호출한다.
  3. 커널 모드로 전환되고, 커널이 권한을 확인한 뒤 작업을 수행한다.
  4. 작업이 끝나면 사용자 모드로 돌아온다.

예를 들어 C의 printf는 stdio 라이브러리를 거쳐 write() 시스템 콜을 호출한다. 이때 커널 모드로 전환되어 출력을 수행하고 다시 사용자 모드로 복귀한다.

서로 다른 시스템 콜을 구분하는 방법

각 시스템 콜에는 번호가 할당된다. 시스템 콜 인터페이스는 시스템 콜 번호와 핸들러 함수 주소로 구성된 시스템 콜 테이블을 유지하고, 운영체제는 커널 영역에서 해당 번호(인덱스)가 가리키는 주소의 루틴을 수행한다. 즉 시스템 콜 번호로 구분한다.

매개변수 전달

  • 매개변수를 CPU 레지스터에 담아 전달한다. 다만 매개변수가 레지스터 수나 크기보다 클 수 있다.
  • 그런 경우 매개변수를 메모리에 저장하고, 그 메모리 주소를 레지스터로 전달한다.

System Call의 유형

유형 하는 일 Unix 예시
프로세스 제어 종료(exit)·중지(abort), 적재·실행, 프로세스 생성, 속성 획득·설정, 시간·사건 대기, 사건 알림, 메모리 할당·해제 fork(), exit(), wait()
파일 조작 파일 생성·삭제, 열기·닫기·읽기·쓰기, 위치 변경, 파일 속성 획득·설정 open(), read(), write(), close()
장치 관리 장치 요구·방출, 읽기·쓰기·위치 변경, 장치 속성 획득·설정, 장치의 논리적 부착·분리 ioctl(), read(), write()
정보 유지 시간·날짜의 설정과 획득, 시스템 데이터의 설정과 획득, 프로세스·파일·장치 속성의 획득·설정 getpid(), alarm(), sleep()
통신 통신 연결의 생성·제거, 메시지 송수신, 상태 정보 전달, 원격 장치의 부착·분리 pipe(), shm_open(), mmap()
보호 자원 접근 권한의 설정과 확인 chmod(), umask(), chown()