강의자료 공부
01. Operating system (OS)
컴퓨터 시스템이 정확하고 효율적으로 동작할 수 있도록 도와주는 resource manager로서, CPU, Memory, Disk를 관리
- - 실행할 프로그램이 많음 -> CPU 공유
- - 여러 프로그램이 동시에 명령어, 데이터에 접근 -> Memory 공유
- - 여러 프로그램이 장치에 접근 -> Disk 공유
=> 프로그램 실행을 쉽게 만들어 주고 상호 작용할 수 있도록 만들어 줌 (가상화, 동시성, 지속성)
02. Virtualization (가상화)
OS는 physical resource(processor, memory, disk)를 가져와서 자신의 가상 형태로 변환 (OS = 가상머신)
1) Virtualizing the CPU
- 시스템은 매우 많은 가상 CPU 가짐
- 하나의 물리적 자원인 CPU를 공유하기 위해 무한한 수의 가상 CPU로 변환 (환상 제공) -> 여러 프로그램들이 동시에 실행되는 것처럼 느껴짐 => CPU 가상화
/* Virtualizing the CPU (cpu.c)*/
int main(int argc, char* argv[])
{
if (argc != 2) {
fprintf(stderr, "usage: cpu <string>\n");
exit(1);
}
char* str = argv[1];
while (1) {
spin(1); // 1초에 한번씩 아래 내용 실행
printf("%s\n", str);
}
return 0;
}
$ ./cpu A & ; ./cpu B & ; ./cpu C & ; ./cpu D & // &(백그라운드에서 4개 동시 실행) ;(한문장으로 씀)
A
B
D
C
A
C
B
D
...
=> 하나의 프로세서로 4개의 프로그램이 동시 실행되는 것 같이 보임
2) Virtualizing the Memory
- Physical Memory == Array (byte)
- 프로그램은 data structures를 Mem에 보관함 (Read mem(load) / Write mem(store))
- 실행 중인 한 프로그램 내의 메모리 참조는 다른 프로세스 주소 공간에 영향 x
- 실제 물리적 메모리는 하나(OS가 관리하는 공유 자원임) -> OS가 가상화 시킴 -> 각 프로세스는 개인 virtual address space에 엑세스 (개인 공간 가지고 있는 것 같은 환상 제공) => 메모리 가상화
int main(int argc, char* argv[])
{
int* p = malloc(sizeof(int));
assert(p != NULL); // 에러 검출용
printf("(%d) address of p: %08x\n", getpid(), (unsigned)p);
*p = 0;
while (1) {
spin(1); // 1초에 한번씩 아래 내용 실행
*p = *p + 1;
printf("(%d) p: %d\n", getpid(), *p);
}
return 0;
}
$ ./mem & ; ./mem & //백그라운드에서 2개 동시 실행
(1220) address of p: 00200000
(1221) address of p: 00200000
(1220) p: 1
(1221) p: 1
(1221) p: 2
(1220) p: 2
...
=> 같은 위치(00200000) 메모리 할당(실제 물리적 메모리는 하나라는 뜻), 그러나 독립적으로 일하면서 서로 영향 미치지 않음(마치 각 프로세서가 서로 다른 메모리를 가진 것 같이 보임)
03. Concurrency (동시성)
OS는 여러 프로세스를 처리하기 때문에 동시성 문제가 발생(multi-threaded programs에서도 나타나는 문제)
- 예를 들어, 2개의 thread에서 각각 루프를 1000번씩 돌면서 1씩 카운터를 증가시킬 때 총 합은 2000이 되지만, 같은 방식으로 총 합 20000을 기대하고 각 스레드마다 루프를 10000번씩 돌았으나 값이 다르게 출력되는 현상 등
=> 이런 문제를 OS가 막아야 됨
- 동시성 문제 발생 원인
- Mem -> Reg로 값 Load 후 증가시키고 다시 Mem에 Store하는 과정을 거침
- 하지만 위 명령어들은 원자적으로 실행되지 않음 (All or noting) -> 동시성 문제 발생
04. Persistence (지속성)
- DRAM과 같은 저장장치는 휘발성으로 저장(전원 끄면 날라감) -> 지속성 위해서는 HW, SW 필요
- HW: hard drive, SSD같은 I/O 장치
- SW: 파일 시스템은 디스크 관리 -> 생성하는 모든 파일 저장
- 즉, DRAM은 날라가니까 write와 같은 시스템 콜 -> 시스템 콜은 파일 시스템이라는 OS 부분으로 보내짐 -> HW에 I/O 요청 -> 지속성 저장 완료
=> OS가 디스크에 쓰기 위해 작업(디스크 어디다가 쓸지 정하고 I/O 요청)
05. System call
사용자가 OS에게 지시할 때 시스템 콜 사용
- - OS는 API와 같은 interface 제공
- - OS는 프로그램 실행, 메모리 접근, 액세스 장치와 같은 수백 개의 시스템 콜을 내보냄
'🌙CS > 운영체제' 카테고리의 다른 글
[Linux] System Call 추가하기 (0) | 2024.09.23 |
---|---|
04. Limited Direct Execution (1) | 2024.09.18 |
03. Process API (0) | 2024.09.14 |
02. Processes (0) | 2024.09.13 |
[Linux] 커널 설치, 컴파일 (2) | 2024.09.08 |