운영체제는 응용프로그램을 관리한다.
현재 CPU를 어느 프로세스에 할당할지 결정하고(스케줄링 기능), 프로세스의 생성 및 삭제, 프로세스간 공유 자원 접근과 통신을 관리한다.
💡키워드
- 프로세스, 스레드
- CPU 스케줄링
- 동기화
- IPC
💡키워드
- 메모리 관리
- 가상 메모리
- 파일 시스템
💡키워드
- TCP/IP
한 컴퓨터를 여러사람이 사용하는 경우에 각 계정을 관리할 수 있는 기능이 필요하다.
=> 개인파일이나, 시스템 자원에 접근 권한을 지정할 수 있도록 지원한다.
💡키워드
- 계정 관리
- 접근권한 관리
마우스, 키보드 등 I/O 장치와 컴퓨터 간에 데이터를 주고 받는 것을 관리
유저프로그램
GUI
시스템콜
커널
드라이버 => 해당 그림에서는 이렇게 4가지를 운영체제라고 지칭한다.
하드웨어
프로세스나 스레드 -> 시스템콜 -> 커널 -> OS
Kernal: OS의 기본 알고리즘들을 구현해둔 로직이다.
시스템콜: OS가 커널에 접근하기 위한 인터페이스. 유저 프로그램이 운영체제의 서비스를 받기위해 커널함수 호출시 사용한다.
커널모드로만 운영체제의 자원을 이용할수있게함
(커널 모드에서는 운영체제가 전체 시스템을 관리하고 필요한 작업을 수행할 수 있는 권한을 가지므로)
=> 시스템의 안정성, 보안향상
e.g. VSCode에서 특정파일을 불러오려고 할때,
1. 파일열기 요청
2. 트랩 발생(커널모드 전환)
vsCode는 OS에게 시스템 콜을 통해 I/O 작업 요청함
=> 시스템 콜은 트랩 발동시킨다. modebit를 변경하고, 유저모드가 시스템 콜을 통해 커널모드로 전환된다.
3. 검증 및 I/O처리
운영체제는 커널모드에서 파일의 존재여부, 접근권한을 검증하고 요청이 유효하다면 파일을 메모리로 읽어온다.
4. 유저모드 전환
I/O 작업이 완료되면, 읽어온 데이터를 vsCode에 반환
프로그램이 메모리에 적재되어 인스턴스화 된 것. 즉, 실행중인 프로그램.
CPU 스케줄링의 대상이 되는 task와 같은 의미로 쓰인다.
특징
e.g. 크롬 브라우저의 각각의 탭은 프로세스로 독립된 메모리를 가지고 있다.
💡 프로세스는 운영체제로부터 CPU, 메모리 등의 자원을 할당받아 CPU가 명령을 실행하도록 한다.
프로세스는 메모리와 PCB로 구성되어 있다.
메모리 구조 내부
- 코드 영역(프로그램 자체)
- 데이터 영역(프로그램 실행 시 필요한 데이터)
- 정적 데이터 영역
- 스택 영역
- 힙 영역
스택과 힙은 동적영역으로 런타임 단계에서 메모리를 할당받는다!
데이터, 코드 영역은 정적영역으로 컴파일 단계에서 메모리를 할당한다.
각 프로세스마다 존재하는 블록으로 프로세스를 관리하기 위한 필요 정보들이 들어있다.
=> 여러 프로세스가 번갈아 실행되는 겨우 이 PCB에 있는 정보들을 활용한다.
프로세스 제어 블록(PCB) 내에 들어있는 정보
- 프로세스 번호(PID)
- 프로세스 상태
- 프로그램 카운터(PC)
- 레지스터
- 메모리 관리 정보
- 프로세스 우선순위
- 회계정보 등
스레든
1.New(생성 상태) - 프로세스가 생성된 상태(메모리 할당하여 적재시킨상태)를 의미하며, PCB가 할당된다.
2.Ready
3.Running
4.Waiting
5.Terminated
생성 -> 준비 ---디스패치(CPU 획득)---> 실행 -> 종료
준비 <---할당시간 만료------- 실행
생성 -> 준비 -------------------디스패치------------------> 실행 -> 종료
준비 <---해당이벤트 작업완료-- 대기 <---이벤트 대기--- 실행
정의: 프로세스 내에서의 다중처리를 위해 제안된 개념으로, 하나의 프로그램을 실행시키기 위한 기본적인 단위다.
프로세스 하나의 자원을 공유하면서 일련의 과정 여러개를 동시에 실행시킬 수 잇는 것을 말한다.
전통적인 프로세스에서는 하나의 프로세스 안에 하나의 PC가 코드영역을 가리켰다면,
스레드가 제안된 프로세스에서는 PCB에서 pc가 분리되어, 스레드 내에 pc가 존재하고.
pc가 각각 다른 코드영역을 가리킬 수 있게 되었다.
PC(Program Counter): 다음 수행할 명령어의 주소를 기억하는 레지스터이다.
장점
1. 빠른 컨텍스트 스위치
스케줄링 단위가 프로세스였던 시절, context switch가 일어날 때마다 캐쉬 flush, 그리고 캐쉬 복구등을 해야했다. 하지만, 스케줄링 단위가 Thread로 되면서 같은 프로세스 내의 Thread들을 context switch를 할 때는 TCB만 바꾸면 된다.
가장 큰 차이점은 메모리 공유 여부이다.
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다.
스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다.
따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.
멀티프로세스는 하나의 응용 프로그램을 여러개의 프로세스로 분리하여 동시에 여러 작업을 수행 하는것을 말한다..
=> 웹 브라우저는 멀티프로세스 구조를 가지고 있다.
=> 하나의 프로세스가 죽어도 여러 개의 프로세스가 동시에 실행되므로 다른 프로세스 이용해서 처리하면 된다(??), 프로그램이 죽지않아 프로그램 전체의 안정성이 높아지는 것에 목적.
멀티프로세스는 IPC가 가능하다.
IPC란 프로세스끼리 데이터를 주고받고 공유데이터를 관리하는 메커니즘
공유메모리 방식이란 여러 프로세스가 서로 통신할 수 있도록 공유메모리를 생성해서 통신하는 방식.
- 각 프로세스의 메모리를 다른 프로세스가 접근할 수 없다.
=> 하지만 공유메모리를 통해 여러 프로세스가 하나의 메모리를 공유할 수 있다.
한 탭(프로세스) 내에서 여러 스레드를 생성할 수 있는 방식을 의미.
여러 스레드들은 독립적으로 수행되지만, 프로세스의 자원을 공유하며 리소스 낭비를 줄이며 "동시에" 수행된다.
(예를 들어, 하나의 탭에서 페이지 로딩, 자바스크립트 처리, UI 갱신 등이 동시에 일어날 수 있습니다.)
장점
단점: 하나의 스레드가 망가지면, 모든 스레드가 작동 불능 상태
=> 멀티스레드의 안전성에 대한 단점은 Critical Section(임계 영역) 기법을 통해 대비.
멀티프로세스는 하나의 응용프로그램을 여러개의 프로세스로 분리하여 실행.
=> 여러 개의 프로세스가 동시에 실행되므로, 하나의 프로세스가 죽어도 프로그램이 죽지않아 프로그램 전체의 안정성이 높아지는 것에 목적.
하나의 컴퓨터에서 2개이상의 프로세서(CPU) 들이 두가지 이상의 일을 "동시 처리"할 수 있는 방식. (Parallelism) => 속도 향상 목적
둘의 정의를 봤을때 한개의 작업을 동시에 처리하는 면에서 비슷하다고 생각할 수도 있다.
하지만 이 "동시처리"를 어떻게 하느냐? 에 따라 차이가 있다.
멀티프로세스: "프로세스(process)가 멀티인것"
멀티프로세싱: "프로세서(CPU)가 멀티인것"
멀티프로세싱은 parallel로 수행
멀티스레딩은 concurrently하게 수행
Concurrency: 한 시점에 오직 한가지의 작업만 처리하지만, 여러 작업이 동시에 수행되게끔 보이는 효과를 일으킴
Parallelism: 실제로 같은 시간에 여러 작업을 동시에 처리 => 속도를 높이는 목적
코어: CPU 내에서 명령어를 실행하는 부품
멀티코어 프로세서: 여러개의 코어를 포함하는 CPU
멀티스레드 프로세서: 하나의 코어로 여러개의 명령어를 동시 실행할 수 있는 CPU