본문 바로가기

분류 전체보기54

[운영체제] 파일 시스템 + 하드링크 / 소프트링크 파일 시스템 파일 시스템이란 파일과 디렉토리를 보조 기억 장치에 저장하고 접근할 수 있게 하는 운영체제 내부의 프로그램이다. 운영 체제는 파일을 블록이라는 작은 단위로 쪼개고, 이 블록 단위로 읽고 쓴다. 즉 하나의 파일은 하나 이상의 블록에 걸쳐 저장되며, 크기가 클 수록 블록의 갯수도 많아진다. 만약 보조 기억 장치에 연속적으로 블록 파일이 할당되어 있으면 외부 단편화 문제가 발생할 수 있다. 파일 A 빈공간 (3K) 파일 B 파일 C 빈 공간(7K) 보조 기억 장치의 현재 상황이 위와 같다고 해보자. 이때 10K의 파일을 저장할 수 있을까? 분명 빈 공간은 3K + 7K = 10K이지만 연속되어 있지 않기 때문에 10K의 파일은 저장할 수 없다. 이것이 외부 단편화 문제이다. 그래서 현재는 불연속적.. 2023. 10. 21.
[Java] 추상클래스와 인터페이스의 비교 추상 클래스 각각의 동물들을 객체로 만든다고 생각해보자. 사자 객체 하나, 토끼 객체 하나, 여우 객체 하나 이런 식으로 수 많은 동물들을 하나하나 만들 생각을 하니 벌써부터 머리가 아프다. 이럴 때는 각각 동물들의 공통된 필드와 메소드를 가지고 있는 추상 클래스를 만들고, 각각의 객체들이 추상 클래스를 상속받도록 하면 중복된 코드를 줄일 수 있다. abstract class Animal { int age; public void breathe() { System.out.println("들이쉽니다."); System.out.println("내쉽니다."); } public void eat() { System.out.println("먹습니다."); } } 나이나 숨쉬기, 먹기 등은 어떤 동물이든 상관없이 공통.. 2023. 10. 17.
[운영체제] 스레드와 멀티 스레드 스레드의 의미 예를 들어 게임에서 점프를 할 때 동시에 호잇! 하는 효과음을 낸다고 생각해보자. 프로세스의 진행 흐름이 한 가지라면 점프 코드를 실행한 다음에 효과음을 내고, 그 간격을 최소화하여 인지하지 못하도록 해야할 것이다. 그런데 점프 코드를 실행하는데 걸리는 시간이 10초라면? 10초 뒤에나 효과음이 나는 요상한 상황이 된다. 하지만 프로세스의 진행 흐름이 여러 개라면 흐름 하나는 게임 상에 점프를 구현하고, 다른 흐름 하나는 효과음을 내도록 해 두 가지 일을 동시에 처리할 수가 있게 된다. 이 각각의 실행 흐름을 스레드라고 한다. * 만약 프로세스라는 표현이 낯설다면, 하단의 글을 참고하자. 2023.10.13 - [CS] - [운영체제] 프로세스의 구조와 컨텍스트 스위칭 멀티 프로세스와 멀티.. 2023. 10. 13.
[운영체제] 프로세스의 구조와 컨텍스트 스위칭 프로세스의 구조 당신이 프로그램을 개발하고 있다고 생각해보자. 코드를 작성한 후, 컴파일을 통해 실행파일을 생성한다. 그리고 그 실행파일을 실행하는 순간, 프로그램이 실행되기 시작한다. 이 실행중인 프로그램을 프로세스(process)라고 한다. 스택 영역(stack segment) 힙 영역(heap segment) 데이터 영역 (data segment) 코드 영역 (code segment, text segment) 하나의 프로세스는 크게 코드 영역, 데이터 영역, 힙 영역으로 나뉘어 저장된다. 프로세스가 생성되면, 우선 코드 영역에 해당 프로그램의 코드가 저장된다. 그리고 전역 변수처럼 프로그램이 실행되는 동안 유지되는 데이터들은 데이터 영역에 저장된다. 이 코드 영역과 데이터 영역은 프로그램이 실행되는.. 2023. 10. 13.
[운영체제] 커널과 시스템 콜, API의 관계 운영체제를 공부하다보면, 운영체제의 구조와 각각의 역할은 알겠는데 그래서 어떻게 유기적으로 작동하는지 헷갈리기가 쉽다. 최대한 쉽게 설명하기 위해 핵심적인 관계만 설명하고자 한다. 커널 운영체제는 사용자나 응용프로그램이 하드웨어를 편리하게 사용할 수 있도록 하는 일종의 소프트웨어다. 특히나 하드웨어의 자원에 접근하고 조정하는 기능이 핵심이라고 할 수 있는데, 운영체제에서 이 핵심 서비스를 담당하는 부분을 커널(kernel)이라고 한다. 사용자나 응용프로그램이 직접 하드웨어의 자원에 접근하고 조작하지 않고, 왜 커널이라는 한 다리를 거쳐야할까? 미술관에 전시된 작품을 아무나 만질 수 있다고 생각해보자. 큐레이터처럼 조심조심 작품을 만지는 사람들도 있겠지만, 누군가는 작품을 훼손시킬 수도 있다. 마찬가지로 .. 2023. 10. 12.
[Java] 연속된 부분 배열의 최대 합 구하기 정수형 배열 num가 주어졌다. 연속된 부분 배열의 합 중 가장 큰 값을 출력하세요. 단, 구간의 최소 길이는 1입니다. // 입출력 예시 nums: {-3, -2, 3, -1, 6, -7, 9, -4, 3} 출력: 10 O(n)의 시간복잡도로 문제를 해결하는 재미난 방법이 생각났다. nums[0] nums[1] nums[2] nums[3] nums[4] nums[5] nums[6] nums[7] nums[8] -3 -2 3 -1 6 -7 9 -4 3 예시에서는 nums[2]부터 nums[6]까지의 합을 구했을 때가 최댓값이 된다. 그러면 2와 6이라는 인덱스를 어떻게 결정해야할지를 고민해야 한다. 종료 인덱스 구하기 int[] rightSum = new int[nums.length]; int maxRi.. 2023. 10. 8.
[Java] 자식클래스 생성자에서 super()의 필요성 Java에서는 상속을 통해 부모 클래스의 멤버 (필드와 메소드)를 물려줄 수 있다. class Person { String name; int age; } class Student extends Person { String school; int grade; Student (String school, int grade) { this.school = school; this.grade = grade; } } public class Main{ public static void main(String[] args) { Student s1 = new Student("한국고등학교", 1); System.out.println("이름: " + s1.name); } } extends 키워드를 이용해 Person 클래스를 상속.. 2023. 9. 13.
[Java] public static void main(String[] args) {} 에 대한 분석 public class Practice { public static void main(String[] args) { // 코드를 입력하세요. } } 자바를 처음 익히는 날부터 주구장창 치게 되는 코드가 있다. 바로 모든 실행클래스에서 절대 빠질 수 없는 코드, public static void main(String[] args) {} 다. 처음 언어를 배우면 책과 강사를 막론하고 이렇게 말한다. "일단 보고 따라 치세요." 하지만 누구든 한 번쯤은 궁금증을 가졌을 것이다. 저게 뭔데 저렇게 긴걸 꼭 따라쳐야해? 1. 접근제한자 public 접근제한자는 말 그대로 접근을 제한하기 위한 키워드이다. 번거롭게 왜 접근을 제한해둘까? 예를 들어 은행에서 계좌의 비밀번호를 저장해두었다고 생각해보자. 이때 누구나 .. 2023. 9. 8.
[Java] Math과 Random의 비교로 살펴보는 static의 역할 0~9 사이의 난수를 생성하기 위해서는 대표적으로 두 가지 방법이 있다. 1. Math.random() 사용 int randomNum = (int) (Math.random() * 10); 2. Random클래스의 인스턴스 생성 후 nextInt 메서드 사용 Random rand = new Random(); int randomNum = rand.nextInt(10); 두 가지 방법을 비교할 때 가장 큰 차이점은 객체 생성 유무다. Math 클래스는 객체를 생성하지 않았는데도 random 메서드에 접근할 수 있었다. 하지만 Random 클래스는 new 연산자를 이용해 객체를 생성한 다음에야 메서드를 사용할 수 있다. 각 메서드가 어떻게 선언되어있는지를 확인해보자, Math클래스의 random메서드에는 sta.. 2023. 9. 6.