进程学习内容

什么是进程?

  • 什么是进程

    • 概念:进程是程序的一次动态执行的过程,包括创建,调度和消亡

    • 查看进程的命令: ps ; ps aux ; ps -ef ; pstree ; top ; ps axj ;

    • 进程和程序的区别: 程序(a.out)是静态的,是存在磁盘上的一些指令的有序集合,不包括执行的过程 进程(./a.out)是程序的一次动态执行的过程,包括创建,调度和消亡

    • 为什么进程是程序执行和资源管理的最小单位? 每个进程都会分配0~4G的虚拟内存,管理操作是在这虚拟内存中进行的,映射在物理内存上不会产生冲突

    • 为什么有虚拟内存? 因为多任务(用户可以同时运行多个应用程序),安全(每个进程分开管理操作,不会冲突)

    • 如何区分不同的进程? -->PID进程号 进程是由进程创建的,有子进程和父进程

进程的类型:

  • 交互进程:由shell控制和运行,与用户进行交互;既可以在前台运行,也可以在后台运行; +代表是前台进程;杀死进程:kill -l ;

  • 批处理进程:不与用户交互;不属于某个终端;通常在后台运行,它被提交到一个队列中以便顺序执行

  • 守护进程:一直在后台运行;不可操作;一般在Linux启动时开始执行,系统关闭时才结束。

 进程的状态:

  • 命令 man ps可用来查看进程状态 R:运行态(正在运行或准备运行的进程) S:可中断等待(正在等待某件事情发生或能够占用某些资源,可被信号中断) D:不可中断等待(不会被中断) T:停止状态(暂停的进程) Z:僵尸态(已经终止的进程,但内核空间其task_struct(PCB进程控制块)还在) X:消亡态(进程已经终止,且进程控制块也不存在了)

  • task_struct内核结构里面包含进程的所有信息,包括:进程的状态,进程的基本信息,进程的标识符,内存相关信息,父进程相关信息,与进程相关的终端信息,当前工作目录,打开的文件信息,所接受的文件信号信息等; PCB进程控制块——task_struct管理着每个进程资源 内核可以通过进程控制块访问每个进程的所有信息

如何创建守护进程?

  • 第一步:创建子进程,让它变成孤儿进程(断绝血缘关系,脱离控制终端)

  • 第二步:setsid( ):在子进程中创建新会话并担任新会话组组长(变?此时PID=PGID=SID)

    • 进程组(PGID):多个进程的集合;组长进程的ID就是组ID;

    • 会话组(SID):多个进程组的集合;一个会话起始于用户登录,终止与用户退出;第一个进程位是会话组组长

  • 第三步:chdir():改变当前目录(让根目录作为当前守护进程的工作目录,不会被轻易删除,root)

  • 第四步:umask( ):重设文件掩码(增强守护进程的灵活性,屏蔽不需要的位)

  • 第五步:getdtablesize( ):关闭文件描述符(不关闭会影响前台进程)

  • 创建完毕,进入进程工作

 进程间通信:

传统通信:无名管道,有名管道,信号;system v:共享内存,消息队列,信号量;

线程:

  • 为什么有线程? (1)OS在调度时要来回切换地址空间,系统开销比较大; (2)进程之间需要通信; (3)有多个任务时,将多个进程放在一个进程里共享地址空间,这样系统开销减小;

  • 概念: (1)线程是系统调度的最小单位;(2)线程是共享地址空间的多个任务,进程叫主线程,其他的任务叫子线程; (3)线程可以对进程的内存空间和资源进行访问,并与同一进程中其他线程共享; (4)线程具有高效性和可操作性;

线程编程基础:

  • 创建线程:pthread_create();要使用回调函数void*(*start_routine)(void *);

  • 线程间也会抢夺资源,用pthread_join函数可以回收子线程,阻塞主线程,等待子线程执行结束;

  • 游离态:pthread_detach( ); 将子线程设置为游离态,子线程退出后不再被主线程回收,而是被系统回收,这个函数不会阻塞主线程;

  • 退出线程:pthread_exit(线程退出时的返回值,一般写NULL);

 

线程同步和互斥:

  • 线程间同步和互斥

    • 线程间同步:多个线程按照顺序相互配合完成一件事(保证临界资源完整性)(编译时要链接 -lpthread)

      • 用信号量实现同步操作时,往往设置多个信号量,安排不同初始值来实现线程的顺序执行;

      • 初始化信号量函数:sem_init( );

      • P操作:int sem_wait(sem_t *sem)

      • V操作:int sem_post(sem);

      • 信号量实现同步

    • 线程间互斥:保护共享资源完整性但不保证同步(互斥锁)(编译时要链接 -lpthread)

      • 初始化互斥锁:pthread_mutex_init();

      • 上锁:pthread_mutex_lock();

      • 解锁pthread_mutex_unlock();

      • 销毁锁:pthread_mutex_destroy();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值