전공/시스템 프로그래밍(운영체제) 13

10. Threading

1. Programs, Processes, and Threads 1) Threading 하나의 프로스에서 여러개 단위의 실행(작업의 실행)을 생성하고 관리하는 기법이다. CPU는 멀티 코어로 여러 개의 코어로 이루어질 수 있다. processor는 CPU와 같다. 하나의 processor에 여러개의 코어가 있다면 각각의 코어에 각각 다른 process의 thread가 병렬로 실행될 수 있다. ※ 병렬 처리 여러 작업이 동시에 실행되는 것이다. Threading을 이해하기 위해 CPU인 processor는 1개의 코어만 가진다고 가정, 한 process는 여러 개의 스레드로 동작할 수 있다. 위 가정에서 processor는 process안의 thread를 병렬로 처리할 수 없다. 2) Binaries 컴파..

9. Process Management

1. Programms / Process / Thread 개요 1) Programms / Process 프로그램이라고 하는 것은 2진 형태의 데이터의 집합이다. dormant라고 하는데 이는 아직 동작을 시작하지 않았지만 실행될 수 있는 상태를 말한다. 프로그램이 실행된다고 하는 것은 HDD에 저장되어 있는 프로그램이 process 형태로 바뀌는 것이다. 그럼 왜 프로그램은 2진 형태로 존재해야하는가? => 프로그램이 메인 메모리에 적재되었다고 모두 실행되는 것이 아니다. 그럼 어떤 프로세스가 현재 실행 중이다 애기할 수 있냐면 CPU 자원을 할당 받았을 때만 프로세스가 실행되는 것이다. 메인 메모리에 적재된 명령어 중 CPU 자원을 할당 받지 않는 명령어는 sleep 한다라고 한다. 프로세스 A를 실행..

8. Multy-Process와 Mutual Locking

1. Process management 개요 1) 프로세스의 형태 운영체제는 직역을 하면 구성 시스템이다. 그럼 무엇을 구동하냐? 프로세스를 구동시키기 위해 존재한다. Mutual Locking이 왜 필요한지는 프로세스를 알아야 왜 필요한지를 알게 된다. 프로그램은 storage(such as HDD)에 저장되어 있다. (이는 실행될 수 있는 2진 형태이다.) 이 프로그램을 실행하게 되면 실행되 수 있는 2진 소프트웨어가 메인메모리에 적재가 된다. 이것이 loading이라고 한다. HDD->RAM으로 loading 될 때 기존의 프로그램에서 모양이 달라지며 loading되는데 아래와 같은 메모리 구조를 가지며 프로세스가 된다. 위와같이 생긴것이 프로세스이다. Stack heap data section t..

7. Buffered IO

1-1. 도입: HDD는 왜 느린가? (하드웨어적 관점) HDD는 왜 느린가? RAM을 왜 사용하는가? HDD는 굉장히 느리다. 왜 느리냐면 HDD의 구조를 뜯어보면 disk 라는 동그란 CD 같은 원판이 있다. 이곳에 데이터가 기록된다. 이 CD 원판은 회전을 하는데 reder라고 하는 일종의 핀이 있다. 이 핀이 읽고 쓰는 역할을 담당하는 ‘막대기’ 같은 것이다. 예를 들어 디스크로 read 명령이 주소 단위로들어온다. 그럼 디스크는 해당 주소의 위치에 있는 데이터를 읽어야한다. 디스크 원판은 회전을 하는데 위 read 명령에 의해 디스크에서 접근해야하는 주소가 방금 회전을 해서 지나갔다? => 그럼 한바퀴 돌아 해당 주소가 핀에 도달할 때까지 다시 기다려야한다. 이는 아무리 짧다해도 물리적인 시간이..

5. 추가적인 System Call

