Linux进程相关概念

简介:
1.进程调用 
2.CPU分配
3.进程创建 
4.进程调度
5.内存分配与回收
6.进程类型 
7.进程状态 
8.IO过程
9.IPC

                
一、Linux进程及作业管理
1.进程调用:
    call:调用别人实现编写好的功能模块
    可以基于{system call/lib调用}或者混合调用
    
    系统调用:通常在内核发生
    库调用:有的可能是一个独立的模块,有的可能是对系统调用的二次封装
    
进程调用意味着什么?
    CPU指令:普通指令:ring3 //任何应用程序都可以执行
        特权指令:ring0//不允许程序随意调用,由内核调用,来实现硬件平台的管理
    任何程序需要运行特权指令,OS把其封装成调用,必须要向内核发起调用,由内核执行
        system call在ring3,发起在ring0运行,然后调用完成后返回ring3
    该进程需要运行ring0的指令的时候:发起软中断,目的在于发起system call
        //内核把该代码载入cpu,把执行结果返回给调用者,调用后继续运行后续代码
        //程序需要暂停运行:system call之后继续运行,这叫软中断
    
    CPU指令分为:
        特权指令:ring 0 //root环,内存寻址,内存控制,设置内存的访问权限为w/r
                //普通用户的特权指令是不允许运行特权指令的
                //内核级别和OS级别代码,才会去运行特权指令
        ring1,ring2,//历史原因,没有使用
        用户指令:ring3

        
    运行用户代码的时候:用户模式/用户空间
    进程发起system call,需要软中断:内核模式/内核空间
    
    例如mkdir /tmp/a :这就需要一次中断,因为要对硬件进行操作
    内核的作用:进程管理,fs,network functions
    cpu会在用户指令和内核指令之间来回切换:模式切换
    一般:70%代码在用户进程,其他的内核进程最好
    
2.CPU如何进行资源分配//假如cpu只有一个
    时间片切割:time split
    进程有优先级的概念:轮流使用CPU
    1.假如一个进程霸占cpu不放
        需要一个仲裁机制:内核(进程管理:负责进程调度)
    2.保存进程状态 
        在cpu上的寄存器上,cpu上有寄存器:保存的是当前进程的状态
        一旦切换到下一个指令后,这些值都会发生改变
    进程保护与恢复:
        现场信息:由内核负责保存,在内存中存放
            进程信息:进程号,占用的内存号,状态,cpu时间分配等
        切换由内核完成,
        linux内核存储的进程信息的固定格式:task struct //task结构体
        //结构体信息,使用链表存储,方便查找
        //多个任务的task struct组成的链表:task list
    process:运行中的程序的一个副本
        存在生命周期
        //程序是一个静态的文件
    3.当中断发生的时候,必须由内核接管一切
    
3.进程创建
    每一个进程的组织结构都是一样的
    内核创建了第一个进程:init
    init:上帝的使者
        //init创建后,意味着用户空间也被创建出来了
    相当于总代理:
        他可以创建子进程,子进程创建子进程
        父子关系
        进程:都由其父进程创建 //需要向内核申请
            fork(),clone() //创建子进程[可以为同一段内存空间],只有在子进程需要写数据的时候,才分家CoW(写时复制)分配另外一段空间
                            //进程=指令+数据,需要写数据的时候,CoW复制一份,进行分家
    进程终止的话:释放空间,父进程负责
        父进程创建子进程:为了让子进程运行某一特定任务,子进程完成后,需要进行销毁

    系统调用:
        read(),write(),open()
    并行执行,以线程运行:很普遍//一个父程序,创建其子进程,其线程可以同时运行在其他cpu上
    一个进程可以产生多个线程,并行运行//多核
        
4.进程调度
    优先级:划分了固定个数://kernel 2.6之后
    0-99:实时优先级 //数字越大优先级越高
    100-139:静态优先级//用户可指定,数字越小,优先级越高
    
    nice值:-20-+19 //100-139 ,-20:100  +19:100 //调整优先级
    Linux内核为了快速实现进程的调度:把系统上代运行的进程分了140个队列
        相同优先级的拍一队 //只需扫描队列的首部即可
        
        Big O:算法复杂度
            O(1),O(logn),O(n),O(n^2),O(2^n)
        
        每一对运行队列都有两队://当运行队列完成后,和过期队列对换身份
            运行队列:真正扫描的
            过期队列:已经被调度过的队列
            
    task struck中存放的数据:
        state,thread_info,flags,mm,tty,....
        线程,内存信息,tty,fs,files,信号等
        
