目录
系统调用函数与库函数
库函数的组成
库函数与系统调用的关系
进程概述
进程的定义
进程与程序的区别
进程的状态及其转换
进程的调度机制
进程控制块
查看当前系统所有进程
进程号函数
进程创建fork函数
进程挂起
进程的等待
wait()
waitpid
特殊进程
系统调用函数与库函数
库函数的组成
库函数与系统调用的关系
这里指的是访问文件的库函数,比如C语言我们学的fopen
这里表示的意思是:我printf可以一直写,写到满了或者刷新缓冲区了,我再调用write函数,就相当于送快递,我需要等快递积累到了一定的数量时,我才开始派件,而不是来一个我送一个,不然很浪费时间
总结:大部分的库函数仍然是系统调用,只不过库函数去系统调用的路上多了缓冲区而已,从而减少系统调用的次数
进程概述
进程的定义
进程与程序的区别
进程是程序的一次执行过程
进程的状态及其转换
想想-FreeRTOS的知识,因为FreeRTOS也是一个操作系统,而linux也是操作系统,有点知识是像的
进程的调度机制
时间片轮转也是FreeRTOS的调度机制
上下文切换就是保存上文执行下文
进程控制块
进程控制块-保存一个进程的相关内容的结构体
这里举了进程控制块具备的信息--很多信息,比FreeRTOS具备的更多,因为linux内核更复杂,但是学了FreeRTOS能更好理解,学一个小型的操作系统,有利于理解大型的操作系统(Linux)
进程号是内核随机分配的,用户无法控制。并且0和1被使用,1是祖先进程,0是交换进程
查看当前系统所有进程
这里的所有进程是指真正运行的进程,如果一个程序运行了一次的话,那么是不会存在的,因为该进程已经被销毁了,因此如果你想查询自己创建的进程的话,那么需要使你的程序是一个死循环
如果单纯输入ps,那么就是显示当前进程的信息,其实当前进程就是ps
我们打开qq,分别与1,2,3号联系人聊天,并且打开聊天窗口,那么3个窗口表示3个进程,而qq就相当于父进程
进程号函数
进程创建fork函数
根据返回值来区分父子进程
父子进程相互独立,有各自的存储空间--独立的地址
类似于租房子,每个房子的样子是一样的,但是地址不一样(房间号不一样),初始的设备和装修也是一样,通过房间号(相当于返回值)进行区分,并且父子进程的执行顺序不确定,因为你不知道哪一个房间先装修,这个取决于装修工人(相当于内核)
一旦fork了,那么子进程就会有父进程后面的代码了
fork();
printf("hello\n"); --结果是打印2个hello
这里是没有区分父子进程,这里的例子只是为了理解,子进程保存了父进程拥有的东西
fork();
printf("hello\n");
fork();
printf("hello\n");---打印6个hello
但是父子进程也是有联系的,比如磁盘空间,就相当于电梯,都是一个电梯,大家公用
场景分析:文件中有20个字节数,父进程read-15个字节,然后子进程read,那么子进程只能read后面的5个字节,而不能从头开始,因为文件的偏移指针已经改变了,所以文件是公用的,因为它不在用户区,而是在内核区
进程挂起
其实就是相当于FreeRTOS中的delay而已
到了指定时间后,进程成为就绪态(有了抢占cpu的资格),等待内核调度成为运行态
进程的等待
wait()
类似于FreeRTOS的信号量等,等待某一个事情发生才能执行下面的代码,否则就一直阻塞等待。而这里的就是父进程等待子进程运行完,后面的代码才能被执行
等待该父进程创建的所有子进程(具有一定的缺陷也许)终止、回收资源、除非子进程终止或者来了一个信号否则一直阻塞等待、取返回值
不想要返回值的话就NULL
指定子进程退出 waitpid
前面的wait会死等,而waitpid提供了两种功能,死等和不死等,所以说waitpid完全可以替换wait,因为wait有的功能waitpid全都有
特殊进程