进程的相关概念与进程间的通信

并行:就是同时使用
并发:就是交替使用CPU

进程控制块PCB

进程状态:就绪态-运行态-阻塞态
1.就绪态:进程获得除cpu以外的所有条件。只要获得CPU就立即运行。
2.运行态:进程正占用cpu运行
3.阻塞态:出现等待事件,不具备运行条件

状态图

时间片用完
等待事件
等待事件结束
被调度运行
运行态
就绪态
阻塞态

fork函数

当父进程创建子进程,使用的是写时拷贝(copy-on-write)。读时父子进程共享地址空间(内核此时不会复制整个进程的地址空间)。只有当需要写入的时候才会去复制整个进程的地址空间。

exec函数族

exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的
内容,换句话说,就是在调用进程内部执行一个可执行文件。
◼ exec 函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据
段和堆栈等都已经被新的内容取代,只留下进程 ID 等一些表面上的信息仍保持原样,
颇有些神似“三十六计”中的“金蝉脱壳”。看上去还是旧的躯壳,却已经注入了新的灵
魂。只有调用失败了,它们才会返回 -1,从原程序的调用点接着往下执行。

进程回收是由父进程回收的

孤儿进程:

概念:父进程已经死了,但子进程还在。无危害
处理方法:内核会将孤儿进程的父进程设置为init,init会回收子进程。

僵尸进程:

概念:父进程没死,因为父进程还在,但是子进程已经运行完了,没有父进程给回收。此时子进程就成了僵尸进程。僵尸进程会占用进程号,内核无法再用这个进程号,有危害。

wait()函数:在父进程中是一个阻塞状态。子进程会一直运行

wait()函数中可以有两个参数
     1.NULL:啥都不获取
     2.一个int st类型:wait(&st)。获取子进程终止的状态码。比如:使用exit(0)来正常退出的,WIFEXITED(st)的值为0
用shell命令kill -9来杀死进程,非正常退出的WIFSIGNALED(st)会返回9.

进程间通信

同步与异步:同步:看病,一个一个的去看(没有隐私问题)。异步:看病,一起看(有隐私问题)
进程间通信的目的:
◼ 数据传输:一个进程需要将它的数据发送给另一个进程。
◼ 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种
事件(如进程终止时要通知父进程)。
◼ 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供互斥和同
步机制。
◼ 进程控制:有些进程希望完全控制另一个进程的执行(如 Debug 进程),此时控制
进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
进程通信方式:
1.匿名(无名)管道
        管道特点:1.内核内存中维护的缓冲器。2.拥有文件的特质:读写。3.一个管道是一个字节流。4.管道传递数据是顺序的。5.管道读取是一次性操作,读完就没了。6.匿名管道只能有公共祖先的进程,有关系的进程(有关系的进程对应的操作或文件的文件描述符相同)
        管道数据结构:环形队列
2.有名管道(FIFO)
        只要可以访问路径,就能彼此通过FIFO相互通信。通过fifo,不相关的进程也能通信。从管道中读取数据的顺序的是先进先出。
有名管道(FIFO)和匿名管道 (pipe)有一些特点是相同的,不一样的地方在于:1. FIFo在文件系统中作为一个特殊文件存在,但 FIFO 中的内容却存放在内存中。2.当使用FIFO 的进程退出后, FIFO文件将继续保存在文件系统中以便以后使用。3.FIFO有名字,不相关的进程可以通过打开有名管道进行通信。
3.内存映射
使用内存映射实现文件拷功能
思路:
1.对原始文件进行内存映射
2.创建一个新文件(拓展该文件)
3.把新文件的数据映射到内存中
4.通过内存拷贝将第一个文件的内存数据拷贝到新的文件内存中
5.释放资源
注意事项
1.如果对mmap的返回值(ptr)做++操作(ptr++),munmap是否能成功?
void *ptr = mmap(…);
ptr++; 可以进行++操作
munmap(ptr,len);不能对ptr++之后的ptr操作,会错误

2.如果open时O_RDONLY,mmap时prot参数指定PROT_READ|PROT_WRITE会怎样?
错误,返回MAP_FAILED
open的权限和prot的权限要一致

3.如果文件偏移量为1000会怎样?
偏移量必须为4k的整数倍,不然会返回MAP——FAILED

4.MMAP什么情况下会调用失败?
-第二个参数:length=0;
-第三个参数:prot
-只指定写的权限
-比open的权限大

5.可以open的时候O_CREAT一个新的文件来创建映射区吗?
-可以的,但是创建文件大小不能为0。
-可以对新的文件进行扩展
-lseek();
-truncate();

6.mmap后关闭文件描述符,对mmap映射有没有影响?
int fd = open(“XXX”);
mmap(,fd,0);
close(fd);
映射区还存在,创建映射区的fd被关闭,没影响。

7.对PTR越界操作会怎样?
void *ptr = mmap(NULL,100,);
4k
越界操作的时非法内存 ->段错误

你可能感兴趣的:(c++,网络,java,开发语言,c++)