Linux 系统进程理解——标识符,状态
目录
进程描述-pcb
并行与并发
概念:
课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体
这短短的两行就概括了进程,但是进程的内在其实有更过东西,这就像我们说一个人有巨大的成就,但是呢?对于他的经历我们却很少去提及。进程就有点类似的感觉。对于进程我们还要去深入了解他的经历的。
进程描述-pcb
对于一个进程,操作系统为了更好的去管理,也是用了先描述再组织的做法,pcb就是他的描述。
task_struct是PCB的一种
在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_ struct内容分类
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器 :程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
标识符:我们再运行的每一个进程都有自己的pid,pid就是相当于他的唯一标识,类似于进了监狱你的名字就被剥夺了,只能有数字编号。而C语言有个函数叫做getpid就可以获得到这个程序标识符。
我们写这样的代码:
运行起来
然后我们要知道根目录下有个proc的目录,这是个内存级的目录当系统运行时才会才会加载信息,里面的内容是实时更新的,记录的是当前内存里存在的进程。我们来查看。
果然是有一个pid为21774的进程
我们可以进入proc里查看更详细的信息。
父进程与子进程
在linux系统当中像什么ls,pwd以及我们自己创建的进程,父进程都是bash(命令解释器),通过bash我们才可以对系统进行系统调用。为什么会有父进程这个东西呢?
其实很好理解,当我们想运行一个进程时当他崩掉之后但是我们并不像让他影响别的进程,所以我们就会去创建子进程,如果子进程崩掉了他也不会影响我们的子进程。
我们用getpid就可以查看父进程编号
运行起来:
我们再查看pid为16408就是bash
当然我们也可以用fork来创建子进程。
并行与并发
首先我们要知道并行和并发,我们一般的电脑只有一个cpu,当然也有很多个cpu的电脑。而我们的cpu执行代码并不是把进程代码执行完再进行下一个,而是给进程分配一个时间片,基于时间片轮流进行调换,而cpu运行速度是非常快的,我们人是感受不到的快。
并发:进程在一个cpu上运行
并行:进程在多个cpu上运行
时间片
所谓时间片呢,其实上面就已经提到了,一般在我们Linux/window系统下调度任务每次的时间。所以这可以解释我们的电脑为什么会卡了,就是进程太多了,cpu每次将所有进程的时间增加了。让你感受到了卡顿。这种呢?一般叫做分时操作系统。
当然也有实时操作系统,当然这种系统就与上面所说的相反了,这种系统一般在车载系统很常见,比如我们要进行自动刹车,就不能说是要分时了对吧,毕竟刹车是一辈子的事。
等待的本质:
所以等待本质就是:进入输入设备
阻塞本质:不同进程进如不同队列
还有一个概念叫做挂起:挂起呢其实是在阻塞时进行的。
当我们的内存空间严重不足时,且我们进程在不同队列,我们的进程就会先进入swap分区,当我们输入之后,当我们空间缓解后再加载到内存当中
进程状态:
R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。