💬 hello! 各位铁子们大家好哇。 今日更新了Linux的进程内容 🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝
存储器可以预先把输入设备的数据放入到存储器中,预先加入的数据可以预先进行计算,计算好的数据也可以先放到存储器中,等到输出设备需要时,再输出。这样就提高了效率。如果没有存储器,输入设备直接到cpu再到输出设备的话,由于输入、输出设备的速度很慢,效率就很低,尽管cpu的速度很快(木桶效应)。
结论:
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。 操作系统是进行软硬件资源管理的软件。 广义的认识:操作系统=内核+外壳周边程序 狭义的认识:只是操作系统的内核。
每一种硬件都有对应的驱动层,驱动层是一套软件。驱动层向操作系统提供通信接口,使OS能通过驱动程序访问硬件,对其进行管理。有了驱动层,就不怕更换硬件时,由于硬件的厂商不同,导致OS无法管理了。
举例: 学校里面有校长、辅导员、学生。校长是管理者,学生是被管理者。校长不会直接与学生接触,校长管理学生只需要拿到学生的数据即可。校长关心的是学习相关的和基本信息,不关注你喜欢吃什么。校长关心的是学生,而不是某个人。学校人多,管理起来难,通过列表格的形式,管理学生的数据。这就相当于c语言里的结构体类型。为了让这些信息都连接起来,就需要通过链表或者其他高效的数据结构链接。当需要找数学成绩最好的学生时,通过查找数学成绩,找到某个结构体对象,就可以知道这个学生的全部基本信息。
任何管理都是:先描述,再组织。 比如:C++和STL,C++的封装就是先描述,STL就是组织。
总结: 计算机管理硬件:
用户不能直接访问硬件,硬件由OS管理着。而用户又不能直接访问OS,因为OS里面有重要的数据,所以OS就必须提供一个系统调用接口,用户通过系统调用方式使用操作系统。 打个比方:在银行,客户通过柜台窗口进行存取钱服务,而不是到了银行直接进去银行的系统自行修改数据。
打个比方:来银行办事的人可能是大爷,大爷不知道流程,就会有老人通道进行辅助。这个通道就相当于库,入门的程序员就可以通过库来进行系统调用。 不同的操作系统的系统调用可能会不同,但有了库,即使底层的代码不同,都可以通过相同的函数名调用,比如C语言和C++的标准库,都可以用printf打印。
可执行程序没被运行前,是存在磁盘中的。运行后,程序的二进制代码和数据就会加载到内存中。由于进程可以同时有很多个,就有哪些进程的优先级高等问题,所以在内存中的代码和数据不是进程。OS需要管理很多进程,所以就会有结构体PCB进行管理。每一个进程都有一个PCB。进程=PCB+自己的代码和数据。
举例:每个人的简历到了hr的手上,每个人是一个实体,而简历就相当于 task_struct 。OS看的是task_struct,而不会直接看代码和数据。 进程=内核task_struct 结构体+程序的代码和数据。
调度运行进程,本质就是让进程控制块task_struct进行排队。
ps aux / ps axj 命令
如果想查找某个进程的状态,可以使用grep。
可这样就看不到开头第一行的说明了。所以还可以使用&&进行连接,表示同时执行该指令。
&&左右两边执行完再进行合并。
还可以通过 /proc 系统文件夹查看:
我们运行程序后,通过/proc系统文件夹查看,存在该pid命名的文件夹,里面存的就是文件的属性信息。
exe是可执行程序,也就是说我们刚刚的进程是在这个路径下的process加载形成的。
如果我们把这个可执行程序干掉了,如下图
我们发现程序还在运行,如下图:
原因:因为程序已经运行了,我们删掉的是磁盘的可执行程序。而内存中的还在。
上方中的cwd,指的是进程的当前工作路径。 每个进程在启动的时候,会记录自己当前在哪个路径下启动。 我们把进程跑起来后,它会在当前的工作路径下生成log.txt文件。
如果我们想改变进程的工作路径,需要使用chdir
我们将进程跑起来,
发现工作路径确实被更改了。
创建的log.txt文件也在该路径中。
PID就是进程的唯一标识符。系统有提供接口来给我们查看。我们通过man getpid 指令查看
使用getpid()时需要包<unistd.h> 和 <sys/types.h> 两个头文件。pid_t 就是无符号整形。 getppid()就是获取当前进程的父进程的id。
上图中,左右两边PID对应得上。
由上图可知,进程每次启动,对应的pid都不一样,这是正常的。但是为什么父进程的ppid都是一样的?
可以看到,bash就是父进程。还记得之前讲过的,shell是媒婆,bash是王婆。bash会创建很多个子进程。
ctrl+c是在用户层面上终止进程。 kill -9 pid 可以用来直接杀掉进程。
通过man fork 指令来认识fork。fork的作用就是创建一个子进程。 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
while :; do ps axj | head -1 && ps axj | grep myprocess|grep -v grep;sleep 1;done 通过上方指令,我们可以不停打出进程的状态。 运行后如下图:
按照代码的逻辑,后面多出了一个子进程。fork之后,父子代码共享。所以打印了两次hello world。
fork会放回两个值,如果创建成功就会返回子进程的pid给父进程,并且返回0给子进程。如果创建失败,就会返回-1。
fork 之后通常要用 if 进行分流 ,如下图:
fork有两个返回值,其实是在fork函数内部创建子进程的时候,子进程已经创建完成了,才到return ,这时候就就是父子进程各自return了。 父子进程具有独立性,互不影响。
创建多个子进程
可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有