第三章 进程


  • 3.1 进程概念

    • 3.1.1 进程
    • 3.1.2 进程状态
    • 3.1.3 进程控制块
    • 3.1.4 线程
  • 3.2 进程调度

    • 3.2.1 调度队列
    • 3.2.2 调度程序
    • 3.2.3 上下文切换
  • 3.3 进程操作

    • 3.3.1 进程创建
    • 3.3.2 进程终止
  • 3.4 进程间通信

    • 3.4.1 共享内存系统
    • 3.4.2 消息传递系统
  • 3.5 IPC系统的实例

    • 3.5.1 实例:POSIX 共享内存
    • 3.5.2 实例:Mach
    • 3.5.3 实例:Windows XP
  • 3.6 客户机-服务器系统通信

    • 3.6.1 Socket
    • 3.6.2 远程过程调用
    • 3.6.3 远程方法调用
  • 课后习题

    • 3.1
    • 3.2
    • 3.3
    • 3.4
    • 3.5
    • 3.6
// 第一次编写多线程程序,激动。。。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void f(int x) {
    if (x == 1) {
        printf("0");
        return;
    } else if (x == 2) {
        printf("0 1");
        return;
    } else {
        int *a = (int*)malloc(sizeof(x));
        0[a] = 0;
        1[a] = 1;
        for (int i=2; i<x; ++i) {
            i[a] = a[i-1] + a[i-1];
        }
        for (int i=0; i<x; ++i) {
            printf("%d ", i[a]);
        }
        free(a);
    }
}
int main() {
    pid_t  pid = fork();
    if (pid < 0) {
        exit(-1);
    } else if (pid == 0) {
        int x;
        scanf("%d", &x);
        if (x <= 0) {
            fprintf(stderr, "f");
        }
        f(x);
        exit(1);
    } else {
        wait(nullptr);
        printf("ok");
        exit(1);
    }
}

  • 3.10

    #include <stdio.h>
    #include <sys/shm.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdlib.h>
    { // 这个括号只是为了隔一行,kan
     const int MAX_SEQUENCE = 10;
     typedef struct {
         int fib_sequence [MAX_SEQUENCE];
         int sequence_size;
     }shared_data;
    }
    int main() {
    
     pid_t pid;
     int segment_id;
     shared_data *sd;
    
     int x;
     scanf("%d", &x);
     if (x > MAX_SEQUENCE) {
         fprintf(stderr, "x is error");
         exit(-1);
     } else {
         // 创建共享内存块
         segment_id = shmget(IPC_PRIVATE, sizeof(shared_data), S_IRUSR | S_IWUSR);
         // 将sd 指向共享内存块基址
         sd = (shared_data *) shmat(segment_id, nullptr, 0);
         sd->sequence_size = x;
         // 创建 子进程
         pid = fork();
         if (pid < 0) {
             fprintf(stderr, "fork fail");
             exit(-1);
         } else if (pid == 0) {
             // 子进程 写入数据
             printf("size = %d\n", sd->sequence_size);
             if (sd->sequence_size == 1) {
                 sd->fib_sequence[0] = 0;
             } else if (sd->sequence_size == 2) {
                 sd->fib_sequence[0] = 0;
                 sd->fib_sequence[1] = 1;
             } else {
                 sd->fib_sequence[0] = 0;
                 sd->fib_sequence[1] = 1;
                 for (int i=2; i<sd->sequence_size; ++i) {
                     sd->fib_sequence[i] = sd->fib_sequence[i-1] + sd->fib_sequence[i-2];
                 }
             }
             exit(1);
         } else {
             wait(nullptr);
             // 主进程读数据
             for (int i=0; i<x; ++i) {
                 printf("%d ", sd->fib_sequence[i]);
             }
         }
         shmdt(sd);
         // 销毁
         shmctl(segment_id, IPC_RMID, nullptr);
     }
     return 0;
    }
    
    





##*后续还在更新中。。。。。。*