반응형
응용프로그램을 위한 라이브러리
라이브러리
라이브러리는 응용프로그램이 활용할 수 있도록 미리 작성된 함수들의 집합으로, 컴파일되어 바이너리 형태로 제공
개발자는 라이브러리를 활용하지 않고서는 응용프로그램을 작성하기 어렵.
라이브러리의 종류
- 표준 라이브러리:
- 응용프로그램을 위해 구현된 함수를 제공
- 운영체제(OS)나 하드웨어(HW)에 상관없이 이름 및 사용법이 동일
- 시스템 콜 라이브러리:
- 시스템 콜 함수를 제공
- 시스템 콜 함수들은 시스템 콜을 통해 커널 모드로 전환하고 커널에 진입하여 함수를 실행
- OS마다 시스템 콜의 구현이 다름
사용자 코드와 라이브러리 코드의 링킹
- 실행 파일 생성 과정:
- 컴파일 과정에서 사용자 코드와 라이브러리 코드가 링킹되어 하나의 실행 파일로 만들어짐
- 이 과정에서 각 함수와 변수의 주소가 계산
- 응용프로그램 실행:
- 응용프로그램이 사용자 공간(User Space)에 적재
- 응용프로그램은 사용자 모드(User Mode)로 실행을 시작
함수 호출과 시스템 콜
함수 호출(Function Call)로 라이브러리 실행
- 실행 위치:
- 사용자 공간에서 사용자 모드로 실행
- 동작 과정:
- 스택에 복귀 주소와 매개변수를 저장
- 호출된 함수의 지역 변수를 생성한 후, 해당 함수의 주소로 점프
- 함수 실행이 끝나면 복귀 주소를 통해 호출한 곳으로 복귀
시스템 콜(System Call)로 커널 코드 실행
- 동작 과정:
- 시스템 콜 명령 실행:
- 시스템 콜을 일으키는 특별한 기계 명령(예: int 0x80 또는 syscall)을 실행
- 이 명령을 통해 사용자 모드에서 커널 모드로 전환
- 고유 번호 전달:
- 커널 함수마다 매겨진 고유 번호를 레지스터나 스택을 통해 전달
- 시스템 콜 핸들러 실행:
- 커널의 시스템 콜 핸들러(System Call Handler)가 호출되어 전달받은 고유 번호에 따른 커널 함수를 실행
- 커널 함수 실행:
- 실제 커널 기능을 수행하는 함수가 실행
- 모드 전환 및 복귀:
- 커널 함수 실행이 끝나면 사용자 모드로 전환되며, 사용자 프로그램으로 복귀
- 시스템 콜 명령 실행:
시스템 콜
사용자 공간의 코드에서 커널의 서비스를 요청하는 과정
read() 함수에 의한 시스템 콜 과정
- 동작 과정:
- 응용프로그램에서 read() 호출:
- 파일 디스크립터와 버퍼, 읽을 바이트 수를 인자로 read() 함수를 호출
- 시스템 콜 인터페이스:
- read() 함수는 시스템 콜 라이브러리를 통해 시스템 콜 인터페이스를 호출
- 커널 모드 전환:
- 시스템 콜 명령을 실행하여 커널 모드로 전환
- 시스템 콜 핸들러 호출:
- 커널의 시스템 콜 핸들러가 read에 해당하는 커널 함수를 호출
- 파일 시스템 및 드라이버 연계:
- 커널 함수는 파일 시스템과 디바이스 드라이버를 통해 실제 데이터를 읽음
- 데이터 전달 및 복귀:
- 읽은 데이터를 사용자 공간의 버퍼에 복사
- 커널 모드에서 사용자 모드로 전환하고, 응용프로그램으로 복귀
- 응용프로그램에서 read() 호출:
printf()는 디스플레이에 어떻게 출력할까?
- 버퍼링:
- printf()는 C 표준 라이브러리의 출력 버퍼에 데이터를 저장
- 이는 입출력 효율을 높이기 위한 버퍼링 메커니즘
- 시스템 콜 호출:
- 버퍼가 가득 차거나 줄 바꿈 문자가 나타나면, printf()는 write() 시스템 콜을 호출
- 커널을 통한 출력:
- write() 시스템 콜을 통해 커널 모드로 전환
- 커널의 write 함수는 디바이스 드라이버를 통해 디스플레이(예: 터미널)에 데이터를 출력
- 모드 복귀:
- 출력이 완료되면 사용자 모드로 전환되어 응용프로그램으로 복귀
시스템 콜 비용: fread()와 read()의 비교
- 시스템 콜의 오버헤드:
- 시스템 콜은 사용자 모드에서 커널 모드로의 전환 등 추가적인 오버헤드가 발생하여 함수 호출보다 시간이 더 소요
- read():
- 매번 시스템 콜을 수행하므로 오버헤드가 큼
- fread():
- 버퍼링을 통해 여러 데이터 요청을 한 번에 처리하여 시스템 콜 호출 횟수를 줄임
- 따라서 전체적인 실행 시간이 단축되고 효율성이 향상
- 성능 최적화 방법:
- 시스템 콜 호출 횟수를 최소화하여 응용프로그램의 실행 시간을 줄일 수 있음
- 버퍼링 기법이나 비동기 입출력 등을 활용
운영체제의 시작: 부팅 과정
- 전원 공급 및 CPU 초기화:
- 전원 버튼을 누르면 컴퓨터에 전원이 공급되고, CPU가 초기화
- 리셋 벡터를 통한 BIOS 실행:
- CPU는 리셋 벡터를 통해 ROM에 저장된 BIOS의 시작 주소를 찾음
- BIOS 실행:
- CPU가 BIOS를 실행하여 시스템을 초기화
- POST 수행:
- BIOS는 전원 공급 자가 테스트(POST, Power-On Self Test)를 통해 하드웨어의 이상 유무를 검사
- 부트 디바이스 탐색 및 부트 로더 로드:
- BIOS는 부트 순서에 따라 부트 디바이스의 부트 섹터를 찾음
- 부트 섹터에 있는 부트 로더를 RAM에 로드 및 실행
- 운영체제 커널 로드:
- 부트 로더는 파일 시스템을 읽어 운영체제의 커널을 메모리에 로드
- 커널 실행 및 시스템 초기화:
- 커널이 실행되어 각종 시스템 자원을 초기화하고, 운영체제가 구동
디바이스 드라이버
디바이스 드라이버는 운영체제와 하드웨어 장치 간의 인터페이스를 제공하는 소프트웨어
- 역할:
- 운영체제가 다양한 하드웨어 장치를 제어하고 통신할 수 있도록
- 하드웨어의 세부 사항을 추상화하여 응용프로그램이 일관된 방식으로 장치를 사용할 수 있게
- 동작 원리:
- 응용프로그램이 시스템 콜을 통해 I/O 작업을 요청하면, 커널은 해당 디바이스 드라이버를 호출
- 디바이스 드라이버는 하드웨어 장치와 직접 상호 작용하여 요청된 작업을 수행
- 작업 결과를 커널에 전달하고, 커널은 이를 응용프로그램에 반환
- 예시:
- 그래픽 드라이버: 모니터나 그래픽 카드와 통신하여 화면에 그래픽을 출력
- 네트워크 드라이버: 네트워크 인터페이스 카드를 제어하여 데이터 송수신을 처리
- 오디오 드라이버: 사운드 카드를 제어하여 소리를 재생하거나 녹음
- 중요성:
- 디바이스 드라이버의 효율성과 안정성은 시스템 전체의 성능과 신뢰성에 큰 영향
- 새로운 하드웨어 장치를 사용하기 위해서는 해당 장치에 맞는 드라이버가 필요
반응형
'공부해요 > 운영체제' 카테고리의 다른 글
프로세스와 스레드(2) (1) | 2024.10.03 |
---|---|
프로세스와 스레드 퀴즈 (0) | 2024.09.26 |
프로세스와 스레드 (0) | 2024.09.26 |
프로그램 수행과 예외처리 및 시스템 콜 퀴즈 (0) | 2024.09.19 |
프로그램 수행과 예외처리 (1) | 2024.09.19 |