no image
[OS4] Context Switch, Process Creation, Copy On Write
Context Switch CPU가 실행하는 프로세스를 교체하는 행위이다. 우리 인간은 비싼 CPU 가만히 못놔두기 때문에, 계속 일을 시켜야한다. 문맥전환을 통해 여러 프로세스나 스레드가 동시에 실행할 수 있다(실행하는 것 처럼 보이게 할 수 있다) 컨텍스트 스위칭이 일어나는 경우 - 주어진 Time Slice를 다 사용했을 때 - I/O 작업 - 다른 리소스를 기다림 - 인터럽트 RISC가 상대적으로 레지스터가 더 많기 때문에 컨텍스트 스위칭에 오버헤드가 더 크다. 흥미로운 내용이다. I/O, 인터럽트, 시스템콜 등이 발생하면 PCB에 현재 실행하던 프로세스의 상태를 저장하고 스케쥴링에 의해 선택된 새로운 프로세스의 정보를 PCB에서 받아서 실행한다. 이후 다른 인터럽트가 발생하면 다른 프로세스를 선..
2024.03.12
no image
[OS4] Process, PCB
Process 프로세스는 실행중인 프로그램으로 볼 수 있다. 프로그램 그 자체는 Executable file이고 OS가 메모리에 올릴 때 프로세스로 추상화하여 메모리에 올리고 실행한다. 이 프로세스는 스케쥴링의 단위가 되고 서로 침범하지 못하는 독자적인 메모리 영역을 가지고 있다. Process 구성 관련 내용은 많으니 간단히 설명 Text : 코드 영역이라고도 하고 명령코드 자체를 저장하고 있다. 프로그램 카운터(PC)가 text segment에서 명령어를 실행하고 증가되는 식으로 코드를 실행한다. Data : 초기화 된 global, static 변수 bss : 초기화 값이 없는 global, static 변수 Heap : 동적으로 할당된 값이 저장되는 영역 Stack : 함수의 호출에 대한 스택프레..
2024.03.04
no image
[OS3] Monolithic Kernel, Micro Kernel, Hypervisor
Monolithic Kernel 커널의 모든 서비스가 같은 주소공간에 위치한다. Unix는 monolithic 구조이다. 프로세스의 공간은 (일반적으로) 하위 주소의 user space와 상위 주소의 kernel space로 구분할 수 있다. 프로세스의 모든 공간은 서로 독립적인 공간이다. 하지만 monolithic 구조에서 할당받은 커널 공간이 가리키는 주소는 물리적으로 같은 주소를 가리키게 된다. 이런 방식으로 서로 커널 서비스를 공유하게 되는 것이다. 이를 도식화하면 밑에 그림처런 나타낼 수 있다. monolithic 모두 같은 커널을 공유하기에 시스템콜과 커널 서비스 간의 오버헤드가 적다. 하지만 모든 서비스가 하나의 코드를 공유하는 만큼 일부분의 오류가 전체에 영향을 미칠 수 있다. 때문에 유지..
2024.02.23
no image
[OS3] Kernel Structure, Layering, Modularity, System call
Layering OS의 복잡도를 낮추기 위한 방안으로 시스템을 가상의 레이어로 나누는 방식이다. 각 레이어는 정의가 명확한 (well-defined) 함수들로 이뤄져있다. 하나의 레이어는 인접한 레이어와만 통신한다. 하나의 레이어를 건너뛸 수 없다는 특징 때문에 Overhead가 발생하기도 한다. Modularity 각 기능 단위로 모듈화를 시키고 OS를 구성하는 방식이다. 각 모듈은 내부적으로 layering 되어 있다. 초기 OS 구조 (MS-DOS) 모듈로 구분되어 있다는 개념보다는 하나의 큰 덩어리로 되어 있는 구조였다. 계층 구조를 건너뛰어서 User Application 또한 하드웨어 자원에 직접 접근할 수 있었다. 이는 유저모드와 커널모드의 구분이 없었다는 뜻이고 보안에 취약했다. MS-DO..
2024.02.23
no image
[OS2] Multi programming, Multi Tasking
전기창지 CPU와 기계장치인 Input/Output device간 속도 차이(병목 현상)으로 인해 I/O 디바이스가 작업을 하는 동안 task가 Blocked되는 현상이 존재했다. 레지스터 -> 캐시 -> 메인 메모리(RAM) -> Disk(SSD, HDD) 우측으로 갈수록 각 메모리 접근 시간이 점점 느려진다. 특히나 캐시 메모리는 메인 메모리와 레지스터 간 속도 차이를 줄이기 위해 존재한다. Spooling 주변기기와 컴퓨터 처리 장치 간에 데이터를 전송할때 처리 지연을 단축하기 위해 보조기억 장치를 완충 기억 장치로 사용하는 것 중앙 처리장치와 I/O 디바이스 등 컴퓨터 주변 장치의 독립적으로 작동하게 한다. 보조 기억장치를 하나의 버퍼로 사용한다고 볼 수 있다. I/O요청이 있으면 디바이스와 연..
2024.02.21
no image
[OS1] Abstraction, Policy
*숭실대학교 소프트웨어 학부 운영체제 과목을 참고하여 작성하였습니다* Operationg System(OS) 운영체제란 컴퓨터 소프트웨어와 하드웨어 간 인터페이스 하드웨어 자원을 쉽고 효율적으로 사용할 수 있도록 Abstraction을 제공하는 시스템 소프트웨어 Abstraction 추상화란 복잡한 개념 및 시스템을 단순화 하는 것이다. 운영체제는 컴퓨터의 물리 자원을 쉽게 사용할 수 있도록(system call) 추상화를 제공한다. CPU -> Process Memory -> Address Space(Virtual Address Space) Disk -> File 하드웨어의 동작과 자원을 보다 포괄적이고 직관적인 개념으로 추상화 시킨 예시들을 볼 수 있다. Policy 운영체제는 PC뿐 아니라 서버, ..
2024.02.20

 

