Operating System 14

[Kotlin] Shared Mutable State & Concurrency

import kotlinx.coroutines.* import kotlinx.coroutines.channels.actor import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import java.util.concurrent.atomic.AtomicInteger import kotlin.system.measureTimeMillis @Volatile // volatile 로 선언한다고 해서 동기화 문제가 해결되지 않는다. var counter = 0 // 일반적인 해결책으로는 (스레드나, 코루틴이나) thread-safe data structure 를 이용 val counterAtomic = AtomicInteger() ..

Operating System 2022.10.30

[OS] Memory Management (3&4)

❗️Disclaimer : 이화여대 반효경 교수님 수업 자료 입니다. Multilevel Paging and Performance Address space 가 더 커지면 다단계 페이지 테이블 필요 각 단계의 페이지 테이블이 메모리에 존재하므로, logical address 의 physical address 변환에 더 많은 메모리 접근 필요 TLB를 통해 메모리 접근 시간을 줄일 수 있음 (바로 메모리 접근 가능) 4단계 페이지 테이블을 사용하는 경우 메모리 접근 시간이 100ns, TLB 접근 시간이 20ns 이고, TLB hit ratio 가 98% 인 경우 Effective memory access time = 0.98 * 120(TLB확인 20 + 실제 접근 100) + 0.02 * 520(페이지테..

Operating System 2022.01.24

[OS] Memory Management (2)

이화여자대학교 반효경 교수님 운영체제 강의 Paging 을 통한 메모리 관리 논리 주소를 페이지 단위로 쪼개서 관리한다. 페이지 테이블에서는 해당 페이지가 어떤 물리 메모리로 매핑되어 있는지 관리한다. (물리 : 프레임) 페이지 테이블을 통해 논리 페이지 번호를 물리 프레임 번호로 변환한다. 프로세스마다 TLB 가 다르기 때문에 context switching 이 일어날 때 마다 flush 시켜주고 복구 시켜주는 과정이 필요하다 페이지 테이블만 있을 때 보다 TLB를 두었을 때 룩업 시간이 더욱 단축된다. 2단계 페이지 테이블 프로그램마다 페이지 테이블을 위해 4MB 의 공간이 필요한 셈이므로, 공간 낭비가 심함. 페이지 테이블을 두 단계 거쳐서 주소를 찾는다. Page of Page table 사이즈는..

Operating System 2021.12.24

[OS] Memory Management (1)

이화여자대학교 반효경 교수님 운영체제 수업 8-1 Memory Management Logical vs Physical address logical address (= virtual address) 프로세스마다 독립적으로 가지는 주소 공간 각 프로세스마다 0번지 부터 시작 CPU 가 보는 주소는 logical address 임 CPU 는 하드웨어이므로 물리주소를 바라볼 것 같으나, 논리 주소를 바라본다. fetch, execute 시 매번 논리주소를 물리주소로 변환해서 알아내야 함 physical address 메모리에 실제 올라가는 위치 주소 바인딩 : 주소를 결정하는 것 symbolic binding -> logical address -> physical address 주소 바인딩 컴파일 타임 바인딩 ..

Operating System 2021.12.24

[System Software] gcc, compiling, linking, libraries

참고 강의자료 gcc usage : gcc [options] FILE ... C 컴파일러 (C++ 컴파일러는 g++이다) 파일 이름은 반드시 .c 로 끝나야 한다. 컴파일 결과 실행 파일 이름이 a.out 이 된다. -o filename 위와 같이 옵션을 주면 실행파일 이름을 filename 으로 한다. cat > a.c #include int main(){ printf("linux is exciting\n"); } gcc -o exciting a.c Library 만들기 및 사용 (static) library file 은 .a로 끝난다. ar 커맨드를 사용해서 라이브러리 만들 수 있음 ar rcs libname.a a.o b.o c.o r : include this (replace if exist) c..

Operating System 2021.02.13

[System Software] System Software & Program Execution

고급언어, 컴파일러, 링커, 로더, 어셈블러, 라이브러리 C언어와 같은 고급 언어로 프로그램을 작성하면 컴파일러는 소스코드를 컴파일하여 이를 엉셈블리 프로그램으로 변환한다. 어셈블러는 이를 기계어 프로그램(오브젝트 파일)로 변환하고, 다른 오브젝트 파일들과 라이브러리 파일들을 링커가 합쳐서 Executable File 을 만든다. 오브젝트 파일은 불완전한 형태의 기계어 파일로, 불완전한 이유는 우리가 하나의 파일에만 코드를 작성하지 않고 다른 파일에 분리해 작성하여 생긴 파일 및 내가 작성하지 않았지만 다른 사람이 작성한 함수들을 합치지 않았기 때문이다. C언어를 예로 들면 Math 나 Print 관련 함수들을 떠올릴 수 있다. 링커는 이 파일들을 합쳐 실행가능한 파일을 생성한다. GCC같은 컴파일러 소..

Operating System 2021.02.12

[System Software] MIPS Procedure Call (Cont'd)

10강) 점프앤 링크 함수가 호출되면 호출될 함수의 주소로 점프를 한다. 함수가 리턴될 주소를 저장하는 ra 에다가 점프를 시작한 주소를 저장한다. ra 에다가 현재 프로그램 카운터 값을 저장하고, 점프한 후 다른 위치로 pc 를 바꾸는 두 연산을 합쳐둔 것이 점프앤 링크이다. 함수 호출은 결국 "리턴 어드레스 저장 - 함수의 시작 위치 점프 - 함수 실행 끝난 후 Jump Register 를 해서 호출된 지점으로 다시 돌아오는" 과정이다. 함수가 다른 함수를 호출하고, 그 함수가 다시 다른 함수를 호출하면 ra 를 덮어쓸 것이다. 함수가 한 번만 호출되면, 첫번째 그림처럼 로직이 진행되겠지만 A-B-C 함수가 연속해서 호출되면 가장 처음의 ra 값은 스택에 저장된다. 실행이 쭉 되다가 이미 ra 레지스..

Operating System 2021.02.12

[System Software] 프로그램의 메모리 주소 공간 구조

8강) - 어떤 프로그래밍 언어이든 실행할 때 보면 프로시저 구조로 되어있다. 즉 함수 구조로 되어있음. 가령 C언어의 경우 main() 함수에서 A() => B() 와 같이 함수 호출이 이어져 나간다. - 컴파일 후 실행 파일이 만들어지고, 이 프로그램을 메모리에 올리면 프로세스가 된다. 메모리 상에 주소가 매겨지게 되는데, 각 프로세스마다 (가상의) 0번지부터 시작하게 됨. 물리 주소는 ISA에 따라서 달라진다. (MIPS 의 경우 4기가 상의 어딘가에 있을 것) 메모리 레이아웃 설명 - Code : Read only 영역이다. - 전역변수와 Static 변수들은 데이터 영역에 올라간다. *주의) 함수 안에서 선언된 static 변수들 또한 데이터 영역에 올라가서 프로그램의 라이프사이클과 동일한 라이..