5.内存的分配与回收,创建等
    内存分片:4K大小,单个成为page
        page frame:页框,用来存储页面数据
            存储page//页框中存储的数据成为页数据
    内存不能预测进程需要多少空间来使用:假设
        ---------------------------------|
        |--------|-----------------------|//内存
        内核占用 | 其他进程使用
    把其他的内存:切割成固定大小的片段page,把这些片段分配给其他进程
    内存占用的大小:不是固定的,后期可能会增长的
    
    进程启动后,内核把众多分散的空闲的空间中找,拼凑起来分配给该进程
    内存中存在大量的:page frame组成
        而这些page frame:都以不连续或者部分连续的方式组成
    
    页对应的是线性地址的东西   而页框对应的是物理地址   是实际的存储区域
    
    告诉进程是连续的:通过一个中间层,伪装
    每一个系统都认为:世界上只存在两个人,自己和内核
    
    进程的线性地址空间:每一个进程都假设自己有3G(32bit)的内存可用
    物理地址空间:真正占用的空间可能只有很少
        //他们之间是离散对应的,虚拟内存机制
    
    LRU:最近最少使用算法
        线性地址空间映射到内存空间
    进程只能访问:线性地址空间,
        MMU:Memory Management Unit//内存管理单元:负责内存线性内存和物理内存之间的映射
    一旦内存不够使用:LRU算法,置换到swap中,轮到该进程的时候,再次换回去 
    
    //内核为每一个进程都保存有一个task_struck:记录了线性地址空间和物理地址空间的对应关系
    
    有些程序的数据是必须在内存中的:常驻内存集
    能够交换出去的:虚拟内存集
    
    Linux内核:抢占式多任务//进程优先级高的抢占进程优先级低的
        可以把别人运行所用的CPU时间片抢过来
        只有在相应的时间点,才可以抢,不能进程刚上线,就开始抢了
    
6.进程类型:
        守护进程:daemon,由内核在系统引导时启动的进程
        前台进程:用户通过终端启用的进程//和终端相关
            注意:也可把在前台启动的进程送往后台,以守护模式运行
            
7.进程状态:
        运行态:running
        就绪态:ready
        睡眠态:
            可中断睡眠:interruptable
                    //CPU时间片到了就可以直接运行
            不可中断睡眠:uninterruptable //例如一个进程需要等待加载一个大文件,即使下一个cpu时间片到了,也没有满足运行条件
                    //进程等待的这个过程做什么呢?不可能让他占领cpu,只能让他把cpu让出来,让其他进程运行,直到该进程满足该条件
                    //这就叫做一次IO过程
                    //IO过程:某一进程需要加载的数据,内存中没有,就不得不请求内核从磁盘把数据装入到内存
                    //进程是没有权限,加载数据到内存中的,只有向内核申请,但是内核通常只是加载的数据,是加载到内核空间中的内存中的
        停止态:暂停于内存中,但不会被调度,除非手动启动之,stopped
        僵死状态:zombie,一个子进程被创建后,并且任务完成后,等待被父进程清理
            //父进程挂了,但是子进程依然存在    
        
8.IO过程:
        1.数据首先从磁盘装入到内核内存中去
        2.复制一份到进程内存中去
    进程的分类:
        CPU-Bound //CPU密集型
        IO-Bound //IO密集型
        

9.IPC
IPC:inter preocess communication:进程间通信
    //进程是意识不到其他进程的存在的
同一主机上:
    signal //常见通信方式
    shm:shared memory
    semerphor:
不同主机上:
    rpc:remote procecure call //远程过程调用
    socket:基于套接字的通信
        //一个进程监听在一个位置上,可以接受别人发送的消息
        //一端只管向socket发数据,内核会自动把数据传送到另一端,另一单











本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1977631,如需转载请自行联系原作者

相关文章
|
5月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
242 67
|
4月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
198 16
|
4月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
123 16
|
4月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
101 20
|
3月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
76 0
|
3月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
107 0
|
3月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
68 0
|
3月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
76 0
|
6月前
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
6月前
|
存储 Linux 调度
【Linux】进程概念和进程状态
本文详细介绍了Linux系统中进程的核心概念与管理机制。从进程的定义出发,阐述了其作为操作系统资源管理的基本单位的重要性,并深入解析了task_struct结构体的内容及其在进程管理中的作用。同时,文章讲解了进程的基本操作(如获取PID、查看进程信息等)、父进程与子进程的关系(重点分析fork函数)、以及进程的三种主要状态(运行、阻塞、挂起)。此外,还探讨了Linux特有的进程状态表示和孤儿进程的处理方式。通过学习这些内容,读者可以更好地理解Linux进程的运行原理并优化系统性能。
227 4