짬뽕얼큰하게의 맨땅에 헤딩 :: '분류 전체보기' 카테고리의 글 목록 (26 Page)

입국심사.

처음엔 당황했지만.. 생각해보니 풀 수 있었다.

이분탐색 문제라는걸 몰랐으면 더 힘들었을 것 같다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <string>
#include <vector>
 
using namespace std;
 
long long solution(int n, vector<int> times) {
    long long answer = 1000000000000000000;
    long long l = 1;
    long long r = answer;
 
    while (l <= r) {
        long long mid = (l + r) / 2;
        int simsa = times.size();
        long long person = 0;
        for (int i = 0; i < simsa; i++) {
            person += mid / times[i];
        }
        if (person >= n) {
            answer = mid;
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }
 
    return answer;
}
cs
블로그 이미지

짬뽕얼큰하게

,

BFS 이용해서 풀었다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string>
#include <vector>
#include <queue>
 
using namespace std;
bool visited[20001];
vector<int> link[20001];
struct _pair {
    int num;
    int cnt;
};
queue<_pair> que;
int maxCnt = 0;
int solution(int n, vector<vector<int>> edge) {
    int answer = -1;
    int edgeN = edge.size();
    for (int i = 0; i < edgeN; i++) {
        int a = edge[i][0];
        int b = edge[i][1];
        link[a].push_back(b);
        link[b].push_back(a);
    }
    visited[1= true;
    que.push({ 10 });
    while (!que.empty()) {
        _pair pair = que.front();
        que.pop();
        if (pair.cnt > maxCnt) {
            maxCnt = pair.cnt;
            answer = 1;
        }
        else if (pair.cnt == maxCnt) {
            answer++;
        }
        for (int i = 0; i < link[pair.num].size(); i++) {
            int a = pair.num;
            int b = link[a][i];
            if (visited[b]) continue;
            visited[b] = true;
            que.push({ b,pair.cnt + 1 });
        }
    }
 
    return answer;
}
cs
블로그 이미지

짬뽕얼큰하게

,

크루스칼로 풀었다.

/**

실수:

disjoint함수의 두 a,b값이 다른 경우 uf[disjoint(a)] = disjoint(b); 최상위 번호를 찾아 넣어줘야하는데...

uf[a] = disjoint(b) 로 넣어주었다.. ㅠㅠ

이렇게 되면 두집합이 합쳐질때 최상위번호가 바뀌는게 아니라.. 중간쯔음에서 바뀌기 때문에... 집합 전체가 합쳐지지 않는다.

오히려 이건 가능하다.

uf[disjoint(a)] = b

b는 최상위가 아니여도... a의 최상위를 b로 바꿔주었기때문에.. disjoint 함수를 부르게되면 최상위 번호로 갱신된다.


**/



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(const vector<int>& a, const vector<int>& b) {
    return a[2< b[2];
}
int uf[100];
int disjoint(int x) {
    if (uf[x] == x) return x;
    return uf[x] = disjoint(uf[x]);
}
int solution(int n, vector<vector<int>> costs) {
    int answer = 0;
    for (int i = 0; i < n; i++) {
        uf[i] = i;
    }
 
    int row = costs.size();
 
    sort(costs.begin(), costs.end(), &cmp);
 
    for (int i = 0; i < row; i++) {
        int a = costs[i][0];
        int b = costs[i][1];
        int cost = costs[i][2];
        if (disjoint(a) != disjoint(b)) {
            uf[disjoint(a)] = disjoint(b);
            answer += cost;
        }
        else {
            continue;
        }
    }
 
    return answer;
}
 
cs


블로그 이미지

짬뽕얼큰하게

,

프로그래머스(programmers) N으로 표현

/**
1. 빼기와 나누기의 경우 순서가 바뀌는경우 결과값이 달라진다.
처음에 최적화를 한답시고, i/2+1 까지만 돌렸다가, WA를 받았다. 
이 점을 확인 한 후 i-1까지 돌렸다.

2. newN(222,333,44444) 의 숫자를 만들고.... 만들어야 하는 최종 숫자와 비교를 하지 않았다.
단순한 실수인데... 반례를 찾느라 한시간이 걸렸다. ㅜㅜ
구현 도중에도 검사해야겠다는 생각을 하지 않았다.;;;;;;;;;;;;
**/

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <string>
#include <vector>
using namespace std;
 
vector<int> v[9];
int solution(int N, int number) {
    if (N == number) return 1;
    for (int i = 0; i < 9; i++) {
        v[i].clear();
    }
    int newN = N;
    v[1].push_back(N);
    for (int i = 2; i < 9; i++) {
        newN = 10 * newN + N;
        v[i].push_back(newN);
        if (newN == number) return i;
 
        for (int j = 1; j < i; j++) {
            for (int a = 0; a < v[i - j].size(); a++) {
                for (int b = 0; b < v[j].size(); b++) {
                    if (v[i - j][a] == 0 || v[j][b] == 0continue;
                    int res = v[i - j][a] + v[j][b];
                    v[i].push_back(res);
                    if (res == number) return i;
 
                    res = v[i - j][a] - v[j][b];
                    v[i].push_back(res);
                    if (res == number) return i;
 
                    res = v[i - j][a] * v[j][b];
                    v[i].push_back(res);
                    if (res == number) return i;
 
                    if (v[j][b] == 0continue;
                    res = v[i - j][a] / v[j][b];
                    v[i].push_back(res);
                    if (res == number) return i;
                }
            }
        }
    }
    return -1;
}
cs
블로그 이미지

짬뽕얼큰하게

,

정규표현식이란 원하는 문자열을 찾기 위해 독특한 패턴으로 인코딩한 텍스트 문자열


정규표현식은 ed, sed,vi, grep, AWK 등을 비롯한 여러가지 유닉스도구에서 중요한 역할을 함.



1. RegexPal로 시작하기

사이트 주소: http://www.regexpal.com 


2. 단축문자 사용하기

2-1) \d : [0-9] 를 의미

2-2) \D: 숫자가 아닌 문자

전화번호 표현: \d\d\d-\d\d\d\d-\d\d\d\d   or   \d\d\d\D\d\d\d\d\D\d\d\d\d


3. 임의의 문자 찾기 (.)

점(.)을 이용하여 파이픈 찾기


4. 그룹참조와 역참조

그룹 참조: ( ) 를 사용하여 표현

역참조: \1 은 첫번째 그룹을 의미

(\d)\d\1 == (\d)\d\d


5. 수량자 사용하기

\d{3} : 숫자 3개의미, 중괄호 안의 숫자는 패턴의 수

? : 하나 이하

+: 하나 이상

*: 0 이상


000-000-0000 번호 파싱하기!

(\d{3,4}[.-]?)+ : 숫자(\d)가 최소3개에서 최대 4개까지({3,4}) 올수있고, 이어서 하이픈이나 다른 문자([.-])가 한개 있거나 없을수 있으며(?) 이러한 패턴이 하나 이상 반복(+)



(\d{3}[.-]?){2}\d{4} : 숫자(\d)가 3개{3}온후 하이픈이나 문자([.-]) 존재할 수 있고(?) 이 패턴이 두번({2}) 존재한 이후에 숫자(\d) 4개({4})



지역번호인 첫 번째 숫자 세 개를 둘러싸는 괄호가 있어도 되고 없어도 되며, 지역번호 자체도 있어도 되고 없어도 되는 정규표현식

^(\(\d{3}\)|\d{3}[.-]?)?\d{3}[.-]\d{4}$




6. 숫자가 아닌 문자 찾기

\D : 숫자가 아닌 문자

[^0-9]: 0~9를 숫자를 제외한 문자

[^\d]: 숫자가 아닌 문자


7. \w로 문자 찾기

\D와 \w의 차이점은 \D는 공백, 구두점, 인용부호, 하이픈, 슬래시, 대괄호 문자들도 찾는반면, \w는 그렇지 않음.


\w: [a-zA-Z0-9_] 을 의미

\W: [^a-zA-Z0-9_]을 의미




8. 공백 찾기

\s : [ \t\n\r] 을 의미, 맨처음 띄어쓰기도 있음

\S : [^ \t\n\r] 을 의미, 공백을 제외한 문자를 찾음



9. 단어의 경계 \b

\b는 그이후에오는 문자, 숫자의 경계를 의미.

설명이 힘드므로 사진으로..


9-1) 


9-2) 


9-3)



