해당 게시글은 운영체제 스터디를 위해 반효경 교수님 운영체제 강의를 보고 기록한 게시물입니다. 틀린 정보가 있다면 언제든 지적해주세요🙏🏻
운영체제
공개 소프트웨어 정신 - 오픈 소스 라이센스
- 소프트웨어를 개발하는데 인건비가 들지만 개발된 다음에 판매시에는 원재료비가 없기 때문에 추가적으로 드는 비용이 없다. 소프트웨어는 독점 체제가 가능하고 특정제품이 시장을 장악했을 때 2,3등이 너무 밀려버리는(죽어버리는) 상황이 발생한다. 이런 상황에서 나온 것이 오픈 소스 라이센스.
운영체제의 범위
- 좁은 의미의 운영체제 - 커널 (운영체제의 핵심, 메모리에 항상 상주함)
- 넓은 의미의 운영체제 - 운영체제의 핵심을 포함한 부가적인 것들. (메모리에 상주하지 않음)
운영체제의 역할
- 여러 사용자가 프로그램을 편리하게 사용할 수 있도록 한다. 구체적으로는 자원을 효율적으로 관리하는 역할을 한다 -> 소프트웨어어 자원들을 관리한다 -> 많은 프로그램들이 실행중일 때에는 균등 분할 한다.
운영체제의 분류
- 동시 작업 가능 여부
- 단일 작업: 한번에 하나의 작업만 처리. MS-DOS 시절.
- 다중 작업: 동시에 두개 이상의 작업 처리. 유닉스나 윈도우 등에서는 한 명령이 수행이 끝나기 전에 다른 명령이나 프로그램 수행이 가능함.
- 사용자의 수
- 단일 사용자: MS-DOS, 윈도우
- 다중 사용자: 유닉스, NT SERVER. 한대의 컴퓨터를 터미널 형태로 많은 사람들이 사용하는 것.
사실 다중 사용자와 다중 작업은 새로운 것이 엄청 추가 된 것은 아님.
하지만 사용자가 여러명이 되면 보안 문제를 포함한 추가적인 문제들이 발생.
다중 사용자가 되면 복잡한 문제들을 운영체제가 해결해야 한다. 다중 사용자가 아니더라도 일반 사용자가 운영체제 자체를 해킹하는 시도를 막는 것도 필요함.
- 처리방식
- 일괄 처리: 배치 프로세싱이라고 함. 현대의 운영체제와는 맞지 않는 이야기. 초기 펀치카드 처리 시스템.
- 시분할: 지금 사용하는 범용 컴퓨터 시스템. 시분할 타임 쉐어링. 시간을 분할해서 쓴다고 이해하면 될 것 같다.
Interactive 하다. 배치와는 반대됨. 결과가 바로 나옴 (여기에서 '바로'라는 건 사람이 생각할 때 지연이 없는 정도를 의미한다.)
- 실시간(Real-time System): 실시간은 우리가 생각하는 일반 운영체제는 아님. '데드라인' 이라는 것이 있어서 그 '데드라인'을 반드시 지켜야한다. 그렇지 못하면 치명적이다.
예시로 원자로 제어, 미사일 제어, 반도체 장비, 로보트 제어 등등이 있고 Hard Real-time System과 Soft Real-time System이 있다.
-> 우리가 사용하는 운영체제는 데드라인을 만족해야 하는 것은 아니고 자원을 효율적으로 사용하려고 하는 것이다. 우리가 사용하는 것은 Time Sharing System으로 주어진 시간을 최대한 효율적으로 사용하려는 것이다. 물론 여기에서도 최대한 노력은 하지만 보장은 못한다 (Best Effort)
용어 정리
1.Multitasking - 다중 작업
2.Multiprogramming - 메모리 측면을 강조한. 메모리에 여러프로그램이 동시에 올라가 있는 것.
3.Time sharing - 시간을 쪼개서 쓴다. 주로 CPU 쪽을 강조한 말.
4.multiprocess - 컴퓨터 안에 CPU 여러개가 붙어 있음을 의미.
-> 결국 위의 네가지는 모두 같은 말이다 -> 컴퓨터에서 여러개를 실행 시킨다는 말.
운영체제의 예
-
유닉스
리눅스도 유닉스 계열. 유닉스는 큰 서버를 위해 만들어진 운영체제. 여러 프로그램, 여러 사용자 관리가 필수. 굉장히 복잡함.
유닉스 이전에는 하드웨어를 제어하려면 어셈블리어로 해야 했고 사람이 이해하기에는 대단히 어려워서 C언어를 만들었다. 유닉스는 C언어로 프로그래밍을 하고 커널을 최소한으로 만들었다. 이에 복잡한 시스템에 맞게 확장이 용이하다. 소스 코드가 공개 되어 있어 프로그램 개발에 용이하다. 365일 돌려놔도 절대 죽지 않는 운영체제.
-
도스
개인용, 개인 사용자를 위한 단일 프로그램만 실행 가능한 운영체제
-
윈도우즈
GUI. 단일 작업을 위한 것에서 발전해 온 운영체제. 유닉스과 비교하면 불안정하다고 할 수 있다(재부팅 해야할 때가 있다.)
Mode bit
- CPU에서 기계어를 실행할 때 운영체제가 실행하는건지 사용자 프로그램이 실행하는건지 구분해야 할 필요가 있다. 이 때 사용하는 것이 Mode bit.
- 1 사용자 모드: 사용자 프로그램 수행
- 0 모니터 모드: OS 코드 수행
- 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행이 가능하다. 특권 명령으로 되어 있음.
- 사용자 프로그램이 CPU를 실행하고 있을 때 기계어를 실행할텐데 그 때 위험한 기계어인지 확인하고 Mode bit을 확인하고 위험하다면 운영체제에게 주도권이 넘어간다.
- Mode bit이 0일때 운영체제가 CPU를 가지고 무엇이든 할 수 있고 운영체제가 사용자 프로그램으로 CPU를 넘겨줄 때는 Mode bit이 1로 변경되면서 제한된 기계어만을 실행하게 된다.
- CPU에는 인터럽트 라인이라는 것이 있는데 이 때 인터럽트 라인에 들어온것이 있는지 체크를 한다. CPU의 독점을 막기 위해서는 OS 혼자서 할 수 없기 때문에 타이머를 둔다.
타이머에 시간을 세팅한 후에 넘기면 타이머가 CPU에 인터럽트를 걸게 된다.
- 프로그램 카운터: 메모리 위치를 가리킨다.
- 운영체제가 CPU를 가지고 있을 때는 Mode bit이 0으로 바뀌어서 모든 기계어를 실행할 수 있고 운영체제가 CPU를 다른친구에게 넘겨주겠다 할때는 Mode bit이 1로 바뀐다.
Timer Controller
- CPU의 독점권을 막기 위해 사용한다.
- 운영체제와 하드웨어가 협력해 CPU의 독점권을 막는 것이 타이머 컨트롤러이고 이를 위해 시간을 세팅한 후에 넘기게 된다.
System Call
- CPU가 I/O에게 요청하는 것은 모두 특권명령으로 묶여 있다.
- 모든 I/O는 특권명령이다.
- 이를 위해서 운영체제에게 요청을 해야하는데 이것이 바로 System Call 이다.
- 사용자 프로그램이 무엇인가를 하고 싶은데 하지 못할때 운영체제에게 부탁한다고 생각하면 된다.
-> 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것이다.
- 프로그램이 스스로 인터럽트를 건다 -> 시스템 콜
즉, 프로그램이 스스로 인터럽트 라인을 실행하면 운영체제에게 주도권이 넘어가게 된다.
Interrupt
-
CPU의 인터럽트 라인이 세팅되어서 다음을 실행하기 전에 운영체제에게 주도권을 넘기는 것을 말한다.
-
넓은 의미로는 하드웨어 인터럽트.
-
소프트웨어 인터럽트는 Trap 이라고 부른다.
-
Exception과 System Call이 있다.
-
I/O 작업은 특권명령이라서 본인의 기계어로 실행이 불가능. 그래서 운영체제에게 System Call을 한다. 그럼 운영체제는 본인의 기계어로 뭐든 할 수 있기 때문에 디스크 컨트롤러에게 부탁을 한다.
Device Controller
- 디바이스 컨트롤러는 모든 I/O장치에서 그 I/O 장치를 전담하는 CPU라고 볼 수 있다.
- I/O 작업은 CPU가 디바이스 컨트롤러에게 요청을 해서 이뤄지게 된다.
- 디바이스 컨트롤러는 하드웨어이고 디바이스 드라이버는 소프트 웨어이다.
- 디바이스 드라이버는 운영체제 안에 들어있는 코드 중에서 부탁을 하는 방법이 적혀 있는것으로 컴퓨터 내부에서 CPU가 수행하는 코드이다.
- 디바이스 드라이버에서 실행되는 코드는 펌웨어이다.
운영체제가 CPU에게 넘어가는 경우?(를 다시 정리해보자면...)
- 인터럽트 라인을 세팅하는 경우에 한해서 CPU가 운영체제에 넘어가게 되어있따. 인터럽트 라인을 누가 세팅하느냐에 따라서 두가지로 나눠볼 수 있는데 하나는 하드웨어 장치들이 인터럽트를 걸어서 CPU가 운영체제한테 넘어가는 방법 또 하나는 프로그램 소프트웨어가 직접 인터럽트 라인을 세팅해서 인터럽트가 발생되는 경우가 있다. 그 중에는 시스템 콜도 있다. 모든 I/O작업은 기계어가 특권명령의 기계어로 규정되어 있기 때문에 사용자 프로그램이 CPU를 가지고는 수행을 할 수 없다. 그래서 인터럽트 라인을 세팅하는 방법을 통해서 시스템콜을 하고 그 다음에 운영체제로 CPU가 넘어감.
Interrupt Vector
- 인터럽트 종류별로, 해당하는 종류의 인터럽트가 발생했을 때 운영체제의 어디에 있는 코드를 실행해야할지 그 위치를 담고 있는 것. 주소에 대한 포인터라고 생각하자.
- 인터럽트 처리 루틴: 해당 인터럽트에서 어떤일을 해야하는지 적혀있음. 인터럽트 핸들러라고도 한다.
현대의 운영체제는 인터럽트에 의해 구동된다
- 인터럽트가 걸려야 운영체제에게 CPU가 넘어간다.
- 나는 계속 쓰고 싶은데 CPU를 빼앗기는 것은 타이머 인터럽트
- 더 이상 CPU를 쓸 의지가 없는 경우 - 오래 걸리는 I/O 작업을 해야할 때
동기식 입출력과 비동기식 입출력
- 동기 (synchronous) 비동기(Asynchronous)
-
동기식 - I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
사용자 프로그램이 입출력 요청을 하는데 본인이 직접 못하기때문에 커널을 통해서 하드웨어에 요청을 함. 예를 들어 디스크에서 파일을 읽어오는 작업을 한다면 디스크가 그 일을 하는 동안에 기다린다.
-
비동기식 - I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감.
I/O결과 보지 않고 할일 하게 함.
두 경우 모두 I/O 작업 완료는 인터럽트로 알게 된다.

DMA (Direct Message Access)
- CPU는 대단히 빠른 아이라서 놀지 않고 계속 일을 하고 뭔가 해야할 때는 인터럽트가 걸려서 다른일을 한다. 하지만 이 때 인터럽트도 너무 많이 걸리면 오버헤드가 발생하게 된다.
- I/O 장치 중에는 고속 I/O 장치도 있다. 이런 고속 I/O 장치들이 작업을 끝낼 때마다 인터럽트를 걸면 CPU에게도 비효율적이라서 여기에 DMA 컨트롤러를 붙여 놓는다.
- 블럭단위로 DMA가 붙여넣는 작업을 다하고 그 뒤에 인터럽트를 발생시킨다.

서로 다른 입출력 기계어
- CPU에서 실행하는 것은 기계어.
- 기계어에는 메모리를 접근하는 기계어 그리고 I/O 전담하는 기계어가 따로 있다. 그렇기 때문에 메모리에 일반 메모리 주소와 I/O 장치를 위한 메모리 부분을 나누어서 서로 다른 기계어로 접근하는 방식이 있고 메모리 주소를 I/O 장치에도 붙여서 메모리에 접근하는 기계어를 사용해서 I/O에 접근하는 방법이 있다.
