정보처리기사 필기

정보처리기사 22_04_24 필기 [4과목]

ITsubin 2023. 5. 16. 23:46

[ 4과목:프로그래밍 언어 활용]


61. C언어에서 문자열 처리 함수의 서식과 그 기능의 연결로 틀린 것은?

    ① strlen(s) - s의 길이를 구한다.

    ② strcpy(s1, s2) - s2를 s1으로 복사한다.

    ③ strcmp(s1, s2) - s1과 s2를 연결한다.

    ④ strrev(s)-s를 거꾸로 변환한다.

 

strcmp는 문자열 "비교" 함수입니다.

문자열을 연결하는 함수는 strcmp가 아닌, strcat입니다.

 

strcmp(s1, s2) : s1과 s2를 비교한다.

strcat(s1, s2) : s1과 s2를 연결한다.


62. 다음 C언어 프로그램이 실행되었을 때, 실행 결과는?

#include <stdio.h>
int main(int argc, char *argv[]) {
	int a = 5, b = 3, c = 12 ;
    int t1, t2, t3 ;
    t1 = a && b ;
    t2 = a || b ;
    t3 = !c ;
    printf("%d", t1 + t2 + t3) ;
    return 0 ;
}

    ① 0

    ② 2

    ③ 5

    ④ 14

 

&& : AND

|| : OR

! : NOT

 

t1 = 5 AND 3 = 1

t2 = 5 OR 3 = 1

t3 = NOT 12 =  0


63. 다음 C언어 프로그램이 실행되었을 때, 실행 결과는?

#include <stdio.h>
struct st{
	int a ;
    int c[10] ;
} ;

int main (int argc, char *argv[]) {
	int i = 0 ;
    struct st ob1 ;
    struct st ob2 ;
    ob1.a = 0 ;
    ob2.a = 0 ;
    
    for(i = 0 ; i < 10 ; i ++) {
    	ob1.c[i] = i ;
        ob2.c[i] = ob1.c[i] + i;
	}
    
    for(i = 0 ; i < 10 ; i = i+2) {
    	ob1.a = ob1.a + ob1.c[i] ;
        ob2.a = ob2.a + ob2.c[i] ;
	}
    
    printf("%d", ob1.a + ob2.a);
    return 0;
}

    ① 30

    ② 60

    ③ 80

    ④ 120

 

    for(i = 0 ; i < 10 ; i ++) {
    	ob1.c[i] = i ;
        ob2.c[i] = ob1.c[i] + i;
	}

ob1.c [ i ] = i

>> 0, 1, 2, 3, 4, ...

 

ob2.c [ i ] = ob1.c + i

>> 0, 2, 4, 6, 8

 

    for(i = 0 ; i < 10 ; i = i+2) {
    	ob1.a = ob1.a + ob1.c[i] ;
        ob2.a = ob2.a + ob2.c[i] ;
	}

 

ob1.a = ob1.a + ob1.c [ i ]

>> 0, 2, 4, 6, 8

 

ob2.a = ob2.a + ob2.c [ i ]

>> 0, 4, 8, 12, 16


64. IP 프로토콜에서 사용하는 필드와 해당 필드에 대한 설명으로 틀린 것은?

    ① Header Length는 IP 프로토콜의 헤더 길이를 32비트 워드 단위로 표시한다.

    ② Packet Length는 IP 헤더를 제외한 패킷 전체의 길이를 나타내며 최대 크기는 2^32-1비트이다.

    ③ Time To Live는 송신 호스트가 패킷을 전송하기 전 네트워크에서 생존할 수 있는 시간을 지정한 것이다.

    ④ Version Number는 IP 프로토콜의 버전번호를 나타낸다.

 

Header Length는 IP 프로토콜의 헤더 길이를 32비트 워드 단위로 표시합니다.

(( Header Length는 4bits입니다. ))

 

Packet Length (Total Packet Length / Total Length)는 16bits입니다.

따라서 최대 크기는 2^16 - 1bits입니다.


