Hello everybody!最近学习任务比较重,就没有时间去专门写博客。这篇文章是我在学习Linux操作系统的第一节进程时整理的笔记,上面的图片是老师的板书,有几张图片有些杂乱,可能不知道从何看起。不过每张图片后都有十分详细的文字描述,读懂那些文字也就读懂了图片在说什么。
希望大家在看过这篇文章后能够有所收获!
1.计算机最基本的体系结构
冯·诺依曼体系结构:
中央处理器/cpu:
离cpu越近的设备,效率越高,成本越高。
离cpu越远的设备,效率越低,成本越低。
所以,虽然cpu的运算速度很快,但是输入设备和输出设备是很慢的,如果去掉内存,计算机采用最上面的结构,那么整台计算机的效率不取决于cpu,而是取决于输入设备和输出设备。
除非把计算机里面的存储设备换成寄存器,这样的计算机运行效率是非常可怕的,但它的造价也十分高昂(几千万)。
这时内存就起到了十分重要的作用(效率也是很高的),它在极大程度上提高计算机效率的同时,造价也没有高多少,这让大多数人有能力买电脑,手机。买的人多了,就有了网络的需求,后来才发展起了网络。
由此可以看出:冯·诺依曼体系结构是非常伟大的!
2.操作系统
图中介绍的比较清楚
补充:
硬件会更新迭代,当硬件更新后,难道操作系统也要更新一下才能访问更新后的硬件嘛?
这里,硬件厂商会提供对应硬件的驱动程序,每一个硬件都有驱动程序,操作系统是通过驱动层来管理硬件的!
操作系统存在的意义:
对下,很好的管理软硬件。对上,为用户提供良好(稳定的,安全的,高效的)的运行环境(操作系统存在的目的)。
六个字:
先描述,再组织。
描述就是把对象描述出来,组织就是再组织链表,顺序表等以及完成增删查改等操作。
还有就是操作系统对软硬件的管理其实就是对其数据的管理。
由此可见,在操作系统中,存在大量的数据结构,其中包含大量的数据。
数据结构这门学科就是教我们如何高效的管理数据的学科。
另外,为保护操作系统,用户不可以直接访问操作系统,用户必须调用系统调用接口才可以访问操作系统,进而访问软硬件等。
图中,操作系统和系统调用才是完整的操作系统。
3.进程
进程=PCB+自己的代码和数据。
PCB内有程序的基本属性,操作系统通过管理PCB来管理程序。
操作系统也是软件,开机时,需要加载到内存中。PCB需要加载到操作系统中。
最终,操作系统对进程的管理转换成了对链表的增删查改!
ps:查看进程
a:相当于all
xj:显示进程的详细信息
一般,进程的名字和可执行程序的名字一样。
grep是按关键字查找,另外grep启动后也是一个进程,所以会显示有两个进程。
显示进程中,一行多列信息,每一列的含义。
连续执行两条指令。
既想看头部信息,又想按关键字查找,就按上图中的方法。
而pid是操作系统内部的内核数据结构,用户不可以直接访问。只能通过系统调用:getpid。
pid_t是无符号整型。
如何查看进程,如何结束进程,谁是子进程,谁是父进程:
grep -v grep去掉grep的行。
创建子进程。
父进程和子进程共享代码和数据。这是hello world 为什么会被打印两次的原因(父,子进程各自执行一次)。
这样更直观一些。
让父子进程执行不同的代码:
kill掉任何一个进程都不会影响另一个。
在启动一个进程时,系统会在/proc目录下创建一个以进程pid命名的目录,结束进程时会删掉该目录。
ls /proc/pid -l可以看到该进程的具体数据,比如cwd,exe等。
当前路径就是进程当前所处路径:cwd
chdir:修改进程的工作路径,修改之后,log.txt就创建在了修改之后的路径下,而不在可执行程序的路径下!
4.进程状态与优先级
让中间的指令总是被执行。
为什么我的进程一直在执行,查到的状态却总是S呢?
因为在cpu真正执行printf函数时才是r状态,在数据从内存刷新到显示器时,进程处于等待阶段,才会是S状态。由此可见,cpu的速度是很快的!
有+号,表示在前台运行,没有+号,表示在后台运行。在前台运行时,可以用ctrl c终止,后台不可以,只能kill掉。
在对应指令后加&表示在后台运行。
kill -9:杀掉
kill -19:暂停
kill -18:继续
T/t目前可以理解成一个意思,在调试时进程会暂停,也可以通过kill -19 pid来暂停进程。
其实,在我们调试打断点时,进程运行到断点时,系统会给进程发送19号命令让其暂停。
之前遇到暂停的场景:调试!
在内存严重不足的时候,操作系统有权利杀掉进程,释放空间。
D:深度睡眠,不可被杀!
4.1僵尸进程和X状态
僵尸进程的实验代码。
在以后我们会用接口:waitpid对子进程的数据进行回收。
孤儿进程的实验代码。
以后用waitpid对子进程的数据进行读取,子进程会从z状态进入x状态,然后由OS进行释放。
4.2进程运行状态
这张图片左上角的是操作系统进程状态的理论,而Linux中的r s z x等状态是具体实现!
4.3阻塞状态
其实s状态就是阻塞状态,d状态也是阻塞状态。
例如在cpu执行scanf时,等待用户输入数据时的状态就是阻塞状态。
设备也有自己的数据结构,它们的数据通过链表的方式链接起来。
各种设备也有自己的等待队列(wait_queue),需要设备数据的进程会从cpu中的运行队列取下来链接到对应设备的等待队列中,这样该进程就不会被cpu调度了。这个状态就是进程的阻塞状态。等对应设备的状态变为OK时,操作系统会把进程重新链入到运行队列中,这个过程叫做唤醒。其实t状态也算是一种阻塞状态!
4.4阻塞挂起状态
有进程处于阻塞状态且OS内存十分吃紧,OS会将阻塞的进程的数据和代码转移带swap分区。此时,被转移的进程处于阻塞挂起状态。这是以时间换空间的做法。
但是swap分区的空间不宜过大(一般为内存的一到两倍),如果太大,操作系统会过度依赖swap分区,系统的效率会降低。
4.5进程切换
函数返回值是通过寄存器返回的!
进程在cpu中产生的临时数据叫做进程的上下文数据。
当某个进程的时间片结束,cpu中的数据会存储到该进程的pcb中,cpu接着调度下一个进程,当再次轮到该进程调度时,pcb中的上下文数据在转到cpu中继续调度。这就叫进程切换!