Q. 시스템 콜이란 무엇인가요?

  • 시스템 콜이란 운영체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스입니다.
  • 시스템 콜의 유형으로는 프로세스 제어, 파일 조작, 장치 조작, 정보 유지보수, 통신과 보호로 나눌 수 있다.

 

ex) 프로세스 제어를 위한 system call

  • fork() : 자식 프로세스 생성
  • exec() : 자신을 수행 가능한 다른 프로세스로 대치 수행
  • wait() : 프로세스 종료시까지 대기
  • + pipe, signal, exit, open, create, close, read, write ...
반응형

'cs지식 > Operating System' 카테고리의 다른 글

[OS] IPC(Inter Process Communication)  (0) 2021.01.20
[OS] PCB와 Context Switching  (0) 2021.01.20
[OS] 인터럽트(Interrupt)  (0) 2021.01.15
[OS] 프로세스 주소 공간  (0) 2021.01.14
[OS] 프로세스와 스레드  (0) 2021.01.14

단계별풀기 - 기본수학2

#2581 소수 (실버4)

  • M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.
  • 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
  • point. 소수란 2보다 큰 자연수 중에서 1과 자기 
M = int(input())
N = int(input())
prime = []

for i in range(M,N+1):
    cnt = 0
    if i == 1:
        continue
    for j in range(2,i):
        if i%j == 0:
            cnt += 1
    if cnt == 0:
        prime.append(i)

if len(prime) == 0:
    print(-1)
else:
    print(sum(prime), min(prime))

 

#2581 소인수분해 (실버4)

  • N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.
N = int(input())
i = 2
while N != 1: # 분해가 전부 될때까지 반복
    if N % i == 0:
        N = N/i
        print(i)
    else:
        i += 1

 

 

# 1929 소수 구하기 (실버2)

  • M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오. 
  • 한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
  • point. 시간 초과 주의 

시간초과 코드

M, N = map(int,input().split())
for i in range(M,N+1):
    cnt = 0
    if i == 1:
        continue
    for j in range(2,i):
        if i%j == 0:
            cnt += 1
    if cnt == 0:
        print(i)

 

개선 1 ) 제곱근 사용하여 소수 구하기 (시간 4040ms나옴)

N의 약수는 무조건 sqrt(N) 범위에 존재한다.

만약 N이 12라 할때, 12의 제곱근은 약 3.46이다.
12의 약수는 1, 2, 3, 4, 6, 12 이다.
여기서 1과 12를 제외했을 때 이는 2 * 6, 3 * 4, 4 * 3, 6 * 2의 결과이다.

이들의 관계는 몫이 커지면 나누는 값이 작아지거나 나누는 값이 커지만 몫이 작아지는 반비례 관계이다. 결국 N의 절반(제곱근)까지 향하게 되면 이후 몫과 나누는 값이 반대로 바뀌게만 되는 상황이다.

따라서 N의 제곱근까지 나누어 떨어지는지 여부를 조사하면 더 빠르게 소수판별을 할 수 있다.

def isPrime(num):
    if num==1:
        return False
    else:
        for i in range(2, int(num**0.5)+1):
            if num%i == 0:
                return False
        return True

M, N = map(int, input().split())

for i in range(M, N+1):
    if isPrime(i):
        print(i)

 

개선 2 ) 에라토스테네스의 체를 사용하여 소수 구하기 (시간 252ms 나옴)

소수(x)의 배수는 약수로 무조건 x를 포함하게 된다.
따라서 절대 소수의 배수는 소수가 될 수 없다. 이를 이용한 것이 에라토스테네스의 체이다.
누구나 알고있는 가장 작은 소수인 2부터 시작해서, 2의 배수를 다 지웠으면, 지워지지 않은 수 중에서 다음 값인 3의 배수를 지워나가고 이를 계속해서 반복해 나가면 소수만 남게된다.
마치 체에 걸러서 남는 것들만 뽑아내는 방식이라고 생각하면 된다.

m, n = map(int, input().split())

