[운영체제] 1. Intro to OS

만두·2023년 11월 23일
0

운영체제

목록 보기
1/13

노션에 정리한 글을 블로그에 옮기는 중입니다..


1. Intro to OS

프로그램을 실행하면 무슨 일이 발생할까?

  • 실행중인 프로그램은 Instrution 즉, 명령어를 실행한다.
    1. 프로세서는 메모리로부터 Instruction을 Fetch 한다.
    2. Decode : 명령어가 무엇인지 해석한다.
    3. Execute : 예를 들어 두 수를 더하고, 메모리에 접근하고, 조건을 검사하고, 함수로 이동하는 것 등등을 실행한다.
    4. 프로세서는 PC(Program Counter) 레지스터에 저장된 다음 명령어로 이동한다.

Operating System(OS)

  • Responsible for : 운영체제의 역할
    • Making it easy to run programs : 프로그램 실행을 쉽게 만든다.
    • Allowing programs to share memory : 메모리 공유를 허락한다.
    • Enabling programs to interact with devices : 디바이스와 상호작용하게 한다.

💡 OS is in charge of making sure the system operates correctly and efficiently.
OS는 시스템이 정확하고 효율적으로 작동하는지 확인하는 역할을 담당한다.


Virtualization 가상화

  • OS는 physical resource(물리적 자원)을 virtual form 가상의 형태로 변환한다.
    • physical resource : Processor, Memory, Disk…
  • 가상의 형태는 더 general하고 powerful하고 easy-to-use하게 한다.
  • 때때로 우리는 OS를 virtual machine이라고 부르기도 한다.

System call

💡 System call을 통해 사용자가 OS에게 요청한다.
  • OS는 몇몇 interface(APIs, jstandard library)를 제공한다.
  • 일반적인 OS는 대략 2~300개의 시스템 콜을 가진다.
    • Run programs (ex. execute)
    • Access memory
    • Access devices
💡 The OS is a resource manager.

OS는 CPU, memory, disk 등의 물리적인 자원들을 관리한다.

OS는 다음과 같은 것들을 허용한다.

  • Many programs to run → Sharing the CPU
    • 많은 프로그램들을 실행시킬 수 있도록 하는건 CPU를 공유하기 때문
  • Many programs to concurrently access their own instructions and data → Sharing memory
    • 많은 프로그램들이 동시의 그들의 명령어나 데이터에 접근할 수 있는건 메모리를 공유해서
  • Many programs to access devices → Sharing disks
    • 많은 프로그램들이 디바이스에 접근하는 것은 disk를 공유하기 때문


Virtualizing the CPU

CPU의 수는 제한되어 있기 때문에 가상화를 한다.

  • 시스템은 매우 많은 양의 virtual CPU들을 가지고 있다.
    • 하나의 CPU를 무한개의 CPU가 있는 것처럼 보이도록 바꾼다.
    • 많은 프로그램들이 동시에 실행할 수 있는 것처럼 보이도록 허락함.
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <assert.h>
#include "common.h"

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;
}

결과를 보면 입력받은 문자열을 1초마다 출력시킨다. Ctrl+C를 누르면 프로그램 종료 가능

2번째 결과를 보면 ./cpu A &; ./cpu B &; ./cpu C &; ./cpu D &;

  • &는 background에서 실행하겠다는 의미이다.
  • background로 하면 여러 프로세스를 동시에 실행할 수 있기 때문이다.
  • 그래서 총 4개의 프로그램을 실행시켰고, pid 값이 4개가 나온 것을 볼 수 있다.

Virtualizing Memory 메모리 가상화

  • Physical memory(물리적 메모리)는 an array of bytes. 즉, 바이트로 이뤄진 배열이다.
  • 프로그램은 메모리의 데이터 구조를 모두 유지한다.
    • Read memory (load) : 데이터에 접근할 수 있는 주소를 명시한다.
    • Write memory(store) : 주어진 주소에 쓸 수 있는 데이터를 명시한다.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"

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);
				*p = *p + 1;
				printf("(%d) p: %d\n", getpid(), *p);
		}
		return 0;
}
  • 코드를 살펴보면, 먼저 malloc을 이용하여 메모리를 할당한다.
  • 그리고 메모리의 주소를 출력한다.
  • 그 다음 메모리의 첫번째 주소를 0으로 설정한다.
  • 그러면 위와 같은 결과를 얻을 수 있다.
  • 보면 새롭게 메모리 주소로 00200000을 얻었고, 0부터 설정하여 1씩 증가한다.
prompt> ./mem &; ./mem &
[1] 24113
[2] 24114
(24113) memory address of p: 00200000
(24114) memory address of p: 00200000
(24113) p: 1
(24114) p: 1
(24114) p: 2
(24113) p: 2
(24113) p: 3
(24114)

