进程是os中非常重要的一个概念,也是十分基础的概念,十分重要。以下是自己学习的一点学习笔记,是个人见解,欢迎批评指正。
1、看看unix标准对于进程的定义:“一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源”。线程站且放到后面介绍。 计算程序就是数据结构和算法的组合。其中算法就是实现功能的方法,而数据结构就是实现算法采用的数据结构,其实也包括实现的代码。简单理解,进程是正在运行的程序,每个运行中的程序都可以看作一个进程。linux是支持多个进程同时运行的,这个也很容易理解,比如我现在写着blog和听歌,就运行这浏览器和播放器两个进程。
当然进程并不是简单的执行中的代码那么简单,还包括其他的系统资源,例如打开的文件,挂起的信号,内核内部数据,处理器状态,地址空间及一个或多个执行线程,当然还包括用来存放全局变量的数据段。关于linux中进程和线程的之间的关系和区别暂时不介绍,留在后续文章中。
2、进程的查看。ps命令提供一种查看进程相关状态信息,包括进程PID、进程状态、进程所持有的用户名等等。
~$ ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 11:04 ? 00:00:01 /sbin/initroot 2 0 0 11:04 ? 00:00:00 [kthreadd]root 3 2 0 11:04 ? 00:00:01 [ksoftirqd/0]root 5 2 0 11:04 ? 00:00:00 [kworker/0:0H]root 7 2 0 11:04 ? 00:00:10 [rcu_sched]root 8 2 0 11:04 ? 00:00:00 [rcu_bh]root 9 2 0 11:04 ? 00:00:01 [migration/0]root 10 2 0 11:04 ? 00:00:00 [watchdog/0]
这里仅仅查看列举了本机中前10进程的相关信息。其中比较重要的两个标识符为:PID为进程标识符,PPID为父进程的进程标识符。UID为用户的标识符,这里为超级用户root。其他的还涉及到时间(STIME,TIME),TTY为标准输出终端,CMD为命令行。通过ps命令组合不同的查看选项,可以查看进程很多信息。这里并不一一介绍,读者可以通过man ps命令来了解相关的信息,有比较详细的文档说明。
3、进程的创建。linux内核在创建一个新的进程时,通过复制当前进程的来达到创建新进程的目的。新进程成为子进程而源进程为父进程,两者几乎一模一样,两者主要通过PID值来区分。新的进程在创建的程序处开始执行,并且共享父进程的代码。下面有个例子。
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int
main()
{
pid_t pid;
char
*message;
int
n;
printf
(
"fork program starting\n"
);
pid=fork();
if
(pid==-1){
perror
(
"fork failed"
);
exit
(1);
}
else
if
(pid==0){
message=
"this is the child"
;
n=5;
// sleep(n);
}
else
{
message=
"this is the parent"
;
n=3;
// sleep(n);
}
for
(;n>0;n--){
puts
(message);
sleep(1);
}
exit
(0);
}
程序执行结果如下:
$ ./fork1 fork program starting
this is the parent
this is the child
this is the parent
this is the child
this is the parent
this is the child
this is the child
this is the child
linux提供fork系统调用来创建新的进程。fork进程新创建的进程就会下一条指令处开始执行,那么系统是如何区分父亲进程和子进程的呢。当主要还是通过fork进程放回的pid来确定的,子进程的pid返回值为0而浮进程为1。关于fork的用法可以查阅doc,有比较详细的介绍。
DESCRIPTION fork() creates a new process by duplicating the calling process. The new process, referred to as the child, is an exact duplicate of the calling process, referred to as the parent, except for the following points: 其实上面的那个小程序还有点小bug,在这里先放一下,后续会提到,主要原因就是父进程比子进程先终结,白发送青巳,老子死了儿子没长大,谁抚养呢。