\b는 특정 문자를 나타내는게 아니라... 경계를 의미하는것을 기억하자.

또한 이 경계의 기준은 다음에 나오는 표현식에따라 바뀔수 있음. 

점(.) 을 넣은경우에는 경계가 아래처럼 바뀜


9-4) 





10. 임의의 문자 0개 이상 찾기 

10-1) .*

10-2) [^\n]* or [^\n\r]* 

10-3) 한개이상은 .+


수량자는 욕심쟁이 수량자. 가능한 가장 많은것을 찾기때문에, .*이나 .+시 한줄 전체를 인식.



11. sed 를 사용하여 마크업 추가하기

sed: 유닉스 스티리밍 편집기로, 정규표현식을 사용하여 텍스트를 변경하는 도구


echo Hello | sed s/Hello/Goodbye


표준출력 Hello가 sed 입력으로 들어가고, 입력으로 들어온 Hello를 Goodbyte바꿈.


sed -n 's/^/<h1>/;s/$/<\/h1>/p;q' rime.txt

11-1) -n은 입력된 각 행을 표준출력으로 보내는 sed 기본 기능을 막음. 정규표현식이 적용된 행만 출력하기 위함

11-2) s/^/<h1> 은 행의 시작(^)위치에 <h1> 태그를 넣는다.

