首页 > 系统相关 >linux下的进程

linux下的进程

时间:2024-03-23 16:58:27浏览次数:25  
标签:fork 调用 struct init exit linux 进程

创建进程

众所周知linux由unix发展而来,所以本文先就unix进程先论为快,unix的进程创建很特别,许多其它的操作系统都提供了产生(spawn)进程的机制:首先在新的地址空间里创建进程,读入可执行文件,最后开始执行。unix采用与众不同的实现方式:

它把上述步骤分解到两个单独的函数中去执行fork()和exec(),调用fork()拷贝当前进程创建一个子进程(PID,某些资源量和统计量不一样)

写时拷贝

传统的fork()系统调用直接把所有的资源复制给新创建的进程,实际上这种实现过于简单并且效率底下,因为它拷贝的数据也许并不共享,linux的fork使用写时拷贝,只有在写入时,数据才会拷贝

fork 

linux通过clone系统调用实现fork,fork,vforkg和__clone库函数根据各自需要的参数标志去调用clone,然后由clone去调用do_fork

        do_fork完成创建中的大部分工作,它定义在kernel/fork.c文件中,该函数调用copy_process函数,然后让进程开始运行。copy_process完成的工作很有意思:

        1.调用dup_task_struct为进程创建一个内核栈,thread_info结构和task_struct,此时父进程和子进程完全相同

        2.检查并确保新创建子进程后,资源合法

        3.进程描述符内的许多成员要被清0或初始化

        4.子进程状态被设为TASK_UNINTERRUPTIBLE,以确保不会投入运行

        5.copy_process调用copu_flags以更新task_struct的flags成员,降权

        6.调用alloc_pid为新进程分配一个有效的pid

        7.根据传递给clone的参数标志,copy_process拷贝或共享打开的文件,文件系统信息

        8.返回一个指向子进程的指针

终结进程

一般来说,进程的析构时自身引起的。它发生在进程调用exit系统调用时,既可能显式调用系统调用,也可能隐式地从某个程序地主函数返回(c语言编译器会在main()函数后放置调用exit),不管怎么终结的,大部分都依靠do_exit它定义在kernel/exit.c中,工作:

        1.将task_struct中的标志成员设为PF_EXITING

        2.调用del_timer_sync删除任一核内定时器

        3.调用acct_update_integrals输出记账信息

        4.调用exit_mm释放mm_struct

        5.调用sem_exit。如果进程排队等候IPC信号,它则离开队列

        6.调用exit_files和exit_fs分别递减文件描述符和文件系统数据的引用计数,如果将为0则释放

        7.设置退出代码

        8.调用exit_notify向父进程发射信号,寻找养父

        9.do_exit调用schedule切换到新的进程

 孤儿进程

一个父进程退出,它的子进程还在运行,那么那些子进程将成为孤儿进程,孤儿进程将被init进程所收养,init进程pid为1是所有进程的祖宗,并由init进程对他们状态进行收集工作

 僵尸进程

一个进程使用fork创建子进程,如果子进程退出,而父进程并未调用(进程调用exit后并不会完全删除,还会残留进程描述符,既没有资源也无法响应,处于僵死状态)wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍保存在系统中,这种进程称之为僵尸进程

        如何查看?

利用ps即可查看进程信息,标为z的就是僵尸进程

        如何处理?

改写父进程,在子进程死后为他收尸

Kill父进程,父进程死后子进程过继给init进程,init负责清理僵尸进程

调度进程

I/O消耗型和处理器消耗型

进程可被分为I/O消耗型和处理器消耗型:

前者进程的大部分事件用来提交I/O请求或等待I/O请求,因此运行状况并不固定

        相反,后者是大多数时间用于执行代码,对于这种我们一般是提高运行时间,降低调度频率,当然划分并不角度,如X window服务器具有二向性

进程优先级

linux采用两种不同的优先级范围。第一种是nice值,值越小越优先,从-20到+19

第二种是实时优先级,从0到99它与nice值相反,越大越优先

 未完待续......

标签:fork,调用,struct,init,exit,linux,进程
From: https://blog.csdn.net/KKKK250/article/details/136969407