Context Switch

CPU가 실행하는 프로세스를 교체하는 행위이다.

우리 인간은 비싼 CPU 가만히 못놔두기 때문에, 계속 일을 시켜야한다.

문맥전환을 통해 여러 프로세스나 스레드가 동시에 실행할 수 있다(실행하는 것 처럼 보이게 할 수 있다)

 

컨텍스트 스위칭이 일어나는 경우

- 주어진 Time Slice를 다 사용했을 때

- I/O 작업

- 다른 리소스를 기다림

- 인터럽트

RISC가 상대적으로 레지스터가 더 많기 때문에 컨텍스트 스위칭에 오버헤드가 더 크다. 흥미로운 내용이다.

 

I/O, 인터럽트, 시스템콜 등이 발생하면 PCB에 현재 실행하던 프로세스의 상태를 저장하고

스케쥴링에 의해 선택된 새로운 프로세스의 정보를 PCB에서 받아서 실행한다.

이후 다른 인터럽트가 발생하면 다른 프로세스를 선택하고 상태값을 받아와서 실행하기 때문에

마치 끊기지 않고 동시에 실행되는 것 처럼 보인다.

 

Process Creation

UNIX 기준 프로세스를 새로 생성하면 자식 프로세스는 기본적으로 부모 프로세스의 복사본이다. PID는 다르다.

이는 효율성을 위해서다. 프로세스 새로 생성하려면 많은 데이터가 필요하고 이는 리소스를 많이 사용한다는 의미이다.

때문에, 새로운 프로세스를 생성할 때는 fork()를 통해 일단 부모 프로세스의 데이터를 복사한 뒤 exec하는 방법을 택한다.

exec() 함수는 PCB를 실행하려는 프로세스의 정보로 전부 교체한다. return을 포함해서 말이다.

즉 새로운 프로그램을 적재하게 되는 것이다.

 

근데 여기서도 의문을 제기할 수 있다. 기껏 fork 했는데 exec하느라 프로세스 정보를 전부 교체한다면 비효율 적이잖아요.

이런 비효율도 해결하기 위해 대부분의 OS에서는 Copy On Write(COW)를 채택한다

Copy On Write

 

자세한 Virtual Memory 개념은 나중에 작성할 예정이다.

페이지 테이블은 논리 주소와 피지컬 어드레스를 맵핑시켜주는 자료 구조이다.

프로세스는 각자 페이지 테이블을 가지는데, 처음에 자식 프로세스를 생성하면 부모 프로세스의 페이지 테이블을 복사하게 된다.

페이지 테이블과 맵핑되는 physical memory, 즉 부모 프로세스와 자식 프로세스의 변수가 같은 물리 공간을 가리키고 있다는 의미이다.

프로세스가 생성될 때 공유 자원에 관해서 read-only로 생성된다.

때문에 공유 자원에 대해서 write하려고 했을 때 page fault가 발생하게 되고 page fault handler를 호출한다.

핸들러는 write하려는 페이지를 새로운 페이지에 복사한 뒤 페이지 테이블을 업데이트 시켜준다.

fork 시스템콜 시점이 아닌 write하려는 시점에 복사가 일어나기 때문에