위의 결과는 백그라운드로 두 개의 프로세스를 실행한 결과이다.

pid 값이 두개가 나온 것을 보아 프로세스 2개가 실행중이고

각각 address 값으로 00200000을 받았다. 그리고 각각 값이 1씩 증가하고 있다.

이것은 각각의 실행중인 프로그램이 own private memory를 가진것처럼 보인다.

  • 각각의 실행중인 프로그램은 같은 주소를 할당받았고

  • 각각은 독립적으로 업데이트되고 있다.

  • 각 프로세스는 자신만의 가상 주소 공간에 접근한다.

    • os는 address space를 physical memory와 맵핑시킨다.
    • 실행중인 한 프로그램에서 참조하는 메모리는 다른 프로세스의 주소 공간에 영향을 끼치지 않는다.
    • 물리적인 메모리는 공유되는 자원이고, os에 의해 관리된다.

The problem fo Concurrency

메모리를 공유하다 보면 동시성 문제가 발생한다.

  • OS는 한번에 많은 것들을 저글링하고 있다. 먼저 하나의 프로세스를 실행하고, 그 다음에는 또 다른 것을 실행한다.
  • 현대의 multi-threaded programs 도 동시성 문제를 보인다.
#include <stdio.h>
#include <stdlib.h>
#include "common.h"

volatile int counter = 0;
int loops;

void *worker(void *arg) {
		int i;
		for (i=0; i<loops; i++) {
				counter++;
		}
		return NULL;
}

...

int main(int argc, char *argv[]) {
		if (argc != 2) {
				fprintf(stderr, "usage: threads value\n");
				exit(1);
		}
		loops = atoi(argv[1]);
		pthread_t p1, p2;
		printf("Initial value: %d\n", counter);
		
		Pthread_create(&p1, NULL, worker, NULL);
		Pthread_create(&p2, NULL, worker, NULL);
		Pthread_join(p1, NULL);
		Pthread_join(p2, NULL);
		printf("Final value: %d\n", counter);
		return 0;
}
  • 이 메인 프로그램은 2개의 스레드를 생성한다.
  • Thread: 같은 메모리 공간, 같은 프로세스 내에서 실행하는 하나의 루틴, 실행 단위의 함수이다.
  • 여기서는 worker()라는 함수를 실행하고 있고, 이 함수는 counter값을 증가시키는 함수이다.
prompt> gcc -o thread thread.c -Wall -pthread
prompt> ./thread 1000
Initial value : 0
Final value : 2000

→ loops : 1000이라는 값을 줬을 때 두 개의 스레드가 실행되어 두개가 각각 카운터 값을 증가시켰기에 2000이라는 값을 얻는다.

prompt> ./thread 100000
Initial value : 0
Final value : 143012 // huh??
prompt> ./thread 100000
Initial value : 0
Final value : 137298 // what the??

→ loops: 100000 값을 줬을 때 예상 값이랑 다르게 나오는데 이게 바로 concurrency 문제이다.

무슨 일이 일어난걸까?

  • 공유된 카운터값을 증가시키다. → 3가지 명령어를 수행한다.
    1. memory에서 counter의 값을 불러서 register에 저장한다.
    2. 그 값을 증가시키다.
    3. 다시 메모리에 값을 저장한다.
  • 이 세가지 명령어는 atomically 하게 실행되지 않는다. → concurrency 문제가 발생한다.

Persistence 지속성

  • DRAM 같은 디바잇는 휘발성(volatile)으로 값을 저장한다.
  • 하드웨어와 소프트웨어는 데이터를 persistently하게 저장할 필요가 있다.
    • Hardware : 하드 드라이브, SSD(solid state drive) 같은 I/O 디바이스
    • Software
      • File system은 disk를 관리한다.
      • File system은 사용자가 만든 모든 파일을 저장할 책임이 있다.
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
		int fd = open("/tmp/file", O_WRONLY | O_CREATE | O_TURNC, S_IRWXU);
		assert(fd > -1);
		int rc = write(fd, "hello world\n", 13);
		assert(rc == 13);
		close(fd);
		return 0;
}
  • open(), write(), close() 와 같은 시스템 콜은 요청을 처리하는 파일시스템이라는 OS 부분으로 라우팅된다.

  • 디스크에 쓰기 위해 OS는 무엇을 할까?

    • 새 데이터가 디스크의 어느 위치에 있는지 파악한다.
    • 기본 스토리지 장치에 I/O 요청을
  • 파일 시스템은 쓰기 중에 나타나는 system crash를 처리한다.

    • Journaling or copy-on-write
    • Carefully ordering wirtes to disk
profile
아무것도 모르는 말하는 감자 입니다

0개의 댓글

관련 채용 정보