11-3) 세미콜론(;)으로 여러 개의 sed 명령어를 구분.

11-4) s/$<\/h1>/는 행의 끝($)에 </h1> 종료 태그를 삽입. p명령어는 해당 행(1행)을 출력. p 명령어는 모든 행을 무조건 출력하는 -n옵션과 반대 기능을 함.

11-5) q명령어는 프로그램 종료. 따라서 sed는 오직 첫행만 처리

11-6) 이 모든 작업은 rime.txt. 파일에 대해서 수행됨


sed는 세미콜론(;) 대신에 -e옵션으로 여러가지 명령어를 붙일 수 있음.

파일에 명령어를 넣고 실행도 가능: -f옵션


12. perl을 사용하여 마크업 추가하기

perl은 범용 프로그래밍 언어로, 정규표현식 처리와 텍스트 프로세싱 기능이 매우 타월


perl -ne 'if ($. == 1) { s/^/<h1>/; s/$/<\/h1>/m; print; }' rime.txt

12-1) perl 명령어는 perl 을 실행

12-2) -n옵션은 입력파일(rime.txt)의 내용을 한 행씩 처리

12-3) -e 옵션은 파일이 아니라 명령행에 프로그램 코드를 직접 입력한다는 뜻(sed 처럼)

12-4) if문으로 현재 행이 1행인지 확인. $.은 Perl의 특수 변수로, 현재행을 가리킴

12-5) 첫 번째 대체 명령어 s는 첫 행(^)의 시작부분을 찾아서 <h1>시작 태그를 넣음

12-6) 두 번째 대체 명령어 s는 행의 끝($)을 찾아서 </h1> 종료 태그를 넣음

12-7) 대체 명령어 끝에 있는 변경자(플래그) m(multiline)은 이 행을 따로 구분해서 처리하라는 의미, $는 파일의 끝이 아니라 1행의 끝을 찾음.

12-8) 마지막 결과를 표준 출력으로 출력



h1.pl에 명령어를 넣고... perl h1.pl rime.txt를 해도 됨.








참고 서적: 처음 시작하는 정규표현식 (한빛미디어)

블로그 이미지

짬뽕얼큰하게

,

1. 자료구조:


1
2
3
4
5
6
7
8
9
10
11
struct student{
 
char name[2];
 
unsigned long nameKey;
 
};
 
 
 
student gAllStudent[100];
cs

 


2. hash 함수: unsigned long getNameKey(char* name);



위와 같은 상황에서 이름의 hash값을 이용하여 gAllStudent에 있는 여러명의 학생 이름을 빠르게 찾을 때 한 실수다.


name1, name2 를 찾는다 했을때, getNameKey로 얻은 hash값을 nameKey1, nameKey2라고 하면


1
2
3
4
5
6
7
8
9
 
 for(int i = 0 ; i < 100; i++) {
  if (gAllStudent[i].nameKey == nameKey1) {
    if(strcmp(gAllStudent[i].name, name1) == 0) { ~~~~}
  }
  else if(gAllStudent[i].nameKey == nameKey2) {
    if(strcmp(gAllStudent[i].name, name2) == 0) { ~~~~}
  }
}

cs

 



위와 같이 작성했다..

그런데.. hash값이기 때문에, name1, name2이름은 다르고 nameKey1과 nameKey2 가 같은 경우가 존재한다.


이런 경우 name2도 첫번째 if문만 들어가기때문에... 문제가 발생한다. 따라서 else if문을 if문으로 변경하여 가볍게 해결할 수있다.


