2、进程
2.1、进程、线程、协程的区别
进程 | 线程 | 协程 | |
---|---|---|---|
定义 | 资源分配和拥有的基本单位 | 资源调度的基本单位 | 用户态的轻量级线程,线程内部调度的基本单位 |
切换情况 | 进程CPU环境(栈、寄存器、页表、句柄等)的保存以及新调度的进程CPU环境的设置 | 保存和设置程序计数器、少量寄存器和栈的内容 | 先将寄存器上下文和栈保存,后期恢复 |
切换过程 | 用户->内核->用户 | 用户->内核->用户 | 用户态(没有陷入内核) |
拥有资源 | CPU资源、内存资源、文件资源等 | 程序计数器、寄存器、栈和状态字 | 独有的寄存器上下文和栈 |
并发性 | 不同进程之间切换实现并发,各自占有CPU并行 | 一个进程内部的多个线程并发执行 | 同一时间只能执行一个协程,而其他协程处于休眠状态,适合多任务进行分时处理 |
系统开销 | 切换虚拟地址空间,切换内核栈和硬件上下文,CPU高速缓存失效、页表切换,开销大 | 切换时只需保存和设置少量寄存器内容,开销较小 | 直接操作栈则基本没有内核切换开销,可以不加锁的访问全局变量,上下文切换快 |
通信方面 | 进程间通信需要借助操作系统 | 线程间可以直接读写进程数据段(如全局变量)来进行通信 | 共享内存、消息队列 |
2.2、并发和并行
- 并发:同一时间间隔内做多件事情,比如“时间片轮转进程调度算法”,就是在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。
- 并行:同一时刻同时做多件事情,如果有多台CPU,进程数若是小于CPU数,则不同的进程可以分配给不同的CPU来运行,这样多个进程就是真正同时进行,若是进程数大于CPU数,仍需要使用并发技术。
2.3、进程的定义和状态
1、定义
进程是系统进行资源分配和调度的基本单位,进程是程序的基本执行实体
创建进程:BOOL ret = CreateProcess(NULL, chCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
关闭进程:CloseHandle(pi.hThread);
2、状态
3、进程的同步和互斥
2.4、进程的创建、杀死、退出
1、进程的创建
进程结构由以下几个部分组成:代码段、堆栈段、数据段。代码段是静态的二进制代码,多个程序可以共享。实际上在父进程创建子进程之后,父、子进程除了pid外,几乎所有的部分几乎一样。父、子进程共享全部数据,但并不是说他们就是对同一块数据进行操作,子进程在读写数据时会通过写时复制机制将公共的数据重新拷贝一份,之后在拷贝出的数据上进行操作。如果子进程想要运行自己的代码段,还可以通过调用execv()函数重新加载新的代码段,之后就和父进程独立开了。我们在shell中执行程序就是通过shell进程先fork()一个子进程再通过execv()重新加载新的代码段的过程。
pid_fork(void);//出错返回-1,父进程中返回pid > 0,子进程pid = 0;
2、杀死进程的方式
//用ps查看进程
ps -ef 或 ps -aux;
//杀死进程
kill -s 9 PID;
//进阶版1
ps -ef | grep firefox;
kill -s 9 PID;
//进阶版2
//pgrep的p表明了这个命令是专门用于进程查询的grep
pgrep firefox;//得pid
kill -s 9 PID;
//进阶版3
//和pgrep相比稍显不足的是,pidof必须给出进程的全名
pidof firefox-bin;//得pid
kiss -s 9 PID;
//进阶版4
/*“grep firefox”的输出结果是,所有含有关键字“firefox”的进程。
“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。
“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。
“xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。
“kill -s 9”会强行杀掉指定进程。*/
ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9;
//进阶版5
pgrep firefox | xargs kill -s 9;
ps -ef | grep firefox | awk '{print $2}' | xargs kill -9;
//进阶版6
pkill -9 firefox;//pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 "-s 9",结果每次运行都无法终止进程。
3、进程的退出
1)进程终止的几种方式
- main