Linux:进程(一)
创始人
2024-02-04 02:36:09

文章目录

  • 前言
  • 一、进程是什么
  • 二、描述进程--PCB
  • 三、查看进程
  • 四、通过系统调用获取进程标示符
  • 五、通过系统调用创建进程-fork初识
  • 六、进程状态
  • 七、进程状态查看
  • 八、僵尸进程(Z:zombie)
    • 1.是什么
    • 2.为什么
    • 3.怎么避免
  • 九、孤儿进程
  • 十、进程优先级
  • 十一、其他概念
  • 总结


前言

  前面我们学习了gdb的一些基础命令,今天来看看进程这个概念。


一、进程是什么

  进程 = 对应的代码和数据 + 进程对应的 PCB 结构体
  那么问题来了,PCB是什么?
  难道是高中生物?错辣!那是PCR
  PCB全称Process Control Block,即 进程管理块

二、描述进程–PCB

  进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  Linux操作系统下的PCB是: task_struct
  task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

三、查看进程

  进程的信息可以通过 /proc 系统文件夹查看

[wkj@VM-4-13-centos lesson8]$ ls /proc/1
ls: cannot read symbolic link /proc/1/cwd: Permission denied
ls: cannot read symbolic link /proc/1/root: Permission denied
ls: cannot read symbolic link /proc/1/exe: Permission denied
attr       cgroup      comm             cwd      fd       io        map_files  mountinfo   net        oom_adj        pagemap      projid_map  schedstat  smaps  statm    task     wchan
autogroup  clear_refs  coredump_filter  environ  fdinfo   limits    maps       mounts      ns         oom_score      patch_state  root        sessionid  stack  status   timers
auxv       cmdline     cpuset           exe      gid_map  loginuid  mem        mountstats  numa_maps  oom_score_adj  personality  sched       setgroups  stat   syscall  uid_map
[wkj@VM-4-13-centos lesson8]$ ls /proc
1      1199   14040  20     24     259    27737  294  414  6411  7     925        cmdline    execdomains  kallsyms    locks    pagetypeinfo  stat           uptime
10     12     147    203    24085  26     27884  36   47   646   7301  990        consoles   fb           kcore       mdstat   partitions    swaps          version
10753  1217   16     21     25     260    28     37   49   65    8     991        cpuinfo    filesystems  keys        meminfo  sched_debug   sys            vmallocinfo
10968  13     1621   22     25007  26695  28826  38   50   650   8234  993        crypto     fs           key-users   misc     schedstat     sysrq-trigger  vmstat
11     13814  18     22268  25089  27     28850  389  51   654   8236  acpi       devices    interrupts   kmsg        modules  scsi          sysvipc        xpmem
1162   1389   19     22269  251    27052  289    39   52   657   8349  buddyinfo  diskstats  iomem        kpagecount  mounts   self          timer_list     zoneinfo
1166   1390   19897  22270  257    271    29     4    557  658   8350  bus        dma        ioports      kpageflags  mtrr     slabinfo      timer_stats
1175   14     2      23     258    277    293    410  6    659   9     cgroups    driver     irq          loadavg     net      softirqs      tty

四、通过系统调用获取进程标示符

  1. 进程id :pid
  2. 父进程id : ppid
#include 
#include 
#include 
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}

五、通过系统调用创建进程-fork初识

  1. fork有俩个返回值
  2. 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
#include 
#include 
#include 
int main()
{int ret = fork();if(ret < 0){perror("fork");return 1;
}
else if(ret == 0){ //childprintf("I am child : %d!, ret: %d\n", getpid(), ret);
}
else{ //fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);
}sleep(1);return 0;
}

六、进程状态

static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
  1. R运行状态(running) : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  2. S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠。
  3. D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  4. T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  5. X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
    在这里插入图片描述
      当服务器压力过大的时候,操作系统(OS)会通过一定的手段,杀掉一些进程,以求节省空间的作用。

七、进程状态查看

  ps aux / ps axj 命令

八、僵尸进程(Z:zombie)

1.是什么

  一个进程已经退出,但是还不允许被操作系统(OS)释放,处于一个被检测的状态,这个状态就是僵尸状态。

2.为什么

  维持该状态,为了让父进程和OS来进行回收。
  我是一个进程,如果我退出了,没有人来读我的数据,我就是僵尸!
在这里插入图片描述

3.怎么避免

  1. 让僵尸进程的父进程来回收,父进程每隔一段时间来查询子进程是否结束并回收,调用wait()或者waitpid(),通知内核释放僵尸进程 。
  2. 采用信号SIGCHLD通知处理,并在信号处理程序中调用wait函数 。
  3. 让僵尸进程变成孤儿进程,就是让他的父亲先死。
  4. 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。

九、孤儿进程

  父进程退出,子进程还在,子进程就叫做孤儿进程。孤儿进程会被领养,被1号进程领养(init,系统本身),这样就可以进行回收。

#include 
#include 
#include 
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;
}
else if(id == 0){//childprintf("I am child, pid : %d\n", getpid());sleep(10);
}else{//parentprintf("I am parent, pid: %d\n", getpid());sleep(3);exit(0);
}return 0;
}

十、进程优先级

  1. cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  2. 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
  3. 可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

十一、其他概念

  1. 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  2. 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  3. 并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行
  4. 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

总结

以上就是今天要讲的内容啦

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...