[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS 193

[운영체제] 입출력시스템

입출력 시스템의 일반적 구성 입출력 장치는 '시스템 버스'와 연결되어야 하는데, 물리적인 입출력장치가 바로 시스템버스에 접속되어 있는 것은 아니고 '제어기'를 통해서 연결이 된다. 즉, 장치 제어기가 시스템 버스와 연결되어 있다. 응용 프로그램이 시스템 콜을 통해 커널의 파일 시스템 및 디바이스 드라이버에 연결되고, 커널의 다바이스 드라이버가 장치 제어기를 통해 입출력 장치 자체와 연결된다. 즉, 응용 프로그램이 시스템 콜을 호출하면 이 호출이 커널의 디바이스 드라이버에게 전달되고, 디바이스 드라이버는 하드웨어인 장치 제어기와 명령 및 정보를 주고받으며 작업을 수행하고, 이러한 작업을 통해 입출력 장치가 통제되게 되는 것이다. 디바이스 드라이버와 장치제어기의 상호작용 (하드웨..

[운영체제] 커널과 시스템호출

운영체제는 하드웨어와 매우 밀접하게 연관되어 있다. 특히 CPU내의 레지스터나 메모리 입출력장치 등과 같이 장치 자체가 운영체제의 기능과 접점을 이루는 경우, 해당 장치의 구조와 기능을 잘 알고 있어야 운영체제를 이해할 수 있다. 하지만 하드웨어 전체를 이해하기란 어려움이 있으므로, 컴퓨터 구조라는 개념으로 일반화(추상화)하여 공부해보고자 한다. 앞으로 커널과 시스템 호출부터 시작해서 커널이 외부세계와 접촉하는 입출력 시스템, 입출력시스템과 커널의 접점인 인터럽트의 구조와 기능, 캐시와 기억장치의 구조 등에 대해 공부하겠다. 커널 커널 : 이전에 배운 '상주모니터' 개념의 연장선 상에 있다. 운영체제의 핵심으로서 부팅 이후 메모리에 상주하는 부분이다. (사실 부팅 자체가 이러한 커널을 메모..

[운영체제] 다중 프로그래밍 / 시분할 시스템 / 실시간 시스템

다중 프로그래밍 메모리의 사용자영역에 프로그램이 여러개 탑재되어 있고, CPU가 이를 번갈아가며 수행한다. 어떤 프로그램을 수행하다 입출력이 발생하면 해당 입출력이 처리되는 동안 CPU가 다른 프로그램을 수행하는 방식이다. 여러 프로그램 중 어떤 프로그램을 선택할지는 '스케쥴링'을 통해 해결한다. 이는 적절한 정책을 통해 다음 프로그램을 결정해준다. 이러한 프로세스는 각 프로그램이 입출력이 발생할 때만 발생된다. 즉, 다른 프로그램으로 작업이 이동되려면 하나의 프로그램이 입출력이 발생해야 한다. 만약 하나의 프로그램에서 무한 루프가 발생된다면 스케쥴링도 일어나지 않아 나머지 프로그램도 돌아가지 않는다. 즉, 다중 프로그래밍 방식에서는 프로그램 간 간섭이 존재한다. 대부분의 프로그램 실행시간..

[운영체제] 운영체제의 필요성 / 일괄 처리 시스템

운영체제의 필요성과 목적 메모리나 CPU와 같은 자원은 한정되어 있지만, 사용자는 충분히 무한할 수 있다. -> 이에 따라 이러한 사용자들의 자원 사용을 조율하기 위한 '운영자의 정책'이 필요하다. 다양한 사용자를 받아들여 최적의 사용율을 보이는 '효율성'과 각각 사용자로서 하여금 불편함이 없을 만큼의 '편의성'을 둘 다 추구해야 한다. 하지만 이 둘은 결국 상반된 개념이다. 한 사용자의 편의성을 위해 자원을 한 사용자에게만 주면 결국 자원을 효율적으로 사용하지 못하는 것이고, 모두에게 자원을 똑같이 분배하면 사용자가 많아질수록 사용에 불편을 겪을 수 있기 때문이다. 따라서 이 두 양극의 최적점을 찾는 것이 중요하다. 정리하면 운영체제는 사용자 관점의 편의성, ..

[알고리즘 연습] 시청방해자 (by C++)

시청방해자 영화관에 사람이 일렬로 앉아있다고 가정하고, 앉은 키가 뒷 사람 모두보다 더 커서 뒷사람 모두에게 피해를 주는 사람의 수를 세자. 사람의 수 N을 입력받고, N명의 사람의 앉은 키를 입력받는다. 예를 들어, 10을 입력받고 56 46 55 76 65 53 52 53 55 50을 입력받으면, 뒷 사람 모두의 키보다 큰 인원은 3이므로 3을 출력한다. 풀이 (단순 접근) #include int main() { //freopen("input.txt", "rt", stdin); int n,i,j,tmp,res = 0, flag = 1; int h[101]; scanf("%d", &n); for(i=0; i

[알고리즘 연습] 아나그램 (by C++)

아나그램 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아나그램이라고 한다. 예를 들어, AbaAeCe 와 baeeACA는 아나그램이다. 두 문자열을 받고, 두 문자열이 아나그램이면 'YES'를, 아나그램이 아니면 'NO'를 출력한다. 풀이1 #include int main() { freopen("input.txt", "rt", stdin); char a[101],b[101]; int i,j,flag=1; scanf("%s", &a); scanf("%s", &b); for (i = 0; a[i] != '\0'; i++) { for (j = 0; b[j] != '\0'; j++) { if (a[i] == b[j]) { b[j] = '0'; break; } } } for(i=0; ..

[알고리즘 연습] 소수의 개수 (by C++)

소수의 개수 자연수 N을 입력하면 1~N까지의 수 중 소수를 찾아 출력해준다. 예를 들어, 20이 입력되면 2, 3, 5, 7, 11, 13, 17, 19 총 8개의 소수가 출력된다. 시간 제한이 짧다고 가정하고 최대한 효율적인 알고리즘을 생각해보자. 풀이1 #include int a[200001]; int main() { //freopen("input.txt", "rt", stdin); int n, i, j, res = 0; scanf("%d", &n); for(i = 1; i

[알고리즘 연습] 뒤집은 숫자의 소수 여부 판단 (by C++)

가장 많이 사용된 자릿수뒤집은 숫자의 소수 여부 판단 N을 입력받고 N개의 자연수를 입력받는다. 자연수를 뒤집고 소수 여부를 판단하여, 소수일 경우 출력한다. 예를 들어, 910을 뒤집으면 19로 바꾸어 판단해야 한다. 예를 들어, 5을 입력하고 32 55 62 3700 250을 입력하면 23과 73이 출력된다. 풀이 #include int reverse(int x) { int res=0, tmp; while(x > 0) { tmp = x % 10; res = res * 10 + tmp; x = x / 10; } return res; } bool isPrime(int x) { int i; if (x == 1) { return false; } for(i=2; i

[알고리즘 연습] 가장 많이 사용된 자릿수 (by C++)

가장 많이 사용된 자릿수 N자리의 자연수가 입력되면 해당 자연수에서 가장 많이 사용된 자릿수를 출력한다. 답이 여러개일 경우 가장 큰 수를 출력한다. 예를 들어 1230565625라는 자연수가 입력되면 5가 3번 사용되어 가장 많이 사용된 자릿수이므로 5가 출력된다. 풀이 #include int ch[10]; int main() { freopen("input.txt", "rt", stdin); int i, digit, max = -2147000000, res; char a[101]; scanf("%s", &a); for (i=0;a[i]!='\0';i++) { digit = a[i] - 48; ch[digit]++; } for(i=0;i= max) { max = ch[i]; res = i; } } pri..

[알고리즘 연습] 숫자의 총 개수 (by C++)

숫자의 총 개수 특정 숫자 n을 받아서 1~n까지 숫자가 총 몇개 쓰였는지 출력한다. 예를 들어, 15를 입력할 경우 1부터 15까지 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5으로 총 21개가 쓰였으므로 21이 출력된다. 풀이 (단순 접근) #include int main() { //freopen("input.txt", "rt", stdin); int n, i, j, sum = 0; scanf("%d", &n); for(i=1;i 0;j = j/10) { sum++; } } printf("%d",sum); return 0; } - 가장 간단하게 위와 같은 코드를 작성할 수 있다. - 단, 해당 코드는 효율이 좋지 못하여 매우 큰 숫자가 ..