Linux & C 스레드 제어 수업 후 연습 문제

Q1: 멀티스레드가 멀티 프로세스에 비해 어떤 이점이 있습니까?
  • 다중 프로세스 프로그램이 소모하는 자원이 크다. 왜냐하면 fork()할 때 하위 프로세스는 부 프로세스의 거의 모든 것을 계승해야 하기 때문이다. 그러나 다중 프로세스 프로세스의 루틴은 자신의 개인 데이터, 예를 들어 자신의 루틴 ID, 레지스터, 창고, 신호 차단자, errno값, 스케줄링 우선순위
  • 만 계승한다.
  • 다중 프로세스의 프로그램 간의 데이터가 서로 독립되기 때문에 통신 간에는 반드시 전문적인 통신 방식이 필요하지만 다중 프로세스 간에 데이터 공간을 공유하기 때문에 라인 간의 통신이 편리해진다.
  • 다중 프로세스 간에 서로 다른 메모리 공간이 분배되기 때문에 프로세스 간의 전환은 상대적으로 느리지만 다중 프로세스 간에 주 프로세스의 주소와 메모리 공간을 공유하기 때문에 프로세스 간의 전환은 매우 빠르다.
  • 다중 루틴 프로그램은 여러 명령을 처리하는 프로그램 구조를 간단하게 하고, 각 루틴은 명령을 하나만 실행할 수 있다.

  • Q2: 다중 스레드 프로그램을 작성하여 주 스레드에 세 개의 서브스레드를 만들고 세 개의 서브스레드가 공유하는 전역 변수를 동시에 수정해야 한다. 어떤 결과가 나오는지 보자.
    물론 예상치 못한 결과가 발생할 수 있기 때문에 정확하게 수정할 수 없다. 이 문제만 연구하는 것은 의미가 없다. 라인 간의 자원이 동기화되지 않는 문제를 해결한다. - 상호 잠금 코드는 다음과 같다. 상호 잠금의 용법은 다음과 같다.
    Q3: 다중 스레드 프로그램에서 어떻게 스레드의 동기화를 실현하는지, 어떤 방식이 있습니까?
    나는 두 가지 방식을 안다. 즉, 상호 배척 자물쇠와 조건 변수 상호 배척 자물쇠이다. 그것은 여러 라인이 같은 변수에 접근할 때의 동기화되지 않는 문제를 해결할 수 있다. 즉, 어떤 사건이 한 순간에 한 라인에만 접근할 수 있다는 것을 보장할 수 있다.조건 변수: 전역 변수 (코드 - 임계 구역, 자원 - 파일) 에 대한 다중 루트가 동시에 접근할 때 동기화되지 않는 문제를 해결할 수 있습니다.또한 어떤 자원이 한 시간에만 한 라인에 접근할 수 있도록 보장한다.그것은 일반적으로 서로 밀어내는 자물쇠와 협조하여 사용하는데, 사용 시 자물쇠를 빼앗지 않으면 자물쇠의 위치에 막힌다.자물쇠를 뺏으면 웨이트 상태로 들어갑니다. 이 때 자물쇠를 풀고 signal이나broadcast가 활성화되면 다시 자물쇠를 추가합니다.상호 배척 잠금 코드 위에 있습니다. 조건 변수 코드는 다음과 같습니다. 상호 배척 잠금의 사용법
    Q4: 스레드 개인 데이터를 만드는 절차를 작성합니다.
    루틴의 개인 데이터, 즉 키 다수치 기술을 만드는 절차는 다음과 같다. 1:'키'를 신청한다.pthread_key_t key; 2: 이 키 만들기;pthread_key_create(&key,NULL); 3: 이'키'를 라인 내부의'전역 변수'와 연결시킨다.pthread_setspecific(key,globvar); 4: 이 함수와 관련된 "key"값 얻기:pthreadkey_getspecific(key); 5: 키 제거: pthreadkey_delete(key); 코드는 다음과 같습니다: TSD - 원키 다수치 기술
    Q5: 다중 프로세스 다중 루틴을 만드는 프로그램을 만듭니다. 4개의 하위 프로세스를 만듭니다. 각 하위 프로세스는 두 개의 루틴을 만듭니다. 프로세스와 루틴의 기능은 요구하지 않고 한 마디만 출력할 수 있습니다.코드는 다음과 같습니다.
    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<pthread.h>
    #include<stdlib.h>
    void *func1()
    {
        printf("i am a thread,threadId:%u
    "
    ,pthread_self()); } int main(int argc,char *argv[]) { int pid1,pid2,pid3; pthread_t tid1,tid2,tid3,tid4,tid5,tid6,tid7,tid8; pid1 = fork(); switch(pid1) { case 0: pid2 = fork(); switch(pid2) { case 0: printf("i am a process ,pid:%d
    "
    ,getpid()); pthread_create(&tid1,NULL,func1,NULL); pthread_create(&tid2,NULL,func1,NULL); break; default: printf("i am a process ,pid:%d
    "
    ,getpid()); pthread_create(&tid3,NULL,func1,NULL); pthread_create(&tid4,NULL,func1,NULL); // exit(0); break; } default: pid3 = fork(); switch(pid3) { case 0: printf("i am a process ,pid:%d
    "
    ,getpid()); pthread_create(&tid5,NULL,func1,NULL); pthread_create(&tid6,NULL,func1,NULL); break; default: printf("i am a process ,pid:%d
    "
    ,getpid()); pthread_create(&tid7,NULL,func1,NULL); pthread_create(&tid8,NULL,func1,NULL); // exit(0); break; } } }

    좋은 웹페이지 즐겨찾기