이것은 한낱 대학생이 교수의 수업을 듣고 작성한 개인저장용 복습 문서입니다.
그렇지만, 물론 지적과 수정은 환영합니다.
os의 3대기능
communication(통신), concurrency(동시성), asynchronous operations(비동기적실행)
-cca
fundamental changes in commercial sorftware(용어의 변화)
메인프레임에서 실행되던 데이터베이스나 다른 상업적인 애플리케이션들은 더 작고 값싼 시스템에서 실행할 수 있게 되었다.
터미널은 그래픽 사용자 인터페이스(GUI)와 멀티미디어 기능을 갖춘 데스크탑에서 자리를 내어주었다.
고립되어있던 PC애플리케이션은 네트워크 통신을 사용하는 방향으로 진화하였다.
이러한 기술상의 발전들은 소프트웨어 애플리케이션 내에서의 통신, 병행성, 비동기적인 실행을 바탕으로 하고 있다.
terminology
비동기적인 동작(asynchronous action)은 많은 컴퓨터 시스템 이벤트들이 예상치 못한 시간에 예상치 못한 순서로 발생할 때 일어난다. 예를들어, 프로그래머는 시스템에 연결된 프린터가 언제 데이터를 요구하는지 알 수 없다.
concurrency(병행성)이란, 동일한 시간 프레임에서 자원을 공유하는 것을 말한다.
communication(통신)이란 한 개체에서 다른 개체로 정보가 이동하는 것을 말한다.
time and speed(시간과 속도)
운영체제(OS)는 시스템 자원을 관리한다.
디스크 드라이브(disk drive)
디스크 드라이브가 아무리 발전한다고 하더라도, 디스크는 회전이라는 기계적인 한계를 극복할 수 없다. 디스크 접근 시간은 급속도로 줄어들 수 없다.
프로세서(processor)프로세서의 속도는 급속히 빨라지고 있다.
multiprogramming
멀티프로그램은 하나 이상의 프로세스가 실행대기 상태에 있을 수 있다는 것을 의미한다. read함수나 write함수 호출 등과 같은 자원요청은 운영체제 요청, 즉 시스템 콜 수행을 야기한다. 시스템 콜(system call)이란 운영체제에게 특정한 서비스를 수행해달라는 요청이며, 시스템 콜이 수행되면 일반 CPU 사이클은 인터럽트되고, 제어권은 운영체제로 넘어가게 된다. 그 후 운영체제는 다른 프로세스를 실행시킬 수 있다.
time sharing
시분할은 물리적인 cpu는 하나이더라도 여러 프로세스가 동시에 실행되는 것과 유사하게 보이도록 해준다. 운영체제가 재빨리 프로세스를 교환한다면 여러 프로세스가 동시에 실행되는 것처럼 보인다.
time sharing은 multiprogramming과 다르게 time quantum(할당된 시간)이 주어진다.
interrupts(인터럽트)
전형적인 컴퓨터에서 프로그램의 단일 명령어가 수행되는 것은 프로세서 명령어 사이클의 결과이다. 전통적인 컴퓨터에서 주변기기들이 인터럽트라는 전기적인 신호로 프로세스 내의 하드웨어 플래그를 설정하는 방법으로 병행성을 달성하였다. 각 명령어 사이클마다 프로세서는 하드웨어 플래그들을 검사하여 인터럽트 발생을 감지하면, 프로세서는 프로그램 카운터의 현재값을 저장하고 인터럽스 서비스 루틴이라 불리는 특별한 함수의 주소를 프로그램 카운터에 집어넣는다. 인터럽트 서비스 루틴이 끝나면 프로세서는 이전에 실행하던 명령어를 다시 실행해야 한다.
signals(시그널)
시그널은 이벤트가 일어났음을 알리는 소프트웨어 메커니즘이다. 종종, 시그널은 인터럽트에 대한 운영체제의 반응으로 발생하기도 한다. ctrl+c는 키보드를 다루는 디바이스 드라이버에게 가는 인터럽트를 발생하기도 한다. 시그널은 동기적 또는 비동기적으로 생성될 수 있다. (프로세스나 쓰레드에 의해 시그널이 생성되면 시그널이 동기적으로 생성되었다고 함.) 잘못된 명령어나 0으로 나누는 등의 명령어는 동기적인 시그널을 발생시킨다. ctrl+c는 동기적 시그널을 발생시킨다.
processes and threads
병행적인 실행을 하는 전통적인 방법은 fork함수로 여러개의 프로세스를 만드는 것이다. 공통의 부모를 갖는 프로세스들은 파이프들을 통해 서로 통신할수 있다. 공통의 부모를 갖지 않는 프로세스들은 시그널, FIFOS, 세모파오, 메시지등을 통해 통신할 수 있다. 여러개의 실행흐름은 한 프로세스 내에서 병행성을 제공해준다.
fault tolerance(보안과 장애 허용성)
장기간 실행되는 프로그램은 반드시 사용한 자원들을 반납해야 한다. 종종 자원을 받납하지 않아서 에러가 생기기도 한다. c언어는 리턴 값을 검사해야 한다는 요구사항을 가지고 있지 않다. c는 변수의 범위를 넘어서 사용하는 것을 허용한다. 새로운 프로그래밍 언어들은 실행 중에 자동으로 배열의 범위가 제대로 되었는지 검사한다.
ex) malloc -> free 해줘야함.
Consequences of buffer overflows
array의 overflow로 다른 영역을 침범(os의 영역, 다른 함수)하면 프로세스가 죽어버릴 수 있다.
ex) x의 영역을 침범해서 해당값을 0이 아니도록 해서 if(x) {} 부분을 true로 처리해서 통과할 수 있도록함.
(이전의 해킹방법. 물론 요즘엔 안통함)
char buf[80];
print("Enter your coud : ");
scanf("%s", buf);
와 같은 코드는 이런 버퍼 오버플로우의 가능성이 있다.
'💻 CS > 시스템프로그래밍' 카테고리의 다른 글
[시스템프로그래밍] UNIX I/O - 1 (2) | 2019.11.04 |
---|---|
[시스템프로그래밍] 중간고사 대비 (0) | 2019.10.22 |
[시스템프로그래밍] Processes in UNIX (1) | 2019.10.12 |
[시스템프로그래밍] Programs, Processes and Threads (0) | 2019.10.12 |
[시스템프로그래밍] 리눅스 튜토리얼 (0) | 2019.10.12 |