위 실수를하여.. 원인 분석에 꽤 많은 시간이 들어 정리해 놓는다.






블로그 이미지

짬뽕얼큰하게

,

오늘 파이썬을 공부하며 알게된 것 3가지

파이썬은 한개 이상의 변수 리턴이 가능, format 사용법, 여러 줄의 string을 변수에 담는법

 

테스트 코드를 짜보았다.

 

 

#리턴 여러개 가능
def test1():
    a = 1
    b = 2
    c = 3
    return a, b, c

d,e,f = test1()

#format 사용하기
print('d:{}, e:{}, f:{}'.format(d,e,f))

#여러줄 문자열 넣기
str = """ zzzzzzzzzzzzzzzz
zzzzzzzzzz
zzzzzzzzzzzzzz
zzzzzzzzzzzzzz """

print(str)
~                                                                               
~     
블로그 이미지

짬뽕얼큰하게

,

1. 유닉스와 C의 간단한 역사

유닉스는 AT&T의 벨 연구소에서 켄 톰슨이 개발, 어셈블리로 작성

톰슨은 새로운 운영체제를 만들며 트리구조의 파일 시스템, 명령을 해석하는 셸, 파일은 구조화되지 않은 바이트의 흐름의 개념을 MULTICS로부터 끌어옴

 

조금 뒤에 톰슨의 벨 연구소 동료이자 유닉스 초기 공동 연구자인 데니스 리치가 C 프로그래밍 언어를 설계하고 구현

그 이후 C는 유닉스 커널을 거의 모두 새로운 언어로 재작성할 수 있을 정도로 발달

 

1판에서 6판까지 유닉스는 여러 차례 발표됐다.

AT&T는 미국 전화 시스템에 대한 정부의 독점 규제에 묶여있었다.

AT&T가 정부와 합의한 조건 때문에 소프트웨어를 팔 수 없었고, 유닉스도 제품으로 팔 수가 없었다.

6판이 나왔을때 AT&T는 최소한의 배포비용만 받고 대학에 사용권을 주었다.

대학은 유닉스를 수정하여 학생들에게 제공

 

BSD와 시스템 V의 탄생

1979년 유닉스 7판이 발표. 

이 시점부터 유닉스가 BSD와 시스템V라는 두가지 주요 변종으로 갈림

 

톰슨은 UC버클리에서 방문 교수로 지냄 (UC버클리 졸업 후 교수 된듯)

대학원생과 함께 여러 가지 새로운 기능을 유닉스에 추가

여러가지 새로운 도구와 기능이 버클리에서 개발되었음.

BSD(Berkeley Software Distribution)라는 이름으로, 이버전의 유닉스는 소스코드째 널리 배포

그 이후 4.1 ~ 4.4BSD 버전으로 널리 개발됨

 

그 사이에 AT&T가 분해됐고, 그 결과 전화 시스템에 대한 독점이 해소되어, 유닉스 판매가 가능

그 이후 시스템 V 발표, 시스템 V는 여러 회사에 사용권이 제공되었고, 여러 회사는 이를 기초로 각자의 유닉스를 구현

 

따라서 학계에 퍼진 다양한 BSD 배포판뿐만 아니라, 다양한 하드웨어상에 유닉스의 여러가지 상업적 구현이 존재

상업적 구현에는 나중에 솔라리스가 된 썬의 SunOS, IBM의 AIX, 애플 매킨토시의 A/UX, 마이크로소프트와 SCO의 XENIX가 포함

 

 

2. 리눅스의 간략한 역사

2.1 GNU 프로젝트

MIT에서 일하던 리처드 스톨만은 자유(FREE) 유닉스 구현을 만들기 시작

커널과 모든 관련 소프트웨어 패키지로 이뤄진, 완전하고 자유롭게 구할 수 있는 유닉스와 유사한 시스템을 개발하기 위해 GNU 프로젝트(GNU IS NOT UNIX)를 시작 (재귀적 의미)

GNU프로젝트의 중요 결과 중 하나는 자유 소프트웨어 개념을 법적으로 구체화한 GPL(General Public License)다.

GPL License: 반드시 소스 코드를 구할 수 있어야 하고, GPL에 따라 자유롭게 배포할 수 있어야한다.

초기의 GNU프로젝트는 동작하는 유닉스 커널을 만들지 못하고 여러가지 응용 프로그램을 만듦(Emacs 등)