def isprime(m, n):
  n += 1                            # for문 사용을 위한 n += 1
  prime = [True] * n                # n개의 [True]가 있는 리스트 생성
  for i in range(2, int(n**0.5)+1): # n의 제곱근까지만 검사
    if prime[i]:                    # prime[i]가 True일때
      for j in range(2*i, n, i):    # prime 내 i의 배수들을 False로 변환
        prime[j] = False

  for i in range(m, n):
    if i > 1 and prime[i] == True:  # 1 이상이면서 남은 소수들을 출력
      print(i)

isprime(m, n)

 

※ 참고 : 소수 판별법 알고리즘

반응형

'알고리즘 > baekjoon' 카테고리의 다른 글

20210122_코테공부  (0) 2021.01.22
20210121_코테공부  (0) 2021.01.21
20210119_코테공부  (0) 2021.01.19
20210118_코테공부  (0) 2021.01.15
20210115_코테공부  (0) 2021.01.14

단계별풀기 - 기본수학2

#1978 소수찾기 (실버4)

  • 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
  • point. 소수란 2보다 큰 자연수 중에서 1과 자기 자신을 제외한 자연수로 나누어떨어지지 않는 자연수이다.
n = int(input())
n_list = list(map(int, input().split()))
n_count = 0

for i in n_list:
    count = 0
    if i == 1:
        continue
    for j in range(2,i):
        if i%j == 0:
            count +=1
    if count == 0:
        n_count +=1
print(n_count)

 

반응형

'알고리즘 > baekjoon' 카테고리의 다른 글

20210121_코테공부  (0) 2021.01.21
20210120_코테공부  (0) 2021.01.20
20210118_코테공부  (0) 2021.01.15
20210115_코테공부  (0) 2021.01.14
20210114_코테공부  (0) 2021.01.14

Q. 인터럽트란 무엇인가요?  ->끼어들기

  • CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요한 경우, 현재 실행중인 프로그램 수행을 미루고 다른 프로그램의 수행을 요구하는 명령입니다.
  • 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉘며 소프트웨어 인터럽트의 예로는 예외상황(exception)과 시스템 콜(system call)이 있습니다.

 

Q. 인터럽트 처리과정에 대해서 설명해주세요

  • 요청-중단-보관-처리-재개
  • 인터럽트가 발생하면 현재 수행중인 프로그램을 멈추고, 레지스터와 PC(Program Counter)을 저장한 뒤에 인터럽트 서비스 루틴(ISR)을 실행합니다. 인터럽트 처리가 완료되면 저장한 정보를 복구하고 수행 중이던 프로그램을 실행합니다.

 

반응형

'cs지식 > Operating System' 카테고리의 다른 글

[OS] PCB와 Context Switching  (0) 2021.01.20
[OS] 시스템 콜(System Call)  (0) 2021.01.20
[OS] 프로세스 주소 공간  (0) 2021.01.14
[OS] 프로세스와 스레드  (0) 2021.01.14
[OS] 운영체제란  (0) 2021.01.02

단계별풀기 - 기본수학1

# 10757 큰 수 A+B (브론즈5)

a,b = map(int,input().split())
print(a+b)

 

# 1011 Fly me to the Alpha Centaur! (실버1) 

point. 규칙찾고 식으로 표현하기

count 0 1 2 3 4 5 6
move 1 1 2 2 3 3 4
move_plus 0 1 2 4 6 9 12
t = int(input())

for _ in range(t):
    x, y = map(int,input().split())
    distance = y - x
    count = 0  # 이동 횟수
    move = 1  # count별 이동 가능한 거리
    move_plus = 0  # 이동한 거리의 합
    while move_plus < distance :
        count += 1
        move_plus += move  # count 수에 해당하는 move를 더함
        if count % 2 == 0 :  # count가 2의 배수일 때, 
            move += 1  
    print(count)
반응형

'알고리즘 > baekjoon' 카테고리의 다른 글

20210120_코테공부  (0) 2021.01.20
20210119_코테공부  (0) 2021.01.19
20210115_코테공부  (0) 2021.01.14
20210114_코테공부  (0) 2021.01.14
20210113_코테공부  (0) 2021.01.13

