Linux多进程

2019-07-13 01:29发布

获取进程pid、ppid : getpid()   getppid()进程的真实用户id和真实组id : getuid() 、getgid()进程的有效用户id和有效组id : geteuid()、getegid()
程序和进程的区别:程序:是代码,是静态的。进程:程序的一次执行过程,是linux基本调度单位。进程通过进程控制块(PCB)来描述。
进程调度:     内核的调度器负责在所有的进程间分配CPU执行时间,称为时间片(time slice),它轮流在每个进程分得的时间片用完后从进程那里抢回控制权。调度周期(时间片周期):就是一轮。一轮有多个进程执行。每一个进程在一个调度周期里分一个时间片。
调度策略:linux下有三种调度策略:1.实时调度策略FIFO2.实时调度策略RR3.普通调度策略OTHER
FIFO、RR对事实性要求高。FIFO:运行优先级高的。高的不运行完,低的就不能运行。RR:优先级相同的轮着来运行。先运行优先级高的,高的运行完了,再运行低的。OTHER:大家一起来。所有优先级的一起来。在一个周期内,优先级高的拿到的时间片多。
公司里面基本所有的服务器都是OTHER。
进程标识pid:每一个进程都有一个唯一的进程id,即pid。每个进程还有自己的父进程,每个进程的ppid就是父进程的id (即parent pid)。所有的进程都有同一个祖先进程:init进程。其pid为1。本来他是0号进程,后来他把自己改成1号了。通过函数getpid()、getppid()得到pid和ppid。
例:获取进程的pid、ppid#include  #include int main(){  printf("pid=%d,ppid=%d ",getpid(),getppid());   //直接输出的情况  pid_t pid;  pid=getpid();                                                      //通过变量获取的情况  printf("%d",pid);       return 0;}
进程的用户id和组id:进程的真实用户id和真实组id:缺省情况下,那个用户运行程序,进程的真实uid就是这个用户的用户id,进程的真实gid就是这个用户的组id。通过函数getuid()和getgid()得到。进程的有效用户id和有效组id: 内核对进程的访问权限检查时,它检查的是进程的有效用户id和有效组id,而不是真实用户id和真实组id。缺省情况下,用户的(有效用户id和有效组id)与(真实用户id和真实组id)是相同的。有效用户id和有效组id可以通过geteuid()和getegid()得到。
s权限:当某一个用户执行二进制可执行文件时,权限会被提升为对应者(s加在哪个组,就是哪个组,一般加在拥有者)的权限。
例子:passwd命令分析[liupc@ubuntu /etc]$>ll passwd-rw-r--r-- 1 root root 2248 May 12 09:03 passwd    //通过ll命令可以看/etc/passwd文件:liupc用户是没有权限往/etc/passwd写东西的。但                                                                                  是我们知道,我可以使用passwd命令来修改自己的密码。因为我下次登入的时候可以                                                                              用新的密码登,说明我在liupc用户下使用passwd命令对/etc/passwd文件做了修改。[liupc@ubuntu /etc]$>which passwd                      //通过which命令查看passwd命令的绝对路径/usr/bin/passwd
[liupc@ubuntu /usr/bin]$>ll passwd                       //通过ll /usr/bin/passwd可以看到passwd变成了红底,并且具有了s权限。这样普通用户-rwsr-xr-x 1 root root 49644 Apr 20  2015 passwd*  在执行这个可执行文件时,进程就拥有了root的权限,这样就可以修改/etc/passwd了。                       程序执行是,进程的有效id就是root。在前面通过stat实现ll命令时,用到了st_mode的                                                                              后9位和前4位,中间有3位当时认为是没用的,其实这三位中间有一位就是与x进行操                                                                              作,产生s的。例子:s权限的使用步骤1:  su liupc                   touch aaa                 //使用liupc用户建立文件  chmod 600 aaa         //把文件aaa的权限改为600,这个时候其他用户修改不了这个文件  echo "hello" >aaa   步骤2:  vim change_aaa.c     //编写可执行文件,修改文件aaa  gcc change_aaa.c  chmod u+s a.out       //给可执行文件增加s权限,这样进程就拥有了liupc的有效用户id.这样就可以操作aaa文件了。步骤3:  su liming       //切换用户  ./a.out aaa                //执行


中断、系统调用:服务器编程:只能用系统调用。只有调用了系统调用,才进入内核态。系统启动起来,那一块内存是内核用的。那一块是用户态用的,都订好了。

linux下进程管理:        ps -elf:主要看  s pid ppid time(运行时间累计)ps -elf 共有四种状态需要掌握:R:运行(进程就绪和执行在ps-elf下都显示为R)S:睡觉(等待资源)T:暂停(ctrl+Z就是发送暂停的信号,使进程暂停。gdb的原理就是用了暂停的信号。)Z:僵尸(已经结束,但还未被回收)ps -aux:主要看进程的cpu 内存mem占用率.top命令:实时显示cpu使用情况kill:kill -9 不要把他老爹干掉了!nice、renice改变优先级,公司用不到&./a.out &       //让进程后台运行bg 2              //让暂停的信号再起来,放到后台fg 1               //把任务拿到前台