Operating System 2021.02.08

[System Software] C언어&어셈블리 예제

7강) MIPS Instruction Set Architecture VI - C언어와 MIPS 어셈블리언어 - 배열의 경우 시작주소를 레지스터에 저장한다. - 시작 위치로부터 얼마나 떨어져 있는지 인덱스 i 를 보고 계산한다. 정수 배열의 경우 요소 요소 마다 4byte 씩 공간을 차지하게 되므로 i 에다가 4를 곱한 주소에 배열 시작 주소를 더한 곳으로 접근한다. - 곱하기 4를 하는 과정 : 곱하기보다 더하기가 더 빠르므로 똑똑한 컴파일러는 곱하기 4를 하는 과정을 add 연산으로 대체한다. 따라서 처음에 루프가 시작되는 곳을 보면, t1 에다가 s3 를 두 번 더하고, t1 에다가 다시 t1 끼리 더한 값을 저장한다. 그리고 마지막으로 s6, 즉 배열의 시작 주소를 더해준다. - t0 라는 레지스터..

Operating System 2021.02.07

[System Software] 논리연산 & Data Transfer 연산 / Branch & Jump 연산

4강) 논리 연산 - 기계어에서의 논리연산은 숫자로 보는 관점이 아니라 비트 단위의 AND OR 를 나타낸다 - XOR 는 두 비트가 같으면 거짓 (0), 두 비트가 다르면 참 (1) 이 되는 연산. - and immediate : 더 큰 숫자와 작은 숫자를 연산 할 때는 작은 부분을 확장해야 한다. 확장할 때는 전부 0으로 채워준다 (일반적임). - 꼭 그렇지 않을수 도 있음. 양수만 있으면 작은 숫자에 상위 비트를 0으로 채우면 되지만, 숫자중 음수가 있다면 ? - 컴퓨터에서는 2의 보수형태를 이용해서 음수를 표현함. 1로 채우기 (?) => 연산 장치를 편리하게 구성할 수 있기 때문임. - 최상위비트를 1로 나타내기도 함 메모리에 접근하는 연산 1. LOAD 2. STORE - 로드는 메모리에서 읽..

Operating System 2021.02.07