Q. 프로세스 주소 공간에 무엇이 있는지 설명해주세요

-> 코드, 데이터, 스택 영역이 존재하며 코드는 프로그램의 코드가 저장되어있고, 데이터는 전역변수가, 스택에는 함수나 지역변수가 저장되어 있습니다.

-> 프로그램이 CPU에 의해 실행되면 프로세스가 생성되고 메모리에 프로세스 주소공간이 할당됩니다주소공간은 코드데이터스택으로 이루어져있습니다. 이 프로세스의 메타데이터들은 PCB에 저장됩니다.

 

Q. 프로세스 주소 공간을 나눈 이유는 무엇인가요?

  • 최대한 데이터를 공유하여 메모리 사용량을 줄이기 위해서
  • code는 프로그램이 만들어지고 나서 바뀔일이 없기 때문에 프로그램의 프로세스일 경우 코드 부분을 공유하여 메모리의 사용량을 줄이기 위해 분리했습니다.
  • stack과 data는 함수 외부와 함수에 따라서 stack 구조 활용을 위해 나누었습니다.
반응형

'cs지식 > Operating System' 카테고리의 다른 글

[OS] PCB와 Context Switching  (0) 2021.01.20
[OS] 시스템 콜(System Call)  (0) 2021.01.20
[OS] 인터럽트(Interrupt)  (0) 2021.01.15
[OS] 프로세스와 스레드  (0) 2021.01.14
[OS] 운영체제란  (0) 2021.01.02

Q3. 프로세스와 스레드를 설명해주세요

-> 프로세스는 프로그램 실행단위이며, 스레드는 프로세스 내에서 실행되는 흐름의 단위를 말합니다.

+ 프로세스와 스레드 둘의 차이는 무엇인가요?

이 둘의 가장 큰 차이점은 메모리 영역 할당의 차이입니다. 프로세스는 자신만의 고유 공간과 자원을 할당받는 반면, 스레드는 프로세스 내에서 스택을 제외한 코드, 데이터, 힙 메모리를 공유합니다.

 

※ 프로세스와 스레드 구조  

  •  프로세스는 프로세스 당 최소 1개의 스레드를 소유
  • 프로세스는 각각 별도의 주소 공간의 할당(독립적)
  • Code : 코드 자체를 구성하는 메모리 영역(프로그램 명령)
  • Data : 전역변수, 정적 변수, 배열 등 (초기화된 데이터)
  • Heap : 동적 할당 시 사용 (new(), mallock() 
  • Stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)

 

+ 스택을 스레드마다 독립적으로 할당하는 이유는?

 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.

++ 자바 스레드란 : 자바에서는 프로세스가 존재하지 않고 스레드만 존재합니다. 스레드 스케쥴링은 JVM이 담당합니다.

+++ JVM(Java Virtual Machine)이란? : 자바 어플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것입니다. 메모리 관리, garbage collection을 수행하고 스택기반의 가상머신입니다.

 

Q4. 멀티 프로세스와 멀티 스레드의 장단점에 대하여 설명해주세요

-> 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 가지고 있습니다.

반면 멀티 프로세스 방식은 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 있습니다.

때문에 대상 시스템의 특징에 따라 적합한 동작 방식을 선택하고 적용해야 합니다.

+

 

멀티 프로세스

멀티 스레드

장점

안전성(하나 프로세스 죽어도 다른 곳에 영향 안 끼침)

독립적인 프로세스에 비해 공유 메모리만큼의 시간, 자원 손실 감소, heap, data 영역을 통해 데이터를 주고받을 수 있어 스레드 간 통신 방법이 훨씬 간단하다.

단점

각각 독립된 메모리 영역을 가지고 있어 멀티스레드보다 많은 메모리 공간, CPU차지
-> 작업량이 많을수록 오버헤드 발생, context switching으로 인한 성능 저하

안전성 문제(오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료 될 수 있다)
-> critical section 기법을 통해 대비함

+ 멀티스레드에서 동기화를 하는 이유?

-> 멀티 스레드를 사용하는 프로그램에서 두 개 이상의 스레드가 공유 데이터에 접근할 때, 작업 처리 순서를 컨트롤 하고 공유 자원에 대한 접근을 컨트롤하기 위해 동기화가 필요합니다.

