Day3_IO进程线程

  • linux中库的制作

    • 库在系统中是一个二进制文件,他是由 .c文件(该文件不含main函数)编译而来的,库一旦做好后,其他文件就可以直接使用该库了,库分为静态库和动态库,不同的操作系统,库的形式有所不同,库的本质是源程序编译生成的二进制文件,使用时更加安全可靠

      • windows

        • 静态库:xxx.lib

        • 动态库: xxx.dll

      • linxu

        • 静态库:libxxx.a

        • 动态库:libxxx.so

    • 静态库

      • 所谓静态库,是由xxx.c程序编译生成的一个lib库名.a的一个二进制文件,当你需要改库的某个函数时,秩序编译主程序时,连接该库即可使用

      • 静态库体现在:当gcc编译的时候,会将你的主程序和库最终生成一个可执行程序,使用时就不需要在去其他地方找库的位置了,这就导致可执行程序的大小比较大,由于直接将库中的内容封装在可执行程序中了,所以使用起来比较方便,效率较高,缺点是可执行程序体积较大

      • 静态库制作过程

        • 准备对应的源程序和头文件

        • 将程序编译生成静态库

        • 使用静态库

      • 库的命名规范

        • 以lib开头,后面是紧跟库的名字,以 .a 结尾

      • 多文件进行编译

    • 动态库

      • 所谓动态库,也是一个二进制文件,后缀是lib库名.so ,当需要使用该库中的函数时,直接进行调用即可

      • 动态库的制作过程

        • 准备对应的源程序和头文件

        • 将源程序编译生成动态库

        • 使用动态库

        • 当执行可执行程序时,会有错误,无法执行,解决办法3个

          • 在命令行中,输入指令,更改库的路径,但是该操作只在当前终端有效

          • 将自定义的库放在/usr/lib 或者 /lib中,也能进行操作

          • 更改根目录下的 sudo vi /etc/ld.so.conf.d/libc.conf ,将自定义库的路径放入该文件中即可

  • 多进程

    • 进程概念

      • 进程

        • 正在执行的程序(程序的一次执行过程)

        • 进程就是正在执行的任务,是一个动态的过程,有声明周期,会随着进程的创建而分配资源,随着进程的消亡而释放空间

        • 进程是计算机分配资源的最小空间,每个进程计算机都会为其分配4G的虚拟内存,其中0 —3 G是用户空间,3—4G是内核空间

        • 每个进程都独立拥有自己的0-3G的用户空间,并且素有进程会共享3-4G的内核空间

        • 0-3G的用户空间,又分为

          • 栈区

          • 堆区

          • 静态区

        • 3-4G的内核空间中,通过一个task——struct类型的结构体来表述一个进程,进程控制块:pcb

        • 进程之间是相互独立的,可以单独被调度器进行调度

        • 系统在调度进程时的调度原则:时间片轮询,上下文切换

      • 进程的内存管理

        • 每个进程都会拥有4G的虚拟内存

        • 0-3G是用户空间,程序就放在该空间中,3-4G是内核空间代码使用

    • 进程和程序的区别

      • 进程是动态的,是程序的一次执行过程,有生命周期,多个进程拥有自己的0-3G的用户空间,共享3-4G的内核空间

      • 程序是静态的,没有所谓的生命周期,知识存储在磁盘上的二进制文件而已

    • 进程的组成

      • 每个进程由三部分组成

        • 进程控制块 PCB

          • 进程控制块是由task_struct结构体控制,该结构体中,记录了进程的所有相关信息,其中就包含了进程id: PID号

        • 数据段

          • 用来存放程序执行过程中的数据的

        • 程序段

          • 存放进程的可执行程序代码的 :.txt

  • 进程的种类

    • 进程一共有三种

      • 交互进程

        • 它是由shell脚本控制,可以直接跟用户进行交互,例如:文本编辑器

      • 批处理进程

        • 维护了一个队列,被放在队列中的进程,统一进行操作,但是需要指定进程的优先级,例如,使用gcc编译器一步到位进行编译程序

      • 守护进程(服务)

        • 脱离了终端而存在,会随着系统的启动而启动,随着系统的关闭而消亡,例如:计算机中的服务进程

  • 进程的PID概念

    • PID:进程的唯一标识(process ID)

    • PPID :父进程的id号

    • 进程的pid是进程的唯一标识,他是一个大于等于0的整数,并且每个进程的pid是独一无二的

    • 在一个linux 系统中,能够创建出的进程数是有限的,可以通过指令进行查看:cat /proc/sys/kernel/pid_max

    • 在根目录下的proc目录下,所有以数字开头的都是正在运行的进程号

  • 特殊的进程

    • 当系统启动后,会默认启动三个进程,进程号分别是:0,1,2

    • 0号进程(idel)

      • 他是linux系统在启动时,默认启动的第一个进程,这个进程叫做空闲进程,当没有其他进程执行时,才会执行该进程

    • 1号进程(init)

      • 该进程是由0进程产生,用于完成进程的初始化工作,当某个进程的父进程结束,那么这个进程就是孤儿进程,孤儿进程会被1号进程收养

    • 2号进程(kthreadd)

      • 该进程也是由0号进程产生,也被称为调度进程,当某个进程的时间片用完后,由2号进程完成调度功能

  • 有关进程的相关linux指令

    • 查看进程的命令

      • ps

        • ps -ef

          • 用于显示进程间的关系

            • UID

              • 用户的id号

            • PID

              • 进程的id号

            • PPID

              • 父进程号

            • C

              • 没啥用

            • STIME

              • 开始运行的时间

            • TTY

              • 如果TTY对应的是问好,说明该进程不依赖于任何终端而存在

            • TIME

              • 时间

            • CMD

              • 进程名称

        • ps -ajx

          • 可以显示进程的状态(常用)

            • SID

              • 会话id号

            • TPGID

              • 如果该值位-1,标识这时一个守护进程

            • STAT

              • 进程的状态

          • ps -ajx | grep 名称a

            • 查看所有名称a的进程的状态

        • ps -aux

          • 可以显示进程所在计算机资源的百分比

      • kill指令,给进程发信号

        • kill -l

          • 查看所有信号

          • 一共由62个信号,其中前30个是稳定的信号,后面是不稳定的信号

          • 9号 SIGKILL

            • 结束一个进程

          • 19号 SIGSTOP

            • 暂停一个进程,相当于快捷键:ctrl +z

          • 2号 SIGTINT

            • 中断一个进程,相当于快捷键: ctrl +c

          • 18号 SIGCONT

            • 继续一个进程

          • 10号 SIGUSR1,12号 SIGUSR2

            • 系统给用户提供的两个自定义信号

            • 不连续

        • kill -信号号 PID

          • 给一个进程发信号

        • killall 进程名a

          • 杀死所有名为进程名a的进程

        • pidof

          • 可执行程序名:查看某个进程的pid

        • top

          • 动态查看运行的进程状态

        • pstree

          • 显示进程的关系树

  • 进程的状态

    • man ps

      • D

        • 不可中断的休眠状态

      • R

        • 运行态

      • S

        • 可中断的休眠状态

      • T

        • 停止态

      • t

        • 调试代码时的停止态

      • W

        • 现版本已取消

      • X

        • 死亡态,不能被看到

      • Z

        • 僵尸态,进程结束了,父进程没有回收

      • 附加状态

        • <

          • 高优先级进程

        • N

          • 低优先级进程

        • L

          • 锁在内存中的进程,不会进入交换分区

        • s

          • 会话组组长

        • l

          • 拥有多线程的进程

        • +

          • 前台运行的进程

  • 进程的切换

    • 运行程序,查看状态

    • 对着正在执行的进程,按ctrl+z,相当于 kill -19 pid, 会暂停一个进程

      • kill -19 pid需要在终端另一个界面操作

    • 想要让该进程重新运行,kill -18 pid(后台运行),或者 bg 作业号(后台运行)

      • 查看一个进程的作业号 :jobs -l

      • 如果停止的进程只有一个,则直接输入指令bg 即可让其进入后台运行状态

    • 让一个后台运行的程序编程前台运行: fg 作业号

      • 如果只有一个作业,则直接使用 fg即可

  • 进程的创建

    • 进程的创建过程,子进程时拷贝父进程的资源得到的,进程在内核空间通过task_struct 结构体进行控制,以及拷贝工作,新进程的创建,时直接拷贝父进程得来,但是需要修改一些很少的数据,比如,pid,但是保留了绝大部分的遗传基因,父进程在创建子进程之前定义的所有资源,子进程都有

    • fork

      • 进程创建函数

      • 通过拷贝父进程得到子进程

      • 无参数

      • 返回值:成功,父进程会得到子进程的pid的值,子进程中得到的是0,失败返回父进程中返回 -1,子进程创建失败,并置为错误码

    • 不关注fork 的返回值

      • 多次使用fork产生的结果是2^n个进程

你可能感兴趣的:(linux,服务器,运维,c语言,笔记)