查看进程相关属性解释图

系统调用就是你去调用,或者简单一点,你在键盘上敲下了系统提供的接口比如:open、read、fork,那么此时,系统为了去执行这些指令,会从用户态变成内核态来执行,执行完后,再变回用户态把结果返回,这就是所谓的:操作系统只提供了系统调用接口来访问内核
循环查看一个进程信息的脚本
bash
while : ;do ps ajx |head -1;ps ajx|grep proc|grep -v grep ;echo "--------------------------------------------------------------";sleep 10;done
查看一个进程的ppid为4205父进程,结果如下:
bash
[txf@VM-4-5-centos lesson12]$ ps ajx | head -1 ;ps ajx | grep 4205 | grep -v grep
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
4204 4205 4205 4205 pts/0 11364 Ss 1001 0:00 -bash
4205 11364 11364 4205 pts/0 11364 R+ 1001 0:00 ps ajx
bash创建了一个子进程来执行ps ajx的命令
对父子进程写时拷贝的理解:
父进程与子进程共享代码段,暂时共享数据段,当有一个进程要改写数据时:1、父进程要改写数据,就会发生缺页异常,然后会建立真实的物理内存,然后在父进程的PCB中把父进程的虚拟内存映射到物理内存形成页表,然后改写数据。2、子进程要改写数据时,子进程共享父进程的代码段,而且不会把父进程的数据段全部复制到新的一块物理内存上,而是写时拷贝,哪块数据要改,操作系统就给它单独分配一块内存空间专门放要改写的数据,其他的不动,然后在子进程的PCB的页表中记录子进程中关于那个要改的数据的虚拟内存与单独分配的那块内存空间之间的映射关系,这样虽然子进程和父进程有同样的虚拟内存地址,但在运行时,会有不同的结果。
对进程状态的理解:
运行状态:
每个CPU都要维护一个自己的struct runqueue : 运行队列,CPU队列的方式对进程做调度,struct runqueue 包含了 struct task_struct* head ,struct task_struct* tail ,一个进程要运行,首先要先把一个进程放到运行队列中去。
调度器:一种函数可以把运行队列作为参数传进来,调度器就能找到所有排队的进程
自我理解:我编写了一个程序while(1) 死循环,如果CPU只执行一个程序完后,再去执行其他的程序,那我的页面不就一直被卡死了,真实情况是while(1),一直循环,我可以直接X掉,结束这个循环,为什么我能在循环在被执行时,还可以让CPU执行其他的指令,不就是因为PU不仅仅只执行循环这一个程序,而是给每个程序都分配了被运行的时间(时间片 int time_... ),这个程序运行了这么些时间,CPU转而去指令其他的程序
时间片足够短,这样在一段时间内,所有的进程代码都会被执行,(ps : 这也是边听歌边打游戏的底层吧 )这也叫多个进程并发执行
在CPU上会有大量的把进程从CPU上拿下去/放上来的动作 :进程切换
阻塞状态:
操作系统对硬件做管理也是先描述,在组织,创建strcut dev { int type,int status ,struct task_truct* head ;........}
如果一个进程要从键盘读取(scanf(.....)),如果键盘不输入,那么这个进程就绝对不能被放到运行队列中,这个进程要等待键盘资源,所以这个进程要被放到键盘的等待队列当中:struct task_struct* waitqueue ,进程在等待队列当中等待设备就绪,当我们的驱动程序读取我们的键盘,当键盘里有数据了,这个进程就会被放到CPU的运行队列里,这种等待特定设备的进程的状态称为该进程处于阻塞状态。
每个设备(的struct dev)都有一个等待队列,一个进程等待一个设备,如果这个设备没有就绪,此时进程就自动把PCB链入该设备的等待对列中,如果设备可读了,这个进程就把自己放运行队列里。
挂起状态(阻塞挂起状态):
如果多个进程都在等待,如果在等待时,操作系统的内存资源不足了,操作系统就会保留进程的PCB,然后把进程的代码和数据交换到磁盘当中,(交换区,哈哈😄):内存数据的换出/换入。
一个进程的代码和数据被换出了,只剩个PCB,此时这个进程就是挂起状态。
问题:
- 具体Linux当中的状态是如何维护的
- 在Linux当中,运行状态是什么,阻塞...
- ..............