1990년대 초 GNU프로젝트는 유닉스 커널을 제외한 거의 완전한 시스템을 만듦

 

2.2 리눅스 커널

1991년 핀란드 헬싱키 대학 학생 리누스 토발즈는 유닉스 커널을 만드는 프로젝트를 시작, 몇 달 뒤 토발즈는 여러 가지 GNU 프로그램을 컴파일 하고 실행하는 기본 커널을 개발

토발즈는 리눅스를 GNU GPL에 따라 배포하기 시작

여러 사람들이 함께 개발

 

3. 표준화

3.1 C 프로그래밍 언어

유닉스 구현의 다양성에 문제가 있었음

BSD에 기반한 유닉스 구현, 시스템 V에 기반한 구현, 어떤 구현은 짬뽕~

다양한 구현들 사이에 차이가 생김

이러한 요인으로 인해 ANSI(American National Standards Institute)의 승인으로 C의 표준화

이 표준은 ISO표준으로 채택

1999년 ISO에 의해 C 표준 개정(C99)

C표준은 운영체제와 독립적이다. 유닉스에 매여있지 않고, C를 제공하는 어떤 컴퓨터와 운영체제에도 이식이 가능

 

 

 

 

 

 

 

 

'시스템 프로그래밍' 카테고리의 다른 글

프로세스 간 통신(IPC) 개요  (0) 2020.04.18
블로그 이미지

짬뽕얼큰하게

,

1. IPC 방법의 분류

크게 3개의 기능적 분류로 나눌 수 있음.

  • 통신 : 프로세스 간에 데이터를 주고받는 방법

  • 동기화: 프로세스나 스레드 간에 동기화를 맞추는 방법

  • 시그널: 시그널은 다른목적으로 설계되었지만, 특정 상황에서 동기화를 맞추는 방법으로 사용 가능

    시그널 번호 자체가 하나의 정보 형태기때문에 통신목적으로도 사용 가능(연관된 정수, 포인터를 수반할 수 있음)

 

 

2. 통신 방법

  • 데이터 전송: 쓰기와 읽기 두가지 요소로 구분
    통신을 하려면 한 프로세스에서 IPC방법에 데이터를 쓰고 다른 프로세스는 이 데이터를 읽어야함
    이 기술에는 사용자 메모리와 커널 메모리 간에 통신하는 두가지 전송 모드가 있음
    - 쓰는 동안 사용자 메모리로부터 커널 메모리로 전송
    - 읽는 동안 커널 메모리에서 사용자 메모리로 전송
  • 공유 메모리: 특정 메모리 영역에 데이터를 저장해 프로세스간 데이터를 공유하는 방식
    사용자 메모리와 커널 메모리 사이에 시스템 호출이나 데이터 전송이 필요하지 않기 때문에 공유 메모리는 매우 빠른 통신을 제공

데이터 전송방법은 다음과 같이 하위 카테고리로 더 세분화 할 수 있음

  • 바이트 스트림: 파이프, FIFO, 스트림 소켓을 통해 전송되는 데이터는 제한되지 않은 바이트 스트림
    각 read 오퍼레이션은 전송자가 얼마만큼의 데이터를 섰는지에 상관없이 IPC방법으로부터 임의의 크기의 바이트를 읽어야 하는지 얻어와서 읽음
  • 메시지: 시스템 V 메시지큐, POSIX 메시지 큐, 소켓 데이터그램은 데이터를 전송할 때 한 번에 전송할 수 있는 크기에 제한이 있음. 각 읽기 오퍼레이션은 송신자의 프로세스가 쓴 데이터 전체를 한번에 읽게됨.
    IPC방법에 메시지의 일부를 놔두고 메시지의 일부분만을 읽을 수 없음
    한번의 읽기 오퍼레이션으로 여러개의 메시지를 읽는것도 불가능
  • 가상 터미널: 가상터미널은 통신 방법중 하나이며 특정 상황에서 설계됨. 이건 나중에 더 공부 필요...
    송신자, 수신자 프로세스 간의 동기화는 자동으로 이루어짐. 읽기시 수신한 데이터가 없다면 자동으로 블록

 

공유 메모리는 시스템 V 공유 메모리, POSIX 공유 메모리, 메모리 매핑 세가지 공유 메모리를 제공