이로 인해 병목 현상이 발생하여 성능이 저하될 가능성이 높기 때문에 과도한 락으로 병목현상을 줄여야 한다.

 

+ context switching가 무엇이고 이것이 필요한 이유는?

-> 현재 진행하고 있는 task(process, thread)의 상태를 저장하고 다음 진행할 task의 상태 값을 읽어 적용하는 과정을 말하고, 이것이 있어야 CPUtask를 바꿔가며 실행할 수 있습니다.

 

++ processthread context switching의 비용이 더 많이 드는 것은?

-> process, thread의 경우 stack 영역을 제외한 모든 메모리를 공유하기 때문에 context switching 발생 시 stack 영역만 변경을 진행하면 된다.

 

+ critical section(임계영역)이란?

-> 멀티 스레드 시 하나의 스레드가 공유 데이터 값을 변경하는 시점에 다른 스레드가 그 값을 읽으려할 때 발생하는 문제를 해결하기 위한 동기화 과정

 

반응형

'cs지식 > Operating System' 카테고리의 다른 글

[OS] PCB와 Context Switching  (0) 2021.01.20
[OS] 시스템 콜(System Call)  (0) 2021.01.20
[OS] 인터럽트(Interrupt)  (0) 2021.01.15
[OS] 프로세스 주소 공간  (0) 2021.01.14
[OS] 운영체제란  (0) 2021.01.02

단계별풀기 - 기본수학1

# 10250 ACM 호텔 (브론즈3)

풀이1) 단순 숫자 세기 (시간 112ms 나옴)

for _ in range(int(input())):
    H, W, N = map(int, input().split())
    count = 0
    for i in range(1,W+1):
        for j in range(1,H+1):
            count +=1
            if count == N:
                print(j*100+i)

풀이2) point. 규칙 찾기 (시간 84ms)

  • 손님이 몇 층에 머물지는 N%H와 같고, 몇 번에 머물지는 N//H+1
  • 단, N%H가 0일 경우에는 가장 꼭대기층이므로 H층, N//H 에 머문다
for _ in range(int(input())):
    H, W, N = map(int, input().split())
    a = N%H
    b = N//H+1
    if a == 0:
        a = H
        b -= 1
    print(a*100+b)

 

# 2775 부녀회장이 될테야 (브론즈2)

  • 0층 : 1 2 3 4 ...
  • 1층 : 1 3 6 10 ..
  • 2층 : 1 4 10 20 ..
  • => 0층은 1~호수까지, 1층부터 1호는 1 고정, 나머지는 현재값과 전값 더하기
for _ in range(int(input())):
    k = int(input()) #층
    n = int(input()) #호
    apart = [i for i in range(1,n+1)] #0층
    for j in range(k): #층 수만큼 반복
        for k in range(1,n): # 0번째는 1 고정이니까 1~n-1까지
            apart[k] +=apart[k-1] #층별 사람 변경
    print(apart[-1]) #마지막수 출력

 

# 2839 설탕 배달 (브론즈1)

  • sugar가 음수가 되면 설탕이 나누어떨어지지 않는 것이기 때문에 -1 반환
  • 5배수가 될때까지 설탕 -3 봉지 +1, 5배수이면 5로 나눈 몫 봉지에 더하기
sugar = int(input())
bag = 0
while sugar >= 0 :
    if sugar % 5 == 0 :  # 5의 배수이면
        bag += (sugar // 5)  # 5로 나눈 몫을 구해야 정수가 됨
        print(bag)
        break
    sugar -= 3
    bag += 1  # 5의 배수가 될 때까지 설탕-3, 봉지+1
else :
    print(-1)

 

반응형

'알고리즘 > baekjoon' 카테고리의 다른 글

20210119_코테공부  (0) 2021.01.19
20210118_코테공부  (0) 2021.01.15
20210114_코테공부  (0) 2021.01.14
20210113_코테공부  (0) 2021.01.13
20210112_코테공부  (0) 2021.01.12

+ Recent posts