65. 다음 Python 프로그램의 실행 결과가 [실행결과]와 같을 때, 빈칸에 적합한 것은?

x = 20

if x == 10 :
	print('10')
(		) x == 20 :
	print('20')
else :
	print('other')
[실행결과]
20

    ① either

    ② elif

    ③ else if

    ④ else

 

"Python"이므로, if 조건문은 [ if / elif / else ]로 구성됩니다.

 

C, Java : [ if / else if / else ]


66. RIP 라우팅 프로토콜에 대한 설명으로 틀린 것은?

    ① 경로 선택 메트릭은 홉 카운트(hop count)이다.

    ② 라우팅 프로토콜을 IGP와 EGP로 분류했을 때 EGP에 해당한다.

    ③ 최단 경로 탐색에 Bellman-Ford 알고리즘을 사용한다.

    ④ 각 라우터는 이웃 라우터들로부터 수신한 정보를 이용하여 라우팅 표를 갱신한다.

 

RIP(Routing Information Protocol)는 자율 시스템 내에서 사용하는 내부 라우팅 프로토콜로,

거리 벡터 라우팅(Distance Vector Routing)에 기반합니다.

라우팅 테이블을 만들 때 Bellman-Ford Algorithm을 사용합니다.

 

RIP의 문제점인 "저속 수렴(Slow Convergence)"으로 인해, 홉 카운트를 15로 제한하는 것이 특징힙니다.

 

라우팅 프로토콜을 [ IGP / EGP ]로 분류하는것은

[ 내부 도메인 라우팅(Intra) / 도메인 간 라우팅(Inter) ]로 분류하는 것을 말합니다.

라우팅 프로토콜은  내부 도메인 라우팅(Intradomain Routing)으로, IGP에 해당합니다.


67. 다음에서 설명하는 프로세스 스케줄링은?

최소 작업 우선(SJF) 기법의 약점을 보완한 비선점 스케줄링 기법으로 다음과 같은 식을 이용해 우선순위를 판별한다.

우선순위 = (대기한 시간 + 서비스를 받을 시간) / 서비스를 받을 시간

    ① FIFO 스케줄링

    ② RR 스케줄링

    ③ HRN 스케줄링

    ④ MQ 스케줄링

 

프로세스 스케줄링(Process Scheduling)이란 프로세스의 생성 및 실행에 필요한 시스템의 자원을 해당 프로세스에 할당하는 작업입니다.

모든 작업들에 대한 공평성 유지, 단위 시간당 처리량 최대화, 응답 시간 및 반환 시간 최소화, 운영체제의 오버헤드 최소화가 목적입니다.

 

프로세스 스케줄링 기법은 크게 [비선점 / 선점] 스케줄링으로 나눌 수 있습니다.

 

비선점 스케줄링 : Non-Preemptive

>> [ FIFO / SJF / HRN / Priority(우선순위) ]

  • FIFO : 도착한 순서대로
  • SJF : Shortest Job First, 실행 시간이 가장 짧은 ps 먼저
  • HRN : Highest Response-ratio Next, [ (대기시간 + 서비스를 받을 시간) / 서비스를 받을 시간 ]순서

선점 스케줄링 : Preemptive

>> RR / SRT / 다단계 큐 / 다단계 피드백 큐

  • RR : Round Robin, 주어진 시간(Time Slice)에 작업이 안끝나면 맨 뒤로
  • SRT : Shortest Remaining Time, 실행 시간 "추정치"가 작은 순서 먼저
  • 다단계 큐 : 상-중-하 단계별로
  • 다단계 피드백 큐 : 주어진 시간에 작업이 안끝나면 다음 순서로

68. UNIX 운영체제에 관한 특징으로 틀린 것은?

    ① 하나 이상의 작업에 대하여 백그라운드에서 수행이 가능하다.

    ② Multi-User는 지원하지만 Multi-Tasking은 지원하지 않는다.

    ③ 트리 구조의 파일 시스템을 갖는다.

    ④ 이식성이 높으며 장치 간의 호환성이 높다.

 