Copy On Write 라고 한다.

 

 

 

 

[OS4] Process, PCB

sumjo
|2024. 3. 4. 00:35

Process

프로세스는 실행중인 프로그램으로 볼 수 있다. 프로그램 그 자체는 Executable file이고 OS가 메모리에 올릴 때 프로세스로 추상화하여 메모리에 올리고 실행한다. 이 프로세스는 스케쥴링의 단위가 되고 서로 침범하지 못하는 독자적인 메모리 영역을 가지고 있다.

 

 

일반적인 상황에서 서로의 영역을 침범하지 않도록 운영체제가 관리한다

 

Process 구성

관련 내용은 많으니 간단히 설명

 

Text  : 코드 영역이라고도 하고 명령코드 자체를 저장하고 있다. 프로그램 카운터(PC)가 text segment에서 명령어를 실행하고 증가되는 식으로 코드를 실행한다.

Data : 초기화 된 global, static 변수

bss : 초기화 값이 없는 global, static 변수

Heap : 동적으로 할당된 값이 저장되는 영역

Stack : 함수의 호출에 대한 스택프레임과 그와 관련된 지역변수를 저장, 말그대로 스택이라 함수 호출시 스택처럼 쌓이는 방식

그 유명한 스택 오버플로우가 났다고 하면 Stack 공간에 데이터가 쌓이다가 터진것임. Heap에 비해 상대적으로 작다.

예시로 보면 이런 느낌이다.

 

Process State

프로세스는 라이프 사이클 동안 여러 상태를 가지게 된다.

New , Created: PCB와 함께 프로세스가 생성된 상태, 바로 실행되는 것은 아님

Ready : 프로세스가 CPU에 할당되기 위해 대기하는 상태

Running : CPU에 의해 프로세스가 실행되고 있는 상태

Waiting, Blocked : 프로세스가 실행 되다가 I/O 처리 등 바로 완료될 수 없는 작업을 위해 잠시 CPU를 반납하고 대기하는 상태

Terminated: 프로세스가 종료 되기 직전에 잠시 거치는 상태

 

Process Controll Block(PCB)

운영 체제에서 프로세스 관리에 필요한 메타데이터를 저장하는 자료 구조.

위에서 말한 프로세스의 상태(State)를 PCB에서 관리한다.

그 외에 프로그램이 다음으로 실행시킬 주소값을 담고있는 프로그램 카운터, CPU 레지스터가 가지고 있는 값,

스케쥴링 우선순위 등에 대한 정보, 열고있는 파일 등등의 정보를 가지고 있다.

 

이 PCB는 컨텍스트 스위칭에 중요한 역할을 한다.

프로세스가 Ready상태에서 다시 Running 될 때 프로세스의 PCB를 통해

프로세스가 이전까지 실행하던 위치(Program Counter), 스택 프레임, 레지스터 값등을 참조하여

이전의 실행 문맥(Context)부터 이어서 실행할 수 있는 것이다.

Monolithic Kernel

커널의 모든 서비스가 같은 주소공간에 위치한다. Unix는 monolithic 구조이다.

프로세스의 공간은 (일반적으로) 하위 주소의 user space와 상위 주소의 kernel space로 구분할 수 있다.

프로세스의 모든 공간은 서로 독립적인 공간이다. 하지만 monolithic 구조에서 할당받은 커널 공간이 가리키는 주소는 물리적으로 같은 주소를 가리키게 된다.

이런 방식으로 서로 커널 서비스를 공유하게 되는 것이다. 이를 도식화하면 밑에 그림처런 나타낼 수 있다.

 

monolithic 모두 같은 커널을 공유하기에 시스템콜과 커널 서비스 간의 오버헤드가 적다.

하지만 모든 서비스가 하나의 코드를 공유하는 만큼 일부분의 오류가 전체에 영향을 미칠 수 있다. 때문에 유지보수가 어렵다

 

Micro Kernel

기능별로 마이크로 서비스로 개발하여 많은 서비스를 커널 모드가 아닌 유저 모드에서 처리할 수 있는 커널 시스템이다.

커널에는 필수적인 최소의 기능들만 남겨둔다. 나머지 분리된 모듈을 서버라고 하고, 서버들은 하나의 프로세스로 유저 모드에서 구동된다.

monolithic에 비해 커널이 가볍고, 의존도가 확실히 내려가기 때문에 유지 보수에 용이하다.

하지만 서버 간 통신이 필요하기 때문에 monolithic kernel 보다 낮은 성능을 보인다.

 

Hypervisor

d가상화된 컴퓨터 하드웨어 자원을 제공하기 위한 관리 계층