相关文章

  • Linux--Flappy_bird实现
    目录voidhandler(intsig): mian:voidinit_curses()intset_timer(intms_t); 小鸟的操作: voidshow_pipe(): voidcreate_list()voidclear_pipe()voidmove_pipe(); test_bird.c完整代码:代码实现:#include<stdio.h>#include<curses.h>#include<signal.......
  • linux分卷压缩解压
    1.压缩:.首先是考虑压缩,无论在windosw还是linux中tar这个压缩工具都有(windows可以使用7z这个工具进行分卷tar的压缩,自行网络下载)7z安装好windows下右键菜单就可以找到linux下压缩命令:格式tarcvzf-filedir|split-d-b50m-filename样例:tarcvzf-./dir|split-d-......
  • Linux 创建用户不创建家目录,配置ssh密钥的方式
    创建用户不创建家目录useradd-Mtest-user创建ssh密钥对文件#一路会车使用默认值ssh-keygen-trsa-mPEM配置test-user使用密钥vim编辑sshd_config配置文件。vim/etc/ssh/sshd_config添加以下内容,AuthorizedKeysFile配置密钥(公钥)文件所属的位置。MatchUsercodi......
  • skynet框架:跨进程组播实现方案
    存在业务场景,从单点进程(source)批量向集群内其他节点(target)推送消息,目标节点数量可能达三位数。提供一个实现方案:target上开启进程内的组播服务,只负责当前节点的组播推送业务;服务支持接收其他节点的通知消息(目标服务只在所在节点内的组播服务上做订阅等操作,由该组播服务负责管理......
  • 本地主机连接Linux虚拟机中的mongodb,并使用studio 3T连接,同时项目启动连接mongodb刷新
    本部分只做个人纪录**1.安装mongodb**本部分为尚硅谷的电影推荐系统的文档,具体以实际存放位置为准//通过WGET下载Linux版本的MongoDB[bigdata@linux~]$wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.3.tgz//将压缩包解压到指定目录[......
  • Linux操作系统学习2024.03.23
    Linux操作系统学习目标2024.03.23一.操作系统1.1作用:主要作用是管理好硬件设备,并为用户和应用程序提供一个简单的接口,以便于使用,作为中间人,连接软件和硬件。1.2不同应用领域的主流操作程序·桌面操作系统:1.Windows系列2.macOS3.Linux·服务器操作系统:1.Linux2.Windows......
  • ElasticSearch的安装(Linux版)
    1.获取安装资源(文末有文件)https://www.elastic.co/cn/downloads/elasticsearch2.上传文件并解压cd/opttar-xfelasticsearch-7.8.0-linux-x86_64.tar.gzrm-rfelasticsearch-7.8.0-linux-x86_64.tar.gz3.创建普通用户并授权#新增user用户useradduser......
  • Linux网络相关命令
    ping:测试连通性ip命令:用于网卡信息、添加IP、路由管理等ss命令:用于连接统计等mtr:用于路由追踪ethtool:用于网卡信息查看iptables:防火墙规则管理、转发规则管理ipvsadm:负载均衡规则管理arping:ip冲突检测telnet:连接联通性ssh:远程登录wget:下载文件nc:瑞士军刀mail:邮件nslo......
  • Linux 学习之路 -- 权限2
    目录1.文件的权限<1>chown命令<2>chmod命令另一种修改权限方式<3>chgrp命令2.文件类型3.关于文件的误区和一些问题1.文件的权限前面已经粗略的介绍了一下文件权限的修改命令chmod,这里继续上面的介绍。这里我们把拥有者的权限修改成只有可执行,再去掉用文件看看......
  • linux中的用户分类与权限管理
    普通用户和管理员root用户的分类和组:/etc/passwd  保存了操作系统中所有用户的信息root:x:0:0:root:/root:/bin/bash字段1:用户名字段2:密码占位符(弃用)字段3:用户的uid  0表示超级用户,500-6000普通用户,1-499为程序用户字段4:基本组的gid  先有组后有用户字段5:用户信息记录字段......