UNIX는 Multi-User, Multi-Tasking 모두 지원합니다.


69. UDP 프로토콜의 특징이 아닌 것은?

    ① 비연결형 서비스를 제공한다.

    ② 단순한 헤더 구조로 오버헤드가 적다.

    ③ 주로 주소를 지정하고, 경로를 설정하는 기능을 한다.

    ④ TCP와 같이 트랜스포트 계층에 존재한다.

 

UDP 프로토콜은 "비연결형" 프로토콜이며, 헤더 구조가 단순하여 오버헤드가 적습니다.

TCP와 같이 전송 계층에 존재합니다.

 

주로 주소를 지정하고, 경로를 설정하는 프로토콜은 IP에 관한 내용입니다.


70. Python 데이터 타입 중 시퀀스(Sequence) 데이터 타입에 해당하며 다양한 데이터 타입들을 주어진 순서에 따라 저장 할 수 있으나 저장된 내용을 변경할 수 없는 것은?

    ① 복소수(complex) 타입

    ② 리스트(list) 타입

    ③ 사전(dict) 타입

    ④ 튜플(tuple) 타입

 

해당 설명은 튜플(Tuple) 타입에 관한 설명입니다.

Python Data Type은 리스트, 튜플, 세트, 딕셔너리가 있습니다.

이를 Python Collection이라고 합니다.

컬렉션 생성 함수 특징 예시
리스트 list() 추가, 수정, 삭제가 언제나 가능 [ 1, 2, 3 ]
튜플 tuple() 생성되고 나면 변경 불가능 ( 1, 2, 3 )
세트 set() 중복된 값의 저장 불가능 { 1, 2, 3 }
딕셔너리 dict() 키-값으로 관리 { 'age' : 25 }

71. 다음 JAVA 프로그램이 실행되었을 때, 실행결과는?

public class Rarr {
	static int[] marr() {
    	int temp[] = new int[4] ;
        for(int i = 0 ; i < temp.length ; i++)
        	temp[i] = i;
		return temp ;
	}
    public static void main(String[] args) {
    	int iarr[] ;
        iarr = marr() ;
        for(int i = 0 ; i < iarr.length ; i++)
        	System.out.print(iarr[i] + " ") ;
	}
}

    ① 1 2 3 4

    ② 0 1 2 3

    ③ 1 2 3

    ④ 0 1 2


72. 다음 JAVA 프로그램이 실행되었을 때의 결과는?

public class ovr {
	public static void main(String[] args) {
    	int a = 1, b = 2, c = 3, d = 4 ;
        int mx, mn ;
        mx = a < b? b : a ;
        if(mx==1) {
        	mn = a > mx? b : a ;
		}
        else {
        	mn = b < mx? d : c ;
        }
        System.out.println(mn);
    }
}

    ① 1

    ② 2

    ③ 3

    ④ 4

 

a < b? b : a

>> a가 b보다 [ 작으면 b / 아니면 a ]

a=1, b=2이므로 mx = b = 2

 

mx는 2이므로 else문으로, b < mx? d : c ;

>> b가 mx보다 [ 작으면 d / 아니면 c ]

mx=2, b=2이므로 mn = c = 3


73. 다음 중 Myers가 구분한 응집도(Cohesion)의 정도에서 가장 낮은 응집도를 갖는 단계는?

    ① 순차적 응집도(Sequential Cohesion)

    ② 기능적 응집도(Functional Cohesion)

    ③ 시간적 응집도(Temporal Cohesion)

    ④ 우연적 응집도(Coincidental Cohesion)

 

모듈의 독립성은 결합도(Coupling)과 응집도(Cohesion)에 의해 측정됩니다.

모듈의 독립성이 높아지려면 [ 결합도▽ / 모듈 크기▽ / 응집도△ ]

 

결합도 순서

[ 자료 < 스탬프 < 제어 < 외부 < 공통 < 내용 ]

 

응집도 순서

[ 우연 < 논리 < 시간 < 절차 < 통신 < 순차 < 기능 ]