단일한 컴퓨터에서 여러 가상 머신을 운용할 수 있게 물리적인 컴퓨팅 리소스 자원을 분배하는 소프트웨어 이다.

게스트 OS와 하드웨어 사이에 위치한다. 각 게스트 OS는 서로의 존재를 알지 못한다.

하이퍼바이저를 통해 내 컴퓨터와 다른 인스트럭션 셋을 가진, 이를테면 RISC 명령어 set을 가진 컴퓨터에서 CISC 인스트럭션을 실행할 수도 있다.

 

 

 

 

Layering

OS의 복잡도를 낮추기 위한 방안으로 시스템을 가상의 레이어로 나누는 방식이다.

각 레이어는 정의가 명확한 (well-defined) 함수들로 이뤄져있다.

하나의 레이어는 인접한 레이어와만 통신한다.

하나의 레이어를 건너뛸 수 없다는 특징 때문에 Overhead가 발생하기도 한다.

 

 

Modularity

각 기능 단위로 모듈화를 시키고 OS를 구성하는 방식이다.

각 모듈은 내부적으로 layering 되어 있다.

 

초기 OS 구조 (MS-DOS)

모듈로 구분되어 있다는 개념보다는

하나의 큰 덩어리로 되어 있는 구조였다.

계층 구조를 건너뛰어서 User Application 또한 하드웨어 자원에 직접 접근할 수 있었다.

이는 유저모드와 커널모드의 구분이 없었다는 뜻이고 보안에 취약했다.

출처 : https://ddongwon.tistory.com/10

MS-DOS에서 프로그램이 돌아갈떄와 돌아가지 않을 때 메모리의 그림이다.

멀티 프로그래밍에 대한 개념이 없었기 때문에 프로세스 개념도 없고

프로그램이 돌지 않을 때는 명령어 해석기가 올라와 있고

프로그램이 실행되면 필요한 메모리를 모두 할당해주는 방식이다.

 

커널 내의 모듈들

 

User Mode Kernel Mode

위에 예시로 말한 MS-DOS의 구조처럼, 하드웨어 핵심 자원에 접근이 자유롭다면 보안적으로 취약할 수 밖에 없다.

때문에 Mode를 나누어 각각의 접근 권한을 달리한다.

Mode는 소프트웨어가 아닌 하드웨어 선에서 제어하게 된다.

Mode bit를 두어서 0일때는 운영체제가 cpu를 제어하여 여러 특권명령을 실행할 수 있는 Kernel Mode 이고 1이면 사용자 프로그램이 cpu를 사용하고 사용자 영역 안의 명령어만 실행 가능한 User Mode 이다

시스템 콜

User Mode 에서 Kernel Mode 로 진입하기 위한 통로이다. 커널에서 제공하는 하드웨어 접근을 위한 Protected된 인터페이스이다.

유닉스 계열 커널에서 제공하는 fork(), open() 등이 예시이다. 시스템콜이 호출되면 커널모드로 전환 되고 이를 통해 프로세스는 하드웨어에 직접 접근할 수 있는 것이다.

 

 

시스템콜이 호출되면 Mode의 전환이 일어나고 시스템콜은 정의되어있는 매크로로 변환된다.

매크로를 통해 system call table에 맵핑되어 있는 시스템콜 수행된다.

application이 시스템콜 인터페이스를 통해 하드웨어에 접근하는 도식

 

 

 

 

 

전기창지 CPU와 기계장치인 Input/Output device간 속도 차이(병목 현상)으로 인해

I/O 디바이스가 작업을 하는 동안 task가 Blocked되는 현상이 존재했다.

 

레지스터 -> 캐시 -> 메인 메모리(RAM) -> Disk(SSD, HDD)

우측으로 갈수록 각 메모리 접근 시간이 점점 느려진다.

특히나 캐시 메모리는 메인 메모리와 레지스터 간 속도 차이를 줄이기 위해 존재한다.

 

 

Spooling

주변기기와 컴퓨터 처리 장치 간에 데이터를 전송할때 처리 지연을 단축하기 위해 보조기억 장치를 완충 기억 장치로 사용하는 것

중앙 처리장치와 I/O 디바이스 등 컴퓨터 주변 장치의 독립적으로 작동하게 한다.

보조 기억장치를 하나의 버퍼로 사용한다고 볼 수 있다.

I/O요청이 있으면 디바이스와 연결된 저장장치 공간에 task를 쌓아놓고 cpu는 다른 작업을 할 수 있다.

