Linux多进程

获取进程pid、ppid : getpid()   getppid()
进程的真实用户id和真实组id : getuid() 、getgid()
进程的有效用户id和有效组id : geteuid()、getegid()

程序和进程的区别:
程序:是代码,是静态的。
进程:程序的一次执行过程,是linux基本调度单位。进程通过进程控制块(PCB)来描述。

进程调度:     
内核的 调度器负责在所有的进程间分配CPU执行时间,称为时间片(time slice),它轮流在每个进程分得的时间片用完后从进程那里抢回控制权。
调度周期(时间片周期):就是一轮。一轮有多个进程执行。每一个进程在一个调度周期里分一个时间片。

调度策略:
linux下有三种调度策略:
1.实时调度策略FIFO
2.实时调度策略RR
3.普通调度策略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 <unistd.h> 
#include <stdio.h>
int main(){
  printf("pid=%d,ppid=%d\n", 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               //把任务拿到前台


猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/80501579