74. 다음 C언어 프로그램이 실행되었을 때, 실행 결과는?

#include <stdio.h>
int  main(int arge, char *argv[]) {
	int n1 = 1, n2 = 2, n3 = 3 ;
    int r1, r2, r3 ;
    
    r1 = (n2 <=2) || (n3> 3) ;
    r2 = !n3 ;
    r3 = (n1> 1) && (n2 <3) ;
    
    printf("%d", r3-r2+r1) ;
    return 0;
}

    ① 0

    ② 1

    ③ 2

    ④ 3

 

r1 = 1 OR 0

>> r1 = 1

 

r2 = NOTn3

>> r2 = 0

 

r3 = 0 AND 1

>> r3 = 0

 

0 - 0 + 1


75. IP 프로토콜의 주요 특징에 해당하지 않는 것은?

    ① 체크섬(Checksum) 기능으로 데이터 체크섬(Data Checksum)만 제공한다.

    ② 패킷을 분할, 병합하는 기능을 수행하기도 한다.

    ③ 비연결형 서비스를 제공한다.

    ④ Best Effort 원칙에 따른 전송 기능을 제공한다.

 

VER
4bits
HLEN
4bits
Service type
8bits
Total length
16bits
Identification
16bits
Flags
3bits
Fragmentation offset
13bits
Time to live
8bits
Protocol
8bits
Header checksum
16bits
Destination IP Address
Source IP Address
Options + padding
(0 ~ 40 bytes까지)

Checksum 기능으로 Header checksum기능만을 제공합니다.

Header checksum은 16bits입니다.


76. 4개의 페이지를 수용할 수 있는 주기억장치가 있으며, 초기에는 모두 비어 있다고 가정한다. 다음의 순서로 페이지 참조가 발생할 때, LRU 페이지 교체 알고리즘을 사용할 경우 몇 번의 페이지 결함이 발생하는가?

페이지 참조 순서 1, 2, 3, 1, 2, 4, 1, 2, 5

    ① 5회

    ② 6회

    ③ 7회

    ④ 8회

 

페이지 교체 알고리즘(Page Replacement Algorithm)이란 필요한 페이지가 메모리에 없을 때 발생하는 page-fault 상황에서 어떤 페이지 프레임을 선택하여 교체할 것인지 결정하는 알고리즘을 말합니다.

 

페이지 교체 알고리즘의 종류는 아래와 같습니다.

  • FIFO : First In First Out, 가장 먼저 올라온 페이지를 우선 교체
  • OPT : Optimal, 가장 오래동안 사용하지 않을 페이지를 교체
  • LRU : Least Recently Used Algorithm, 가장 오래전에 참조된 페이지로 교체
  • LFU : Least Frequently Used Algorithm, 가장 적게 참조된 페이지로 교체
  • MFU : Most Frequently Used Algorithm, 가장 많이 참조된 페이지로 교체
  • NUR : Not Used Recently Algorithm, 최근에 사용되지 않은 페이지 교체

 

위의 상황에서는 아래의 단계를 거칩니다.

1) 1을 참조하려 하나 비어있으므로 Page Fault [ 1,  ,  ,  ]

2) 2를 참조하려 하나 비어있으므로 Page Fault [ 1, 2,  ,  ]

3) 3을 참조하려 하나 비어있으므로 Page Fault [ 1, 2, 3,  ]

4) 1을 참조 [ 1, 2, 3,  ]

5) 2를 참조 [ 1, 2, 3,  ]

6) 4를 참조하려 하나 비어있으므로 Page Fault [ 1, 2, 3, 4 ]

7) 1을 참조 [ 1, 2, 3, 4 ]

8) 2를 참조 [ 1, 2, 3, 4 ]

9) 5를 참조하려 하나 비어있으므로 Page Fault

>> LRU는 가장 오래전에 참조된 페이지로 교체하므로 3을 교체 [ 1, 2, 5, 4 ]