1-1. System call: lseek() #include #include off_t lseek(int fd, off_t pos, int origin); 파일 디스크립터를 처음 open하면 offset은 당연히 0이다. (참고로 offet은 메타 데이터가 아니다. !!) 그리고 파일을 읽을 때 마다 offset이 뒤로 이동한다. 이 offset을 이동 시키는 시스템 콜이다. 첫 번째 매개변수인 파일 디스크립터의 파일의 offset의 원래 위치인 origin 값에서 pos만큼 뒤로 이동하라는 의미가 된다. 이때 origin이 아래 2가지 상수 값을 가질 수 있다. SEEK_CUR : 현재 offset위치를 반환 SEEK_END : 현재 파일의 offset을 걍 맨 마지막 끝으로 이동하라는 것이다. 또한..

4. 시스템 콜: buffer 정리

0. buffer 기본 개념 버퍼라는 것의 역할은 프로세스1 과 프로세스2 사이 속도의 차이를 완화해주는 것이다. 우리가 키보드를 통해 내용을 치는데 모니터에 안나오고 갑자기 모니터에 쭉 나오는 현상이 발생한다. 컴퓨터를 관리하는 것이 OS인데 OS는 CPU 자원을 할당해서 프로세스를 구동시키는 역할을 한다. 우리 컴퓨터를 보면 엄청나게 많은 프로세스가 실행되고 있고 CPU는 1개이다.(코어 1개라고 가정) 운영체제가 여러 프로세스를 동시에 실행하는 것처럼 보이지만 실제로는 프로세스를 한번에 하나씩 조금씩 실행해서 차례로는 CPU에서 하나하나 실행된 결과이다. 키보드로부터 입력하는 데이터를 화면에 출력하는 프로세스 A 가 있을 것이다. 사용자의 키보드 타이핑은 A프로그램이 스케줄링되는 떄에 맞춰 타이핑하..

3. System Call: read, write

1-1. read 시스템 콜 read라는 시스템 call의 함수 역할은 파일을 읽는 역할을 한다. 따라서 read전에 open을 먼저해줘야하고 open으로 리턴 받은 파일의 파일 디스크립트 값을 read 의 첫 매개변수로 준다. 그러면 read 파일 디스크립터는 파일의 맨 처음을 가리켜 읽을 수 있게 된다. buf는 파일로부터 데이터를 읽어서 저장할 공간을 buf에 지정한다. 즉 문자열의 주소의 주소 값을 전달한다. buf의 void 형태는 무슨 형태(문자열인지, 숫자인지, 2진수인지 모름) 의 데이터 형태인진 모르겠으나 offset부터 len 길 만큼에 파일에서 읽어 저장하는 인자이다. read함수는 파일 디스크립터가 처음 호출될때는 처음을 가리키고 len만큼 read한 만큼 파일 디스크립터가 가리키는..

2. System Call: open

1. System call open #include #include #include #include #include int open (const char *name, int flags); int open (const char *name, int flags, mode_t mode) 리눅스 시스테 콜의 open은 첫 번째 매개변수로 주어진 문자열의 경로에 해당하는 파일 열고 파일 디스크립터를 반환하는 것이다. 두 번째 매개변수는 파일을 열 때 플레그를 지정한다. 그리고 세 번째 매개변수는 파일을 열 때 사용자가 그 연 파일의 권한을 부여하고 여는 것이다. #include #include #include #include #include int main() { int fd; fd = open("./file.tx..

1. 시스템 구조와 시스템 라이브러리

1. 운영체제란 운영체제를 정리한 글이 아니라 시스템 라이브러리를 이해하기 위한 최소한의 OS개념을 정리한다. 운영체제(operating system), 사용자 프로그램을 동작시키는 프로그램이 운영체제이다. 사용자 프로그램을 동작시키는 것과 운영체제에는 어떤 벽이 존재한다. 예를 들어 pc에서 두 개의 독립적 프로세스가 서로 방해하지 않도록 독립성을 보장하기 위해 두 개의 프로세스를 동시에 실행하고 관리하기 위한 것이 운영체제이다. 운영체제가 관리하는 것은 사실 하드웨어이다. 하드웨어를 관리해서 사용자가 하드웨어에 접근해서 하드웨어를 사용할 수 있도록 만들어주는 것이 운영체제이다. 따라서 정리해보면, 하드웨어를 동작시키거나 사용자 프로그램을 동작시키는 것이 운영체제이다. 2. 시스템 프로그래밍: 시스템 ..