공유 메모리가 빠른 통신 방법을 제공하지만, 이런 속도의 장점은 공유 메모리를 동기화하는 데 들어가는 시간과 상쇄될 수 있음. 하나의 프로세스는 다른 프로세스가 메모리상에서 작업을 하고 있을 때 접근 불가능.

메모리에 저장된 데이터는 같은 메모리를 공유하는 모든 프로세스에서 볼 수 있음.

 

 

3. 동기화 방법

세마포어: 리눅스는 시스템 v 세마포어와 POSIX 세마포어를 제공

 

파일 잠금: 같은 파일에 다중 프로세스가 작업을 할 때 이를 중재

읽기 잠금과 쓰기 잠금으로 사용. flock(), fcntl() 시스템 호출로 제공.

flock()은 전체파일 잠금. 거의 사용하지 않음.

fcntl()으로 레코드 잠금. 파일의 여러곳에 lock할수 있음.


뮤텍스: POSIX 스레드에서 일반적으로 사용

 

-> 통신 방법을 동기화에 사용할 수 있음. 

 

 

4. IPC 방법 비교하기

데이터 전송 방법 vs 공유 메모리

데이터 전송 방법(파이프, FIFO, 메시지)은 동기화를 커널이 자동으로 처리. 여러 응용프로그램 설계에 적합

공유메모리는 하나의 프로세스가 같은 메모리 공간을 공유해 다른 여러 프로세스에서 데이터를 볼수있게 할때 유용.

공유메모리는 동기화를 지원해야하므로 복잡한 설계를 추가해야 할 수 있음.

 

바이트 스트림(파이프, FIFO, 소켓) 전송 vs 메시시 전송(메시지 큐, 데이터그램 소켓)

응용프로그램이 바이트 스트림 방법의 메시지 중심 모델을 선호 할 수 있는데 구분문자를 사용, 고정 길이 메시지를 사용, 최종 메시지 길이를 헤더에 표시 등을 사용할 수 있기 때문

 

시스템V와 메시지 큐 VS 그밖의 데이터 전송 방법

시스템 V와 메시지 큐는 숫자형이나 우선순위를 메시지에 줄 수 있음. 보낸 순서와 다른순서로 도착 할 수 있음

 

파이프, FIFO, 소켓은 파일 디스크립터를 통해 구현됨.

I/O 모델의 대안으로 제시된 멀티플렉싱(select()와 poll() 시스템 호출), 시그널 기반 I/O, 리눅스 고유의 epoll API를 모두 지원. 동시에 다중 파일 디스크립터를 관찰해 I/O중 어떤 것이 사용 가능한지 파악 할 수 있음.

시스템 V 메시지 큐는 파일 디스크립터 기술을 사용하지 않고 이런 기술을 지원하지 않음. 

 

POSIX 메시지큐는 통지 방법을 제공, 프로세스나 새로운 스레드에 비어있는 쿠에 메시지가 도착하면 시그널을 전송

 

유닉스 도메인 소켓은 파일 디스크립터를 하나의 프로세스에서 다른 프로세스로 전달할 수 있는 기능을 제공

이 기능은 하나의 프로세스에서 파일을 열고 이를 파일에 접근할 수 없는 다른 프로세스가 사용 가능하게 함

 

레코드 잠금은 fcntl() 을 이용해 걸게됨 fcntl()을 사용할 경우 커널이 데드락을 감지하지만 시스템V와 POSIX 세마포어는 소유권 속성을 갖고있지 않아 세마포어의 데드락을 커널이 자동으로 감지 할 수 없음.

 

시스템 V IPC 설계 이슈

시스템 V IPC는 전통적인 유닉스 I/O 모델과는 독립적으로 설계됐기 때문에 결과적으로 기이한 프로그래밍 인터페이스가 존재, 사용하기 복잡 //  POSIX IPC는 이런 문제를 고려해 설계됨

시스템 V IPC는 비 연결형 : IPC를 열기 위해 사용하는 핸들 개념을 제공하지 않음. 커널은 프로세스가 객체를 열고있는지 기록하지 않기때문에 객체가 안전하게 제거되는지 알기 위해서는 추가적인 프로그래밍이 필요

 

 

 

출처: 리눅스 API의 모든것 고급 리눅스 API

'시스템 프로그래밍' 카테고리의 다른 글

리눅스 역사와 표준  (0) 2020.04.25
블로그 이미지

짬뽕얼큰하게

,

null과 undefined 차이

2020. 2. 8. 19:43

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.