77. 사용자 수준에서 지원되는 스레드(thread)가 커널에서 지원되는 스레드에 비해 가지는 장점으로 옳은 것은?

    ① 한 프로세스가 운영체제를 호출할 때 전체 프로세스가 대기할 필요가 없으므로 시스템 성능을 높일 수 있다.

    ② 동시에 여러 스레드가 커널에 접근할 수 있으므로 여러 스레드가 시스템 호출을 동시에 사용할 수 있다.

    ③ 각 스레드를 개별적으로 관리할 수 있으므로 스레드의 독립적인 스케줄링이 가능하다.

    ④ 커널 모드로의 전환 없이 스레드 교환이 가능하므로 오버헤드가 줄어든다.

 

스레드(Thread)는 어떠한 프로그램(특히 프로세스) 내에서 실행되는 흐름의 단위입니다.

[ User-Level Thread / Kernel-Level Thread ]로 분류할 수 있으며, 설명은 아래와 같습니다.

 

 

User-Level Thread : 사용자 레벨 스레드

    - 커널 모드로의 전환 없이 스레드 교환이 가능하므로(System Call 없음) 오버헤드가 적음

    - 유저-커널 모드 전환이 없음

    - 스케줄링 우선순위 지원 X

    - 하나의 스레드가 System Call하면 해당 프로세스 내 모든 스레드 중단

 

Kernel-Level Thread : 커널 레벨 스레드

    - 커널이 각 스레드를 개별적으로 관리 가능

    - 동작중인 스레드가 System Call해도 해당 프로세스 내 다른 스레드가 계속 실행될 수 있음

    - 스케줄링 동기화를 위해 System Call 시 오래 걸림

    - 유저-커널 모드 전환이 빈번 => 성능 저하


78. 한 모듈이 다른 모듈의 내부 기능 및 그 내부 자료를 참조하는 경우의 결합도는?

    ① 내용 결합도(Content Coupling)

    ② 제어 결합도(Control Coupling)

    ③ 공통 결합도(Common Coupling)

    ④ 스탬프 결합도(Stamp Coupling)

 

결합도 순서

[ 자료 < 스탬프 < 제어 < 외부 < 공통 < 내용 ]

 

해당 설명은 내용 결합도(Content Coupling)에 관한 내용입니다.


79. a[0]의 주소값이 10일 경우 다음 C언어 프로그램이 실행되 었을 때의 결과는? (단, int 형의 크기는 4Byte로 가정한다.)

#include <stdio.h>
int main(int argc, char *argv[]) {
	int a[] = {14, 22, 30, 38} ;
    printf("%u, ", &a[2]) ;
    printf("%u", a) ;
    return 0 ;
}

    ① 14, 10

    ② 14, 14

    ③ 18, 10

    ④ 18, 14

 

a[0]의 주소값이 10이고, a[ ]는 int형 4바이트이므로

a[0] : [ 10, 11, 12, 13 ], a[1] : [ 14, 15, 16, 17 ], ...

 

&a[2]는 a[2]자리의 첫 번째 주소값으로 18입니다.

a는 a[0]자리의 첫 번째 주소값으로 10입니다.


80. 모듈화(Modularity)와 관련한 설명으로 틀린 것은?

    ① 시스템을 모듈로 분할하면 각각의 모듈을 별개로 만들고 수정할 수 있기 때문에 좋은 구조가 된다.

    ② 응집도는 모듈과 모듈 사이의 상호의존 또는 연관 정도를 의미한다.

    ③ 모듈 간의 결합도가 약해야 독립적인 모듈이 될 수 있다.

    ④ 모듈 내 구성 요소들 간의 응집도가 강해야 좋은 모듈 설계이다.

 

모듈의 독립성은 결합도(Coupling)과 응집도(Cohesion)에 의해 측정됩니다.

모듈의 독립성이 높아지려면 [ 결합도▽ / 모듈 크기▽ / 응집도△ ]

 

"결합도"는 모듈과 모듈 사이의 상호의존 또는 연관 정도를 의미합니다.

"응집도"는 모듈이 독립적인 기능으로 정의되어 있는 정도를 의미합니다.