第七版操作系统概念-进程管理
第三章 进程
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; }
##*后续还在更新中。。。。。。*