存储是越靠近CPU速度越快,容量越小
网络->硬盘->内存->缓存(缓存中还分等级)->寄存器(4byte(32位,1byte = 8 bit,32/8=4))
CPU中有预取器(取指令)->译码器(就是个翻译官)->ALU(算数逻辑单元(只能做加法和左移))->最后到寄存器然后在缓存等等到磁盘
MMU(大小是4K)将虚拟地址映射到物理地址上
MMU会把内存分级,常规等级,还有系统等级(当然这个是我说的,不过分级是真的存在)
内核内核(操作系统)在内存中只有一份(内核是共享的),管理进程控制(PCB(一个结构体)),也就是说不同进程之间在内存中,使用的是同一个内核.从而进行进程见通信
进程和程序程序磁盘上的一个可执行文件
进程:运行中的程序,占用系统资源CPU,内存等
并发操作系统一个时间段有多个进程,但是一个时刻上只会有要给进程执行.
之所以能同时进行几个程序,是因一个进程,分成几个时间片,然后分段执行(分时复用)(当然了,CUP的速度看起来就是一起执行的),如今就更方便了,都是几核的CUP-_-
所有进程排队执行,已淘汰(dos)
也就是串行,一个一个执行
多道程序设计几个进程,相互交替执行运行
结合到如今的CPU也就是真的并行,可以同一时间段同时处理N条指令(但是并发和并行并不一样)
并发就是一起出发,但是到达终点的顺序可以有先后
并行就是同时出发同时到达终点
在一个进程获得CPU开始,经过一个时间单位系统会强制让该进程让出CUP资源
进程控制块(PCB)/usr/src/linuxxxxx/include/linux/sched.h中可以查看struct task_struct结构定义(PCB进程块所代表的结构体)
这个结构体很大很大很大具体就不谈了
进程ID(每个进程都有唯一的ID,是一个非负整数(C中用pid_t表示))
进程状态(就绪(等待CPU分配时间片(就绪中包含初始)),运行,挂起(挂起的时候会主动放弃CPU(等待除CUP之外的资源)),终止)
信号相关信息等等
常用环境变量命令 env可以列出所有环境变量
fork(创建子进程) 头文件#include
#include
pid_t fork(void);
pid_t 就是一个非负的整数
返回值创建子进程相当于复制一份父进程
只是创建子进程之前的指令,以被父进程执行完
子进程无法执行,创建子进程后的命令父子进程一起执行
执行结束后,子进程返回0,父进程返回子进程ID
成功返回0和子进程ID
失败返回-1,设置errno
#includegetpid/getppid(获得进程id/获得父进程id) 头文件#include #include using namespace std; int main(int argc, char** argv) { cout << "1" << endl; cout << "2" << endl; cout << "3" << endl; cout << "4" << endl; cout << "5" << endl; // 创建子进程 pid_t pid = fork(); if (pid == -1) { perror("pid_t pid = fork();"); exit(1); } // 大于0是父进程的返回值,也就是子进程的pid else if (pid > 0) { cout << "parent process return " << pid << endl; } else if (pid == 0) { cout << "child process return " << pid << endl; } cout << "6" << endl; cout << "7" << endl; cout << "8" << endl; return 0; }
#include
#include
pid_t getpid(void);
pid_t getppid(void);
getpid 返回当前进程id
getppid 返回父进程id
该函数不会返回失败
案例#include#include #include using namespace std; int main(int argc, char** argv) { cout << "1" << endl; cout << "2" << endl; cout << "3" << endl; cout << "4" << endl; cout << "5" << endl; // 创建子进程 pid_t pid = fork(); if (pid == -1) { perror("pid_t pid = fork();"); exit(1); } // 大于0是父进程的返回值,也就是子进程的pid else if (pid > 0) { cout << "process id " << getpid() << endl; cout << "parent process id " << getppid() << endl; cout << "parent process return " << pid << endl; } else if (pid == 0) { cout << "process id " << getpid() << endl; cout << "parent process id " << getppid() << endl; cout << "child process return " << pid << endl; } cout << "6" << endl; cout << "7" << endl; cout << "8" << endl; return 0; }
父进程的父进程是bash,这个很好理解,就是当前进程(程序)也就是bash进程中的子程序(进程)
循环创建多个子进程,子进程父进程的顺序是不固定(因为并发)
案例#include#include #include using namespace std; int main(int argc, char** argv) { pid_t pid; // 直接循环创建 会创建2的n次方-1 减的是父进程 for (int i = 0; i < 5; i++) { pid = fork(); if (pid == 0) { cout << "process " << i + 1 << endl; } } return 0; }
我这里程序无法退出,但是这个不绝对,造成这种情况的原因是时间片的争抢
案例#include#include #include using namespace std; int main(int argc, char** argv) { pid_t pid; int i; // 直接循环创建 会创建2的n次方-1 减的是父进程 for (i = 0; i < 5; i++) { pid = fork(); if (pid == 0) { // 父进程创建五个子进程,子进程直接退出 // 这样确保是五个进程 break; } } if (pid > 0) { cout << "parent process" << endl; } if(pid == 0) { cout << "child process " << i+1 << endl; } return 0; }
原理一样,就是因为父子进程之间相互争抢时间片
案例#include最终案例#include #include using namespace std; int main(int argc, char** argv) { pid_t pid; int i; // 直接循环创建 会创建2的n次方-1 减的是父进程 for (i = 0; i < 5; i++) { pid = fork(); if (pid == 0) { // 父进程创建五个子进程,子进程直接退出 // 这样确保是五个进程 break; } } if (pid > 0) { cout << "parent process" << endl; // 可以让父进程最后退出 sleep(1); } if (pid == 0) { cout << "child process " << i + 1 << endl; } return 0; }
#include进程共享#include #include using namespace std; int main(int argc, char** argv) { pid_t pid; int i; // 直接循环创建 会创建2的n次方-1 减的是父进程 for (i = 0; i < 5; i++) { pid = fork(); if (pid == 0) { // 父进程创建五个子进程,子进程直接退出 // 这样确保是五个进程 break; } } if (pid > 0) { // 可以让父进程最后退出 // 循环五次嘛 五秒之后父进程退出 sleep(5); cout << "parent process" << endl; } if (pid == 0) { // 一秒输出一个 sleep(i); cout << "child process " << i + 1 << endl; } return 0; }
不同处:进程id, fork返回值, 父进程ID, 进程运行时间(父进程一直运行,子进程在fork之后), 闹钟(定时器), 未决信号集
进程间读时共享,写时复制



