linux是一个多任务,多用户的操作系统,操作系统借助于进程来管理计算机的软, 硬件资源,支持多任务的并行执行.
为了同一时间执行更多任务,进程内又分出很多线程,线程不拥有系统资源,他与同属于一个进程的线程共享这个进程拥有的全部资源,进程页拥有独立的内存,其内部的线程共享这些内存,一个线程可以创建和撤销另一个线程,同一个进程中多个线程可以并行执行.
每个进程都是通过唯一的进程ID标识的,ID时一个非负数.还可以通过相应的函数获得ID外的一些其他标识符.
linux 进程又三部分组成:
~代码段 存放程序的可执行代码
~数据段 存放程序的全局变量, 常量 , 静态变量
~堆栈段 堆用于存放动态分配的内存变量, 栈用于函数调用, 它存放着函数的参数, 函数内部定义的局部变量.
linux 系统进程有以下几种状态:
~运行状态 R
~可中断等待状态 S
~不可中断等待状态 D
~僵死状态 Z 进程已终止,但进程描述符依然存在,直到父进程调用wait()函数后释放
~停止状态 T 因为收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行或者该进程正在被跟踪.
ps 命令可以查看进程当前状态.
linux 为了控制进程提供了一系列系统调用
~fork 创建一个新进程
~exit 终止进程
~exec 执行一个应用程序
~wait 将父进程挂起,等待子进程终止
~getpid 获取当前进程的ID
~nice 改变进程优先级
fork()函数是创建一个新进程的唯一方法, 有两个返回值
1 父进程调用fork()函数后的返回值,是刚刚创建的子进程的ID
2 子进程调用fork()函数后的返回值, 是0.
若创建失败,只返回-1
fork 与vfork
相同点: 调用一次,返回两次
不同点:~fork:子进程完全复制父进程的资源,独立于父进程,良好的并发性,但浪费空间,哪个进程先运行取决于系统的调度算法
~vfork:子进程共享父进程的地址空间,子进程对该地址中任何数据的修改父进程可见,保证子进程先运行,调用exec或exit之后父进程才可被调用,如果调用之前子进程要依赖父进程的某个行为,就会造成死锁.