이는 프로세스 입장에서는 입출력 처리가 발생할 시 이전 작업의 종료를 기다리지 않고 I/O 디바이스 버퍼에 요청을 쌓아놓으면 되는 것이기 때문에, 프로세스당 독립적인 입출력 장치를 할당받는 것으로 이해할 수도 있다.

 

 

Multi Programming

초기 컴퓨터는 하나의 task를 실행하고 완료된 후 다음 task를 실행할 수 있었다 즉 한번에 하나의 작업만 가능했다.

하지만 위에서 말했듯 입출력 기기와 프로세서 간 속도 차이와 각 메모리의 접근 시간 차이가 있기 때문에 병목현상이 자주 발생했다.

사람은 비싼 돈 주고 산 기계가 쉬는 꼴을 못보기 마련이다. 이런 비효율을 해결고자, 컴퓨터를 어떻게든 혹사시키기 위해 프로세서가 입출력 작업을 요청하고 대기시간 동안 다른 일을 처리할 수 있도록 하는 것이 MultiProgramming이다

 

 

그림의 예시로 보면

만약 Job 1이 I/O 처리를 위한 대기 시간으로 들어가면 다음 Job2가 실행되는 것이다.

Job2는 I/O 요청이 없다면 끝까지 처리한다. 이후 또 다음 스케쥴된 Job으로 넘어가는 것이다.

 

근데, 딱봐도 조금 이상해 보이나. 일단 다음 job이 수행되려면 현재 수행되는 job이 I/O를 해야 할것이고, Job1이 I/O요청이 있는 간단한 작업이고 Job2는 I/O작업이 없는 복잡한 작업이라면 Job1은 I/O처리를 끝내고도 계속 다음 스케쥴을 기다려야 한다.

 

 

 

Time sharing

CPU의 실행 시간을 타임 슬라이스 (Time Slice)로 나누어 실행한다.

모든 프로그램이 타임 슬라이스 동안 CPU를 점유하고 그 시간이 끝나면 CPU를 양보한다.

나중에 얘기할 Round Robin 과 형태가 유사하다고 할 수 있다.

여러개의 작업들이 cpu 스위칭을 통해 동시에 실행된다.

그야말로 공산주의 식으로 매우 공평하긴 하지만, 일단 cpu 스위칭, Context Switching 이 빈번하기 때문에 오버헤드가 커질 수 밖에 없고, 많은 작업이 필요한 job과 간단한 job 모두 동일한 작업 시간을 할당받기 때문에 비효율을 야기할 수 있다.

 

Multitasking

여러개의 Task emfdl CPUR와 같은 자원을 공유하도록 하는 방법

대표적으로 한개의 Job에 Unix fork() 시스템콜을 통해 여러개의 프로세스로 실행시키는 것이 있다.

즉 여러 프로그램이 동시에 수행(Concurrent Execution) 된다고 볼 수 있다.

멀티 태스킹 이슈

- 메모리 관리

   - 동시에 여러 프로그램이 메모리에 상주하기 때문에 각 프로세스 간 접근하면 안되는 메모리를 보호하는 시스템이 필요하다.

- cpu scheduling

    - cpu 스케쥴링 Policy가 필요하다

- 동기화

   - 공유 자원에 동시 접근에 대해서 접근 순서를 보장해줄 필요가 있다.

 

  

 

그 외 시스템

*숭실대학교 소프트웨어 학부 운영체제 과목을 참고하여 작성하였습니다*

Operationg System(OS)

운영체제란 컴퓨터 소프트웨어와 하드웨어 간 인터페이스

하드웨어 자원을 쉽고 효율적으로 사용할 수 있도록 Abstraction을 제공하는 시스템 소프트웨어

Abstraction

추상화란 복잡한 개념 및 시스템을 단순화 하는 것이다.

운영체제는 컴퓨터의 물리 자원을 쉽게 사용할 수 있도록(system call) 추상화를 제공한다.

 

CPU -> Process

 

Memory -> Address Space(Virtual Address Space)

Disk -> File

하드웨어의 동작과 자원을 보다 포괄적이고 직관적인 개념으로 추상화 시킨 예시들을 볼 수 있다.

 

Policy

운영체제는 PC뿐 아니라 서버, 스마트폰, 자동차까지 다양한 영역에 사용된다.

운영체제는 각 시스템에서 고려되는 우선 사항에 맞추어, 한정된 컴퓨팅 자원, 리소스를 효율적으로 사용할 수 있어야 한다.

그에 맞추어 알맞은 정책(Policy)을 결정해서 사용한다.

 

대표적으로

FIFO(First In First Out)

LRU(Least Recently Used)

RR(Round Robin)

등등