Linux系统编程-DAY04

一、进线程
    1..进程:正在运行的程序(从运行开始到结束)
    pcb 块是一个结构体, process control block,pcb中放了个文件fds相关的,还放了信号signal相关的
    PID是进程标识符
    当前工作路径:chdir(只做了解)
    umask   0002  (只做了解)
    进程打开的文件列表, 文件IO中有提到,每开一个文件,pcb块都会有记录
    用户id,组id
    进程资源的上限
    命令:ulimit -a 显示进程的资源限制

2.进程和程序的区别
    程序是静态的。存储在硬盘中代码,数据的集合
    进程是动态的。程序执行的过程,包括进程打的创建、调度、消亡    .c   ---->  a.out --- > process(pid)
    没走起来的叫程序,走起来的叫进程
1)程序是永存的,进程是暂时的
2)进程有程序状态的变化,程序没有
3)进程可以并发,程序无并发
4)进程与进程会存在竞争计算机的资源
5)一个程序可以运行多次,变成多个进程
      一个进程可以运行一个多个程序

3.内存分布:
        ELF是a.out的可执行文件(windos中是exe)
            stack  8M  
            mpa/share  映射区和共享区    (kernal 中  libc.so需要用的时候会共享过来(只读))
               heap   堆区(动态内存空间)
            data    数据段(全局变量 、 static静态变量)    
            code   代码段(只读特性)
        内存开始的地址是0G,结束的地址是3G,内核是3G,结束的位置是4G
  MMU(内存管理单元):把物理地址转为虚拟地址    
    虚拟内存(1 透明, 2 隔离, 3 权限)
    进程的分类:1.交互进程  2. 批处理进程 shell 脚本  3.守护进程(程序走起来不需要输入)
      

4.进程的作用:并发

5.  进程的状态:就绪 -> 执行态 -> 阻塞(等待,睡眠)基本操作系统。
    linux中的状态,运行态,睡眠态,僵尸,暂停态 

6.进程的调度,进程上下文切换
    先来先服务、短任务优先、优先级(时间片)
    实时:rr(时间片轮转): 每个进程分配固定的时间片、 fifo
    分时:other、batch、idle
宏观并行,微观串行

7.查询进程相关命令
    ps.aux
    1)就绪态、运行态 R
    2)睡眠态、等待态
       可唤醒等待态S
        不可唤醒等待态  D
    3)停止态  T
    4)僵尸态 Z
    5)结束态

8.top  根据CPU占用率查看进程相关信息

9. kill 和 killall发送一个信号
    kill -9 PID
    killall  -9  code

10.fork()
1)pid_t fork();  叉子
      ./a.out就是一个进程,再用fork就是子进程
    调用一次会返回俩次
    操作系统可能让父进程先走或子进程先走,顺序不确定。
    变量不共享
    子进程复制父进程的0到3G空间和父进程内核中的PCB,但id号不同,一般子进程的id号大一些
    功能: 通过该函数可以从当前进程中克隆一个同名新进程,子进程从fork函数之后执行

11.父子进程的关系:
    子进程是父进程的副本,子进程获得父进程数据段,堆,栈,正文段共享
    在fork之后,一般情况哪个会先运行是不确定的。如果非要确定哪个先运行,需要IPC机制。
    
区别:  1)fork返回值 > 0 和 ==0
        2)pid不同
    写时复制:子进程数据段只有发生变化的值,才会定义,其他的共享父进程的。消亡的时候,也只需要销毁刚刚定义的一部分。

12.进程的终止:8种情况
主动退出:
    1)main 中 return
    2)exit() 不管你在任何位置,调用exit就会结束,清理函数
    3)_exit,_Exit会关闭所有的已经打开的文件,不执行清理函数。
    4)主线程退出
    5)主线程调用pthread_exie
异常终止:
    1)abort()  
    2)signal kill pid
    3)最后一个线程被pthread_cancle

二、例题
查看父子进程的pid和ppid的变化

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int a = 20;

int	main(int argc, char **argv)
{
    printf("start...\n");
    pid_t ret = fork();
    if(ret > 0)
    {
        int i = 5;
        while(i--)
        {
            printf("father  吃一口 pid:%d, ppid:%d,a:%d \n",getpid(), getppid(), a);
            sleep(1);
        } 
    }
    else if (ret == 0)
    {
        int i = 5;
        a = a + 50;
        while(i--)
        {
            printf("son  打瓦pid:%d, ppid:%d,a:%d \n",getpid(), getppid(), a);
            sleep(1);
        } 
    }
    else
    {
        perror("fork\n");
        return 1;
    }
    //system("pause");
    printf("a is %d pid:%d, ppid:%d\n",a, getpid(), getppid());
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
OSZAR »